
ММЛекция3-А.ppt
- Количество слайдов: 21
Лекция 3 Разветвления. Циклы и разветвления. Ввод данных 1. 2. 3. 4. Операторы ввода-вывода. Вывод по формату Организация разветвлений. Условный оператор. Циклы с разветвлением Организация обработки потока данных
1. Ввод-вывод данных Ввод данных осуществляется следующим образом: из входного потока при помощи метода Read. Line (класса Сonsole) считывается строка символов. Ее значение присваивается какой-либо переменной типа string. Далее это символьное значение при помощи метода Parse, который есть у каждого встроенного типа, преобразуется в числовую форму представления соответствующего типа (для типа double: double. Parse или для типа int: int. Parse). В случае ошибочного указания типа будет выдано сообщение об ошибке. Например, для типа int: int a; string s = Console. Read. Line(); a = int. Parse(s); Console. Write. Line(a); В окне Локальные отображаются локальные переменные a и s (имя, значение, тип), после выполнения приведенного фрагмента кода.
При вводе строки символов в переменную символьного типа (типа string) никакого преобразования не требуется. Например: string s = Console. Read. Line(); int i = int. Parse(s); Console. Write. Line ("i= {0: d}", i); string g = Console. Read. Line(); Console. Write. Line ("g= {0}", g); Здесь предполагается вывод с использованием формата. Для ввода значения числовой переменной можно также использовать одну строку int i = int. Parse(Console. Read. Line()); Если на клавиатуре набрать, например, 7 (7 появляется на экране) и нажать клавишу [Enter], то переменная i получит значение 7. Это значение далее выводится на консоль (экран). При этом производится перевод строки. Далее в соответствии с приведенным кодом следует набрать строку символов (строка появится на экране) и нажать клавишу [Enter]. Введенная последовательность символов будет присвоена переменной g и следующим оператором выведена на консоль. При вводе чисел с дробной частью для отделения дробной части используется запятая.
• Можно в одной строке разместить значения нескольких переменных, разделив их, например, пробелами. В этом случае требуется так называемый разбор строки (метод Split) с целью извлечения цепочек символов между пробелами. Такой способ ввода используется при работе с массивами.
Вывод данных осуществляется с использованием метода Write. Line (или Write) (класса Сonsole). После выполнения Write. Line производится перевод строки и последующий вывод происходит в новую строку. После выполнения Write перевода строки не происходит. Вывод будет продолжен в текущую строку. Вывод может быть организован с использованием формата. В этом случае оператор вывода имеет следующий вид Write. Line (["строка формата", ] список вывода); В списке вывода перечисляются через запятую элементы списка. В качестве элементов списка вывода в общем случае могут фигурировать имена переменных, константы или выражения, которые перед выводом должны быть вычислены. В строке формата для каждого выводимого значения в фигурных скобках указывается: номер выводимого элемента n (нумерация начинается с 0); порядок вывода может не совпадать с порядком следования элементов в списке вывода; количество позиций m, в которые должно быть выведено значение элемента списка вывода (необязательный параметр); код форматирования k (необязательный параметр):
• для данных типа int используется код d(D); • для данных типа double: – код f(F) используется для вывода вещественного числа в форме с фиксированной точкой (можно указать также количество цифр после точки (при выводе целая часть от дробной отделяется запятой), например, f 4); – код e(E) для вывода вещественного числа в форме с порядком (можно указать также количество цифр после точки, например, e 3, в целой части выводится всегда одна цифра). Таким образом, для каждого элемента списка имеем {n[, m][: k]}. Кроме того, в строке формата могут содержаться и другие символы, которые обозначают сами себя и выводятся без изменений; наличие в строке символа t аналогично нажатию клавиши Tab (табулирование). При выводе нескольких элементов использование формата обязятельно!
Пример: using System; namespace Console. Application 1 { class Program { static void Main() { double x = 3. 356345, y = 15. 24567; Console. Write. Line("j= {0: d} {2, 8: f 3} {1} {3: e 2}", 3, 8, x, y); } } } Выведено: j=, затем три пробела, далее нулевой элемент списка по формату для целых d без указания размера поля, следующим выводится второй (предпоследний) элемент списка по формату для вещественных чисел в поле размером 8 с тремя цифрами после точки, далее первый элемент списка без указания форматного кода и наконец последний (третий) элемент списка по формату с порядком с двумя цифрами после точки. Обратите внимание, что целая часть от дробной при выводе отделяется запятой.
2. Разветвление • Разветвление – это структура алгоритмов, содержащая две ветви, из которых - в зависимости от условия - будет выполнена только одна. Разветвления организуются при помощи условного оператора if: if (выражение) { Операторы1; } [Else { Операторы2; }] • . . . Если выражение имеет значение true, то выполняются Операторы1, и происходит переход к оператору, следующему за if. Если выражение имеет значение false, то выполняются Операторы2, расположенные после else, и далее выполняется оператор, следующий за условным.
Наличие фигурных скобок не является обязательным, если какая-либо ветвь содержит один оператор, в котором нет объявления переменных. Однако, рекомендуется фигурные скобки использовать всегда, что делает структуру программы более наглядной. Если требуется выполнить более одного оператора после if или после else, то их все обязательно помещают внутри скобок { }. Эти операторы образуют блок. Например, int i = 1, x; if (i <= 10) x = 5; else x = 0; Console. Write. Line(x); int i = 15, x=2, y=3; if (i <= 10) { x = x+5; Console. Write. Line(x); } else { y = y*2; Console. Write. Line(y); }
Обход • Одна из ветвей отсутствует if (выражение) { Операторы; }. . . Если вторая ветвь отсутствует (такая структура называется обход), то во втором случае никаких действий не производится и сразу выполняется оператор, следующий за условным. Если блок (операторы, заключенные в скобки { }) состоит из одного оператора и не содержит описаний переменных, то скобки можно не использовать.
int r = 3, d=7; if (r < 5) d = d*2; Console. Write. Line(d); В языке C# существует упрощенный вариант записи условного оператора, называемый оператором проверки, который можно использовать в выражении. Общий вид оператора проверки (условие) ? значение 1: значение 2; Например, int i = 4>5? 6 : 8; Здесь условие не выполняется (имеет значение false) и переменной i будет присвоено значение 8. При использовании оператора проверки следует помнить о правилах приоритета, т. к. в этом операторе могут использоваться арифметические, логические операторы и операторы отношений.
Пример. Определить, лежит ли точка с координатами x, y внутри или вне круга радиусом r с центром вначале координат. string inside = "точка внутри круга"; string outside = "точка вне круга"; double x, y, r; Console. Write. Line("Введите x"); x = double. Parse(Console. Read. Line()); Console. Write. Line("Введите y"); y = double. Parse(Console. Read. Line()); Console. Write. Line("Введите r"); r = double. Parse(Console. Read. Line()); if (x * x + y * y <= r * r) Console. Write. Line(inside); else Console. Write. Line(outside); Здесь использованы символьные константы inside и outside для размещения соответствующей символьной информации, которая выводится в качестве результата. Метод Parse будет рассмотрен далее
Условный оператор позволяет осуществлять выбор по нескольким условиям, т. е. содержать разветвление внутри блока, например if (условие 1) { Операторы1; } else if (условие 2) { Операторы2; } [else { Операторы3; }] Если истинно условие 1, то выполняются Операторы1 и условный оператор заканчивает работу. Если условие 1 ложно, то проверяется условие 2, и, если оно истинно, то выполняются Операторы2, в противном случае выполняются Операторы3, если присутствует последний else, или конструкция не выполняет никаких действий. Последний else всегда относится к последнему if, для которого еще не было соответствующего else.
Например, int a = -4, x = 0; if (a > 5) x = 1; else if (a > 0 ) x = 2; else x = 3; Console. Write. Line(x); В результате при a = 3 будет x = 2; при a = - 4 будет x = 3. В рассмотренном примере после каждого условия следует один оператор и фигурные скобки необязательны.
Пример. Составить программу для решения квадратного уравнения ax 2 + bx + c = 0. double a, b, c, d, x 1, x 2; Console. Write. Line("Введите a"); a = double. Parse(Console. Read. Line()); Console. Write. Line("Введите b"); b = double. Parse(Console. Read. Line()); Console. Write. Line("Введите c"); c = double. Parse(Console. Read. Line()); d = b * b - 4 * a * c; if (d < 0) Console. Write. Line("Уравнение не имеет решения"); else if (d > 0) { x 1 = (-b + Math. Sqrt(d)) / (2 * a); x 2 = (-b - Math. Sqrt(d)) / (2 * a); Console. Write. Line("Уравнение имеет 2 решения"); Console. Write. Line("{0: f 4} {1: f 4}", x 1, x 2); } else { x 1 = (-b) / (2 * a); Console. Write. Line("Уравнение имеет 1 решение"); Console. Write. Line("{0: f 4}", x 1); }
Циклы с разветвлением Внутри цикла находится условный оператор if. Пример. Вводя координаты (x, y) n точек, определить, сколько из них попадет в круг радиуса r с центром в начале координат. double x, y, r; int i, n, k; Console. Write. Line("Введите количество точек"); n = int. Parse(Console. Read. Line()); Console. Write. Line("Введите радиус"); r = double. Parse(Console. Read. Line()); k = 0; for (i = 1; i <= n; i++) { Console. Write. Line("Введите x"); x = double. Parse(Console. Read. Line()); Console. Write. Line("Введите y"); y = double. Parse(Console. Read. Line()); if (x*x + y*y <= r*r) k++; } Console. Write. Line("В круг попало {0} точек из {1} ", k, n);
3. Составление программ для обработки потока данных Часто требуется обрабатывать одинаковым образом данные, поступающие последовательно друг за другом. Возможны два случая: • количество данных известно до начала выполнения программы. Тогда это значение используется в качестве верхней границы счетчика цикла по счетчику • количество данных заранее неизвестно. В этом случае для окончания ввода используется специальное значение того же типа, что и вводимые данные (признак конца ввода), которое заведомо не может встретиться в потоке данных. Например, если все вводимые числа положительные, то в качестве признака конца может использоваться отрицательное число. При этом если одновременно вводятся несколько данных, то для организации цикла нужно выбрать одно из них (обычно первое), которое будет вводиться отдельно от остальных.
1. Количество данных известно до начала выполнения программы Пример. Определить средний рост учеников класса (в классе n учеников). В цикле будем вводить в переменную r рост очередного ученика и прибавлять его к сумме s. После выхода из цикла разделим суммарный рост на количество учеников (программа составлена для n = 5). double sr, r, s = 0; for (int i = 0; i < 5; i++) { Console. Write. Line("Введите рост ученика"); r = double. Parse(Console. Read. Line()); s = s + r; } sr = s / 5; Console. Write. Line(sr);
• 2. Количество данных неизвестно до начала выполнения программы В этом случае для окончания ввода используется специальное значение того же типа, что и вводимые данные (признак конца ввода) Пример. Определить средний рост 14 -летних подростков, проходящих диспансеризацию (количество заранее неизвестно). Чтобы определить средний рост, будем в цикле вводить в переменную r рост очередного подростка и прибавлять его к сумме s, а количество подростков n увеличивать на 1. После выхода из цикла разделим суммарный рост на количество подростков. Используем цикл do…while, для выхода из цикла будем использовать специальное значение, вводимое в r (например, 0): double sr, r, s = 0; int n = 0; do { Console. Write. Line("Введите рост ученика, для окончания - 0"); r = double. Parse(Console. Read. Line()); if (r == 0) break; s = s + r; n = n + 1; } while (r > 0); sr = s / n; Console. Write. Line(sr);
Одновременно вводятся несколько данных. Для организации цикла нужно выбрать одно из них (обычно первое), которое будет вводиться отдельно от остальных. Пример. Определить средний рост и вес 14 -летних подростков, проходящих диспансеризацию. Для организации цикла будем использовать специальное значение, вводимое в переменную r (рост), и вводить ее отдельно: double sr, swr, r, w, s = 0, sw = 0; int n = 0; do { Console. Write. Line("Введите рост ученика, для окончания 0"); r = double. Parse(Console. Read. Line()); if (r == 0) break; Console. Write. Line("Введите вес ученика"); w = double. Parse(Console. Read. Line()); s = s + r; sw = sw + w; n = n + 1; } while (r > 0); sr = s / n; swr = sw / n; Console. Write. Line("Средний рост {0: f 2} Средний вес {1: f 2}", sr, swr); -
Вопросы для самопроверки 1. Что такое разветвление? Какой оператор используется для организации разветвлений? Обход и его реализация на С#. 2. Организация обработки потока данных, количество которых заранее не известно. Использование специального значения. 3. Особенности организации вывода, если порции данных включают несколько значений.