
- •Технология программирования итерационных циклов
- •Итерационные циклы с точным решением
- •Физические задачи
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Составление алгоритма решения
- •Программирование задачи
- •Итерационные циклы с приближенным решением
- •Задача вычисления произведений Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Задача о последовательном делении Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
- •Технология программирования смешанных процессов
- •Вычисление накоплений
- •Вычисление сумм в цикле
- •Суммы элементов одномерных массивов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении полиномов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении степенных рядов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление произведений в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление разностей в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление частных в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск экстремальных значений
- •Поиск наибольшего (глобального) значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск наименьшего значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
-
Задача о последовательном делении Постановка задачи
Для отрезка с заданными координатами (a, b) методом последовательного деления пополам определить все последующие координаты создаваемых отрезков и их размеры, пока последний будет больше некоторого заданного значения.
Графическая интерпретация задачи определяет три основных варианта решения:
-
перемещением правого конца отрезка (b):
a0 b3 b2 b1 b0
-
перемещением левого конца отрезка (а):
a0 a1 a2 a3 b0
-
перемещением двух концов отрезка (а и b):
a0 a1 a2 a3 b3 b2 b1 b0
До составления математической модели необходимо выбрать требуемый вариант, например первый. Он определяет неизменное значение левого конца а0 и изменяющееся значение правого конца bi.
Уточнение постановки задачи позволяет выполнить следующий этап – формирование математической модели.
Формирование математической модели
Исходные данные
a0 = _ _ , _ _ – координата начала исходного отрезка;
b0 = _ _ , _ _ – координата конца исходного отрезка;
= _ , _ _ _ _ – степень точности.
Расчётные зависимости
–
начальное значение координаты;
–
расчёт текущей координаты;
–
длина i-го отрезка;
–
условие прекращения вычислений.
Выбор метода решения
Анализ полученной математической формулировки позволяет сделать выводы:
-
решение задачи требует многократного вычисления текущего размера отрезка
, однозначно зависящего от текущей величины bi, следовательно, процесс является циклическим, а параметр цикла есть Li;
-
начальное значение параметра
, условие повторения цикла
, невыполнение которого приводит к выходу из него;
-
текущее значение конца отрезка bi определяет текущее значение параметра цикла – длину отрезка Li.
-
закон изменения параметра цикла имеет вид
, при условии рекуррентного изменения конца отрезка
;
-
количество повторений цикла N не может быть определено до начала счёта.
Следовательно, в качестве метода решения необходимо использовать циклический процесс итерационного типа с приближенным результатом.
Составление алгоритма решения
Относительная несложность математической модели позволяет представить алгоритм решения одношаговой схемой (рис. 7.10).
Рис. 7.10. Схема алгоритма задачи о последовательном делении
Программирование задачи
Идентификация переменных в соответствии со схемой алгоритма представлена в табл. 7.6:
Таблица 7.6
Обозначение в алгоритме |
a0 |
b0 |
bi |
bi-1 |
Li |
|
Обозначение в программе |
a0 |
b0 |
bi |
bi1 |
li |
eps |
Программы решения задачи по полученным схемам алгоритма с учетом таблицы идентификации переменных представлены ниже.
Классический вариант программирования задачи
#include <stdlib.h> /* директивы */
#include <stdio.h> /* препроцессора */
#include <conio.h>
#include <windows.h>
main( ) /* заголовок головной функции */
{
float a0, b0, bi, bi1, li, eps; /* описатели переменных */
char buf[50]; /*описание символьного массива*/
CharToOem("Введите a0, b0, eps : ",buf);
printf("\n %s \n",buf);
scanf("%f%f%f", &a0, &b0, &eps);
printf("a0 = %.4f b0 = %.4f eps =%.6f ", a0, b0, eps);
bi1 = b0; /* формирование текущего значения конца отрезка bi*/
printf("\n -------------------------------"
"\n | a0 | bi | li |"
"\n -------------------------------");
do
{
bi = a0 + (bi1 - a0)/2.; /* расчет текущего значения bi*/
li = bi - a0; /* расчет текущей длины отрезка li*/
printf( "\n |%7.4f |%8.5f | %8.5f |", a0, bi, li);
bi1 = bi;
}while( li > eps ); /*условие повторения цикла*/
printf("\n -------------------------------\n");
getch();
}
13.5 29.43 0.01
13.5 29.43 0.001
Две строки численных значений исходных
данных позволяют проверить работоспособность
программы при различных значениях
точности
.
Результаты решения представлены в приложении 7.9 (а, б).
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой. Для ввода значений концов отрезка a0, b0 и степени точности планируем поля редактирования (EditA, EditВ, и EditEps). Для вывода расчетных значений a0, bi, Li – поля-списки (ListBoxА0, ListBoxBi, ListBoxLi).
ListBoxA0
ListBoxBi
ListBoxLi
EditA
EditВ EditEps
Управление процессом решения реализуют две командные кнопки, расположенные в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним программирование задачи.
Программа решения
#include <stdlib.h> /* директивы */
#include <stdio.h> /* препроцессора */
void TIterDlgClient::BNClickedOK() /*заголовок функции*/
{
// INSERT>> Your code here.
float a0, b0, bi, bi1, li, eps; /* описатели переменных */
char buf[25]; /* описатель символьного массива*/
ListBoxA0->ClearList(); /* очистка */
ListBoxBi->ClearList(); /* полей - */
ListBoxLi->ClearList(); /*списков*/
EditA->GetText(buf,10); /* ввод значения */
a0=atof(buf); /* конца отрезка а0*/
EditB->GetText(buf,10); /* ввод значения */
b0=atof(buf); /* конца отрезка b0*/
EditEps->GetText(buf,10); /* ввод значения */
eps=atof(buf); /* точности eps*/
bi1 = b0; /* формирование текущего значения конца отрезка bi*/
do
{
bi = a0 + (bi1 - a0)/2.; /* расчет текущего значения bi*/
li = bi - a0; /* расчет текущей длины отрезка li*/
sprintf(buf,"%5.3f",a0); /* вывод текущего*/
ListBoxA0->AddString(buf); /* значения a0*/
sprintf(buf,"%5.3f",bi); /* вывод текущего*/
ListBoxBi->AddString(buf); /* значения bi*/
sprintf(buf,"%5.3f",li); /* вывод текущего*/
ListBoxLi->AddString(buf); /* значения li*/
bi1 = bi;
}while( li > eps ); /*условие повторения цикла*/
}
13.5 29.43 0.01
13.5 29.43 0.001
Две строки численных значений исходных
данных позволяют проверить работоспособность
программы при различных значениях
точности
.
-
Внимание! Варианты использования итерационных циклов с приближенным решением и дополнительными расчетными компонентами рассмотрены в главе 8.
Результаты решения представлены в приложении 7.10 (а, б).