Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Интегрирование Главы 7-8.doc
Скачиваний:
1
Добавлен:
12.11.2018
Размер:
2.29 Mб
Скачать

Составление алгоритма решения

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