
- •Технология программирования итерационных циклов
- •Итерационные циклы с точным решением
- •Физические задачи
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Составление алгоритма решения
- •Программирование задачи
- •Итерационные циклы с приближенным решением
- •Задача вычисления произведений Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Задача о последовательном делении Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
- •Технология программирования смешанных процессов
- •Вычисление накоплений
- •Вычисление сумм в цикле
- •Суммы элементов одномерных массивов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении полиномов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Суммы в вычислении степенных рядов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление произведений в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление разностей в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Вычисление частных в цикле
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск экстремальных значений
- •Поиск наибольшего (глобального) значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Поиск наименьшего значения
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
Составление алгоритма решения
Представим алгоритм решения задачи двумя одношаговыми схемами (рис. 7.7). Схема (а) предусматривает хранение всех получаемых значений чисел Фибоначчи в виде одномерного массива, в схеме (б) – хранение значений не предусмотрено.
Программирование задачи
Каждый вариант расчета оформим в виде отдельной функции. Для варианта (а) алгоритма идентификация переменных представлена в табл. 7.2, для варианта (б) – в табл. 7.3.
Таблица 7.2
Обозначение в алгоритме |
i |
fгр |
f0 |
fi |
fi-2 |
fi-1 |
Обозначение в программе |
i |
fgr |
f[0] |
f[ i ] |
f[i-2] |
f[i-1] |
Рис. 7.7 Схемы алгоритмов решения задачи Фибоначчи
Таблица 7.3
Обозначение в алгоритме |
i |
fгр |
f0 |
fi |
fi-2 |
fi-1 |
Обозначение в программе |
i |
fgr |
f0 |
fi |
fi2 |
fi1 |
Программы решения задачи по схемам алгоритма с учетом таблицы идентификации переменных представлены ниже.
Классический вариант программирования задачи
Программа решения по варианту (а)
#include <stdlib.h> /* директивы */
#include <stdio.h> /* препроцессора */
#include <conio.h>
#include <windows.h>
main( ) /* заголовок головной функции */
{
int i, fgr, f[100]; /* описатели переменных и массива */
char buf[50]; /* описатель символьного массива */
CharToOem("\n Введите граничное значение ряда : ",buf);
printf(buf);
scanf("%d", &fgr);
i = 2; /* задание начального значения индекса */
f[0] = 0; /* формирование значения первого члена ряда */
f[1] = 1; /* формирование значения второго члена ряда */
printf("\n ----------------"
"\n | i | fi |"
"\n ----------------");
do
{
f[ i ] = f[ i - 2 ] + f[ i - 1 ]; /* расчет i–го члена ряда */
printf("\n | %3d | %3d |", i - 1, f[ i ]);
i = i +1; /* формирование нового значения номера итерации */
}while( f[ i - 1 ] < fgr ); /*условие выхода их цикла */
printf("\n ----------------\n");
getch();
}
100
Под закрывающей скобкой программы приведено исходное данное для решения задачи.
Программа решения по варианту (б)
#include <stdlib.h> /* директивы */
#include <stdio.h> /* препроцессора */
#include <conio.h>
#include <windows.h>
main( ) /* заголовок головной функции */
{
int fgr, fi, fi1, fi2; /* описатели переменных и массива */
char buf[50]; /* описатель символьного массива */
CharToOem("\n Введите граничное значение ряда : ",buf);
printf(buf);
scanf("%d", &fgr);
fi2 = 0; /* формирование значения первого члена ряда */
fi1 = 1; /* формирование значения второго члена ряда */
printf("\n ------------------------------"
"\n | f(i-2) | f(i-1) | f(i) |"
"\n ------------------------------");
do
{
fi = fi2 + fi1; /* расчет i–го члена ряда */
printf( "\n | %3d | %3d | %3d |", fi2, fi1, fi);
fi2 = fi1; /* формирование новых значений */
fi1 = fi; /* параметров через предыдущие */
}while( fi < fgr ); /*условие выхода их цикла */
printf("\n ------------------------------");
getch();
}
100 – исходное данное для решения задачи.
Результаты решения представлены в приложении 7.3 (варианты а, б).
Программирование задачи с графическим интерфейсом
Программирование задачи при использовании графического интерфейса предварим его разработкой. Для ввода граничного значения ряда планируем поле редактирования (EditFgr). Под вывод расчетных значений используем поле-список (ListBoxFi).
EditFgr ListBoxFi
Управление процессом решения (в двух планируемых вариантах) реализуем тремя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.
С учетом планируемого интерфейса выполним последовательное программирование задачи по каждой схеме. Варианты расчета оформим в виде отдельных функций.
Программа решения по варианту (а)
#include <stdlib.h> /* директивы */
#include <stdio.h> /* препроцессора */
…
void TIter2DlgClient::BNClickedOK() /* заголовок функции */
{
// INSERT>> Your code here.
int i, fgr, f[100]; /* описатели переменных и массива */
char buf[25]; /* описатель символьного массива */
ListBoxFi->ClearList(); /* очистка поля-списка */
EditFgr->GetText(buf,10); /* ввод граничного */
fgr=atoi(buf); /*значения ряда */
i = 2; /* задание начального значения индекса */
f[0] = 0; /* формирование значения первого члена ряда */
f[1] = 1; /* формирование значения второго члена ряда */
do
{
f[i] = f[i-2] + f[i-1]; /* расчет i–го члена ряда */
sprintf(buf,"%3d %5d",i ,f[i]); /* вывод номера итерации */
ListBoxFi->AddString(buf); /* и текущего значения fi*/
i = i +1; /* формирование нового значения номера итерации */
}while( f[i-1] < fgr ); /*условие выхода их цикла */
}
100 – исходное данное
Программа решения по варианту (б)
#include <stdlib.h> /* директивы */
#include <stdio.h> /* препроцессора */
…
void TIter2DlgClient::BNClickedOK2() /* заголовок функции */
{
// INSERT>> Your code here.
int fgr, fi, fi1, fi2; /* описатели переменных */
char buf[25]; /* описатель символьного массива */
ListBoxFi->ClearList(); /* очистка поля-списка */
EditFgr->GetText(buf,10); /* ввод граничного */
fgr=atoi(buf); /*значения ряда */
fi2 = 0; /* формирование значения первого члена ряда */
fi1 = 1; /* формирование значения второго члена ряда */
do
{
fi = fi2 + fi1; /* расчет текущего члена ряда */
sprintf(buf,"%5d %5d %5d ",fi2, fi1, fi);/* вывод текущих */
ListBoxFi->AddString(buf); /* значения fi2, fi1, fi */
fi2 = fi1; /* формирование новых значений */
fi1 = fi; /* параметров через предыдущие */
}while( fi < fgr ); /*условие выхода их цикла */
}
100 – исходное данное
Результаты решения представлены в приложении 7.4 (варианты а, б).