Предложенная методика нахождения максимума в цикле реализована в структурированном алгоритме. Первый шаг определяет общую структуру цикла, второй – детализирует ввод и структуру выбора, третий – реализует конечный (рабочий) вариант (рис. 8.13).
Блоки 9-14 представляют собой внешний цикл расчёта текущих значений функции. Блоки 11 и 12 – ветвление внутри цикла, для последовательного нахождения максимума.
Программирование задачи
Ввиду того, что хранение промежуточных значений для дальнейшего использования не требуется, используем в программе неиндексированные переменные.
Идентификация переменных представлена в табл. 8.7.
Таблица 8.7
Обозначение в алгоритме | xн | xк | Dx | xi | i | yi | ymax |
Обозначение в программе | xn | xk | dx | xi | i | yi | ymax |
Рис. 8.13. Алгоритм решения задачи 8.7
Записанное в блоке 11 условие требует использования в программе укороченного оператора if.
С учётом таблицы идентификации на основании схемы алгоритма составим программы решения задачи.
Классический вариант программирования задачи
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include <windows.h>
main()
{
float xn, xk, dx, /* описание */
xi, yi, ymax; /* локальных */
int i; /* переменных */
char buf[50]; /*описание символьного массива*/
clrscr();
CharToOem(" Введите начальное значение возмущения: ",buf);
printf("\n %s ",buf);
scanf("%f", &xn);
CharToOem(" Введите конечное значение возмущения: ",buf);
printf("\n %s ",buf);
scanf("%f", &xk);
CharToOem(" Введите шаг изменения возмущ. воздействия:", buf);
printf("\n %s ",buf);
scanf("%f", &dx);
printf("\n --------------------------"
"\n | xi | yi | ymax |"
"\n --------------------------");
ymax = -1.e20;
/* цикл расчёта выходного сигнала и поиска максимума */
for(xi = xn; xi <= xk; xi+=dx)
{
yi = sin(xi);
if(yi > ymax)
ymax = yi;
printf("\n |%5.2f | %4.2f | %4.2f |",xi, yi, ymax);
}
printf("\n --------------------------"
"\n ymax = %.2f \n", ymax);
getch();
}
0.38 1.96 0.11
Под закрывающей скобкой программы записаны численные значения исходных данных задачи.
Результаты решения представлены в приложении 8.13.
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой.
|
|
|
Для ввода начального и конечного значений сигнала и шага его изменения планируем однострочные поля редактирования (EditXn, EditXk, EditDx). Вывод текущих расчетных значений сигналов xi, yi, максимального значения сигнала ymax реализуем в поля-списки (ListBoxXi, ListBoxYi, ListBoxMax). Вывод итогового максимального значения сигнала ymax – в статическое поле (PoleMax).
Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним программирование задачи.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
…
void TSumprDlgClient::Ok()
{
// INSERT>> Your code here.
float xn, xk, dx, /* описание */
xi, yi, ymax; /* локальных */
int i; /* переменных */
char buf[50]; /*описание символьного массива*/
ListBoxXi->ClearList(); /*очистка */
ListBoxYi->ClearList(); /* полей*/
ListBoxMax->ClearList(); /*вывода*/
EditXn->GetText(buf, 10); /*ввод начального*/
xn = atof(buf); /* значения сигнала*/
EditXk->GetText(buf, 10); /*ввод конечного*/
xk = atof(buf); /* значения сигнала*/
EditDx->GetText(buf, 10); /*ввод шага*/
dx = atof(buf); /* изменения сигнала*/
ymax = -1.e20;
/* цикл расчёта выходного сигнала и поиска максимума */
for(xi = xn; xi <= xk; xi+=dx)
{
yi = sin(xi);
if(yi > ymax)
ymax = yi;
sprintf(buf,"%11.3f",xi); /* вывод текущих*/
ListBoxXi->AddString(buf); /*значений xi*/
sprintf(buf,"%11.3f",yi); /* вывод текущих*/
ListBoxYi->AddString(buf); /*значений yi*/
sprintf(buf,"%11.3f",ymax); /* вывод текущих*/
ListBoxMax->AddString(buf); /*значений ymax*/
}
sprintf(buf,"%s %11.3f","Максимальное значение сигнала yi",ymax); /* вывод максимального*/
PoleMax->SetText(buf); /*значения функции*/
}
0.38 1.96 0.11
Под закрывающей скобкой программы записаны численные значения исходных данных задачи.
Результаты решения представлены в приложении 8.14.