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

1.3. Программирование произвольных цвп

Программирование произвольных ЦВП основано на использовании оператора for, который допускает возможность в одном цикле последовательно менять значения параметра цикла по различным законам за счет задания соответствующего списка спецификаций

Рассмотрим еще несколько примеров на программирование произвольных

Пример 9.11

Сложные циклы

В сложном цикле типы алгоритмов могут быть произвольными. Оба цикла могут быть одного типа, или внешний цикл может быть итерационным, а внутренний арифметическим, или наоборот.

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

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

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

Дополнительно требуется решить задачу для различных значений стартовой скорости V. Пусть V может изменяться в диапазоне V ∈ [–1;7] c шагом 1. Как видно из постановки задачи, ее решение должно быть повторено многократно по правилам арифметического цикла. Переменная V из простой превращается в управляющую.

Текст примера нужно изменить добавлением к нему управления по переменной V во внешнем цикле, при этом запись внутреннего цикла не изменяется ни в одном символе.

Текст программы примера 9.11

#include <stdio.h>

#include <conio.h>

#define G 9.8

int main ()

{

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

// Управление внешним циклом, параметр V.

for (V = 1; V <=7 ; V += 1.)

{

clrscr ();

cout <<"Таблица зависимости высоты от времени при V= \n" <<V;

cout << "-----------------------------\n";

cout << " t y(t) \n";

cout << "-----------------------------\n";

// Управление внутренним циклом, параметр t.

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

t = 0.1;

while (V * t – 0.5*G*t*t >= 0)

{

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

cout <<"t = " << t << " y = " << y)<< endl;

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

}

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

}

} // End of main

1.4. Использование циклических алгоритмов в решении содержательных задач

Наиболее важным в программировании является подготовительный этап, который называют постановкой задачи, тесно связанный с этапом формализации задачи. От правильного их выполнения во многом зависит время и качество программирования.

Постановка задачи обычно заключается в ее словесном описании. Как известно, на вербальном уровне точное определение модели невозможно, поэтому следующий этап, это формализация, то есть выбор математической или иной модели, адекватно отражающей суть задачи. Точных рекомендаций при выборе модели дать невозможно.

Важным также является выбор структур данных и определение их типов.

До сих пор мы рассматривали уже готовые, формализованные задачи, где математическое описание было дано или лежало на поверхности. Теперь приведем пример неформализованной задачи

Пример 9.12

Червячок ползет по дереву вверх, стартуя со скоростью V м./час. Каждый последующий час движения его скорость падает на 10% от предыдущего значения. Если высота дерева H, то за какое время червячок достигнет вершины, если только это возможно.

Для решения задачи нужно выяснить, прежде всего, что выполняется многократно: бежит время, медленно растет пройденный путь, падает скорость. В задаче все, как в жизни. Очевидно, что управлять этим циклом должна переменная, обозначающая время, так как все три переменные связаны в формуле вычисления пути при заданной скорости S = V · t . Очевидно, что точное условие завершения процесса сформулировать невозможно, поэтому нужно использовать итерационный цикл с условием завершения S < H.

В подготовку цикла входит присваивание начальных значений пути S = 0, скорости V и времени t = 1. Причем, если S и V имеют значения до момента первого вычисления, то t = 1 уже готовится к первой итерации. Для убедительности будем выводить на экран значения пути, пройденного к исходу каждого часа, и значение скорости в каждый час времени.

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

1. Первый вариант завершения цикла, это когда червячок сможет добраться до вершины. Условием завершения является S < H, при этом в теле цикла оператор break отсекает лишнюю итерацию.

2. Второй вариант, это когда червячок не сможет добраться до конца дерева, так как скорость падает очень быстро, а высота большая. Должна быть выполнена проверка условия V > 0 с некоторой степенью точности, так как возможно, что скорость упадет практически до нуля, а до конца дерева останется еще очень долгий путь. Кстати, проверка S < H также выполняется приближенно.

Текст программы примера 9.12

#include <stdio.h>

int main ()

{

float V; // Скорость предыдущего часа и скорость нового часа.

float S; // Путь.

float H; // Высота дерева.

float t; // Время пути.

cout << "Введите высоту дерева и начальную скорость движения\n";

cin >> H >> V;

cout <<" Таблица зависимости пути от времени. \n";

cout <<"---------------------------------\n";

cout << " Время \tПуть \tСкорость \n";

cout << "--------------------------------- \n";

S = 0.;

t = 1.;

while (1) // Бесконечный цикл.

{

S = S + V * t.; // Путь, пройденный за t - тый час:

// S = S + V * t , где t=1.0

if ( S > H )

{

cout << "Я уже почти добрался до вершины.\n ";

break; // Чтобы исключить лишнюю итерацию.

}

if (V <= 0.01)

{

cout << "Я никогда не доберусь до вершины.\n ";

break; // Цикл закончен.

}

cout << " \n" << t << S << V;

V *= 0.9; // Аналог записи V = V * 0.9;

t += 1.;

}

} // End of main