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

Математическая модель и выбранный метод решения позволяют выполнить структурированную схему алгоритма. Анализ математической модели показывает возможность различных вариантов построения алгоритма – полного и укороченных (допустимых).

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

Некоторое уменьшение объёма алгоритма при удовлетворительной наглядности возможно за счёт использования двух последовательных циклов. Первый реализует параллельный ввод элементов двух исходных массивов, второй – расчёт сумм (рис. 8.4).

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

Составление алгоритма решения. Математическая модель и выбранный метод решения позволяют выполнить структурированную схему алгоритма - student2.ru

Рис. 8.4. Основной алгоритм решения задачи 8.1

Составление алгоритма решения. Математическая модель и выбранный метод решения позволяют выполнить структурированную схему алгоритма - student2.ru

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

ListBoxOsp
ListBoxN
ListBoxSp
Составление алгоритма решения. Математическая модель и выбранный метод решения позволяют выполнить структурированную схему алгоритма - student2.ru

Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.

С учетом планируемого интерфейса выполним программирование задачи.

Программа решения задачи по схеме алгоритма (рис. 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 (а, б).

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