500 likes | 772 Views
Курс по програмиране на C#. Занятие № 4 Функции и методи. Често използвани методи. Съдържание 1/2. Функции и методи Контрол на изпълнението Видимост на променливите Методи без връщана стойност Методи с връщана стойност Ограничения Параметри Референтни параметри Изходящи параметри
E N D
Курс по програмиране на C# Занятие №4Функции и методи. Често използвани методи
Съдържание 1/2 • Функции и методи • Контрол на изпълнението • Видимост на променливите • Методи без връщана стойност • Методи с връщана стойност • Ограничения • Параметри • Референтни параметри • Изходящи параметри • Масиви от параметри
Съдържание 2/2 • Аргументи • Незадължителни аргументи • Именувани аргументи • Презаписване на методи • Често използвани методи • Символни низове • Превръщане на данни • Работа с файлове • Работа с масиви • Работа с конзола • Други методи
Функции и методи • Какво е „функция“? Какво е „метод“? • Функция е подпрограма, която извършва конкретна дейност и може да бъде извиквана от друга част от програмата • Функциите могат да приемат един или повече параметри • Функциите могат да връщат единична стойност като резултат • Аргумент е стойността подавана на даден параметър • Методе функция дефинирана в рамките на клас или структура • Процедури наричаме функции, които не връщат резултат • В езика C# методът е единственият начин за дефиниране на функции
Функции и методи • Приложение на функциите • Разбиване на приложението на по-конкретни задачи • Преизползване на програмния код • Разделяне на отговорностите и по-добра поддръжка • Подобрена разбираемост на кода • BCL представлява библиотека от методи подпомагащи разработчика в създаването на приложения без това да става от нулата
Функции и методи • Характеристики на методите • Наименование • Брой и тип на параметрите • Връщана стойност • Клас, в който методът е дефиниран • Сигнатура на метод • Наименование • Ред, вид и тип на параметрите • Наименованието на метода трябва да отразява неговото предназначение • В един и същи клас не може да има повече от един метод с една и съща сигнатура
Функции и методи // метод без параметри и резултатvoid Run(){ // prison break} // метод с параметър без резултатvoid Notify(string message){ // изпраща уведомления по e-mail} // метод с два параметъра и резултатint Sum(int a, int b){int c = a + b;return c;} Деклариране на методи Тип на данните на връщаната стойност (или “void” ако няма такава) Наименование Описание на параметрите Тяло на метода
Функции и методи // извикване на метод без параметър//(след атомна бомба - нищо)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); // къде отиваш ти, може би?!stringfive = “Five”; } Console.WriteLine(five); // Ко?! Не! Локални променливи за един метод са тези декларирани в неговото тяло В тялото на един метод не могат да бъдат декларирани повече от една променливи с едно и също наименование Локалните променливи не могат да бъдат достъпвани извън метода Параметрите имат статут на локални променливи
Методи без връщана стойност void DoSomethingNerd(WeatherInfo info){// ако времето не е хубаво…if (!IsWeatherFine(info))return;// да порешаваме задачи!SolveSomeMathsProblems();} Когато методът не връща резултат, изпълнението приключва: при достигане на края му при достигане на ключовата дума “return” при възникване на грешка
Методи с връщана стойност int Sum(int a, intb){int c = a + b;//Назад, назад, моме, Калино!return c;} // взима дискриминантата на кв. у-еdoubleGetDiscriminant(double a, double b, double c){return b * b – 4 * a * c;} Когато методът връща резултат, изпълнението приключва: при използване на ключовата дума „return” следвана от израз при възникване на грешка След ключовата дума „return” задължително трябва да има израз, който връща стойност от същия тип, като резултата от метода
Методи връщащи стойност // имаме триъгълник със страни…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(){returnnew[] {// наименование на курса“Курс по програмиране на C#”,// наименование на организацията“ДАВИД академия”, };} string[] info = GetCourseInfo(); Console.WriteLine(“Курс: {0}; Организация: {1}”,info[0], info[1]); // … и сега добавете годината! Методите могат да връщат само една стойност Ако искаме да върнем повече?! масиви структури обекти референтни параметри изходящи параметри
Референтни параметри // деклариранеvoid GetCourseInfo(refstringcourse,refstringorganisation,refint year){ course =“Програмиране на C#”;organisation =“ДАВИД академия”;} Позволяват предаването на аргументите по референция, а не по стойност Възможност за промяна на аргумента в извиквания метод Възможност за връщане на повече от една стойност чрез използване на няколко аргумента Декларират се с поставяне на ключовата дума „ref” пред дефиницията на параметъра
Референтни параметри // деклариранеvoid GetCourseInfo(refstringcourse,refstringorganisation,refint year){ course =“Програмиране на C#”;organisation =“ДАВИД академия”;} // използванеstring courseName = null;string organisationName = null;int year = 2013;GetCourseInfo(ref courseName,reforganisationName,ref year); Използват се с поставяне на ключовата дума „ref” пред аргумента Аргументът трябва да е предварително декларирана променлива от същия тип Аргументът трябва да има предварително присвоена стойност Извикването не гарантира, че в метода ще се присвои стойност на аргумента
Изходни параметри // деклариранеvoid GetCourseInfo(outstring course,outstringorganisation,outint year){ course =“Програмиране на C#”;organisation =“ДАВИД академия”; year = 2013;} Позволяват връщането на стойност в подаден (изходен) параметър Задължителна промянана аргумента в извиквания метод Възможност за връщане на повече от една стойност чрез използване на няколко аргумента Декларират се с поставяне на ключовата дума „out” пред дефиницията на параметъра
Изходни параметри // деклариранеvoid GetCourseInfo(out stringcourse,out stringorganisation,out int year){ course =“Програмиране на C#”;organisation =“ДАВИД академия”; year = 2013;} // използванеstring courseName;string organisationName;int year;GetCourseInfo(out courseName,out organisationName,out year); Използват се с поставяне на ключовата дума „out” пред аргумента Аргументът трябва да е предварително декларирана променлива от същия тип Не е нужно аргументътда има предварително присвоена стойност Извикването гарантира, че в метода ще се присвои стойност на аргумента
Масиви от параметри string message; // извикване с два аргументаmessage = string.Format(“Курс {0}”,courseName); // извикване с три аргументаmessage = string.Format(“Курс {0} на {1}”,courseName, organisationName); // извикване с четири аргументаmessage = string.Format(“Курс {0} ({2}) на {1}”,courseName, organisationName, year); // де факто могат да бъдат произволен брой Не винаги е известно с колко параметъра ще бъде извикан даден метод Например string.Format! Какво да правим?!
Масиви от параметри // деклариране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]); }} Произволен брой параметри на метод указваме с масив от параметри Декларират се с поставяне на ключовата дума „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]); }} // използване с аргументиShowContent(“Day 1”, “My dead diary,”,“I wrote yet another C# program!”); // използване с масивShowContent(“Program.cs”,File.ReadAllLines(“Program.cs”)); Извикването става с подаване на 0 или повече параметъра от типа на елементите в декларирания аргумент Като параметър можем да подадем и обикновен масив
Незадължителни аргументи // деклариране на метод с// незадължителни аргументиvoidSendEmail(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); Именувани аргументи Използване: споменава се наименованието на параметъра, за който се подава стойност Правила за използване Редът на именуваните аргументи не е от значение Именувани аргументи могат да следват позиционни аргументи След именувани аргументи не могат да се използват позиционни аргументи
Презаписване на методи voidF();// F() voidF(intx);// F(int) voidF(ref int x);// F(ref int) voidF(int x, int y);// F(int, int) intF(string s);// F(string) intF(int x);// F(int) voidF(string[] a);// F(string[]) voidF(params string[] a);// F(string[]) // ЗАБЕЛЕЖКА: сигнатурите не могат да се// различават само по думите „ref” и “out”void F(out int x);// F(out int) Презаписването на методи е възможността в една област да бъдат декларирани повече от един метод с едно и също наименование, но различна сигнатура Какво е сигнатура на метод?! Включва наименованието му, типа и вида на параметрите и техния ред Не включва връщания тип данни и ключовата дума “params”
Методи, параметри, аргументи, презаписване - демо // демонстрация
Често използвани методи – символни низове • Проверка дали един низ е нулев, празен или съставен само от интервали • Форматиране на низ • Подравняване и подкастряне на низ • Взимане на дължината на низ • Извличане на подниз • Търсене и замяна на символ и поднизв низ • Проверка за начало и край на низ • Съединяване на масив от низове в низ • Разделяне на низ на масив от низове • Превръщане между малки и големи букви
Често използвани методи – превръщане на данни • Превръщане на стойност в низ – 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, методът връща информация за това в изходен параметър • Методът връща информация далипотребителят е натиснал клавиш или не
Задачи за упражнение – Златотърсачи • Направете програма съдържаща всички изработени по-горе методи, като основната програма трябва да: • изчисти екрана • подкани потребителя да въведе размер на полето не по-голям от този на екрана (ако потребителят не въведе такъв, програмата трябва да прекрати работа) • създаде „поле“ с въведените от потребителя размери • до натискане на „Escape” или свършване на „диамантите“: • рисува „полето“ • премества всички „other guys” • обработва входа от потребителя и, ако е нужно, премества “our guy” • изчаква 100 ms • извежда събрания от потребителя процент „диаманти“
Благодаря! • Валери Дачев • valery@david.bg • @vdachev • https://facebook.com/vdachev • ДАВИД академия • acad@david.bg • http://acad.david.bg/ • @david_academy • https://facebook.com/DavidAcademy