Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР7-С++-05 апреля-2012.doc
Скачиваний:
19
Добавлен:
15.09.2019
Размер:
2.45 Mб
Скачать

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

do

<тело_цикла>;

while (<выражение-условие>);

Тело цикла выполняется до тех пор, пока <выражение-условие> истинно.

do

{

cin>>a;

s+=a;

}

while(a!=0);

Пример 7.40

Итерационный цикл. Если в формулировке задачи явно или неявно присутствуют условия «пока не будет выполнено» или «до тех пор, пока не выполнено», то число повторений заранее неизвестно, и это итерационный процесс. Содержание тела цикла может быть произвольным. Для организации таких алгоритмов используются, как правило, циклы while … или do … while.

Пример использования цикла, управляемого событием, уже был ранее показан в примерах № 6.18 и 6.27 лабораторной работы № . Еще раз покажем, как использовать цикл do … while для проверки корректности ввода. Если программа дружественна пользователю, то при вводе данных она сначала подскажет, что и как следует вводить, затем выполнит проверку введенных значений, и в случае ошибки будет возвращать пользователя к этапу ввода данных.

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

// Код программы примера № 7.403.

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main (void)

{

float a, b, c; // Длины сторон треугольника.

float S; // Площадь треугольника.

// Цикл проверки корректности введенных данных.

do // Не перейдет к вычислениям, пока не получит корректных данных.

{

printf ("Введите длины сторон треугольника\n");

scanf ("%f%f%f", &a, &b, &c); // Тут может появиться ошибка данных.

}

while (! (a < b + c && b < a + c && c < a + b));

// Данные введены корректно.

float pp;

pp = (a + b + c) / 2.;

S = sqrt (pp*(pp – a)*(pp – b)*(pp – c));

printf ("Площадь треугольника равна: %6.2f\n",S);

} // End of main

Пример 7.41.

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

Сформулируем условие задачи. Мяч брошен вертикально вверх со скоростью V. Требуется построить таблицу зависимости высоты Y от времени t, начиная с момента броска до момента падения мяча на землю, если

где g – константа тяготения, равная 9,8.

При движении мяч сначала взлетает вверх, затем падает. Высота подъема и время полета мяча зависят от начальной скорости броска. Очевидно, что циклом вычисления должна управлять переменная t. Для нее известно начальное значение (t = 0). Шаг изменения можно оценить из физического смысла задачи и выбрать произвольно, например, t = 0.1 сек. Момент завершения вычислений неизвестен в числовом выражении, но известно, что значение высоты сначала будет возрастать, затем убывать, и при падении мяча на землю станет равно нулю: Y <= 0. Величина Y – прямая функция t, значит, в этом условии переменная t присутствует, но неявно. Поскольку в постановке задачи условие завершения звучит «до момента падения», кажется естественным выбрать цикл do.

// Код программы примера 7.41

#include <stdio.h>

#include <conio.h>

#define G 9.8

void main (void)

{

float V, y, t; // Имена переменных имеют физический смысл.

printf ("Введите значение скорости броска\n";

scanf ("%f", &V);

printf ("Таблица зависимости высоты от времени Y(t)\n");

printf ("------------------------------------\n");

printf (" t y(t) \n");

printf ("------------------------------------\n");

// Подготовка цикла. Момент времени t = 0.1

t = 0.1;

do // Выбран цикл do.

{

y = V * t – 0.5*G*t*t;

printf ("\t %6.2f \t %6.2f \n", t, y);

t += 0.1; // Переход на новую итерацию.

} while (y >= 0); // В условии t присутствует неявно.

getch (); // Для того, чтобы держать таблицу на экране.

} // End of main

Замечание. Этот вариант имеет недостаток. Последнее значение таблицы будет отрицательным, потому что точного совпадения координаты y с нулем не будет никогда, а цикл do проверяет условие завершения после печати строки таблицы. Чтобы избежать этой некорректности, следует выбрать цикл while, в котором отчетливо прописать условие завершения цикла: while (V * t – 0.5*G*t* t>= 0).