Upcoming SlideShare
Loading in...5
×
 

Училищен курс по програмиране на C# (2013/2014), занятие №4

on

  • 263 views

Училищен курс по програмиране на C# (2013/2014)

Училищен курс по програмиране на C# (2013/2014)
Занятие №4: Функции и методи. Често използвани методи

Statistics

Views

Total Views
263
Views on SlideShare
263
Embed Views
0

Actions

Likes
0
Downloads
2
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Училищен курс по програмиране на C# (2013/2014), занятие №4 Училищен курс по програмиране на C# (2013/2014), занятие №4 Presentation 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. извежда събрания от потребителя процент „диаманти“
  • Въпроси?
  • Благодаря! • Валери Дачев – valery@david.bg – @vdachev – https://facebook.com/vdachev • ДАВИД академия – – – – acad@david.bg http://acad.david.bg/ @david_academy https://facebook.com/DavidAcademy