
- •Технология программирования итерационных циклов
- •Итерационные циклы с точным решением
- •Физические задачи
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Составление алгоритма решения
- •Программирование задачи
- •Итерационные циклы с приближенным решением
- •Задача вычисления произведений Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Задача о последовательном делении Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
- •Технология программирования смешанных процессов
- •Вычисление накоплений
- •Вычисление сумм в цикле
- •Суммы элементов одномерных массивов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении полиномов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении степенных рядов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление произведений в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление разностей в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление частных в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск экстремальных значений
- •Поиск наибольшего (глобального) значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск наименьшего значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
Составление алгоритма решения
Предложенная методика нахождения минимума в цикле реализована в структурированном алгоритме. Первый шаг определяет общую структуру цикла, второй – детализирует ввод и структуру выбора, третий – реализует конечный (рабочий) вариант (рис. 8.14).
Блоки 4-7 осуществляют ввод текущих значений времени, блоки 9-14 – формируют внешний цикл расчёта текущих значений функции, блоки 11 и 12 – предписывают ветвление внутри цикла, для последовательного нахождения минимума.
Рис. 8.14. Алгоритм решения задачи 8.8
Программирование задачи
Для хранения данных в программе используем два одномерных массива – входной Т[n] и выходной Y[n]. Их текущие значения – индексированные переменные (аргумент ti и функция yi), позволяют сохранить все текущие значения для дальнейшего использования (построения переходного процесса).
Записанное в блоке 11 условие реализуем в программе укороченным оператором if.
Идентификация переменных представлена в табл. 8.8.
Таблица 8.8
Обозначение в алгоритме |
n |
i |
ti |
yi |
ymin |
Обозначение в программе |
n |
i |
t[i] |
y[i] |
ymin |
С учётом таблицы идентификации на основании схемы алгоритма составим программы решения задачи.
Классический вариант программирования задачи
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include <windows.h>
main( )
{
float t[15], y[15], ymin; /* описание локальных*/
int i, n; /* переменных */
char buf[50]; /*описание символьного массива*/
clrscr( );
CharToOem(" Введите количество точек расчета: ",buf);
printf("\n %s ",buf);
scanf("%d", &n);
for(i=0;i<n;i++)
{
CharToOem(" Значение времени на шаге расчета №: ",buf);
printf("\n %s %d ",buf,i+1);
scanf("%f", &t[i]);
}
printf("\n --------------------------"
"\n | ti | yi | ymin |"
"\n --------------------------");
ymin = 1.e20;
/* цикл расчёта выходного сигнала и поиска минимума */
for( i = 0 ; i < n ; i++ )
{
y[i] = exp(-0.9*t[i])*(cos( 2.5*t[i] )-1);
if( y[i] < ymin )
ymin = y[i];
printf("\n |%4.2f |%6.4f | %6.4f |",t[i], y[i], ymin);
}
printf("\n --------------------------"
"\n ymin = %.4f \n", ymin);
getch();
}
15
0 0.3 0.5 0.7 1.0 1.3 1.5 1.7 2 2.5 2.8 3.3 4.0 4.5 5
Под закрывающей скобкой программы записаны численные значения исходных данных задачи.
Результаты решения представлены в приложении 8.15.
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой.
Для ввода количества точек расчета планируем однострочное поле редактирования (EditN).
Для ввода текущего времени применим многострочное поле редактирования (EditT).
Вывод текущих расчетных значений сигнала yi, минимального значения сигнала ymin реализуем в поля-списки (ListBoxYi, ListBoxMin).
Вывод итогового минимального значения сигнала ymin – в статическое поле (PoleMin).
Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
ListBoxYi
ListBoxMin
С учетом планируемого интерфейса выполним программирование задачи.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
…
void TSumprDlgClient::Ok()
{
// INSERT>> Your code here.
float t[15], y[15], ymin; /* описание локальных */
int i, n; /* переменных */
char buf[20]; /*описание символьного массива*/
ListBoxYi->ClearList(); /*очистка полей*/
ListBoxMin->ClearList(); /*вывода*/
EditN->GetText(buf, 10); /*ввод количества*/
n = atoi(buf); /* точек расчета*/
for(i=0;i<n;i++)
{
EditT->GetLine(buf, 20, i); /* ввод */
t[i]=atof(buf); /* значения времени*/
}
ymin = 1.e20; /*задание начального значения ymin*/
/* цикл расчёта выходного сигнала и поиска минимума */
for( i = 0 ; i < n ; i++ )
{
y[i] = exp(-0.9*t[i])*(cos( 2.5*t[i] )-1);
if( y[i] < ymin )
ymin = y[i];
sprintf(buf,"%11.6f",y[i]); /* вывод текущих*/
ListBoxYi->AddString(buf); /*значений yi*/
sprintf(buf,"%11.6f",ymin); /* вывод текущих*/
ListBoxMin->AddString(buf); /*значений ymin*/
}
sprintf(buf,"%s %11.6f","Минимальное значение yi", ymin);
/* вывод минимального*/
PoleMin->SetText(buf); /*значения сигнала yi*/
}
15
0 0.3 0.5 0.7 1.0 1.3 1.5 1.7 2 2.5 2.8 3.3 4.0 4.5 5
Под закрывающей скобкой программы записаны численные значения исходных данных задачи.
Результаты решения представлены в приложении 8.16.
-
Внимание! Рассмотренные универсальные методики получения наибольших (наименьших) в цикле позволяют находить максимальное (минимальное) значение любой изменяющейся переменной в циклических процессах всех классов и типов.
Поиск локальных экстремальных значений не рассматривается.