
- •Технология программирования итерационных циклов
- •Итерационные циклы с точным решением
- •Физические задачи
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Составление алгоритма решения
- •Программирование задачи
- •Итерационные циклы с приближенным решением
- •Задача вычисления произведений Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Задача о последовательном делении Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
- •Технология программирования смешанных процессов
- •Вычисление накоплений
- •Вычисление сумм в цикле
- •Суммы элементов одномерных массивов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении полиномов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении степенных рядов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление произведений в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление разностей в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление частных в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск экстремальных значений
- •Поиск наибольшего (глобального) значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск наименьшего значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
-
Суммы в вычислении полиномов
Второй типовой вариант накопления сумм – вычисление полиномов. Технология предмашинной подготовки задачи свёртывания полиномов представлена конкретной задачей (8.2).
Постановка задачи
Рассчитать значение полинома
P(x) = 5 x6 + 0,8 x5 + 1,7 x4 – 3,2 x3 + 12 x2 – 0,1 x1 + 63
при x = 1,98, предусмотрев возможность использования значений всех промежуточных вычислений.
Формирование математической модели
Представим исходный полином в общем виде, изменив его обозначение на бесскобочное SP (сумма полинома):
SP = а0 x6 + а1 x5 + а2 x4 + а3 x3 + а4 x2 + а5 x + а6
и сформируем основные элементы математической формулировки.
Исходные данные
-
А(n) – массив коэффициентов (n = 7)
а0 = 5 а1 = 0,8 а2 = 1,7 а3 = -3,2 а4 = 12 а5 = 0,1 а6 = 63
x = 1,98
Расчётная зависимость
=
а0 xn
+ а1 xn-1
+ а2 xn-2
+ ... + аi
xn-i +
... + аn-1 x1
+ аn
Выбор метода решения
Характерная особенность полиномов – обозначение индексов коэффициентов от 0 до n, а показателей степеней в обратном порядке от n до 0.
Решение аналогичных полиномов возможно напрямую. Однако более эффективно – проведение предварительных математических преобразований освобождения от показателей степеней по схеме Горнера.
=
((((а0 x + а1) x
+ а2) x + . . . + аi)
x + . . . + аn-1)
x + аn
Полученная запись предписывает вначале вычисление внутренней скобки (а0 x + а1) как суммы SP (начального слагаемого а0 x с текущим а1 при i = 1), а затем повторения вычислений SPi при следующих значениях i.
При этом запись полинома приобретает вид:
Обозначив начальную сумму SPi-1 (при i = 1) как SP0 = a0, получим SP1 = SP0 x + a1 = a0 x + a1. Повторив рассуждения для вычисления SP2, запишем SP2 = SP1 x + a1 = (a0 x + a1) x +a2. Аналогично могут быть получены все остальные текущие значения искомой суммы в рассматриваемой математической интерпретации.
Таким образом, последовательное накопление суммы в этом случае предполагает следующую методику вычислений:
-
формирование (до начала вычислений) значения суммы SP0=a0;
-
вычисление текущих значений суммы SPi последовательным суммированием произведения предыдущего значения суммы на аргумент (SPi-1 x), с текущим значением слагаемого ai;
Формирование текущих значений промежуточных вычислений SPi, в соответствии с требованиями задачи, выполним в виде одномерного массива.
Следовательно, методом решения является смешанный вычислительный процесс – циклический процесс арифметического типа с табличным заданием аргумента (одномерный массив А(n)) при изменении параметра цикла i по закону i = i + 1, дополненный стандартной методикой накопления суммы.
Составление алгоритма решения
Сформированная математическая модель и выбранный метод решения позволяют выполнить одношаговую схему алгоритма (рис. 8.6).
Рис. 8.6. Алгоритм решения задачи 8.2
Для улучшения наглядности организации вычислений элементы дружественности не показаны.
Программирование задачи
Идентификация переменных представлена в табл. 8.2.
Таблица 8.2
Обозначение в алгоритме |
i |
n |
x |
ai |
SPi |
Обозначение в программе |
i |
n |
x |
a[i] |
sp[i] |
С учётом таблицы идентификации на основании схемы алгоритма составлены программы решения задачи.
Классический вариант программирования задачи
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <windows.h>
#define N 20 /* увеличенный размер массивов */
main( )
{
float x, a[N], sp[N];
int i, n;
char buf[50]; /*описание символьного массива*/
clrscr( );
CharToOem(" Введите численные значения n и x: ",buf);
printf("\n %s ",buf);
scanf("%d%f", &n, &x);
for( i=0 ; i<n ; i++ ) /* заголовок цикла ввода */
{
CharToOem(" Введите коэффициент а",buf);
printf("\n %s%i",buf,i);
scanf("%f", &a[i]);
}
printf("\n ---------------------------------"
"\n | i | ai | SPi |"
"\n ---------------------------------");
sp[0] = a[0];
for( i = 1 ; i<=n ; i++ ) /* заголовок цикла расчёта */
{
sp[i] = sp[i-1] * x + a[i];
printf("\n | %2d | %8.2f|%15.1f|", i, a[i], sp[i]);
}
printf("\n ---------------------------------");
CharToOem(" Значение полинома SP =",buf);
printf("\n %s %.2f",buf,sp[n]);
CharToOem(" при n=",buf);
printf(" %s %.d\n",buf,n);
getch();
}
7 1.98
5 0.8 1.7 -3.2 12 0.1 63
Под закрывающей скобкой программы располагаются численные значения исходных данных для решения задачи.
Результаты решения представлены в приложении 8.3.
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой.
ListBoxSP
Для ввода порядка и основания полинома планируем однострочные поля редактирования (EditN, EditX). Для ввода коэффициентов полинома – многострочное поле редактирования (EditAi). Вывод расчетных значений реализуем в поле-список (ListBoxSP).
Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним программирование задачи.
#include<stdio.h>
#include<stdlib.h>
#define N 20 /* увеличенный размер массивов */
…
void TSumprDlgClient::Ok()
{
// INSERT>> Your code here.
float x, a[N], sp[N];
int i, n;
char buf[20]; /*описание символьного массива*/
ListBoxSP->ClearList();
EditN->GetText(buf, 10);
n = atoi(buf); /* ввод значения порядка*/
EditX->GetText(buf,10);
x=atof(buf); /* ввод значения основания полинома*/
for( i=0 ; i<n ; i++ ) /* заголовок цикла ввода */
{
EditAi->GetLine(buf, 20, i);
a[i]=atof(buf); /* ввод значения массы*/
}
sp[0] = a[0];
for( i = 1 ; i<=n ; i++ ) /*заголовок цикла расчёта */
{
sp[i] = sp[i-1] * x + a[i];
sprintf(buf,"%11.1f",sp[i-1]);
ListBoxSP->AddString(buf); /*вывод текущих значений sp*/
}
}
7 1.98
5 0.8 1.7 -3.2 12 0.1 63
Под закрывающей скобкой программы записаны численные значения исходных данных для решения задачи. Результаты решения представлены в приложении 8.4.