Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие_С++_new.docx
Скачиваний:
69
Добавлен:
11.04.2015
Размер:
741.96 Кб
Скачать

Задача 5. Табулирование функции (или кратные циклы)

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

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

Внешний и внутренний циклы могут использовать любой вид операторов цикла (while, do-while, for).

Пример. Алгоритм табулирования функции с двумя пе­ременными

Вычислить значение функции:

z(x, у) = sin x + cos y

при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.

Данный алгоритм реализуется с использованием двойного цикла, в котором х примем за внешнюю переменную цикла, у - за внутреннюю переменную цикла.

#include "stdafx.h"

#include<math.h>

int main()

{

float х, у, z; // описание переменных

printf("x y z(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.1f",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=…

Задача 6. Вычисление сумм последовательностей

Последовательности с заданным числом элементов

Пример 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 раз следующие две операции:

  • добавить к сумме значение очередного элемента;

  • изменить значения переменных z, c и d для вычисления следующего элемента.

#include "stdafx.h"

int main()

{

Начальные значения

float S, z, c, d;

int i;

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;

Запустить цикл, если а ≥0.001

S = 0; z = 1; c = 1; d = 2;

a = 1;

while ( a >= 0.001 )

{

добавить элемент к сумме

a =fabs( c / d);

S = S + z*a;

изменить переменные

z = - z;

c ++;

d = d * 2;

}

printf("Сумма S = %f", S);

return 0;

}

Цикл закончится тогда, когда переменная a (она обозначает модуль очередного элемента последовательности) станет меньше 0.001. Чтобы программа вошла в цикл на первом шаге, в эту переменную надо записать любое значение, большее, чем 0.001.

Очевидно, что если переменная a не будет уменьшаться, то условие в заголовке цикла всегда будет истинно и программа «зациклится».