изтегли - ДАВИД академия

Download Report

Transcript изтегли - ДАВИД академия

Курс по програмиране на C#
Занятие №4
Функции и методи. Често използвани методи
2013
Съдържание 1/2
• Функции и методи
–
–
–
–
–
Контрол на изпълнението
Видимост на променливите
Методи без връщана стойност
Методи с връщана стойност
Ограничения
• Параметри
– Референтни параметри
– Изходящи параметри
– Масиви от параметри
Съдържание 2/2
• Аргументи
– Незадължителни аргументи
– Именувани аргументи
• Презаписване на методи
• Често използвани методи
–
–
–
–
–
–
Символни низове
Превръщане на данни
Работа с файлове
Работа с масиви
Работа с конзола
Други методи
Функции и методи
• Какво е „функция“? Какво е „метод“?
– Функция е подпрограма, която извършва конкретна дейност и
може да бъде извиквана от друга част от програмата
– Функциите могат да приемат един или повече параметри
– Функциите могат да връщат единична стойност като резултат
– Аргумент е стойността подавана на даден параметър
– Метод е функция дефинирана в рамките на клас или структура
– Процедури наричаме функции, които не връщат резултат
– В езика C# методът е единственият начин за дефиниране на
функции
Функции и методи
• Приложение на функциите
–
–
–
–
Разбиване на приложението на по-конкретни задачи
Преизползване на програмния код
Разделяне на отговорностите и по-добра поддръжка
Подобрена разбираемост на кода
• BCL представлява библиотека от методи подпомагащи
разработчика в създаването на приложения без това да
става от нулата
Функции и методи
• Характеристики на методите
–
–
–
–
Наименование
Брой и тип на параметрите
Връщана стойност
Клас, в който методът е дефиниран
• Сигнатура на метод
– Наименование
– Ред, вид и тип на параметрите
• Наименованието на метода трябва да отразява неговото
предназначение
• В един и същи клас не може да има повече от един метод с
една и съща сигнатура
Функции и методи
• Деклариране на методи
– Тип на данните на връщаната
стойност (или “void” ако няма
такава)
– Наименование
– Описание на параметрите
– Тяло на метода
// метод без параметри и резултат
void Run()
{
// prison break
}
// метод с параметър без резултат
void Notify(string message)
{
// изпраща уведомления по e-mail
}
// метод с два параметъра и резултат
int Sum(int a, int b)
{
int c = a + b;
return c;
}
Функции и методи
• Използване на методи
– Наименование на клас или
обект, ако методът е
деклариран в друг клас
– Наименованието на метода
– Списък от аргументи
// извикване на метод без параметър
// (след атомна бомба - нищо)
DropNuclearBomb();
// извикване на метод с параметър
// (или „да изчезнеш за 60 секунди“)
SetBombTimer(60);
// извикване на метод с няколко
// параметъра
PlantBomb(here, “Ahmet”);
// използване на резултат
int sum = Sum(a, b);
// префиксиране с наименование на клас
Console.WriteLine(“Kaboom!”);
Контрол на изпълнението
• Изпълнението на метод започва при неговото извикване
• Изпълнението на метод приключва:
– при достигане на края му
– при достигане на ключовата дума „return”
– при възникване на грешка
• След изпълнение на метод, изпълнението продължава от
мястото, на което е бил извикан
Видимост на променливите
• Локални променливи за един
метод са тези декларирани в
неговото тяло
• В тялото на един метод не
могат да бъдат декларирани
повече от една променливи с
едно и също наименование
• Локалните променливи не
могат да бъдат достъпвани
извън метода
• Параметрите имат статут на
локални променливи
void GimmeFive()
{
// локална променлива “five”
int five = 5;
// използване на локална променлива
Console.WriteLine(“Hi {0}!”, five);
// къде отиваш ти, може би?!
string five = “Five”;
}
Console.WriteLine(five); // Ко?! Не!
Методи без връщана стойност
• Когато методът не връща
резултат, изпълнението
приключва:
– при достигане на края му
– при достигане на ключовата
дума “return”
– при възникване на грешка
void DoSomethingNerd(WeatherInfo info)
{
// ако времето не е хубаво…
if (!IsWeatherFine(info))
return;
// да порешаваме задачи!
SolveSomeMathsProblems();
}
Методи с връщана стойност
• Когато методът връща
резултат, изпълнението
приключва:
– при използване на ключовата
дума „return” следвана от израз
– при възникване на грешка
• След ключовата дума „return”
задължително трябва да има
израз, който връща стойност
от същия тип, като резултата
от метода
int Sum(int a, int b)
{
int c = a + b;
// Назад, назад, моме, Калино!
return c;
}
// взима дискриминантата на кв. у-е
double GetDiscriminant(
double a, double b, double c)
{
return b * b – 4 * a * c;
}
Методи връщащи стойност
• Извиквания към методи
връщащи стойност могат да
бъдат използвани в изрази
– В изрази извикването на метода
се заменя със стойността на
върнатия от него резултат
// имаме триъгълник със страни…
double a = 5, b = 3, c = 2;
// забравете, че сте видели това:
double s = Math.Sqrt(
GetSemiperimeter(a, b, c)
* (GetSemiperimeter(a, b, c) – a)
* (GetSemiperimeter(a, b, c) – b)
* (GetSemiperimeter(a, b, c) – c));
// по-добре го напишете така:
double p = GetSemiperimeter(a, b, c);
s = Math.Sqrt(p*(p-a)*(p-b)*(p-c));
// накрая, разбира се:
Console.WriteLine(”Лицето е {0}.”, s);
Параметри
• Параметър от стойностен тип
– Параметърът взима стойността
от съответния аргумент
– При изпълнение на метода,
стойността на аргумента се
запазва
// параметър от стойностен тип
void CountBackwards(int n)
{
for (; n > 0; n--)
Console.WriteLine(n);
}
// променлива от стойностен тип
int n = 100;
// използване на стойностен аргумент
CountBackwards(n);
// какво ще изпише тук?
Console.WriteLine(n);
Параметри
• Параметър от референтен
тип
– Параметърът взима
референцията от съответния
аргумент
– При изпълнение на метода,
референциите на аргумента се
запазват, но не винаги и
съхранените зад тях данни
// масивите са от референтен тип
int[] arr = new [] { 1, 3, 2, 10, 0 };
// извикваме метод за сортиране
Array.Sort(arr);
// след извикването, масивът си е
// останал на същото място в паметта,
// но пък сортиран
Параметри
• Параметър от референтен
тип
– Да си припомним Иванчо!
• Но по-подробно с Иванчо и
други (референтни) типове
ще се запознаем по-късно в
курса
// правим си „референтно“ хлапе Иванчо
Person kid = new Person(“Иванчо”);
// Иванчо е слушал и отива да си играе
Play(kid);// Иванчо скача на въже…
// … и чупи два шийни прешлена
// Но, въпреки това, той е същият
// Иванчо, който е отишъл да си играе…
ShowCervicalVertebrae(kid);
// … просто явно е останал с пет
// функциониращи шийни прешлена
Функции и методи - демо
// демонстрация
Ограничения
• Методите могат да връщат
само една стойност
• Ако искаме да върнем
повече?!
–
–
–
–
–
масиви
структури
обекти
референтни параметри
изходящи параметри
// методът ни връща масив
string[] GetCourseInfo()
{
return new[]
{
// наименование на курса
“Курс по програмиране на C#”,
// наименование на организацията
“ДАВИД академия”,
};
}
string[] info = GetCourseInfo();
Console.WriteLine(
“Курс: {0}; Организация: {1}”,
info[0], info[1]);
// … и сега добавете годината! 
Референтни параметри
• Позволяват предаването на
аргументите по референция,
а не по стойност
• Възможност за промяна на
аргумента в извиквания метод
• Възможност за връщане на
повече от една стойност чрез
използване на няколко
аргумента
• Декларират се с поставяне на
ключовата дума „ref” пред
дефиницията на параметъра
// деклариране
void GetCourseInfo(ref string course,
ref string organisation,
ref int year)
{
course = “Програмиране на C#”;
organisation = “ДАВИД академия”;
}
Референтни параметри
• Използват се с поставяне на
ключовата дума „ref” пред
аргумента
• Аргументът трябва да е
предварително декларирана
променлива от същия тип
• Аргументът трябва да има
предварително присвоена
стойност
• Извикването не гарантира, че
в метода ще се присвои
стойност на аргумента
// деклариране
void GetCourseInfo(ref string course,
ref string organisation,
ref int year)
{
course = “Програмиране на C#”;
organisation = “ДАВИД академия”;
}
// използване
string courseName = null;
string organisationName = null;
int year = 2013;
GetCourseInfo(ref courseName,
ref organisationName,
ref year);
Изходни параметри
• Позволяват връщането на
стойност в подаден (изходен)
параметър
• Задължителна промяна на
аргумента в извиквания метод
• Възможност за връщане на
повече от една стойност чрез
използване на няколко
аргумента
• Декларират се с поставяне на
ключовата дума „out” пред
дефиницията на параметъра
// деклариране
void GetCourseInfo(out string course,
out string organisation,
out int year)
{
course = “Програмиране на C#”;
organisation = “ДАВИД академия”;
year = 2013;
}
Изходни параметри
• Използват се с поставяне на
ключовата дума „out” пред
аргумента
• Аргументът трябва да е
предварително декларирана
променлива от същия тип
• Не е нужно аргументът да
има предварително
присвоена стойност
• Извикването гарантира, че в
метода ще се присвои
стойност на аргумента
// деклариране
void GetCourseInfo(out string course,
out string organisation,
out int year)
{
course = “Програмиране на C#”;
organisation = “ДАВИД академия”;
year = 2013;
}
// използване
string courseName;
string organisationName;
int year;
GetCourseInfo(out courseName,
out organisationName,
out year);
Масиви от параметри
• Не винаги е известно с колко
параметъра ще бъде извикан
даден метод
• Например string.Format!
• Какво да правим?!
string message;
// извикване с два аргумента
message = string.Format(
“Курс {0}”,
courseName);
// извикване с три аргумента
message = string.Format(
“Курс {0} на {1}”,
courseName, organisationName);
// извикване с четири аргумента
message = string.Format(
“Курс {0} ({2}) на {1}”,
courseName, organisationName, year);
// де факто могат да бъдат произволен брой
Масиви от параметри
• Произволен брой параметри
на метод указваме с масив от
параметри
• Декларират се с поставяне на
ключовата дума „params”
пред дефиницията на първия
параметъра
• Този параметър трябва да е
едномерен масив от типа
параметри, които очакваме
• В тялото на метода работим с
параметрите като с масив
// деклариране
void ShowContent(string title,
params string[] lines)
{
Console.WriteLine(“Title: {0}”, title);
for (int i = 0; i < lines.Length; i++)
{
Console.WriteLine(“{0}: {1}”,
i, lines[i]);
}
}
Масиви от параметри
• След масив от параметри не
може да има други
параметри
• Дефиницията на един метод
може да декларира само
един масив от параметри
// деклариране
void ShowContent(string title,
params string[] lines)
{
Console.WriteLine(“Title: {0}”, title);
for (int i = 0; i < lines.Length; i++)
{
Console.WriteLine(“{0}: {1}”,
i, lines[i]);
}
}
Масиви от параметри
• Извикването става с подаване
на 0 или повече параметъра
от типа на елементите в
декларирания аргумент
• Като параметър можем да
подадем и обикновен масив
// деклариране
void ShowContent(string title,
params string[] lines)
{
Console.WriteLine(“Title: {0}”, title);
for (int i = 0; i < lines.Length; i++)
{
Console.WriteLine(“{0}: {1}”,
i, lines[i]);
}
}
// използване с аргументи
ShowContent(“Day 1”, “My dead diary,”,
“I wrote yet another C# program!”);
// използване с масив
ShowContent(“Program.cs”,
File.ReadAllLines(“Program.cs”));
Незадължителни аргументи
• Незадължителни аргументи
– Деклариране: на параметъра
се задава стойност по
подразбиране
– Използване: за стойност на
пропуснатите аргументи се
използва стойността по
подразбиране на съответния
параметър
// деклариране на метод с
// незадължителни аргументи
void SendEmail(
string text,
string subject = null,
string from = null)
{
// …
}
// използване на метод с
// незадължителен аргумент
SendEmail(“Hi, there!”);
Именувани аргументи
• Именувани аргументи
•
// деклариране на метод с
// незадължителни аргументи
– Използване: споменава се
double GetRectangleSurface(
double width, double height = 0.0d)
наименованието на
параметъра, за който се подава {
return width * height;
стойност
}
Правила за използване
// използване на именувани аргументи
– Редът на именуваните аргументи double s = GetRectangleSurface(
height: 1.0d, width: 0.5d);
не е от значение
// използване на именувани и
– Именувани аргументи могат да // незадължителни аргументи
следват позиционни аргументи
s = GetRectangleSurface(width: 0.5d);
– След именувани аргументи не
могат да се използват
позиционни аргументи
Презаписване на методи
• Презаписването на методи е
възможността в една област
да бъдат декларирани повече
от един метод с едно и също
наименование, но различна
сигнатура
• Какво е сигнатура на метод?!
– Включва наименованието му,
типа и вида на параметрите и
техния ред
– Не включва връщания тип данни
и ключовата дума “params”
void F();
//
void F(int x);
//
void F(ref int x);
//
void F(int x, int y);
//
int F(string s);
//
int F(int x);
//
void F(string[] a);
//
void F(params string[] a);//
F()
F(int)
F(ref int)
F(int, int)
F(string)
F(int)
F(string[])
F(string[])
// ЗАБЕЛЕЖКА: сигнатурите не могат да се
// различават само по думите „ref” и “out”
void F(out int x);
// F(out int)
Методи, параметри, аргументи, презаписване - демо
// демонстрация
Често използвани методи – символни низове
• Проверка дали един низ е нулев, празен или съставен само
от интервали
• Форматиране на низ
• Подравняване и подкастряне на низ
• Взимане на дължината на низ
• Извличане на подниз
• Търсене и замяна на символ и подниз в низ
• Проверка за начало и край на низ
• Съединяване на масив от низове в низ
• Разделяне на низ на масив от низове
• Превръщане между малки и големи букви
Често използвани методи – превръщане на данни
• Превръщане на стойност в низ – ToString
• Превръщане на низ в стойност от числов тип – Parse
• Превръщане на стойност в основен тип данни – Convert
Често използвани методи – работа с файлове
• Четене и запис на файл като масив от байтове
• Четене и запис на файл като текст
• Четене и запис на файл като множество от редове
Често използвани методи – работа с масиви
•
•
•
•
•
•
•
Клониране на масив
Копиране на масив
Сортиране на масив
Изчистване на масив
Търсене в масив
Взимане на размерностите на масив
Обръщане на масив
Често използвани методи – работа с конзола
•
•
•
•
•
•
Изчистване на екрана
Издаване на звук
Изчитане и печат на текст
Установяване на големина на прозореца
Установяване на позиция на курсора
Допълнителни възможности:
–
–
–
–
–
Проверка за натиснати (специални) клавиши
Позиция на курсора
Цвят на шрифта и фона
Големина и позиция на прозореца
Заглавие на прозореца
Често използвани методи – други методи
• Генериране на произволни числа
– генериране на число
– изпълнение на събития с вероятностен характер
• Изчакване на определен интервал от време
Често използвани методи
// демонстрация
Задачи за упражнение – Златотърсачи
• Създайте метод GetFieldBounds, в който потребителят
въвежда две цели числа x ∈ (10; maxX) и y ∈ (10; maxY), maxX
и maxY се подават в параметър. Потребителят да може да
откаже въвеждането с въвеждане на празен низ, а методът
връща информация дали потребителят е отказал въвеждане
или не, както и въведените числа (ако са въведени такива).
Задачи за упражнение – Златотърсачи
• Създайте метод CreateField, който създава и връща
двумерен масив с размери m и n, елементите на който
запълнете с произволни стойности от изброим списък с
елементи:
– „OurGuy“ – точно един на произволно място в полето;
– „SomeGuy“ – брой съответстващ на 5% от местата в полето на
произволни места в полето;
– „Diamond” – брой съответстващ на 10% от местата в полето на
произволни места в полето (броят им се връща от метода);
– „Ground“ – произволно попълнен с вероятност 40%;
– „Grass“ – произволно попълнен с вероятност 30%;
– „Tree“ – произволно попълнен с вероятност 20%;
– „Stone“ – произволно попълнен с вероятност 10%.
Задачи за упражнение – Златотърсачи
• Създайте метод DrawField, който „рисува“ на екрана
съдържанието на масива от предишната задача. За всеки
елемент от масива поставя съответния оцветен символ:
–
–
–
–
–
–
–
„OurGuy“ – символ „☺“ (U+263A) oцветен в цвят по избор;
„SomeGuy“ – символ „☻” (U+263B) оцветен в цвят по избор;
„Diamond” – символ „♦“ (U+2666) оцветен в светло сиво;
„Ground“ – символ „▒“ (U+2592) оцветен в светло кафяво;
„Grass“ – символ „▓“ (U+2593) оцветен в светло зелено;
„Tree“ – символ „♣“ (U+2663) оцветен в тъмно зелено;
„Stone“ – символ „٥“ (U+0665) оцветен в тъмно сиво.
Задачи за упражнение – Златотърсачи
• Направете метод MoveGuy, който приема като параметър
„поле“, двойка координатите и посока (стойност от
изброим списък “Up”, “Down”, “Left” или “Right”), и мести
„guy” намиращ се на съответните координати в съответната
посока, само като там има „ground”, „grass” или
„diamond”. След себе си „guy“ оставя „ground”.
• Направете метод MoveSomeGuys, който приема като
параметър „поле“ и премества всички „some guys“ в
произволна посока.
• Направете метод MoveOurGuy, който приема като
параметър „поле“ и посока, и мести „our guy” в
определената посока.
Задачи за упражнение – Златотърсачи
• Направете метод ProcessInput, който приема като
параметър „полето“ и проверява дали потребителят е
натиснал клавиш:
– Ако е натиснал стрелка, методът връща стойност съответстваща на
посоката на стрелката в референтен параметър
– Ако е натиснал Escape, методът връща информация за това в
изходен параметър
– Методът връща информация дали потребителят е натиснал клавиш
или не
Задачи за упражнение – Златотърсачи
• Направете програма съдържаща всички изработени погоре методи, като основната програма трябва да:
1. изчисти екрана
2. подкани потребителя да въведе размер на полето не по-голям от
този на екрана (ако потребителят не въведе такъв, програмата
трябва да прекрати работа)
3. създаде „поле“ с въведените от потребителя размери
4. до натискане на „Escape” или свършване на „диамантите“:
1.
2.
3.
4.
рисува „полето“
премества всички „other guys”
обработва входа от потребителя и, ако е нужно, премества “our guy”
изчаква 100 ms
5. извежда събрания от потребителя процент „диаманти“
Въпроси?
Благодаря!
• Валери Дачев
– [email protected]
– @vdachev
– https://facebook.com/vdachev
• ДАВИД академия
–
–
–
–
[email protected]
http://acad.david.bg/
@david_academy
https://facebook.com/DavidAcademy