Лекция. Лекция 3. Операторы языка C#
Скачать 339.25 Kb.
|
Глава 3 Операторы языка C# Программа на языке C# состоит из последовательности операторов, каждый из которых определяет законченное описание некоторого действия и заканчивается точкой с запятой. Все операторы можно разделить на четыре группы: операторы следования, операторы ветвления, операторы цикла и операторы перехода. 3.1.Операторы следования Операторы следования выполняются в естественном порядке : начиная с первого до последнего. Любое выражение , завершающееся точкой с запятой , можно рассматривать как оператор следования. Например: ++i; //оператор инкремента x+=y; // оператор сложения с присваиванием Console.WriteLine(x); //вызов метода x= Math.Pow(a,b)+a*b; //вычисление сложного выражения Составной оператор или блок представляет собой последовательность операторов, заключенных в фигурные скобки {}. Блок обладает собственной областью видимости : объявленные внутри блока имена доступны только внутри данного блока или блоков, выраженных в него. Составные операторы применяются в случае , когда правила языка предусматривают наличие только одного оператора , а логика программы требует несколько операторов. Например , тело цикла whileдолжно состоять только из одного оператора. Если заключить несколько операторов в фигурные скобки , то получится блок, который будет рассматриваться компилятором как единый оператор. 3.2.Операторы ветвления Операторы ветвления позволяют изменить порядок выполнения операторов в программе. К операторам ветвления относятся условный оператор if и оператор выбора switch. Условный оператор if Условный оператор if используется для разветвления процесса обработки данных на два направления. Он может иметь одну из форм :сокращенную или полную. Форма сокращенного оператора if: if (B) S; где B-логическое выражение, истинность которого проверяется; S-оператор: простой или составной. При выполнении сокращенной формы оператора if сначала вычисляется выражение B , затем проводится анализ его результата: если B истинно, то выполняется оператор S; если B ложно, то оператор S пропускается. Таким образом , с помощью сокращенной формы оператора if можно либо выполнить оператор S , либо пропустить его. Форма полного оператора if: if (B) s1; else s2; где B- логическое выражение, истинность которого проверяется; S1,S2- оператор: простой или составной. При выполнении полной формы оператора if сначала вычисляется значение выражения B , затем анализируется его результат : если B истинно, то выполняется оператор S1 , а оператор S2 пропускается; если B ложно, то выполняется оператор S2 , а S1 –пропускается. Таким образом, с помощью полной формы оператора if можно выбрать одно из двух альтернативных действий процесса обработки данных. Рассмотрим несколько примеров записи условного оператора if: // Сокращенная форма с простым оператором if(a>0) x=y; //Сокращенная форма с составным оператором if(++i>0) {x=y; y=2*z;} //Полная форма с простым оператором if (a>0|| b<0)x=y; else x=z ; //Полная форма с составными операторами if (i!=j-1) {x=0; y=1;} {x=1; y:=0;} Операторы S1 и S2 могут также являться операторами if . Такие операторы называют вложенными. При этом ключевое слово связывается с ближайшим предыдущем словом if , которое еще не связано ни с одним else . Рассмотрим несколько примеров алгоритмов с использованием вложенных условных операторов. Уровни вложенности обозначены фигурными скобками. Пример 1 Пример 2 Пример 3 Пример 4 Замечание. Так как оператор if допускает наличие только одного оператора действий, то можно записать его без использования блока{} , например, так: if (x<0) y=0; else y=1; Однако предпочтительнее и в этом случае ставить блок, начиная его с новой строки. Это улучшает читабельность программы и значительно сокращает вероятность ошибки при внесении последующих изменений. В нашем случае оператор следует записать так: if (x<0) { y=0; } else { y=1; } Далее будем придерживаться данного правила не только для оператора if , но и для других операторов. Рассмотрим несколько примеров использования оператора if. Пример 1 Найдем наибольшее значение из двух вещественных чисел: static void Main() { Console.Write(“x=”); double x= double.Parse(Console.ReadLine()); Console.Write(“y=”); double y= double.Parse(Console.ReadLine()); double max; if (x>y) { max= x; } else { max = y; } Console.WriteLine(“max={0},max); } Результат работы программы: x y max 0 0 0 1 -1 1 -2 2 2 Задания. 1.Объясните,почему в данном примере не требуется инициализация переменной max. 2.Измените программу так, чтобы вычислялось наименьшее значение из двух вещественных чисел. Замечание. Напомним, что вычислить максимум из двух чисел можно с помощью тернарной операции, а также с помощью метода Max из стандартной библиотеки C# Math, обратившись к данному методу следующим образом Math.Max(x,y). Пример 2. Найдем наибольшее значение из трех вещественных чисел: Static void Main() { Console.Write(“x=”); double x = double.Parse(Console.ReadLine()); Console.Write(“y=”); double y = double.Parse(Console.ReadLine()); Console.Write(“z=”); double z= double.Parse(Console.ReadLine()); double max; if (x > y && x > z) { max = x; } else { if (y >z) { max = y; } else { max= z; } } Console.WriteLine(“max ={0},max); } Результат работы программы: x y z max 0 0 0 0 1 -1 2 2 -2 12 2 12 4 -1 -3 4 Задания 1. Измените программу так, чтобы вычислялось наименьшее значение из трех вещественных чисел. 2.Решите данную задачу, используя методы Math.Max(x,y)/Math.Min(x,y). Оператор выбора switch Оператор выбора switch предназначен для разветвления процесса вычислений по нескольким направлениям. Формат оператора: switch (<выражение>) { case <константное _выражение_1>: [<оператор 1>];<оператор перехода>; case <константное _выражение_2>: [<оператор 2>];<оператор перехода>; … case <константное _выражение_n>: [<оператор n>];<оператор перехода>; [default:<оператор >;] } Замечание. Операторы, записанные в квадратных скобках, являются необязательными элементами в операторе switch. Если они отсутствуют, то могут отсутствовать и соответствующие им операторы перехода. Выражение, стоящее за ключевым словом switch, должно иметь арифметический, символьный, строковый тип или тип указатель. Все константные выражения должные иметь тип, соответствующий или допускающий неявное преобразование к типу выражения, стоящего внутри скобок switch. Ключевое слово case и расположенное после него константное выражение называют также меткой case. Выполнение оператора начинается с вычисления выражения, расположенного за ключевым словом switch. Полученный результат сравнивается с меткой case. Если результат выражения соответствует метке case, то выполняется оператор, стоящий после этой метки , за которым обязательно должен следовать оператор перехода :break, goto и т.д. В случае отсутствия оператора перехода компилятор выдаст сообщении об ошибке. При использовании оператора break происходит выход из switch и управление передает оператору , следующему за switch . Если же используется оператор goto, то управление передается оператору, помеченному меткой, стоящего после goto. Замечания. Оператор перехода goto лучше использовать для перехода по меткам внутри switch , и не использовать его для выхода из оператора switch. Для повышения производительности рекомендуется размещать ветви, вероятность выбора которых является наибольшей, ближе к началу. В этом случае на выбор требуемого варианта будет тратиться меньше времени. Пример. По заданному виду арифметической операции (сложение, вычитание, умножение и деление) и двум операндам вывести на экран результат применения данной операции к операндам. static void Main() { Console.Write(“OPER=”); char oper = char.Parse(Console.ReadLine()); Console.Write(“A=”); double a= double.Parse(Console.ReadLine()); Console.Write(“B=”); double b= double.Parse(Console.ReadLine()); bool ok= true; double res=0 ; switch(oper) { case ‘+’: res= a+b; break;//1 case ‘=’: res = a-b; break; case ‘*’: res= a*b; break; case ‘:’: if (b !=0)// 2 { res= a/b; break; } else { goto default; } default: ok= false; break; } if (ok) { Console.WriteLine(“{0} {1} {2}={3}”, a, oper, b res); } else { Console.WriteLine(“error”); } } Результат выполнения программы: oper x y res + 4 5 9 : 4 0 error % 4 3 error Задания. 1. Замените в строке 1 оператор на оператор и посмотрите, что произойдет, если в качестве операции ввести «+». 2. В условном операторе (см.строку 2) уберите ветку и посмотрите, что произойдет. Дайте этому объяснение. 3. Решите поставленную задачу с использованием вложенных операторов. Если необходимо, чтобы для разных меток выполнялось одно и то же действие, то метки перечисляются через двоеточие. Например : switch (oper) { … case ‘:’ : case ‘/’: //перечисление меток if (b!=0) { res=a/b; break; } else { goto default; } … } 3.3. Операторы цикла Операторы цикла используются для организации многократно повторяющихся вычислений. К операторам цикла относятся : цикл с предусловием while, цикл с постусловием dowhile, цикл с параметром for и цикл перебора foreach. Цикл с предусловием while Оператор цикла while организует выполнение одного оператора(простого или составного) неизвестное заранее число раз. Формат цикла while : while(B) S ; где B-выражение, истинность которого проверяется(условие завершения цикла); S-тело цикла (простой или составной оператор). Перед каждым выполнением тела цикла анализируется значение выражения :, если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия; если значение ложно- цикл завершается и управление передается на оператор, следующий за оператором Если результат выражения окажется ложным при первой проверке, то тело цикла не выполнится ни разу. Отметим , что если внутри цикла не будет оператора (или операторов ), в результате выполнения которых условие на какой-то итерации станет ложным , то произойдет зацикливание, то есть невозможность выхода из цикла. Поэтому внутри тела должны находиться операторы, приводящие к изменению значения выражения так, чтобы цикл мог корректно завершиться. В качестве иллюстрации выполнения циклаwhile рассмотрим программу вывода на экран целых чисел из интервала от 1 до n. static void Main() { Console.Write(“N=”); int n = int.Parse(Console.ReadLine()); int i = 1; while (i<=n) //пока i меньше или равно n { // Выводим i на экран, затем увеличиваем его на 1 Console.Write(“{0}”, i++); //1 } } Результат работы программы: n ответ 10 1 2 3 4 5 6 7 8 9 10 Задания. 1.Измените программу так, чтобы : числа выводились в обратном порядке; выводились только нечетные числа(без использования оператора if). 2.Подумайте, что произойдет, если в строке 1 команду i++,заменить на команду ++i, и почему. 3.Подумайте, что произойдет , если в строке 1 команду i++ , заменить просто на i , и почему. Цикл с постусловием do while Оператор цикла dowhile также организует выполнение одного оператора(простого или составного) неизвестное значение заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла. Формат цикла do while: do S while(B); где B-выражение, истинность которого проверяется(условие завершения цикла); S-тело цикла (простой или составной оператор). Сначала выполняется оператор S , а затем анализируется значение выражения B : если оно истинно, то управление передается оператору S , если ложно- цикл завершается и управление передается на оператор, следующий за условием B . Так как условие B проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз. В операторе , dowhile так же как и в операторе while , возможна ситуация зацикливания в случае, если условие B всегда будет оставаться истинным. В качестве иллюстрации выполнения цикла dowhile рассмотрим программу вывода на экран целых чисел интервала от 1 до n. static void Main() { Console.Write(“N=”); int n =int.Parse(Console.ReadLine()); int i=1; do //Выводим i на экран, затем увеличиваем его на 1 Console.Write(“{0}”,i++); while (I <=n); } Задания. Измените программу так, чтобы: 1. числа выводились в обратном порядке; 2. выводились только четные числа(без использования оператора if). Цикл с параметром for Цикл с параметром имеет следующую структуру: for (<инициализация>;<выражение>;<модификация>) <оператор>; Инициализация используется для объявления и (или) присвоения начального значения величине , используемой в цикле в качестве параметра (счетчика).Областью действия переменной, объявленной в части инициализации цикла, является цикл вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла. Выражение определяет условие выполнения цикла: если его результатом является истина, цикл выполняется. Истинность выражения проверяется перед каждым выполнением тела цикла, таким образом , цикл с параметром реализован как цикл с предусловием. Модификация выполняется после каждой итерации цикла и служит обычно для изменения параметра цикла. Оператор (простой или составной) представляет собой тело цикла. Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запятой, определяющую позицию пропускаемой части, надо оставить. В качестве иллюстрации выполнения цикла for рассмотрим программу вывода на экран целых чисел из интервала от 1 до n. static void Main() { Console.Write(“N=”); int n= int.Parse(Console.ReadLine()); for (int i =1; i<=n; i++); { Console.Write(“{0},}”, i); } } Задания. Измените программу так, чтобы 1) решалась поставленная задача, а блок модификации оказался пустым; 2) выводились квадраты чисел; 3.4 Вложенные циклы Циклы могу быть простыми или вложенными (квадратные циклы, циклы к цикле). Вложенными могут быть циклы любых типов:while, dowhile, for. Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. «Пересечения» циклов не допускается. Рассмотри пример использования вложенных циклов, который позволит вывести на экран числа следующим образом: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 static void Main() { for (int i=1; i <=4; ++i) // внешний цикл отвечает за // количество выводимых строк { // Внутренний цикл отвечает за количество чисел, //выводимых в строке for (int j=1; j<=5; ++j) { Console.Write(“2”); } Console.WriteLine(); } } Задания. 1.Измените программу так, чтобы таблица содержала n строк и m столбцов (значения n и m вводятся с клавиатуры). 2. Измените программу так, чтобы на экран выводилась прямоугольная таблица, в которой n строк, m столбцов, а каждый элемент таблицы равнялся сумме номера строки и номера столбца. Замечание. В языке C# существует еще один оператор цикла foreach. Данный оператор мы рассмотрим , когда приступим к изучение одномерных массивов. |