Составление алгоритма решения. Предложенная методика нахождения максимума в цикле реализована в структурированном алгоритме

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

Блоки 9-14 представляют собой внешний цикл расчёта текущих значений функции. Блоки 11 и 12 – ветвление внутри цикла, для последовательного нахождения максимума.

Программирование задачи

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

Идентификация переменных представлена в табл. 8.7.

Таблица 8.7

Обозначение в алгоритме xн xк Dx xi i yi ymax
Обозначение в программе xn xk dx xi i yi ymax

Составление алгоритма решения. Предложенная методика нахождения максимума в цикле реализована в структурированном алгоритме - student2.ru

Рис. 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.

Программирование задачи с графическим интерфейсом

Программирование задачи при использовании графического интерфейса предварим его разработкой.

ListBoxХi
ListBoxYi
ListBoxMax
Составление алгоритма решения. Предложенная методика нахождения максимума в цикле реализована в структурированном алгоритме - student2.ru

Для ввода начального и конечного значений сигнала и шага его изменения планируем однострочные поля редактирования (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.

Наши рекомендации