Задача 2. Табулирование функции (или кратные циклы)
Тело цикла может содержать любой оператор, в том числе и другой оператор цикла. Структура цикла, содержащая вложенный цикл, называется кратным циклом. Число вложений может быть произвольным. Если цикл содержит один вложенный цикл, то он называется двойным, если содержит два вложенных цикла, то является тройным и т.д. Цикл, который содержит вложенный цикл, называется внешним. Вложенный цикл называется внутренним.
Переменная внутреннего цикла всегда меняется быстрее, чем внешнего. Это означает, что для каждого значения внешней переменной цикла меняются все значения внутренней переменной.
Внешний и внутренний циклы могут использовать любой вид операторов цикла (while, do-while, for).
Пример. Алгоритм табулирования функции с двумя переменными
Вычислить значение функции:
z ( x , у) = sinx + cosy
при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
Данный алгоритм реализуется с использованием двойного цикла, в котором х примем за параметр внешнего цикла, у - за параметр внутреннего цикла.
#include "stdafx.h"
#include<math.h>
Int main()
{
float х, у, z; // описание переменных
printf("xyz(x,y)\n"); // вывод заголовка
x= -1; // начальное значение параметра внешнего цикла
while (х<=1) // запуск внешнего цикла, если х≤ 1
{
for( y=0; y<=1; y=y+0.1)//запуск внутреннего цикла
{
z=sin(x) + cos(y); // вычисление функции
printf("%6.1f %6.1f z=%6.4f",x, y, z); // вывод
}
x=x + 0.2; // изменение параметра х на шаг
}
return 0;
}
В результате выполнения программы вид таблицы на экране будет следующим:
x | y | z(x,y) |
-1.0 | 0.0 | z=… |
-1.0 | 0.1 | z=… |
… | … | … |
-1.0 | 1.0 | z=… |
-0.8 | 0.0 | z=… |
-0.8 | 1.0 | z=… |
Задача 3. Вычисление сумм элементов последовательностей
Последовательности с заданным числом элементов
Пример 1. Найти сумму первых 20 элементов последовательности
S=1/2 – 2/4 + 3/8 – 4/16+…
Чтобы решить эту задачу, надо определить закономерность в изменении элементов. В данном случае можно заметить:
· Каждый элемент представляет собой дробь.
· Числитель дроби при переходе к следующему элементу возрастает на единицу.
· Знаменатель дроби с каждым шагов увеличивается в 2 раза.
· Знаки перед дробями чередуются (плюс, минус и т.д.).
Любой элемент последовательности можно представить в виде
S=z*c/d
У переменной z меняется знак (эту операцию можно записать в виде z=-z), значение переменной c увеличивается на единицу (c++), а переменная d умножается на 2 (d=d*2).
Алгоритм решения задачи можно записать в виде следующих шагов:
· Записать в переменную S значение 0. В этой ячейке будет накапливаться сумма;
· Записать в переменные z, c и d начальные значения (для первого элемента): z=1, c=1,d=2;
· Сделать 20 раз следующие две операции:
v добавить к сумме значение очередного элемента;
v изменить значения переменных z, c и d для вычисления следующего элемента.
#include "stdafx.h"
int main()
{
float S, z, c, d;
inti;
S = 0; z = 1; c = 1; d = 2;
for ( i = 1; i<= 20; i ++ )
{
S = S + z*c/d;
z = - z;
c++;
d = d * 2;
}
printf("Сумма S = %f", S);
return 0;
}
Суммы с ограничивающим условием
Рассмотрим более сложную задачу, когда количество элементов заранее неизвестно.
Пример 2. Найти сумму всех элементов последовательности
S=1/2 – 2/4 + 3/8 – 4/16+…,
которые по модулю меньше, чем 0.001.
Эта задача имеет решение только тогда, когда элементы последовательности убывают по модулю и стремятся к нулю. Поскольку мы не знаем, сколько элементов войдет в сумму, надо использовать цикл while (или do - while). Один из вариантов решения показан ниже.
#include<math.h>
#include "stdafx.h"
int main()
{
float S, z, c, d, a;
S = 0; z = 1; c = 1; d = 2;
a = 1;
while ( a >= 0.001 )
{
a =abs( c / d);
S = S + z*a;
z = - z;
c ++;
d = d * 2;
}
printf("Сумма S = %f", S);
return 0;
}
Цикл закончится тогда, когда переменная a(она обозначает модуль очередного элемента последовательности) станет меньше 0.001. Чтобы программа вошла в цикл на первом шаге, в эту переменную надо записать любое значение, большее, чем 0.001.
Очевидно, что если переменная a не будет уменьшаться, то условие в заголовке цикла всегда будет истинно и программа «зациклится».
Контрольные вопросы
1. Циклические вычислительные процессы
2. Оператор цикла while
3. Оператор цикла do...while
4. Оператор цикла с параметром