Смекни!
smekni.com

Лекции по информатики 2 (стр. 25 из 43)

Справедливость этого утверждения можно доказать по индукции. Допустим, что оно справедливо для (k-l)-ro шага:

Sk-1 = (Z1 + ... + Zk-1)/(k-l).

Тогда из описания метода вычислений очередное k-e значение будет равно

Sk = Sk-1(k-l)/k + Zk/k =

= (Z1 + ... + Zk-1)/(k-l)×(k-l)/k + Zk/k = (Z1 + ... + Zk-1)/k + Zk/k.

Что и требовалось показать. Следовательно, в силу математичес­кой индукции это утверждение справедливо для всех k = 1, 2,..., N. В частности, для последнего шага вычислений при k = N конечным результатом будет

SN= (Z1 + ... + ZN-1)/N+ ZN/N = (Z1 + ... + ZN)/N.

Таким образом, выбранный метод дает правильный результат для любой последовательности величин Z1, Z2, ..., ZN.

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

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

список сотрудников: dan: 'данные сотрудников

{<фам> <должн> <з/плата>}* data «Иванов»,«директор», 300000

{...................} data «Петров»,«менеджер», 240000

средняя з/плата= <Zcpeд> data «Сидорова»,«секретарь», 120000

data «», «», 0

При выбранных сценарии, методе расчета и представлении данных систематическое конструирование приводит к следующим алгоритму и программе.

АлгоритмПрограмма

алг «средняя зарплата»' средняя зарплата

нач cls

вывод («список сотрудников:»)? «список сотрудников:»

s := 0: k := 0s = 0: k = 0

цикл do

чтение (fam$, dl$, zpl) read fam$, dl$, zpl

при fam$ = «» выход if fam$ = «» then exit do

вывод (fam$, dl$, z)? fam$; dl$; z

k :=k + 1 k = k + 1

s :=s*(k - 1)/k +z/k s = s*(k - 1)/k + z/k

кцикл loop

zsr=s zsr = s

вывод («средняя 3/nлama=»,zsr)? «средняя з/плата=»; zsr

кон end

Для полного обоснования отсутствия ошибок в приведенном алгоритме и программе приведем описание результатов их выполне­ния на ЭВМ.

АлгоритмРезультаты выполнения

алг «средняя зарплата»

нач

вывод («список сотрудников:»)список сотрудников:

s := 0: k:= 0S0 = 0 [ k = 0 ]

цикл

чтение (fam$, dl$, z)

при fam$ = «» выход

вывод (fam$, dl$, z) <famk> <dlk> <zk> }*

k:=k+ 1 [ k= (1...N) ]

s := s*(k - 1)/k+ z/k sk = sk - 1×(k - 1)/k + zk/k

кцикл

zsr = s zsr=sN

вывод («средняя з/nлama=»,zsr)средняя з/плата= <zsr>

кон

Сравнение результатов выполнения программы с описанием метода вычисления и выбранного сценария подтверждает их соот­ветствие друг другу и как следствие правильности выбранного метода вычислений - правильность составленных алгоритма и программы расчета средней зарплаты.

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

товар цена кол-во

яблоки 8000 3
бананы 4000 2
арбузы 1000 20

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

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

Определение суммарной

и максимальной стоимости товаров.

Дано:

(D1,..., DN) - данные о товарах,

где D = [Tov, C, M] - состав данных, s0 = 0

Tov - товар, С - цена товара, от k = 1 до N цикл

М - количество товара, sk = sk-1 + СkМk

Треб:если k = 1 то

Sum - суммарная стоимость товаров, mах1 = С11М11

TovMax - товар максимальной инеc СkМk > mахk-1 то

стоимости.

Где:mахk = СkМk

Sum = C1M1 + С2М2 + ... + СNМN, все

TovMax: C×M = Мах(С1М1, ... ,СNМN). кцикл

При: N > 0.

Прежде чем приступить к составлению алгоритмов и программ, убедимся в правильности выбранного способа решения. Для этого проверим результаты на первых шагах, в середине и в конце вычис­лений. На первом шаге при k = 1 результат

s1 = s0 + С1М1 = С1M1,

max1 = С1М1.

На втором шаге вычислений будут получены следующие значе­ния:

s2 = s1 + С2М2 = C1M1 + С2М2,

max2 = С2М2, при С2М2 > max1 = Мах(mах1, С2М2),

max1, при С2М2£ max1= Мах(mах1, С2М2).

На третьем и последующих шагах в общем случае будут получать­ся результаты:

sk = sk-1 + CkMk = C1M1 + … + CkMk,

maxk = Max(maxk-1, СkМk) = Мах(С1М1, ..., СkМk).

Для доказательства этих утверждений необходимо предположить, что они выполняются для случая k-1:

sk-1 =C1M1 +...+ Ck-1Mk-1,

maxk-1 = Max (C1M1, …,Ck-1Mk-1),

и подставить эти выражения в соотношения для sk и mахk:

sk = sk-1 + CkMk = C1M1 + … Ck-1Mk-1 + CkMk,

maxk = Max(maxk-1, СkМk) = Мах(С1М1, ..., СkМk).

В силу математической индукции эти утверждения верны для всех k = 1, 2, ..., N. Поэтому на последнем шаге вычислений при k = N будут получены окончательные результаты:

sN = sN-1 + CNMN = C1M1 + … + CNMN,

maxN = Max(maxN-1, СNМN) = Max(C1M1, ... , СNМN).

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

Для систематичности разработки примем следующий сценарий диалога и представление исходных данных в операторах data.

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

список товаров

товар цена кол-во

<тов1> <с1> <т1> *dan: 'сведения о товарах

… .... ... data яблоки, 8000, 3

сумма = <Sum>data бананы, 4000, 2

Максимумdata арбузы, 1000, 20

<товар> <стоим>data «», 0, 0

Приведем алгоритм и программу решения поставленной задачи в соответствии с выбранным сценарием и представлением данных.

АлгоритмПрограмма

алг «сумма и максимум» ' сумма и максимум

нач сls

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

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

s := 0; k = 0 s = 0: k = 0

цикл do

чтение (тов, с, т) read tv$, с, m

при тов = «» выход if tv$ = «» then exit do

k := k + 1 k = k + 1

вывод (тов, с, т) ? fv$; с; m

s :=s + cm s= s + c(m

если k = 1 то if k = 1 then

max := c×m max = c×m

ToвMax := товТМ$ = tv$

инес c(m > max тоelseif c(m > max then

max := c×mmax = c×m

ToвMax := товTM = tv$

кеслиend if

кциклloop

вывод («cyммa=»,s)? «cyммa=»,s

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

вывод (ToвMax, max)? TM$, max

кон end

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

АлгоритмРезультаты выполнения

алг «сумма и максимум»

нач

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

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

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

цикл

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

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

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

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

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

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

тах :=c×mmax1 = 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>

кон

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