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

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

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

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

В С# есть пять операторов, изменяющих естественный порядок выполнения вычислений:

  • оператор безусловного перехода goto ;
  • оператор выхода из цикла break ;
  • оператор перехода к следующей итерации цикла continue ;
  • оператор возврата из функции return ;
  • оператор генерации исключения throw.

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

Оператор goto

Оператор безусловного перехода goto используется в одной из трех форм:

goto метка;
goto case константное_выражение;
goto default;

В теле той же функции должна присутствовать ровно одна конструкция вида:

метка: оператор;

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

Вторая и третья формы оператора goto используются в теле оператора выбора switch. Оператор goto case константное_выражение передает управление на соответствующую константному выражению ветвь, а оператор goto default — на ветвь default.

Оператор break

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

Для примера рассмотрим программу вычисления значения функции Sin x (синус) с точностью \varepsilon = 10-6 с помощью бесконечного ряда Тейлора по формуле:

y = x - x3/3! + x5/5! - x7/7! +…

Этот ряд сходится при | x | < \infty. Точность достигается при |Rn| < ε, где Rn —остаточный член ряда, который для данного ряда можно заменить величиной Cn очередного члена ряда, прибавляемого к сумме.

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

Для уменьшения количества выполняемых действий следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий: Cn+1 = Cn x T, где T — некоторый множитель. Подставив в эту формулу Cn и Cn+1, получим выражение для вычисления Т:

T=1+\frac {c_{n+1}} {c_n} +\frac {2n!\cdot {x^{2(n+1)}}} {x^{2n}\cdot(2(n+1))!}=\frac {x^2}{(2n+1)(2n+2)}

В листинге 4.11 приведен текст программы с комментариями.

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {
            double e = 10^-6;
            const int MaxIter = 500;     // ограничитель количества итераций
            Console.WriteLine( "Введите аргумент:" );
            double x = Convert.ToDouble( Console.ReadLine() );

            bool done = true;                 // признак достижения точности
            double ch = x, y = ch; 
            for ( int n = 0; Math.Abs(ch) > e; n++ )
            {
                ch *= -x * x / (2 * n + 2 ) / ( 2 * n + 3); // очередной член ряда 
                y += ch;                    // добавление члена ряда к сумме
                if ( n > MaxIter ) { done = false; break; }
            }
            if ( done ) Console.WriteLine( "Сумма ряда - " + y );
            else        Console.WriteLine( "Ряд расходится" );
        }
    }
}
Листинг 4.11. Вычисление суммы бесконечного ряда

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

Оператор continue

Оператор перехода к следующей итерации текущего цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации.

Перепишем основной цикл листинга 4.11 с применением оператора continue:

for ( int n = 0; Math.Abs(ch) > e; n++ )
{
    ch *= x * x / ( 2 * n + 1 ) / ( 2 * n + 2 );
    y += ch;
    if ( n <= MaxIter ) continue;
    done = false; break;

Оператор return

Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Синтаксис оператора:

return [ выражение ];

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

Базовые конструкции структурного программирования

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

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

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

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

Следованием называется конструкция, реализующая последовательное выполнение двух или более операторов (простых или составных). Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия. Цикл реализует многократное выполнение оператора. Базовые конструкции приведены на рис. 4.5.

Базовые конструкции структурного программирования

Рис. 4.5. Базовые конструкции структурного программирования

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

Целью использования базовых конструкций является получение программы простой структуры. Такую программу легко читать, отлаживать и при необходимости вносить в нее изменения. В большинстве языков высокого уровня существует несколько реализаций базовых конструкций; в С# им соответствует четыре вида циклов и два вида ветвлений.

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