Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
61
Добавлен:
09.05.2015
Размер:
559.09 Кб
Скачать

Урок 6: Функции и методы.

Основная цель урока.

1.Научиться создавать и вызывать собственные методы

2.Продолжить изучение работы с условным оператором if.

3.Продолжить изучение работы с пользовательскими свойствами (Settings).

4.Познакомиться с одним из методов рефакторинга – « Выделение метода».

Краткая справка.

Функция (процедура) – это поименованная часть программного кода,

выполняющая определённые действия. Функции (процедуры) могут вызываться по имени из других частей программы столько раз, сколько необходимо.

Функция, в отличие от процедуры, возвращает некоторое значение.

Так как C# объектно-ориентированный язык программирования, он не может содержать чистых функций и процедур, любая функция должна быть прикреплена к некоторому классу. Например, в ваших консольных приложениях присутствует класс

Program, который содержит процедуру Main. Эта процедура является точкой входа в программу и вызывается в момент запуска программы.

Метод — это функция(процедура), принадлежащая какому-либо классу или объекту. Т.е. в C# любая функция\процедура является методом, поэтому лучше использовать это определение. Существуют статические и не статические методы,

статические методы во многом подобны чистым функциям (процедурам), отличие в том, что они располагаются в пространстве имён некоторого класса. Для вызова статических методов не нужна переменная (объект). Не статические методы могут быть вызваны только через переменную (объект) данного класса. Ниже приведена таблица примеров.

Код

Имя метода

Тип метода

 

 

 

DateTime dat = DateTime.Now;

AddDays

Не статический

dat = dat.AddDays(10);

 

 

 

 

 

Convert.ToInt32("500");

ToInt32

Статический

 

 

 

Console.WriteLine("Hello");

WriteLine

Статический

 

 

 

string s = "Hello,[user]";

Replace

Не статический

s = s.Replace("[user]", "Вася");

 

 

 

 

 

Console.ReadKey();

ReadKey

Статический

 

 

 

Общий синтаксис для объявления нового метода\функции\процедуры (значения,

указанные в квадратных скобках являются необязательными).

[private\public\protected] [static] [virtual] ТипРезультата ИмяМетода(Аргументы);

{

//некоторый код...

}

ТипРезультата – тип возвращаемого значения. Если метод не возвращает никакого значения, то указывается специальный тип данных void, в остальных случаях указывается существующий тип данных (т.е. int, long, float, double, DateTime

и.т.д.).

ИмяМетода – однозначно идентифицирует данный метод и используется для его вызова. Имя метода должно быть уникальным (в рамках существующего класса).

Аргументы – необязательная часть метода, которая содержит список переменных, передаваемых в метод из другой части программы.

Рассмотрим пример простого метода на C#. Создадим метод, который будет выводить на экран консоли строку “Hello, Имя_пользователя!”, дадим методу имя

SayHello, после этого мы можем вызывать его вызывать из метода Main по имени.

Для того чтобы компилятор понял, что мы работаем с методом, а не

переменной в конце вызова метода всегда ставятся скобки.

static void SayHello()

{

string name;

name = Console.ReadLine(); Console.WriteLine("Hello, {0} !", name);

}

static void Main(string[] args)

{

SayHello();

SayHello();

SayHello();

}

Вышеприведённый метод является процедурой (возвращает void) и не содержит

аргументов. Такой метод можно вызывать из окна интерпретации, без

фактического запуска программы.

Методы позволяют избежать дублирования программного кода, ускорить и упростить разработку программ. В качестве примера возьмём учебное задание 1.2, в

котором пользователю нужно было ввести баллы по 3-м предметам. Ввод данных было бы логично оформить в виде отдельного метода.

Пусть это будет метод GetPoints, он будет получать в качестве аргумента название предмета и возвращать полученное количество баллов.

static int GetPoints(string text)

{

Console.Write("{0}:", text); string points = Console.ReadLine(); return Convert.ToInt32(points);

}

static void Main(string[] args)

{

int mat = GetPoints("Математика"); int rus = GetPoints("Русский язык"); int obs = GetPoints("Обществознание");

}

Для того, чтобы метод мог вернуть некоторое значение используется ключевое слово return.

Оператор return позволяет так же досрочно завершить выполнение текущего метода.

Учебное задание 1.7.

Создать приложение – интерактивный тренажер по математике, проверяющий умение пользователя выполнять простые арифметические операции над числами.

При запуске программа запрашивает у пользователя сумму чисел, пользователь вводит ответ (если ответ правильный он получает определённое число очков), затем переходит к следующему примеру и.т.д.

Технология выполнения учебного задания 1.7.

Шаг 1. Создайте новый проект консольного приложения, назовите его Lab17.

Шаг 2. Для того, чтобы пользователь, запуская программу, каждый раз видел разные задачи, а не одни и те же примеры – воспользуемся генератором случайных чисел. В .NET он представлен классом Random (с англ. « случайный»). Создать новое случайное число можно следующим образом:

Random rnd = new Random(); int a = rnd.Next(0, 100);

В переменную a будет записано случайное число в диапазоне от 0 до 100.

Напишем программу, которая будет генерировать 2 случайных числа и запрашивать у пользователя их сумму, затем сравнивать результат пользователя с верным результатом (см. листинг 1).

static void Main(string[] args)

{

//Создаём новую переменную типа Random

//с её помощью мы сможем генерировать случайные числа Random rnd = new Random();

//Объявляем переменные num1 и num2, которые равны //случайным числам в диапазоне от -10 до 10

int num1 = rnd.Next(-10, 10); int num2 = rnd.Next(-10, 10);

//Выводим на экран сообщение о том, что надо найти сумму чисел...

Console.WriteLine("Введите сумму чисел {0} и {1}",num1,num2); //получаем ответ введённый пользователем...

int UserSum = Convert.ToInt32(Console.ReadLine()); //считаем правильный ответ...

int RealSum = num1 + num2;

//если ответ пользователя совпадает с верным...

if (UserSum == RealSum)

{

Console.WriteLine("Верно!"); }else

{

Console.WriteLine("Ошибка... верный ответ {0}",RealSum);

}

Console.ReadKey();

}

Листинг 1.

Шаг 3. Запустите программу, нажав клавишу F5. Убедитесь, что программа

работает.

Шаг 4. Недостаток существующей программы в том, что после ввода суммы чисел она сразу же завершается. С одной стороны можно скопировать существующий код и повторить его столько раз, сколько нужно, но это плохой подход. Правильным решением будет выделить повторяющиеся фрагменты кода в отдельный метод. Новый метод можно создать вручную, но используя инструменты рефакторинга это сделать проще и удобнее. Выделить фрагмент кода, который будет выделен в отдельный метод, как показано на рисунке 1.

Рисунок 1.

Затем кликните правым кликом и из контекстного меню выберите Рефакторинг –>

Извлечь метод. В появившемся меню введите название метода Test.

Рефакторинг — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы.

В результате выполнения этой операции выделенный код будет представлен как независимый метод, а все внешние факторы(это переменные num1 и num2) будут передаваться через список аргументов.

Шаг 5. Теперь мы можем вызывать метод Test несколько раз, передавая в качестве параметров числа для сложения.

Вызывая метод Test с разными параметрами (случайные значения от 0 до 10 или от

-100 до 100) мы можем варьировать уровень сложности.

Теперь, когда у нас есть отдельный метод, выполняющий 1 шаг тестирования пользователя, пользоваться переменными num1 и num2 в методе Main не очень удобно. Нам нужно написать 2 строчки кода для присваивания значений этим переменным и 3-ей строчкой кода вызвать метод Test. Можно объединить эти действия в одну строчку сразу же передавая сгенерированные случайные числа в метод Test.

Test(rnd.Next(1, 10), rnd.Next(1, 10));

Измените код метода Main, как показано в листинге 2. Теперь при запуске программы мы можем решить 3 задачи различной сложности.

Random rnd = new Random();

//Объявляем переменные num1 и num2, которые равны //случайным числам в диапазоне от -10 до 10

//Уровень 1: числа от 1 до 10 Test(rnd.Next(1, 10), rnd.Next(1, 10)); //Уровень 2: числа от 1 до 100 кратные 15

Test(rnd.Next(1, 100)/15*15, rnd.Next(1, 100)/15*15); //Уровень 3: числа от 1 до 100

Test(rnd.Next(1, 100), rnd.Next(1, 100)); Console.ReadKey();

Листинг 2.

Шаг 6. Добавим возможность подсчёта очков, за каждый правильный ответ пользователь будет получать +1 балл. Для этого изменим код метода Test. Сейчас метод Test не возвращает никакого значения, модифицируем его так, чтобы он возвращал 1 в случае правильного ответа и 0 в случае ошибки. Тип возвращаемого значения пусть будет int. (см. листинг 3).

private static int Test(int num1, int num2)

{

//Выводим на экран сообщение о том, что надо найти сумму чисел...

Console.WriteLine("Введите сумму чисел {0} и {1}", num1, num2); //получаем ответ введённый пользователем...

int UserSum = Convert.ToInt32(Console.ReadLine()); //считаем правильный ответ...

int RealSum = num1 + num2;

//если ответ пользователя совпадает с верным...

if (UserSum == RealSum)

{

Console.WriteLine("Верно!"); return 1;

}

else

{

Console.WriteLine("Ошибка... верный ответ {0}", RealSum); return 0;

}

}

Листинг 3.

Далее создадим в методе Main переменную, в которой будут накапливаться очки пользователя. Так как метод Test теперь возвращает значение, мы можем использовать его в математических выражениях (см листинг 4).

//Создаём новую переменную типа Random

//с её помощью мы сможем генерировать случайные числа Random rnd = new Random();

int score = 0;

//Уровень 1: числа от 1 до 10

score = score + Test(rnd.Next(1, 10), rnd.Next(1, 10)); //Уровень 2: числа от 1 до 100 кратные 15

score = score + Test(rnd.Next(1, 100) / 15 * 15, rnd.Next(1, 100) / 15 * 15); //Уровень 3: числа от 1 до 100

score = score + Test(rnd.Next(1, 100), rnd.Next(1, 100));

Console.WriteLine("Вы набрали {0} очка", score);

Console.ReadKey();

Листинг 4.

Шаг 7. Добавим дополнительные уровни (до 10-ого).

//Создаём новую переменную типа Random

//с её помощью мы сможем генерировать случайные числа Random rnd = new Random();

int score = 0;

//Уровень 1: числа от 1 до 10

score = score + Test(rnd.Next(1, 10), rnd.Next(1, 10)); //Уровень 2: числа от 1 до 100 кратные 15

score = score + Test(rnd.Next(1, 100) / 15 * 15, rnd.Next(1, 100) / 15 * 15); //Уровень 3: числа от 1 до 100

score = score + Test(rnd.Next(1, 100), rnd.Next(1, 100)); //Уровень 4: числа от -15 до 15

score = score + Test(rnd.Next(-15, 0), rnd.Next(0, 15)); //Уровень 5: числа от -200 до 200 кратыне 5

score = score + Test(rnd.Next(1, 200) / 5 * 5, rnd.Next(-200, 1) / 5 * 5); //Уровень 6: числа от 1 до 500 кратные 2

score = score + Test(rnd.Next(1, 500) / 2 * 2, rnd.Next(1, 500) / 2 * 2); //Уровень 7: числа от 1 до 1000

score = score + Test(rnd.Next(1, 1000), rnd.Next(1, 1000)); //Уровень 8: числа от -500 до 500

score = score + Test(rnd.Next(-500, 1), rnd.Next(1, 500)); //Уровень 9: числа от -1000 до 1000

score = score + Test(rnd.Next(-1000, 1), rnd.Next(1, 1000)); //Уровень 10: числа от -5000 до 5000

score = score + Test(rnd.Next(1, 5000), rnd.Next(-5000, 1)); Console.WriteLine("Вы набрали {0} очка", score); Console.ReadKey();

Листинг 5.

Контрольные вопросы.

1.Что такое метод ?

2.Чем отличается функция от процедуры?

3.Что такое аргументы метода (функции/ процедуры) ?

4.Какое ключевое слово используется чтобы метод вернул значение ?

5.Как можно создать метод, который не возвращает значения ? Какой тип значения должен быть указан ?

6.Что такое рефакторинг ?

Самостоятельное задание 1.7.

Модифицируйте учебное задание 1.7 следующим образом:

1.Добавьте возможность сохранения максимального счёта в пользовательских настройках (Settings).

2.За более сложные вопросы должно начисляться большее количество очков.

3.Изменить метод Test, так чтобы за быстрый ответ (менее 2-х секунд)

начислялись дополнительные очки.

4.Информация о количестве очков всегда отображается в одном и том же падеже. Изменить программу так, чтобы всегда отображался верный падеж.

Т.е. :« Вы набрали 1 очко», « Вы набрали 2 очка», « Вы набрали 5 очков», « Вы набрали 78 очков» ,« Вы набрали 1001 очко» и.т.д.

Урок 7: Рекурсивные функции (методы).

Основная цель урока.

1.Познакомиться со строковыми и целочисленными типами данных.

2.Научиться объявлять переменные, присваивать им значения.

3.Научиться преобразовывать строковые переменные в числовые.

4.Познакомиться с базовыми функциями ввода\вывода в консольных приложениях

Краткая справка.

Рекурсия — процесс повторения чего-либо самоподобным способом.

В программировании рекурсия — вызов функции (процедуры) из неё же самой,

непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция A вызывает функцию B, а функция B —

функцию A. Количество вложенных вызовов функции или процедуры называется

глубиной рекурсии.

Учебное задание 1.8.

Создать приложение имитирующее регистрацию абитуриента в системе и подсчитывающее сумму баллов за 3 предмета.

Технология выполнения учебного задания 1.2.

Шаг 1. Создайте проект нового консольного приложения, назовите его Lab12.

Шаг 2. Откройте файл Program.cs, дважды кликнув по нему в окне « Обозреватель решений».

Шаг 3. Для начала, запросим имя пользователя и поприветствуем его. Для того чтобы получить имя пользователя, воспользуемся методом Console.ReadLine().

Метод Console.ReadLine() считывает строку символов из консоли (до нажатия Enter).

Введите код, приведённый в листинге 2.

static void Main(string[] args)

{

string name; // Объявляем строковую переменную Console.WriteLine("Как вас зовут ?");

name = Console.ReadLine();// присваиваем значение переменной name Console.WriteLine("Здравствуйте, " + name + " !"); Console.ReadKey();

}

Листинг 2.

Шаг 4. Запустите программу, нажав F5. Введите ваше имя и нажмите [Enter].

Шаг 5. Обратите внимание на строчку

Console.WriteLine("Здравствуйте, " + name + " !");

Здесь выводится на экран объединение (конкатенация) 3-х строк: строки

“Здравствуйте, ”, строки хранящейся в переменной name и строки “ !”. Переменная name обязательно должна быть написана без кавычек, иначе мы получим на экране вместо фактически введённого имени пользователя просто “ Здравствуйте, name !”.

В некоторых случаях без конкатенации строк не обойтись, но когда нужно вывести только отформатированную строку – большое количество знаков + и “ может сильно запутать, поэтому следует использовать следующую запись:

Console.WriteLine("Здравствуйте, {0} !",name);

В таком виде строка выглядит более наглядно – сначала задаётся её формат, а

затем следуют перечисления переменных, которые будет подставлены в эту строку.

Первая переменная должна быть обозначена как {0}, вторая {1} и.т.д.

Измените приветствие пользователя в соответствии с вышеприведённым форматом.

Шаг 6. Теперь необходимо запросить баллы по трём предметам. Попробуем это сделать следующим образом:

static void Main(string[] args)

{

string name; // Объявляем строковую переменную Console.WriteLine("Как вас зовут ?");

name = Console.ReadLine();// присваиваем значение переменной name Console.WriteLine("Здравствуйте, " + name + " !");

Console.Write("Введите баллы по русскому языку:"); //сохраняем в переменной rus баллы по русскому string rus = Console.ReadLine(); Console.Write("Введите баллы по математике:"); //сохраняем в переменной mat баллы по математике string mat = Console.ReadLine(); Console.Write("Введите баллы по обществознанию:"); //сохраняем в переменной obs баллы по обществознанию string obs = Console.ReadLine();

Console.WriteLine("{0}, cумма баллов равна {1}",name, rus + mat + obs); Console.ReadKey();

}

Листинг 3.

Обратите внимание на строчку

Console.WriteLine("{0}, cумма баллов равна {1}",name, rus + mat + obs);

Здесь, мы выводим сразу несколько переменных для вывода. Мы обращаемся к пользователю по имени (name) и затем выводим сумму баллов (rus+mat+obs).

Запустите программу, нажав F5.

Шаг 7. Программа работает, однако сумму баллов выводит неверно, вместо выполнения арифметической операции сложения, выполняется операция

Соседние файлы в папке Методичка (1 сем)