Upload
enya
View
78
Download
3
Embed Size (px)
DESCRIPTION
Курс по програмиране на C#. Занятие № 4 Функции и методи. Често използвани методи. Съдържание 1/2. Функции и методи Контрол на изпълнението Видимост на променливите Методи без връщана стойност Методи с връщана стойност Ограничения Параметри Референтни параметри Изходящи параметри - PowerPoint PPT Presentation
Citation preview
2013Copyright © 2013 DAVID Holding Company
Курс по програмиране на C#Занятие №4
Функции и методи. Често използвани методи
Copyright © 2013 DAVID Holding Company
Съдържание 1/2• Функции и методи– Контрол на изпълнението– Видимост на променливите– Методи без връщана стойност– Методи с връщана стойност– Ограничения
• Параметри– Референтни параметри– Изходящи параметри– Масиви от параметри
Copyright © 2013 DAVID Holding Company
Съдържание 2/2• Аргументи– Незадължителни аргументи– Именувани аргументи
• Презаписване на методи• Често използвани методи– Символни низове– Превръщане на данни– Работа с файлове– Работа с масиви– Работа с конзола– Други методи
Copyright © 2013 DAVID Holding Company
Функции и методи• Какво е „функция“? Какво е „метод“?– Функция е подпрограма, която извършва конкретна дейност и
може да бъде извиквана от друга част от програмата– Функциите могат да приемат един или повече параметри– Функциите могат да връщат единична стойност като резултат– Аргумент е стойността подавана на даден параметър– Метод е функция дефинирана в рамките на клас или структура– Процедури наричаме функции, които не връщат резултат– В езика C# методът е единственият начин за дефиниране на
функции
Copyright © 2013 DAVID Holding Company
Функции и методи• Приложение на функциите– Разбиване на приложението на по-конкретни задачи– Преизползване на програмния код– Разделяне на отговорностите и по-добра поддръжка– Подобрена разбираемост на кода
• BCL представлява библиотека от методи подпомагащи разработчика в създаването на приложения без това да става от нулата
Copyright © 2013 DAVID Holding Company
Функции и методи• Характеристики на методите– Наименование– Брой и тип на параметрите– Връщана стойност– Клас, в който методът е дефиниран
• Сигнатура на метод– Наименование– Ред, вид и тип на параметрите
• Наименованието на метода трябва да отразява неговото предназначение
• В един и същи клас не може да има повече от един метод с една и съща сигнатура
Copyright © 2013 DAVID Holding Company
Функции и методи// метод без параметри и резултатvoid Run(){ // prison break}// метод с параметър без резултатvoid Notify(string message){ // изпраща уведомления по e-mail}// метод с два параметъра и резултатint Sum(int a, int b){ int c = a + b; return c;}
• Деклариране на методи– Тип на данните на връщаната
стойност (или “void” ако няма такава)
– Наименование– Описание на параметрите– Тяло на метода
Copyright © 2013 DAVID Holding Company
Функции и методи// извикване на метод без параметър// (след атомна бомба - нищо)DropNuclearBomb();// извикване на метод с параметър// (или „да изчезнеш за 60 секунди“)SetBombTimer(60);// извикване на метод с няколко// параметъраPlantBomb(here, “Ahmet”);// използване на резултатint sum = Sum(a, b);// префиксиране с наименование на класConsole.WriteLine(“Kaboom!”);
• Използване на методи– Наименование на клас или
обект, ако методът е деклариран в друг клас
– Наименованието на метода– Списък от аргументи
Copyright © 2013 DAVID Holding Company
Контрол на изпълнението• Изпълнението на метод започва при неговото извикване• Изпълнението на метод приключва:– при достигане на края му– при достигане на ключовата дума „return”– при възникване на грешка
• След изпълнение на метод, изпълнението продължава от мястото, на което е бил извикан
Copyright © 2013 DAVID Holding Company
Видимост на променливитеvoid GimmeFive(){ // локална променлива “five” int five = 5; // използване на локална променлива Console.WriteLine(“Hi {0}!”, five); // къде отиваш ти, може би?! string five = “Five”;}
Console.WriteLine(five); // Ко?! Не!
• Локални променливи за един метод са тези декларирани в неговото тяло
• В тялото на един метод не могат да бъдат декларирани повече от една променливи с едно и също наименование
• Локалните променливи не могат да бъдат достъпвани извън метода
• Параметрите имат статут на локални променливи
Copyright © 2013 DAVID Holding Company
Методи без връщана стойностvoid DoSomethingNerd(WeatherInfo info){ // ако времето не е хубаво… if (!IsWeatherFine(info)) return; // да порешаваме задачи! SolveSomeMathsProblems();}
• Когато методът не връща резултат, изпълнението приключва:– при достигане на края му– при достигане на ключовата
дума “return”– при възникване на грешка
Copyright © 2013 DAVID Holding Company
Методи с връщана стойност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;}
• Когато методът връща резултат, изпълнението приключва:– при използване на ключовата
дума „return” следвана от израз
– при възникване на грешка• След ключовата дума
„return” задължително трябва да има израз, който връща стойност от същия тип, като резултата от метода
Copyright © 2013 DAVID Holding Company
Методи връщащи стойност// имаме триъгълник със страни…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);
• Извиквания към методи връщащи стойност могат да бъдат използвани в изрази– В изрази извикването на
метода се заменя със стойността на върнатия от него резултат
Copyright © 2013 DAVID Holding Company
Параметри// параметър от стойностен типvoid CountBackwards(int n){ for (; n > 0; n--) Console.WriteLine(n);}
// променлива от стойностен типint n = 100;
// използване на стойностен аргументCountBackwards(n);
// какво ще изпише тук?Console.WriteLine(n);
• Параметър от стойностен тип– Параметърът взима
стойността от съответния аргумент
– При изпълнение на метода, стойността на аргумента се запазва
Copyright © 2013 DAVID Holding Company
Параметри// масивите са от референтен типint[] arr = new [] { 1, 3, 2, 10, 0 };
// извикваме метод за сортиранеArray.Sort(arr);
// след извикването, масивът си е// останал на същото място в паметта,// но пък сортиран
• Параметър от референтен тип– Параметърът взима
референцията от съответния аргумент
– При изпълнение на метода, референциите на аргумента се запазват, но не винаги и съхранените зад тях данни
Copyright © 2013 DAVID Holding Company
Параметри// правим си „референтно“ хлапе ИванчоPerson kid = new Person(“Иванчо”);
// Иванчо е слушал и отива да си играеPlay(kid);// Иванчо скача на въже… // … и чупи два шийни прешлена
// Но, въпреки това, той е същият// Иванчо, който е отишъл да си играе…ShowCervicalVertebrae(kid);
// … просто явно е останал с пет// функциониращи шийни прешлена
• Параметър от референтен тип– Да си припомним Иванчо!
• Но по-подробно с Иванчо и други (референтни) типове ще се запознаем по-късно в курса
Copyright © 2013 DAVID Holding Company
Функции и методи - демо// демонстрация
Copyright © 2013 DAVID Holding Company
Ограничения// методът ни връща масивstring[] GetCourseInfo(){ return new[] { // наименование на курса “Курс по програмиране на C#”, // наименование на организацията “ДАВИД академия”, };}string[] info = GetCourseInfo();Console.WriteLine( “Курс: {0}; Организация: {1}”, info[0], info[1]);// … и сега добавете годината!
• Методите могат да връщат само една стойност
• Ако искаме да върнем повече?!– масиви– структури– обекти– референтни параметри– изходящи параметри
Copyright © 2013 DAVID Holding Company
Референтни параметри// деклариранеvoid GetCourseInfo(ref string course, ref string organisation, ref int year){ course = “Програмиране на C#”; organisation = “ДАВИД академия”;}
• Позволяват предаването на аргументите по референция, а не по стойност
• Възможност за промяна на аргумента в извиквания метод
• Възможност за връщане на повече от една стойност чрез използване на няколко аргумента
• Декларират се с поставяне на ключовата дума „ref” пред дефиницията на параметъра
Copyright © 2013 DAVID Holding Company
Референтни параметри// деклариране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);
• Използват се с поставяне на ключовата дума „ref” пред аргумента
• Аргументът трябва да е предварително декларирана променлива от същия тип
• Аргументът трябва да има предварително присвоена стойност
• Извикването не гарантира, че в метода ще се присвои стойност на аргумента
Copyright © 2013 DAVID Holding Company
Изходни параметри// деклариранеvoid GetCourseInfo(out string course, out string organisation, out int year){ course = “Програмиране на C#”; organisation = “ДАВИД академия”; year = 2013;}
• Позволяват връщането на стойност в подаден (изходен) параметър
• Задължителна промяна на аргумента в извиквания метод
• Възможност за връщане на повече от една стойност чрез използване на няколко аргумента
• Декларират се с поставяне на ключовата дума „out” пред дефиницията на параметъра
Copyright © 2013 DAVID Holding Company
Изходни параметри// деклариране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);
• Използват се с поставяне на ключовата дума „out” пред аргумента
• Аргументът трябва да е предварително декларирана променлива от същия тип
• Не е нужно аргументът да има предварително присвоена стойност
• Извикването гарантира, че в метода ще се присвои стойност на аргумента
Copyright © 2013 DAVID Holding Company
Масиви от параметри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!• Какво да правим?!
Copyright © 2013 DAVID Holding Company
Масиви от параметри// деклариране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” пред дефиницията на първия параметъра
• Този параметър трябва да е едномерен масив от типа параметри, които очакваме
• В тялото на метода работим с параметрите като с масив
Copyright © 2013 DAVID Holding Company
Масиви от параметри// деклариране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]); }}
• След масив от параметри не може да има други параметри
• Дефиницията на един метод може да декларира само един масив от параметри
Copyright © 2013 DAVID Holding Company
Масиви от параметри// деклариране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 или повече параметъра от типа на елементите в декларирания аргумент
• Като параметър можем да подадем и обикновен масив
Copyright © 2013 DAVID Holding Company
Незадължителни аргументи// деклариране на метод с// незадължителни аргументиvoid SendEmail( string text, string subject = null, string from = null){ // …}
// използване на метод с// незадължителен аргументSendEmail(“Hi, there!”);
• Незадължителни аргументи– Деклариране: на параметъра
се задава стойност по подразбиране
– Използване: за стойност на пропуснатите аргументи се използва стойността по подразбиране на съответния параметър
Copyright © 2013 DAVID Holding Company
Именувани аргументи// деклариране на метод с// незадължителни аргументи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);
• Именувани аргументи– Използване: споменава се
наименованието на параметъра, за който се подава стойност
• Правила за използване– Редът на именуваните
аргументи не е от значение– Именувани аргументи могат
да следват позиционни аргументи
– След именувани аргументи не могат да се използват позиционни аргументи
Copyright © 2013 DAVID Holding Company
Презаписване на методиvoid F(); // F()void F(int x); // F(int)void F(ref int x); // F(ref int)void F(int x, int y); // F(int, int)int F(string s); // F(string)int F(int x); // F(int)void F(string[] a); // F(string[])void F(params string[] a); // F(string[])
// ЗАБЕЛЕЖКА: сигнатурите не могат да се// различават само по думите „ref” и “out”void F(out int x); // F(out int)
• Презаписването на методи е възможността в една област да бъдат декларирани повече от един метод с едно и също наименование, но различна сигнатура
• Какво е сигнатура на метод?!– Включва наименованието му,
типа и вида на параметрите и техния ред
– Не включва връщания тип данни и ключовата дума “params”
Copyright © 2013 DAVID Holding Company
Методи, параметри, аргументи, презаписване - демо
// демонстрация
Copyright © 2013 DAVID Holding Company
Често използвани методи – символни низове• Проверка дали един низ е нулев, празен или съставен
само от интервали• Форматиране на низ• Подравняване и подкастряне на низ• Взимане на дължината на низ• Извличане на подниз• Търсене и замяна на символ и подниз в низ• Проверка за начало и край на низ• Съединяване на масив от низове в низ• Разделяне на низ на масив от низове• Превръщане между малки и големи букви
Copyright © 2013 DAVID Holding Company
Често използвани методи – превръщане на данни• Превръщане на стойност в низ – ToString• Превръщане на низ в стойност от числов тип – Parse• Превръщане на стойност в основен тип данни – Convert
Copyright © 2013 DAVID Holding Company
Често използвани методи – работа с файлове• Четене и запис на файл като масив от байтове• Четене и запис на файл като текст• Четене и запис на файл като множество от редове
Copyright © 2013 DAVID Holding Company
Често използвани методи – работа с масиви• Клониране на масив• Копиране на масив• Сортиране на масив• Изчистване на масив• Търсене в масив• Взимане на размерностите на масив• Обръщане на масив
Copyright © 2013 DAVID Holding Company
Често използвани методи – работа с конзола• Изчистване на екрана• Издаване на звук• Изчитане и печат на текст• Установяване на големина на прозореца• Установяване на позиция на курсора• Допълнителни възможности:– Проверка за натиснати (специални) клавиши– Позиция на курсора– Цвят на шрифта и фона– Големина и позиция на прозореца– Заглавие на прозореца
Copyright © 2013 DAVID Holding Company
Често използвани методи – други методи• Генериране на произволни числа– генериране на число– изпълнение на събития с вероятностен характер
• Изчакване на определен интервал от време
Copyright © 2013 DAVID Holding Company
Често използвани методи// демонстрация
Copyright © 2013 DAVID Holding Company
Задачи за упражнение – Златотърсачи• Създайте метод GetFieldBounds, в който потребителят
въвежда две цели числа x ∈ (10; maxX) и y ∈ (10; maxY), maxX и maxY се подават в параметър. Потребителят да може да откаже въвеждането с въвеждане на празен низ, а методът връща информация дали потребителят е отказал въвеждане или не, както и въведените числа (ако са въведени такива).
Copyright © 2013 DAVID Holding Company
Задачи за упражнение – Златотърсачи• Създайте метод CreateField, който създава и връща
двумерен масив с размери m и n, елементите на който запълнете с произволни стойности от изброим списък с елементи:– „OurGuy“ – точно един на произволно място в полето;– „SomeGuy“ – брой съответстващ на 5% от местата в полето на
произволни места в полето;– „Diamond” – брой съответстващ на 10% от местата в полето на
произволни места в полето (броят им се връща от метода);– „Ground“ – произволно попълнен с вероятност 40%;– „Grass“ – произволно попълнен с вероятност 30%;– „Tree“ – произволно попълнен с вероятност 20%;– „Stone“ – произволно попълнен с вероятност 10%.
Copyright © 2013 DAVID Holding Company
Задачи за упражнение – Златотърсачи• Създайте метод DrawField, който „рисува“ на екрана
съдържанието на масива от предишната задача. За всеки елемент от масива поставя съответния оцветен символ:– „OurGuy“ – символ „☺“ (U+263A) oцветен в цвят по избор;– „SomeGuy“ – символ „☻” (U+263B) оцветен в цвят по избор;– „Diamond” – символ „♦“ (U+2666) оцветен в светло сиво;– „Ground“ – символ „▒“ (U+2592) оцветен в светло кафяво;– „Grass“ – символ „▓“ (U+2593) оцветен в светло зелено;– „Tree“ – символ „♣“ (U+2663) оцветен в тъмно зелено;– „Stone“ – символ „٥“ (U+0665) оцветен в тъмно сиво.
Copyright © 2013 DAVID Holding Company
Задачи за упражнение – Златотърсачи• Направете метод MoveGuy, който приема като
параметър „поле“, двойка координатите и посока (стойност от изброим списък “Up”, “Down”, “Left” или “Right”), и мести „guy” намиращ се на съответните координати в съответната посока, само като там има „ground”, „grass” или „diamond”. След себе си „guy“ оставя „ground”.
• Направете метод MoveSomeGuys, който приема като параметър „поле“ и премества всички „some guys“ в произволна посока.
• Направете метод MoveOurGuy, който приема като параметър „поле“ и посока, и мести „our guy” в определената посока.
Copyright © 2013 DAVID Holding Company
Задачи за упражнение – Златотърсачи• Направете метод ProcessInput, който приема като
параметър „полето“ и проверява дали потребителят е натиснал клавиш:– Ако е натиснал стрелка, методът връща стойност
съответстваща на посоката на стрелката в референтен параметър
– Ако е натиснал Escape, методът връща информация за това в изходен параметър
– Методът връща информация дали потребителят е натиснал клавиш или не
Copyright © 2013 DAVID Holding Company
Задачи за упражнение – Златотърсачи• Направете програма съдържаща всички изработени по-
горе методи, като основната програма трябва да:1. изчисти екрана2. подкани потребителя да въведе размер на полето не по-голям
от този на екрана (ако потребителят не въведе такъв, програмата трябва да прекрати работа)
3. създаде „поле“ с въведените от потребителя размери4. до натискане на „Escape” или свършване на „диамантите“:
1. рисува „полето“2. премества всички „other guys”3. обработва входа от потребителя и, ако е нужно, премества “our guy”4. изчаква 100 ms
5. извежда събрания от потребителя процент „диаманти“
Copyright © 2013 DAVID Holding Company
Въпроси?
Copyright © 2013 DAVID Holding Company
Благодаря!• Валери Дачев– [email protected]– @vdachev– https://facebook.com/vdachev
• ДАВИД академия– [email protected]– http://acad.david.bg/– @david_academy– https://facebook.com/DavidAcademy