Опубликован: 15.09.2010 | Доступ: свободный | Студентов: 4808 / 630 | Оценка: 3.97 / 3.80 | Длительность: 14:45:00
Лекция 4:

Простейший ввод-вывод. Управляющие операторы

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

Выражения, блоки и пустые операторы

Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения. Частным случаем выражения является пустой оператор ; (он используется, когда по синтаксису оператор требуется, а по смыслу — нет). Примеры:

i++;               // выполняется операция инкремента
a *= b + c;        // выполняется умножение с присваиванием
fun( i, k );       // выполняется вызов функции
while( true );     // цикл из пустого оператора (бесконечный)

Блок, или составной оператор, — это последовательность описаний и операторов, заключенная в фигурные скобки. Блок воспринимается компилятором как один оператор и может использоваться всюду, где синтаксис требует одного оператора, а алгоритм — нескольких. Блок может содержать один оператор или быть пустым.

Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рис. 4.1.

Структурная схема условного оператора

Рис. 4.1. Структурная схема условного оператора

Формат оператора:

if ( логическое_выражение ) оператор_1; [ else оператор_2; ]

Сначала вычисляется логическое выражение. Если оно имеет значение true, выполняется первый оператор, иначе — второй. После этого управление передается на оператор, следующий за условным. Ветвь else может отсутствовать.

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

Примеры условных операторов:

if ( a < 0 ) b = 1;                                                  // 1
if ( a < b && ( a > d || a == 0 ) ) b++; else { b *= a; a = 0; }     // 2
if ( a < b ) if ( a < c ) m = a; else m = c; 
else         if ( b < c ) m = b; else m = c;                         // 3
if ( b > a ) max = b; else max = a;                                  // 4

Если требуется проверить несколько условий, их объединяют знаками логических условных операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и одно из условий в скобках. Оператор в примере 3 вычисляет наименьшее значение из трех переменных. Обратите внимание, что компилятор относит часть else к ближайшему ключевому слову if.

В качестве примера подсчитаем количество очков после выстрела по мишени, изображенной на рис. 4.2.

Мишень

Рис. 4.2. Мишень

Программист выбирает тип переменных, исходя из их назначения. Координаты выстрела нельзя представить целыми величинами, так как это приведет к потере точности результата, а счетчик очков не имеет смысла описывать как вещественный. Программа приведена в листинге 4.6.

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {            
            Console.WriteLine( "Введите координату x" );
            double x = Convert.ToDouble(Console.ReadLine() );

            Console.WriteLine( "Введите координату у" );
            double y = double.Parse( Console.ReadLine() );

            int kol = 0;
            if      ( x * x + y * y < 1 ) kol = 2;
            else if ( x * x + y * y < 4 ) kol = 1;
            Console.WriteLine( "Результат = {0} очков", kol );
        }
    }
}
Листинг 4.6. Выстрел по мишени

Оператор выбора switch

Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведена на рис. 4.3.

Структурная схема оператора switch

Рис. 4.3. Структурная схема оператора switch

Формат оператора:

switch ( выражение ){
    case константное_выражение_1: [ список_операторов_1 ]
    case константное_выражение_2: [ список_операторов_2 ]
    ...
    case константное_выражение_n: [ список_операторов_n ]
    [ default: операторы ]
}

Выполнение оператора начинается с вычисления выражения. Тип выражения чаще всего целочисленный (включая char ) или строковый. Затем управление передается первому оператору из списка, помеченному константным выражением, значение которого совпало с вычисленным. Если совпадения не произошло, выполняются операторы, расположенные после слова default, а при его отсутствии управление передается следующему за switch оператору.

Каждая ветвь переключателя должна заканчиваться явным оператором перехода, а именно одним из операторов break, goto или return:

  • оператор break выполняет выход из самого внутреннего из объемлющих его операторов switch, for, while и do ;
  • оператор goto выполняет переход на указанную после него метку, обычно это метка case одной из нижележащих ветвей оператора switch ;
  • оператор return выполняет выход из функции, в теле которой он записан.

В листинге 4.7 приведен пример программы, реализующей простейший калькулятор на четыре действия.

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {
            string buf;
            double a, b, res;

            Console.WriteLine( "Введите первый операнд:" );
            a = double.Parse( Console.ReadLine() );
             
            Console.WriteLine( "Введите знак операции" );
            char op = (char)Console.Read();
            Console.ReadLine();
             
            Console.WriteLine( "Введите второй операнд:" );
            b = double.Parse( Console.ReadLine() );

            bool ok = true;
            switch (op)
            {
                case '+' : res = a + b; break;
                case '-' : res = a - b; break;
                case '*' : res = a * b; break;
                case '/' : res = a / b; break;
                default  : res = double.NaN; ok = false; break;
            }
            if (ok) Console.WriteLine( "Результат: " + res );
            else    Console.WriteLine( "Недопустимая операция" );
        }
    }
}
Листинг 4.7. Калькулятор на четыре действия

Операторы цикла и передачи управления

Операторы цикла используются для вычислений, повторяющихся многократно. Блок, ради выполнения которого и организуется цикл, называется телом цикла. Остальные операторы служат для управления процессом повторения вычислений: это начальные установки, проверка условия продолжения цикла и модификация параметра цикла ( рис. 4.4). Один проход цикла называется итерацией.

Структурные схемы операторов цикла

Рис. 4.4. Структурные схемы операторов цикла

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

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

Параметром цикла называется переменная, которая используется при проверке условия продолжения цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла.

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue, return и goto. Передавать управление извне внутрь цикла запрещается.

Цикл с предусловием while

Формат оператора:

while ( выражение ) оператор

Выражение должно быть логического типа. Например, это может быть операция отношения. Если результат вычисления выражения равен true, выполняется простой или составной оператор. Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания цикла управление передается на следующий за ним оператор.

Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение равно false, цикл не выполнится ни разу.

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

\mathbf{X} = 
\left( \begin{array}{l} 
x,x<0 \\
tx,o\leqslant x <10 \\ 
2t,x \geqslant 10
\end{array} \right)

Назовем начальное значение аргумента Xn, конечное значение аргумента — Xk, шаг изменения аргумента — dX и параметр t. Все величины вещественные. Программа должна выводить таблицу, состоящую из двух столбцов: значений аргумента и соответствующих им значений функции.

Текст программы приведен в листинге 4.8.

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {
            double Xn = -2, Xk = 12, dX = 2, t = 2, y;
            Console.WriteLine( "|   x    |    y   |" ); // заголовок таблицы

            double x = Xn;                                  
            while ( x <= Xk )                                
            {
                y = t;                                          
                if ( x >= 0 && x < 10 ) y = t * x;              
                if ( x >= 10 )          y = 2 * t;              
                Console.WriteLine( "| {0,6} | {1,6} |", x, y ); 
                x += dX;                                        
            }
        }
    }
}
Листинг 4.8. Таблица значений функции с использованием цикла while

Цикл с постусловием do

Цикл с постусловием реализует структурную схему, приведенную на рис. 4.4, б, и имеет вид:

do оператор while ( выражение );

Сначала выполняется простой или составной оператор, образующий тело цикла, а затем вычисляется выражение (оно должно иметь тип bool ). Если выражение истинно, тело цикла выполняется еще раз, и проверка повторяется. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.

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

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {
            char answer;
            do
            {
                Console.WriteLine( "Купи слоника, а?" );
                answer = (char) Console.Read();
                Console.ReadLine();
            } while ( answer != 'y' );
        }
    }
}
Листинг 4.9. Проверка ввода

Цикл с параметром for

Цикл с параметром имеет следующий формат:

for ( инициализация; выражение; модификации ) оператор;

Инициализация служит для объявления величин, используемых в цикле, и присвоения им начальных значений. В этой части можно записать несколько операторов, разделенных запятой, например:

for ( int i = 0, j = 20; ...
int k, m;
for ( k = 1, m = 0; ...

Областью действия переменных, объявленных в части инициализации цикла, является цикл. Инициализация выполняется один раз в начале исполнения цикла.

Выражение типа bool определяет условие выполнения цикла: если его результат равен true, цикл выполняется.

Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую, например:

for ( int i = 0, j = 20; i < 5 && j > 10; i++, j-- ) ...

Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!).

Для примера вычислим сумму чисел от 1 до 100:

int s = 0;
for ( int i = 1; i <= 100; i++ ) s += i;

В листинге 4.10 приведена программа, выводящая таблицу значений функции из листинга 4.8.

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {
            double Xn = -2, Xk = 12, dX = 2, t = 2, y;
            Console.WriteLine( "|   x    |    y   |");   // заголовок таблицы

            for ( double x = Xn; x <= Xk; x += dX )          
            {
                y = t;                                       
                if ( x >= 0 && x < 10 ) y = t * x;           
                if ( x >= 10 )          y = 2 * t;           
                Console.WriteLine( "| {0,6} | {1,6} |", x, y );
            }
        }
    }
}
Листинг 4.10. Таблица значений функции с использованием цикла for

Любой цикл while может быть приведен к эквивалентному ему циклу for и наоборот. Например, два следующих цикла эквивалентны:

Цикл for:

for ( b1; b2; b3 ) оператор;

Цикл while:

b1;
while ( b2 )
{
    оператор;
    b3
}

Цикл перебора foreach

Цикл foreach используется для просмотра всех объектов из некоторой группы данных, например, массива, списка или другого контейнера. Он будет рассмотрен в разделе "Оператор foreach".

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Мария Фадейкина
Мария Фадейкина
Россия, г. Екатеринбург