Составление алгоритма решения. Математическая модель и выбранный метод решения позволяют выполнить структурированную схему алгоритма
Математическая модель и выбранный метод решения позволяют выполнить структурированную схему алгоритма. Анализ математической модели показывает возможность различных вариантов построения алгоритма – полного и укороченных (допустимых).
Полный (основной) требует блочной организации циклического ввода исходных данных отдельно по каждому массиву, циклический расчёт текущих значений стоимостей и накопления суммы, расчёт конечной прибыли и её вывод. Реализуется формированием трех последовательно расположенных циклов (два по вводу исходных массивов и третий расчётный). Достоинства такого варианта – максимальная структурированность, высокая информативность. Недостаток – существенное увеличение объёма, приводящее к уменьшению наглядности.
Некоторое уменьшение объёма алгоритма при удовлетворительной наглядности возможно за счёт использования двух последовательных циклов. Первый реализует параллельный ввод элементов двух исходных массивов, второй – расчёт сумм (рис. 8.4).
Наибольшая компактность алгоритма реализации математической модели возможна при одном цикле, выполняющем на каждом шаге ввод требуемой пары текущих значений (мi, цi) и вычисление текущих значений спi и Осп (рис. 8.5).
Рис. 8.4. Основной алгоритм решения задачи 8.1
Рис. 8.5. Допустимый алгоритм решения задачи 8.1
Реализация такого алгоритма классическим способом ухудшает наглядность результатов (см. прил. 8.1.б).
Ввиду отсутствия специальных требований к оформлению промежуточных текущих значений суммы, в алгоритмах использованы варианты формирования с одной переменной (Осп).
На первом шаге каждой схемы выполнен укрупненный вариант алгоритма. На втором шаге организован ввод переменных и массивов и детализированы расчёты текущих значений стоимостей партий, текущего значения общей стоимости и возможной прибыли, на третьем сформирован окончательный вариант алгоритма.
Для улучшения наглядности организации вычислений элементы дружественности не показаны.
Программирование задачи
Идентификация переменных представлена в табл. 8.1.
Таблица 8.1
Обозначение в алгоритме | Пр | n | мi | цi | спi | Осп | ПФ | i |
Обозначение в программе | pr | n | m[i] | c[i] | sp[i] | osp | pf | i |
С учётом таблицы идентификации на основании схем алгоритма составлены программы решения задачи.
Классический вариант программирования задачи
Программа решения по схеме алгоритма (рис. 8.4)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <windows.h>
main( )
{
float pr, m[20], c[20], /* описание */
sp[20], osp, pf; /* локальных */
int i, n; /* переменных и массивов */
char buf[50]; /*описание символьного массива*/
clrscr( );
CharToOem(" Введите процент отчислений Пр (проц.): ",buf);
printf("\n %s ",buf);
scanf("%f", &pr);
CharToOem(" Введите размер массивов (n<=20): ",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%f", &m[i], &c[i]);
}
osp=0.;
printf("\n---------------------------------------------------");
CharToOem("| N | Масса | Цена | Стоимость | Прибыль |", buf);
printf("\n %s ",buf);
CharToOem("|партии| кг | р. | р. | р. |",
buf);
printf("\n %s ",buf);
printf("\n---------------------------------------------------");
for( i=0 ; i<n ; i++ ) /* заголовок цикла расчёта и вывода */
{
sp[i] = m[i] * c[i];
osp += sp[i];
printf("\n | %2d | %6.1f | %5.1f | %9.1f |%11.1f|",
i+1, m[i], c[i], sp[i], osp);
}
printf("\n---------------------------------------------------");
pf = osp * pr / 100.;
CharToOem("Процент прибыли = ",buf);
printf("\n\n\n %s %.1f",buf,pr);
CharToOem("Прибыль фабрики, р. (ПФ)=",buf);
printf("\n\n %s %.1f",buf, pf);
getch();
}
пояснения
18.6 | – процент отчислений |
– размер массивов | |
536 51.8 | – масса и цена первой партии |
304 52 | – масса и цена второй партии |
120 84.3 | – масса и цена третьей партии |
22 177.8 | – масса и цена четвертой партии |
Программа решения задачи по схеме алгоритма (рис. 8.5)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <windows.h>
#define N 20 /* увеличенный размер массивов */
main( )
{
float pr, m[N], c[N], /* описание */
sp[N], osp, pf; /* локальных */
int i, n; /* переменных и массивов */
char buf[50]; /*описание символьного массива*/
clrscr( );
CharToOem(" Введите процент отчислений Пр (проц.): ",buf);
printf("\n %s ",buf);
scanf("%f", &pr);
CharToOem(" Введите размер массивов (n<=20): ",buf);
printf("\n %s ",buf);
scanf("%d", &n); /* ввод фактического размера массивов */
printf("\n---------------------------------------------------");
CharToOem("| N | Масса | Цена | Стоимость | Прибыль |", buf);
printf("\n %s ",buf);
CharToOem("|партии| кг | р. | р. | р. |",
buf);
printf("\n %s ",buf);
printf("\n---------------------------------------------------");
osp=0.;
for( i=0 ; i<n ; i++ ) /* заголовок цикла ввода и расчёта */
{
CharToOem(" Введите массу (кг) и цену (р./кг) партии № ",buf);
printf("\n %s %d",buf,i+1);
scanf("%f%f", &m[i], &c[i]);
sp[i] = m[i] * c[i];
osp += sp[i];
printf("\n | %2d | %6.1f | %5.1f | %9.1f |%11.1f|",
i+1, m[i], c[i], sp[i], osp);
}
printf("\n---------------------------------------------------");
pf = osp * pr / 100.;
CharToOem("Процент прибыли = ",buf);
printf("\n\n\n %s %.1f",buf,pr);
CharToOem("Прибыль фабрики, р. (ПФ)=",buf);
printf("\n\n %s %.1f",buf, pf);
getch();
}
пояснения
18.6 | – процент отчислений |
– размер массивов | |
536 51.8 | – масса и цена первой партии |
304 52 | – масса и цена второй партии |
120 84.3 | – масса и цена третьей партии |
22 177.8 | – масса и цена четвертой партии |
Результаты решения по каждому из вариантов представлены в приложении 8.1 (а, б).
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой. Ввод процента отчислений и размера массивов планируем в однострочные поля редактирования (EditPr, EditN). Ввод массы и цены партии – в многострочные поля редактирования (EditMi, EditCi) Вывод номера и расчетных значений стоимости и прибыли планируем в поля-списки (ListBoxN, ListBoxSp, ListBoxOsp). Вывод прибыли фабрики – в однострочное поле редактирования (EditPf).
|
|
|
Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним программирование задачи.
Программа решения задачи по схеме алгоритма (рис. 8.4)
#include<stdio.h>
#include<stdlib.h>
…
void TSumprDlgClient::Ok()
{
// INSERT>> Your code here.
float pr, m[20], c[20], /* описание */
sp[20], osp, pf; /* локальных */
int i, n; /* переменных и массивов */
char buf[20]; /*описание символьного массива*/
ListBoxN->ClearList();
ListBoxSp->ClearList();
ListBoxOsp->ClearList();
EditPr->GetText(buf,10);
pr=atof(buf);
EditN->GetText(buf,10);
n=atoi(buf);
for( i=0 ; i<n ; i++ ) /*заголовок цикла ввода массивов */
{
EditMi->GetLine(buf, 20, i);
m[i]=atof(buf); /* ввод значения массы*/
EditCi->GetLine(buf, 20, i);
c[i]=atof(buf); /* ввод значения стоимости*/
}
osp=0.;
for( i=0 ; i<n ; i++ ) /* заголовок цикла расчёта и вывода */
{
sp[i] = m[i] * c[i];
osp += sp[i];
sprintf(buf,"%3d",i+1);
ListBoxN->AddString(buf); /* вывод текущих значений i*/
sprintf(buf,"%9.1f",sp[i]);
ListBoxSp->AddString(buf); /*вывод значений sp*/
sprintf(buf,"%11.1f",osp);
ListBoxOsp->AddString(buf); /* вывод значений osp*/
}
pf = osp * pr / 100.;
sprintf(buf,"%5.2f",pf);
EditPf->SetText(buf); /* вывод прибыли фабрики*/
}
пояснения
18.6 | – процент отчислений |
– размер массивов | |
536 51.8 | – масса и цена первой партии |
304 52 | – масса и цена второй партии |
120 84.3 | – масса и цена третьей партии |
22 177.8 | – масса и цена четвертой партии |
Программа решения задачи по схеме алгоритма (рис. 8.5)
#include<stdio.h>
#include<stdlib.h>
#define N 20 /* увеличенный размер массивов */
….
void TSumprDlgClient::Ok()
{
// INSERT>> Your code here.
float pr, m[N], c[N], /* описание */
sp[N], osp, pf; /* локальных */
int i, n; /* переменных и массивов */
char buf[10]; /*описание символьного массива*/
ListBoxN->ClearList();
ListBoxSp->ClearList();
ListBoxOsp->ClearList();
EditPr->GetText(buf,10);
pr=atof(buf);
EditN->GetText(buf,10);
n=atoi(buf);
osp=0.;
for( i=0 ; i<n ; i++ ) /* заголовок цикла ввода исходных*/
/* массивов, расчёта и вывода*/
{
EditMi->GetLine(buf, 10, i);/* ввод */
m[i]=atof(buf); /* значения массы*/
EditCi->GetLine(buf, 10, i); /* ввод */
c[i]=atof(buf); /* значения стоимости*/
sp[i] = m[i] * c[i];
osp += sp[i];
sprintf(buf,"%3d",i+1);
ListBoxN->AddString(buf); /* вывод текущих значений i*/
sprintf(buf,"%9.1f",sp[i]);
ListBoxSp->AddString(buf); /* вывод текущих значений sp*/
sprintf(buf,"%11.1f",osp);
ListBoxOsp->AddString(buf); /* вывод текущих значений osp*/
}
pf = osp * pr / 100.;
sprintf(buf,"%5.2f",pf);
EditPf->SetText(buf); /* вывод прибыли фабрики*/
}
пояснения
18.6 | – процент отчислений |
– размер массивов | |
536 51.8 | – масса и цена первой партии |
304 52 | – масса и цена второй партии |
120 84.3 | – масса и цена третьей партии |
22 177.8 | – масса и цена четвертой партии |
В программах использованы различные варианты описания размеров массивов. В первой (третьей) дано описание увеличенного размера массивов напрямую, во второй (четвертой) – посредством подставляющей директивы препроцессора #define с макроопределением N = 20. Это позволяет использовать в качестве фактического размера переменную n, что делает программу универсальной, т.е. пригодной для работы с любым размером, не превышающим заданный, напрямую (20), либо через директиву #define N = 20.
Результаты решения по каждому из вариантов представлены в приложении 8.2 (а, б).