Краткая характеристика объекта изучения

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

В языке Си существует три разновидности операторов цикла.

1. Цикл с предусловием имеет формат:

while(<выражение_условие>) <оператор>

<выражение_условие> - значение этого выражения может быть любого типа языка Си, заменяющего логический (целый, вещественный, указатель), значение условия считается истинным, если оно отлично от нуля, при этом выполняется тело цикла, телом цикла может быть составной оператор или блок. Фрагмент схемы алгоритма с циклом с предусловием представлен на рисунке 2.

Тело цикла -оператор
Условие
Истинно
Ложно

Рисунок 2 – Фрагмент схемы алгоритма с циклом с предусловием

 

2. Цикл с постусловием имеет формат:

do <оператор> while(<выражение_условие>);

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

Фрагмент схемы алгоритма с циклом с постусловием представлен на рисунке 3.

Тело цикла -оператор
Условие
Истинно
Ложно

Рисунок 3 – Фрагмент схемы алгоритма с циклом с постусловием

 

3. Цикл for имеет формат:

for([<инициализаторы>];[<выражение_условие>]; [<модификации>]) <оператор>

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

<выражение_условие> определяет условия продолжения цикла, задается аналогично, как в предыдущих видах циклов.

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

Телом цикла может быть простой оператор, составной оператор или блок. Фрагмент схемы алгоритма с циклом for представлен на рисунке 4.

Ложно
Инициализаторы
Условие
Истинно
Тело цикла -оператор
Модификации

Рисунок 4 – Фрагмент схемы алгоритма с циклом for

 

Все три элемента в заголовке цикла могут отсутствовать (или некоторые из них), но наличие «;» обязательно. Если выражение условие отсутствует, то считается, что оно всегда истинно.

Пример циклов for:

for( ; ; ) { …} // Бесконечный цикл

for(int i=0; i<100; i++) { … }

for(int i=0, j=20; i<j; i++, j--) { … }

for(int i=0; i<20; i+=2) { … }

Задачи и порядок выполнения работы

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

 

Примеры выполнения работы

Пример 1

Условие задачи:

Вычислить сумму ряда

c точностью x=10-2, 10-4. Точное значение равно ln 2 (использовать для проверки).

Для решения задачи в среде Microsoft Visual Studio 2013 было создано стандартное консольное приложение (проект типа Win32 Console Application) с установленным свойством «пустой проект» (Empty project). В проект добавлен файл с расширением .cpp, исходный код которого приведен ниже.

Листинг программы с комментариями:

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

void main()

{

double e = 1e-4;

double Sum = 0; // Рассчитываемая сумма

double si; // Очередное слагаемое в сумме

int k = 0; // Индекс

int sign = 1; // Знак слагаемого значение или 1 или -1

// (или -1 в степени)

do

{

k++; // Номер слагаемого (итерации)

si = 1. / k; // Модуль слагаемого

Sum += sign*si; // Считаем сумму

sign *= -1; // Меняем знак слагаемого

} while (si >= e); // Пока модуль слагаемого >= точности цикл продолжается

printf_s("Sum=%f k=%d ln(2)=%f\n", Sum, k, log(2.));

system("pause"); // Останавливаем программу до нажатия любой клавиши

}

 

В результате выполнения программы в консольное окно будет выведено: Sum=0.693197 k=10001 ln(2)=0.693147.

Пример 2

Условие задачи:

Сравнить скорость сходимости (число слагаемых для достижения заданной точности x=10-2,…, 10-6) следующего разложения числа π:

.

Для решения задачи в среде Microsoft Visual Studio 2013 было создано стандартное консольное приложение (проект типа Win32 Console Application) с установленным свойством «пустой проект» (Empty project). В проект добавлен файл с расширением .cpp, исходный код которого приведен ниже.

Листинг программы с комментариями:

#include <stdio.h>

#include <stdlib.h>

#define _USE_MATH_DEFINES // Необходимо, чтобы использовать константу M_PI

#include <math.h>

int main(int argc, char* argv[])

{

double sum = 0, e, sl; // Объявляем вещественные переменные

int k = 1, znak = 1; // Объявляем целые переменные (знаменатель и знак)

printf_s("E="); scanf_s("%lf", &e); // Вводим точность

int n = 0; // Счетчик числа повторений цикла

do

{

sl = 4. / k; // Вычисляем очередное слагаемое

sum += sl*znak; // Считаем сумму

k += 2; // Увеличиваем значение знаменателя дроби

znak *= -1; // Меняем знак слагаемого

n++; // Увеличиваем счетчик повторений цикла

} while (sl >= e); // Пока слагаемое >= точности цикл продолжается

printf_s("Sum=%.10f n=%d PI=%.10f\n", sum, n, M_PI); // Вывод результатов

system("pause"); // Останавливаем программу до нажатия любой клавиши

return 0;

}