Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УПП Программирование 2102,2202.doc
Скачиваний:
17
Добавлен:
20.04.2015
Размер:
760.32 Кб
Скачать

Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;

begin

readln(n); {число вкладов (до 10)}

for i:=1 to n do; for j:=1 to 4 do begin {ввод сведений о вкладах}

write('введите остаток по вкладу номер', i,'за', j ,'квартал');

readln(x[i,j]);

end;

s:=0;

writeln(' Счет № Остатки по кварталам');

writeln(' I II III IV ВСЕГО');

for i:=1 to n do begin {вычисление годового остатка}

y:=(x[i,1]+x[i,2]+x[i,3]+x[i,4])/4; {средний остаток}

if y<=5000 then y:=1.1*y;

if (y>5000) and (y<=10000) then y:=1.15*y;

if y>10000 then y:=1.2*y;

x[i,5]:=x[i,4]+y; {остаток вклада с начислениями}

writeln(i,x[i,1],x[i,2],x[i,3],x[i,4],x[i,5]);

s:=s+x[i,5];

end;

sr:=s/n;

writeln('Сумма всех вкладов в банке = ',s);

writeln('Средний вклад = ',sr);

end.

Контрольные задания.

Задание 6.1. В векторе Х найти элемент, максимально близкий к некоторому Y и его номер.

Задание 6.2. В векторе Х сдвинуть по кольцу его содержимое на 1 клетку. На 2 клетки. На К клеток. Подсказка. Здесь понадобится вспомогательный мас­сив Y, куда и будем заносить уже сдвинутые данные.

Задание 6.3. Пусть имеется таблица, содержащая сведения о работниках бригады: Имя, Отработано дней, Зарплата. Известна также сумма, которую заработала бригада S. Рассчитать зарплату для каждого работника.

Задание 6.4. Усложним предыдущее задание. Пусть зарплата увеличивается на 10% тем, кто отработал больше 20-ти дней (при прежнем S). Во всех случаях сумма всех зарплат работников должна быть в точности равна S.

Задание 6.5. Запрограммировать процесс выбора в детской счи­талке. Пусть нужно выбрать случайным образом дежурного из группы в M человек. Дети становятся в круг и “считаются” по следующему правилу. Из круга по часовой стрелке удаляется каждый третий (шаг выбора N) участник, начиная с номера 1 (он уже дежурил раньше). В конце останется только один – дежурный. Для (см. рисунок выше) примера M=8, N=3. Тогда последовательно из круга выйдут номера 1,4,7,3,8,6. Наконец останутся только номера 2 и 5 и счет продол­жается уже между ними 2→5→2. Таким образом, “повезло” но­меру 5. Задания решить двумя способами, указанными ниже. В программе вывести номера всех выбывающих элементов и номер дежурного.

Х

1

2

3

4

5

6

7

8

2

3

5

6

8

2

5

6

2

5

2

5

5

5

дальше

1

4

7

3

8

6

2

5

нули

i:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

выбывание

считалка N=3, M=8

Алгоритм 1.Создается массив Х длиной в несколько раз больше чем M. Обозначим его размерность MM (в програм­ме задайте ММ= 30). Первые его M элементов заполняются последовательными числами от 1 до M. Остальные элементы от M+1 до MM остаются пока пустыми (=0). Строится FOR-цикл перебора всех элементов X. В нем, если номер элемента I минус 1 кратен N, этот номер (он подчеркнут) печатается и человек выбывает. Если нет, элемент переносится в правый конец занятой части массива Х (в первую свободную клетку). Если встретился элемент =0, значит произошла обработка всех чисел и процесс прекращается. На рисунке выше показана динамика изменения массива Х. Первоначально в нем заняты только клетки с 1 по 8. Цифры 1,4,7 печатаются, а остальное (2,3,5,6,8) последовательно переносится в свободную область Х, из которой печатаются цифры 3 и 8 и т.д. пока не будут выведены все цифры. После 22-ой ячейки остаются еще MM-22 пустых клеток. Их просматривать не нужно и для этого в цикле должен быть предусмотрен выход при X[i]=0.

Алгоритм 2. Возможен и другой алгоритм, заключающийся в том, что, как и в жизни, мы будем ходить по кругу из элементов массива Х размерности M. Каждый раз, когда человек выбывает, мы печатаем его номер и (чтобы не забыть, что он выбыл) заменяем содержимое соответствующей ячейки на 0. Здесь введем переменные: I=1 – номер каждого элемента в круге, J=1 – номер только не удаленного элемента (клетки, содержащие 0 игнорируются), L=0 число уже отобранных клеток.

1). Организуем хождение по кругу. Строим WHILE-цикл в котором переменная I меняется от 1 до M (т.е. 1..M, 1..M, и т.д.). В цикле I=I+1 всегда и J=J+1 – только для непустых клеток.

2). Внутри цикла, каждый раз, когда J становится кратным K, ячейка Х(J) печатается и очищается Х[I]=0, L=L+1.

3). Вычисления прекращаются при L=M.

 Сортировки в массиве. Сортировка данных является очень распространенной задачей и для нее имеется несколько методов.

Пример 6-3. В векторе X расположить элементы в порядке убы­вания их зна­че­ний. Алгоритм реализуется при помощи двух вложен­ных циклов. В на­ружном цикле последовательно перебираются числа x(i) массива и во внут­реннем сравниваются со всеми оставшимися числами x(j) справа от дан­ного. Если выясняется, что какое-то из x(i) меньше сравниваемого, они меняются местами – большее число становится на место меньшего. В программе для наглядности в качестве элементов массива взяты их номера i. Если вектор имеет длину четыре (N=4), будет выполнена следующая последовательность перестановок чисел: 1,2,3,4: при i=1 – 2,1,3,4; 3,1,2,4; 4,1,2,3; при i=2 – 4,2,1,3; 4,3,1,2; при i=3 – 4,3,2,1. Здесь для обмена значений элементов x[i]↔x[j] вводится специальная “транзитная” переменная М для временного хранения данных. Действительно, если использовать только операторы x[i]:=x[j]; x[j]:=x[i] мы получим неверный результат. Хотя х[i] и примет значение х[j], оператор x[j]:=x[i] ничего не изменит, ведь х[i] теперь равен х[j]. С тем, чтобы не потерять исходное значение х[i], оно запоминается в переменной М.

PROGRAM P6_3;