Смекни!
smekni.com

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

Таким образом, после третьего шага при k = 3 первые три значе­ния последовательности х1', x2', x3' будут удовлетворять условию

х1'£ x2'£ x3'

Из приведенных выкладок можно сделать индуктивное предположение, что на каждом очередном k-м шаге выполнения основного цикла первые k членов последовательности х1', x2', .... хk' будут удов­летворять условию

х1'£ x2'£ … £ xk'.

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

В силу Леммы 2 на k-м и (k + 1)-м шагах выполнения основного цикла промежуточными результатами будут

хk' = Min(xk, xk+1, ..., хN),

хk+1' = Min (xk+1, ..., хN).

В силу свойств минимума последовательности чисел имеем

хk' = Min(xk, xk+1, ..., хN) = min (хk, Min (хk+1, ...,хN)) £ Min (xk+1, ..., хN) = хk+1'.

Таким образом, хk£ xk+1 и в силу индуктивного предположения получаем, что

x1' £ х2' £ ... £ хk' £ xk+'1.

Что и требовалось доказать.

Осталось уточнить результаты выполнения последнего шага цикла при k = N - 1. В силу Леммы 2 результатом будет значение

xN-'1= Min (xN-1, xN)£ хN'.

Таким образом, после N - 1 шагов выполнения основного цикла для последовательности в целом будут выполнены соотношения упорядоченности

x1' £ x2' £ ... £ хN' .

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

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

Данные о товарах представлены двумя таблицами:

товар стоим кол-во

яблоки 500 200
огурцы 400 250
арбузы 200 600

товар цена остаток

яблоки 2500 100
огурцы 2000 150
арбузы 1200 200

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

Постановка задачиСценарий

Сортировка товаров по остатку.

Дано: товары:

D = (d1, d2, .... dN) - данные товара, <товар1> <s1> < m1> *

d = (товар, s, m), ...... ... ...

s - стоимость, m - кол-во, остатки:

R = (r1, r2, ..., rN) - данные об остатках, <товap1> <c1> < р1>*

г = (товар, с, р), ...... ... ...

с - цена, р - остаток.

Треб.: S - сумма выручки, выручка = <S>

R' = (r1', ..., rN') - упорядоченные данные, сортировка:

Где: <товар1'> <с1'> <р1'> *

S = (c1-s1)×(m1-p1) +...+ (сN-sN)×(mNN), ............

р1' £ р2' £ ... £ рN',

рk'= рiдля k = 1 ... N и i = 1 ... N.

При: N > 0.

Для представления исходных данных в программе примем опера­торы data:

tovs: 'товары: osts: 'остатки:

data «яблоки», 500, 200 data «яблоки», 2500, 100

data «огурцы», 400, 250 data «огурцы», 2000, 150

data «арбузы», 200, 600 data «арбузы», 1200, 200

data «персик», 800, 100 data «персик», 2000, 0

data «», 0, 0 data «», 0, 0

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

При составлении алгоритмов и программы решения этой задачи будем использовать принцип нисходящей разработки «сверху-вниз»: от основного алгоритма и основной части программы к алгоритмам и подпрограммам решения вспомогательных подзадач.

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

Для размещения исходных данных о товарах в поставленной задаче примем пять массивов: tv(l:N), s(l:N), m(l:N), с (1:N), p(l:N). Общий размер этих массивов ограничим числом N = 200, которое явно выделено в описании массивов с тем, чтобы в дальней­шем его можно было увеличить для большего количества данных без других изменений программы.

алг «выручка и остатки товаров» 'выручка и остатки товаров

N = 100N = 100

массив tv[1:N],s[1:N],m1l:N] dim tv$(N),s(N),m(N)

массив L[1:N],c[1:N],p[1:N] dim L(N),c(N),p(N)

нач сls

вывод («товары:»)? «товары:»

данные-товаров gosub tovar 'товары

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

данные-остатков gosub ostatok 'остатки

вывод («-----»)? «-----»

подсчет-выручки gosub vyruch 'выручка

вывод («выручка», S)? «выручка=»;S

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

сортировка-товаров gosub sortdan 'сортировка

конend

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

алг «данные товаров»tovar: 'данные товаров

нач'

загрузка-товаров restore tovs

от k =1 до N цикл for k = 1 to N

чmeнue(tv(k),s(k),m(k)) read tv$(k),s(k),m(k)

при tv(k) = «» то if tv$(k) = «» then exit for

вывод (tv(k),s(k),m(k)) ? tv$(k);s(k);m(k)

кцикл next k

если k< Nmo N := k-1 if k < N then N = k-1

кон return

Последний условный оператор изменяет верхнюю границу N массивов в том случае, если фактическое число данных меньше числа мест в массивах, размещенных в памяти компьютера.

алг «данные остатков» ostatok: 'данные остатков

нач '

загрузка-остатков restore osts

от k = 1 до N цикл for k = 1 to N

чmeнue(tv(k),c(k),p(k)) read tv$(k),c(k),p(k)

при tv(k) = «» выход if tv$(k) = «» then exit for

вывод (tv(k),c(k),p(k))? tv$(k);c(k);p(k)

кцикл next k

если k < N mo N := k-1 if k < N then N = k-1

кон return

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

алг «подсчет выручки» vyruch: 'подсчет выручки

нач '

S := 0 S = 0

от k = 1 до N цикл for k = 1 to N

S := S+(c(k)-s(k)) *(m(k)-p(k)) S = S+(c(k)-s(k))*(m(k)-p(k))

кцикл next k

конreturn

Лемма3. Конечным результатом выполнения данного вспомога­тельного алгоритма будет сумма

SN= (с(1) - s(l))×(m(l) - р(1)) + ... + (c(N) - s(N))×(m(N) - p(N)).

Доказательство проводится с помощью индуктивных рассужде­ний. Первое присваивание S := 0 обеспечивает начальное значение суммы S0= 0.

О результатах k-го шага выполнения цикла можно сделать индук­тивное утверждение

Sk= Sk-1 + (c(k)- s(k))-(m(k) - p(k)) = (с(1) - s(l))×(m(l) - p(l)) + ... + (c(k) - s(k))×(m(k) - p(k)).

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

SN= (с(1) - s(l))×(m(l) - р(1)) + ... + (c(N) - s(N))×(m(N) - p(N)).

Что и требовалось доказать.

Для сортировки данных воспользуемся алгоритмом упорядочения чисел по методу «пузырька», предполагая, что исходная и упорядоченная последовательность чисел r1, r2, ..., rN будут записаны в мас­сиве x[l:N].

Для формирования результирующих упорядоченных данных ис­пользуется массив индексов L(1:N), в котором будут записаны номера элементов исходной последовательности так, что x(k) = p(L(k)) для всех k = 1, ..., N.

алг «сортировка данных» sortdan: 'сортировка данных

массив x[1:N] dim x(N)

нач '

от k = 1 до N циклfor k = 1 to N

L(k) = k L(k) = k

x(k)=p(L(k)) x(k)=p(L(k))

кцикл next k

сортировка-массива gosub sortmas 'сортировка

от k = 1 до N цикл for k = 1 to N

i := L(k) i = L(k)

вывод (tv(i),c(i),p(i)) ? tv$(i);c(i);p(i)

кцикл next k

кон return

Модификация алгоритма упорядочения чисел, размещаемых в массиве x[l:N], с учетом перестановок значений в массиве индексов L[1:N] получает следующий вид: