Доходы Расходы

Кон

Кцикл

Кесли

Чтение (тов, с, т)

Цикл

Нач

вывод («список товаров») список товаров

вывод («товар цена кол-во») товар цена кол-во

s :=0; k = 0 s0 =0 [k = 0]

при тов = «» выход

k:=k+1 [k= 1,2,...,N]

вывод (тов, с, т) { <тов> <с> <m> }*

s := s + с×тsk = sk-1 + ck×mk

если k =1 то при k = 1

тах := c×m max1 = c1×m1

ТовМах := тов ToвMaх1 = тов1

uнес c×m > тах то при сk×mk > mах

тах := с×т mахk = сk×mk

ТовМах := тов ТовМахk = товk

вывод («сумма=», s) cуммa = <sN>

вывод («Максимум») Максимум

вывод (ТовМах, тах) <ToвMaxN> <maxN>

 

Из расмотренных примеров следует, что правильность алгоритмов и программ зависит прежде всего от правильности выбранных методов решения. Составление соответствующих им алгоритмов и программ сводится к решению технических проблем.

Можно утверждать, что правильные алгоритмы и программы - это корректная реализацияправильных методов решения. Ошибки в выбранных методах решения носят не алгоритмический, а принципиальный характер и их следует искать не с помощью отладки программ на ЭВМ, а исследованием самих методов.

Рассмотрим самую популярную экономическую задачу -расчет семейного бюджета в целях анализа достатка семьи. Напомним, что достаток семьи - это остаток от разности доходов и расходов:

 

достаток = доходы - расходы.

 

Допустим, что данные о семейном бюджете представлены двумя таблицами: - таблицей доходов и таблицей расходов:

папа питание
мама одежда
брат транспорт
я отдых
    разное

 

Приведем точную постановку задачи и опишем метод ее реше­ния.

Постановка задачиМетод решения

Определение достатка семьи.

Дано: S = Sd - Sr

D = (дох1, ..., дох N) - доходы, Sd = сN

R = (расх1, ..., расхМ) - расходы, сk = сk-1 + dk

где дох = (имя, d), [k = (1...N)]

расх = (стат, r). с0 = 0

Треб.: S - достаток семьи. Sr = bM

Где: bi = bi-1 + ri

S = Sum (d1, …, dN) - Sum (r1, .... rM). [i = (1 ... M)]

При: N, M > 0. b0 = 0

 

Для решения задачи на ЭВМ в качестве представления данных примем два списка операторовdata, а для организации вывода ре­зультирующих данных - следующий сценарий.

СценарийПредставление данных

Подсчет достатка 'doch: ' доходы

Доходы семьи:data «папа», 300000

<имяk> <dk> *data «мама», 120000

... ... data «брат», 200000

Доходов = <Sd>data «», 0

Расходы семьи:

<статk> <rk>* rash: ' расходы

... ... data «питание», 200000

Расходов = <Sd>data «одежда», 120000

Достаток = <S>data «транспорт», 60000

data «», 0

 

Приведем соответствующие этому сценарию и выбранному методу представления данных алгоритмы и программу на Бейсике:

 

алг «достаток семьи» 'достаток семьи

нач cls

вывод («Подсчет достатка») ? «Подсчет достатка»

вывод («Доходы семьи:») ? «Доходы семьи:»

подсчет_доходов gosub dchs 'доходы

вывод («Доходов=», Sd) ? «Доходов=», Sd

вывод («Расходы семьи:») ? «Расходы семьи:»

подсчет_расходов gosub rashs 'расходы

вывод («Расходов =», Sr) ? «Расходов=», Sr

S := Sd - Sr S = Sd - Sr

вывод («Достаток=», S) ? «Достаток=», S

кон end

 

алг «подсчет доходов» dchs: 'подсчет доходов»

нач '

загрузка_доходов restore doch 'доходы

Sd := 0 Sd = 0

цикл do

чтение (имя, d) read nam$, d

при имя = «» вых if nam$ = «» then exit do

вывод (имя, d) ? nam$, d

Sd = Sd + d Sd = Sd + d

кцикл loop

кон return

 

алг «подсчет расходов» rashs ' подсчет расходов

нач '

загрузка_расходов restore rach 'расходы

Sr := 0Sr = 0

цикл do

чтение (стат, r) read stat$, r

при стат = «» вых if st$ = «» then exit do

вывод (стат, r) ? st$, r

Sr = Sr + r Sr = Sr + r

кцикл loop

кон return

Правильность составленного комплекса алгоритмов и программы расчета достатка семьи можно проверить по описанию результатов их выполнения:

«достаток семьи»«подсчет доходов»«подсчет расходов»

Подсчет достатка

Доходы семьи: Sd0 = 0 [k = 0] Sr0 = 0 [i = 0]

<подсчет_доходов>

Доходов = <Sd>

Расходы семьи: [k =(1...N)] [i =(1...M)]

<подсчет_расходов> <имяk> <dk> <статi> <ri>

Расходов = < Sr> Sdk = Sd/k-l/+dk Sri == Sri-1 + ri

{ S = Sd - Sr

Достаток = <S>

 

Для обоснования правильности всего комплекса алгоритмов и программы в целом необходимо показать правильность каждого из вспомогательных алгоритмов: «подсчет доходов» и «подсчет расходов».

Для первого алгоритма для первых шагов вычисления получаем:

 

Sd0 = 0,

Sd1 = Sd0 + d1 = d1,

Sd2 = Sd1 + d2 = d1 + d2.

 

Для последующих шагов можно заключить, что

 

Sdk = Sdk-1 + dk = d1 + d2 + ... + dk-1 + dk.

 

Это доказывается с помощью математической индукции. В силу этого утверждения окончательным результатом вычислений станет сумма доходов

 

SdN = d1 + d2 + ... + dN-1 + dN.

 

Следовательно, алгоритм подсчета доходов правильный.

Для второго алгоритма подсчета расходов получаются аналогич­ные оценки:

 

Sr0 = 0,

Sr1 = Sr0 + r1 = r1,

Sr2 = Sr1 + r2 = r1 + r2,

 

и для последующих шагов вычислений:

 

Sri = Sri-1 + ri = r1 + r2 +... + ri-1+ ri.

 

Это доказывается также с помощью математической индукции. На основании этого утверждения можно сделать заключение о ко­нечном результате выполнения алгоритма:

 

SrM = r1 + r2 + ... + rM-1+ rM.

 

Следовательно, алгоритм подсчет расходов правильный. Но в основном алгоритме содержится единственная расчетная формула

 

S = Sd - Sr.

 

В силу доказанных утверждений о результатах выполнения алго­ритмов «подсчета доходов» и «подсчета расходов» конечным резуль­татом вычислений станет величина

 

S = Sd - Sr = (d1 + d2 + ... + dN) - (r1 + r2 + ... + rM).

 

Что и требовалось доказать. Следовательно, весь комплекс алго­ритмов и программа в целом правильны.