Подразделы

Другие разделы

Дата и время

19/04/2024 12:56:29

Авторизация

Имя:
Пароль:
Зарегистрироваться
Восстановить пароль
 

printЗанятие № 2

Если какой-либо фрагмент алгоритма должен быть выполнен многократно, то это циклический алгоритм (цикл).
Циклические алгоритмы можно условно разделить на две группы.
1. Арифметический цикл, у которого заранее известно число повторений.
2. Итерационный цикл, у которого заранее неизвестно число повторений.

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

Можно выделить четыре составные части цикла.
1. Подготовка цикла: присваивание начальных значений переменным, в том числе параметру цикла.
2. Тело цикла: фрагмент, который должен быть повторен многократно.
3. Изменение параметра цикла: как правило, выполняется в теле цикла.
4. Проверка условия завершения цикла: в проверке условия, явно или нет,присутствует параметр цикла.
Не всегда эти составляющие присутствуют явным образом.

Cуществуют три вида операторов цикла, которые одинаково можно использовать для организации любого циклического алгоритма.
while (Условие)
{ //Количество повторений любое.
  Тело цикла
}

do
{ //Количество повторений любое.
  Тело цикла
} while (Условие)

for (объявление параметра цикла)
{ //Количество повторений фиксировано.
  Тело цикла
}

Пример 1:
Алгоритм построения таблиц значений различных функций. Это,
чаще всего, арифметический цикл. Обычно параметром цикла является аргумент функции. Для функции задана формула вычисления значения `y(x)\ =\ F(x)`.
Известны диапазон изменения аргумента `x_0\ ≤\ x\ ≤\ x_n`, и шаг изменения dx.
Общая схема этого алгоритма на основе цикла while (Pascal) выглядит так:
x = x0; // Подготовка цикла.
while x <= xn do // Проверка условия завершения.
begin
  y = F(x); // Сколь угодно сложный алгоритм вычисления значения.
  // Вывод значения таблицы.
  x += dx; // Приращение управляющей переменной.
end; // Выход из цикла.
Общая схема этого алгоритма на основе цикла do … while на языке Pascal выглядит так:
x = x0; // Подготовка цикла.
repeat
  y = F(x); //Сколь угодно сложный алгоритм вычисления значения.
  // Вывод значения таблицы.
  x += sx; // Приращение управляющей переменной.
until (x > xn); // Проверка условия завершения.
Общая схема этого алгоритма на основе цикла for языка Си выглядит так:
for (x = x0; x <= xn; x += dx) // Все составляющие цикла в заголовке.
{
  y = F(x); // Сколь угодно сложный алгоритм вычисления значения.
  // Вывод значения таблицы.
};

В алгоритмах вычисления сумм, произведений, количеств, пределов, последовательностей особенностью является содержание тела цикла.
При вычислении суммы к значению суммы многократно прибавляются новые значения слагаемых.
При вычислении произведения значение многократно умножается на очередной сомножитель.
При вычислении количеств значение счётчика увеличивается на 1.
При вычислении предела или последовательности значение многократно вычисляется на базе предыдущего значения.
Итоговое значение, кроме вычисления последовательностей, чаще единственное, так как все остальные вычисленные значения являются промежуточными.
Управление циклами этого вида выполняется также с использованием
управляющих переменных, которыми фактически служит номер вычисляемого значения (слагаемого, множителя, элемента последовательности).
Если число повторений известно, цикл должен быть арифметическим. В задачах вычисления с указанной точностью цикл должен быть итерационным, так как заранее не
может быть известно число повторений, которое понадобится, чтобы достичь заданной точности.

Пример 2. Вычисление суммы известного числа слагаемых. Пусть
требуется вычислить сумму `N` чисел натурального ряда
`S\ =\ 1\ +\ 2\ +\ 3\ +\ 4\ +\ …\ +\ N`, где `N` – любое наперед заданное число.
Это арифметический цикл, у которого параметром является номер слагаемого,который также определяет и значение очередного слагаемого, включаемого в сумму. Обозначим его буквой n, тогда общая формула тела цикла запишется так:
`S=S+n`
Смысл цикличности в том, что к значению суммы многократно прибавляются новые значения слагаемых, обновляя ее. Число повторений цикла равно числу действий сложения, которое нужно выполнить, чтобы достичь результата.
Номер слагаемого (и его значение) `n` меняется в диапазоне от 1 до `N` с шагом, равным 1.
// Код программы на С.
int main (void)
{
  int n; // Управляющая переменная.
  int S; // Сумма ряда.
  int N; // Число слагаемых, включённое в сумму.
  
  scanf ("%d", &N);
  S = 0; // Инициализация переменной S нулем обязательна.
  n = 1; // К нулю готовимся прибавить первое слагаемое.
  do
  {
    S += n; // Тело цикла.
    n ++; // Приращение параметра цикла.
  } while (n <= N);
  // Печать результата вне цикла.
  printf ("%d", S);
  return 0;
} // End of main
Поскольку данный цикл арифметический, использование оператора цикла do … while не необходимо, но подчёркивает, что любой тип цикла в С++ можно реализовать с помощью любого оператора цикла.

Пример 3.Организация итерационного цикла на примере алгоритма суммирования. Пусть требуется найти сумму прогрессии
`S=1+1/2+1/3+…+1/n+…` c точностью `"eps"` (например, `"eps"`= 0.001).
Количество слагаемых, которое нужно включить в сумму для достижения заданной точности, неизвестно, но известно условие, определяющее точность вычислений.
Предел значения очередного слагаемого стремится к нулю при `n`, стремящемся к бесконечности.
поэтому можно считать, что именно это значение определяет требуемую точность вычислений, и можно закончить вычисления, когда очередное слагаемое настолько мало, что им можно пренебречь. Все переменные должны иметь вещественный тип, так как участвуют в вычислении вещественного значения.
// Код программы на C.
int main (viod)
{
  double S;
  double eps; // Значение точности вычислений.
  double n; // Номер слагаемого, определяет также его значение,
          // изменяется от 1 с шагом 1

  scanf ("%lf", &eps);
  n = 1;
  S = 0; // Входит в подготовку цикла.
  do
  {
    S += 1. / n;
    n += 1;
  } while ( 1. / n >eps); // еps достаточно мало.
  printf("%8.5lf", S);
  return 0;
} // End of main
В рассмотренных примерах циклические алгоритмы суммирования являются простыми. При организации сложных циклов внутренний цикл полностью, от подготовки до завершения должен находиться внутри внешнего.
loading