Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой.
|
|
Для ввода числа магазинов, максимального ассортимента хлебных и кондитерских изделий планируем однострочные поля редактирования (EditN, EditT, EditP). Для ввода количества хлебных изделий и массы кондитерских изделий (в ассортименте) для каждого магазина используем многострочные поля редактирования (EditKil, EditMij).
Вывод текущих количеств хлебных изделий и масс кондитерских изделий (в ассортименте) для каждого магазина, суммарного количества хлебных изделий и суммарной массы кондитерских изделий по каждому магазину реализуем в поля-списки (ListBoxKil, ListBoxMij, ListBoxSK, ListBoxSM). Их расположение задаем так, чтобы значения суммарных количеств (масс) располагались правее соответствующих строк с текущими значениями слагаемых.
Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним программирование задачи.
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define N 20 /* увеличенные */
#define P 30 /* размеры */
#define T 30 /* массивов */
void TSumprDlgClient::Ok()
{
// INSERT>> Your code here.
float m[N][P], sm[N], pk,pm; /* описатели массивов */
int i, j, l, n, t, p,skol[N],k[N][T]; /* и переменных */
char buf[20], buf1[60]=""; /*описание символьного массива*/
ListBoxKil->ClearList();/*очистка поля вывода*/
ListBoxSK->ClearList();/*очистка поля вывода*/
ListBoxMij->ClearList();/*очистка поля вывода*/
ListBoxSM->ClearList();/*очистка поля вывода*/
EditN->GetText(buf, 10); /*ввод количества*/
n = atoi(buf); /* магазинов*/
EditT->GetText(buf, 10); /*ввод макс. ассортим.*/
t = atoi(buf); /* хлебопродуктов*/
EditP->GetText(buf, 10); /*ввод макс. ассортим.*/
p = atoi(buf); /* конд. изделий*/
for(i = 0 ; i < n ; i++ )
{
sm[i]=0.;
skol[i]=0;
}
for( i = 0; i < n; i++)/* заголовок цикла перебора № магазина*/
{
for( l = 0 ; l < t ; l++ )
{
EditKil->GetLine(buf, 20, i*t+l); /* ввод элементов */
k[i][l]=atoi(buf); /* массива K*/
skol[i]= skol[i] +k[i][l];
}
for( j = 0 ; j < p ; j++ )
{
EditMij->GetLine(buf, 20, i*p+j); /*ввод элементов*/
m[i][j]=atof(buf); /* массива M*/
sm[i] =sm[i]+ m[i][j];
}
}
for( i = 0 ; i < n ; i++ ) /*заголовок внешн. цикла вывода kij*/
{
sprintf(buf1," %s "," ");
for( l = 0 ; l < t ; l++ ) /* внутрен. цикл вывода kij */
{
sprintf(buf," %3d ",k[i][l]); /* вывод текущих */
strcat(buf1, buf); /* склеенных */
}
ListBoxKil->AddString(buf1); /*значений kil*/
}
for( i = 0 ; i < n ; i++ ) /*заголовок внешн. цикла вывода mij*/
{
sprintf(buf1," %s "," ");
for( j = 0 ; j < p ; j++ ) /* внутренний цикл вывода mij*/
{
sprintf(buf," %6.2f ",m[i][j]); /* вывод текущих */
strcat(buf1, buf); /* склеенных */
}
ListBoxMij->AddString(buf1); /*значений mij */
}
for( i = 0 ; i < n ; i++ ) /* цикл вывода ski */
{
sprintf(buf," %3d ",skol[i]); /* вывод текущих*/
ListBoxSK->AddString(buf); /*значений ski*/
}
for( i = 0 ; i < n ; i++ ) /* цикл вывода smi */
{
sprintf(buf," %6.2f ",sm[i]); /* вывод текущих*/
ListBoxSM->AddString(buf); /*значений smi*/
}
}
2 5 4 – количество магазинов, ассортименты;
125 138 239 212 92 – количества изделий в первый магазин;
83 65 58 42 34 – количества изделий во второй магазин;
25.9 23.2 38.1 15.4 – массы изделий в первый магазин;
56.2 14.8 56.1 17.8 – массы изделий во второй магазин.
Под закрывающей скобкой приведены исходные данные для решения задачи.
Описатели вводимых массивов показывают, что количество магазинов максимально может быть равно пятнадцати, а ассортимент включать до десяти наименований. В запросах на ввод текущих значений расстояний и масс и при выводе таблицы результатов индексы магазина и продукта увеличены на единицу. Это позволяет перейти от принятой в Cи/Си++ формы обозначения индексов (от 0) к принятой в математике (от 1).
Результаты решения представлены в приложении 9.6.