
- •Технология программирования итерационных циклов
- •Итерационные циклы с точным решением
- •Физические задачи
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Составление алгоритма решения
- •Программирование задачи
- •Итерационные циклы с приближенным решением
- •Задача вычисления произведений Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Задача о последовательном делении Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
- •Технология программирования смешанных процессов
- •Вычисление накоплений
- •Вычисление сумм в цикле
- •Суммы элементов одномерных массивов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении полиномов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении степенных рядов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление произведений в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление разностей в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление частных в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск экстремальных значений
- •Поиск наибольшего (глобального) значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск наименьшего значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
Программирование задачи
Идентификация переменных представлена в табл. 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 |
– процент отчислений |
4 |
– размер массивов |
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 |
– процент отчислений |
4 |
– размер массивов |
536 51.8 |
– масса и цена первой партии |
304 52 |
– масса и цена второй партии |
120 84.3 |
– масса и цена третьей партии |
22 177.8 |
– масса и цена четвертой партии |
Результаты решения по каждому из вариантов представлены в приложении 8.1 (а, б).
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой. Ввод процента отчислений и размера массивов планируем в однострочные поля редактирования (EditPr, EditN). Ввод массы и цены партии – в многострочные поля редактирования (EditMi, EditCi) Вывод номера и расчетных значений стоимости и прибыли планируем в поля-списки (ListBoxN, ListBoxSp, ListBoxOsp). Вывод прибыли фабрики – в однострочное поле редактирования (EditPf).
ListBoxN
ListBoxSp
ListBoxOsp
Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним программирование задачи.
Программа решения задачи по схеме алгоритма (рис. 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 |
– процент отчислений |
4 |
– размер массивов |
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 |
– процент отчислений |
4 |
– размер массивов |
536 51.8 |
– масса и цена первой партии |
304 52 |
– масса и цена второй партии |
120 84.3 |
– масса и цена третьей партии |
22 177.8 |
– масса и цена четвертой партии |
В программах использованы различные варианты описания размеров массивов. В первой (третьей) дано описание увеличенного размера массивов напрямую, во второй (четвертой) – посредством подставляющей директивы препроцессора #define с макроопределением N = 20. Это позволяет использовать в качестве фактического размера переменную n, что делает программу универсальной, т.е. пригодной для работы с любым размером, не превышающим заданный, напрямую (20), либо через директиву #define N = 20.
Результаты решения по каждому из вариантов представлены в приложении 8.2 (а, б).