Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Интегрирование Главы 7-8.doc
Скачиваний:
1
Добавлен:
12.11.2018
Размер:
2.29 Mб
Скачать

Составление алгоритма решения

Предложенная методика нахождения минимума в цикле реализована в структурированном алгоритме. Первый шаг определяет общую структуру цикла, второй – детализирует ввод и структуру выбора, третий – реализует конечный (рабочий) вариант (рис. 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.

  • Внимание! Рассмотренные универсальные методики получения наибольших (наименьших) в цикле позволяют находить максимальное (минимальное) значение любой изменяющейся переменной в циклических процессах всех классов и типов.

Поиск локальных экстремальных значений не рассматривается.