С помощью этого оператора гораздо проще решить пример 5-2 (program p5_2).

Оператор цикла с постусловием:

uREPEAT оператор UNTIL условие

Оператор, в цикле выполняется до тех пор, пока ложно условие. В отличие от оператора WHILE здесь цикл будет выполнен хотя бы раз. Структуру с постусловием удобно применять в случае, если цикл необходимо выполнить хотя бы раз независимо от значения условия или, если само условие формируется в цикле и не может быть оценено до входа в цикл. Внутри цикла нет необходимости использовать блок begin (блок образуют сами слова repeat…until). Пример решения предыдущей задачи приведен справа. В виду того, что здесь оказывается возможным деление на ноль, в программу вставлен оператор if, предотвращающий такую возможность.

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

uBREAK

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

uСONTINUE

Действие указанных операторов (применительно к циклу FOR) иллюстрирует рисунок справа.

@ Задание 5.7.Написать программу, в которой вводятся два операнда Х и Y и знак операции (+,–,/,*). Вычислить результат Z в зависимости от знака. Предусмотреть реакции на возможный неверный знак операции, а также на ввод Y=0 при делении. Организовать возможность многократных вычислений без перезагрузки программа (т.е. построить цикл). В качестве символа прекращения вычислений принять ‘0’.

Функциональные ряды. При работе с компьютером возникает впечатление его огромной интеллектуальной силы. На самом деле это не так. Собственно процессор умеет (правда очень быстро) выполнять только четыре арифметических действия и логические операции, т.е. располагает возможностями ученика 1-го класса. Откуда же вся его математическая мощь. Ответ простой – от программистов. Разработчики компиляторов языков (в частности Паскаля) побеспокоились о том, чтобы в нем присутствовали многие математические функции. Когда мы используем выражение exp(x) мы на самом деле вызываем подпрограмму вычисления ex, написанную для нас неизвестным автором из фирмы Borland. Однако мы можем сделать это и сами. Существует методы, позволяющие вычислять функции, используя лишь небогатые возможности процессора. Так из математики хорошо известны функциональные ряды Тейлора (здесь аргумент включен в члены ряда). Хотя такие ряды бесконечны, нам нет необходимости (и возможности) вычислять их целиком. Значения элементов ряда быстро убывают и мы можем прекратить вычисления в тот момент, когда очередной член станет меньше заданной погрешности ?.

Пример 5-7. Вычислить с заданной погрешностью функцию exдля произвольного значения Х

ex?1+x+x2/2!+ x3/3!+ x4/4!+…

Отсюда можно записать аналитические зависимости (справа). Здесь у – искомая функция, r – элемент ряда, i – номер члена разложения. Напишите программу вычисления функции с погрешностью не более 0,001. Это означает, что вычисления можно прекратить, если очередной член разложения становится меньше указанного значения.

Сложные циклы.Этот термин означает вложенность одного цикла в другой.

Пример 5-8. Вычислить значения функции Y=X2+Z для 0?X?4 и 0?Z? 10 с шагом 1. В этой функции два аргумента, т.е. она является не плоской кривой, а криволинейной поверхностью. Решение здесь очень простое. Строятся два цикла – внешний (по Х) и внутренний (по Z). Поскольку аргументы и функция целочисленные и шаг равен 1, можно использовать оператор for. В данном случае безразлично, какой параметр поместить снаружи, а какой внутри. Здесь на одно изменение переменной Х произойдет 11 изменений Z.

В следующих заданиях условия целочисленности аргумента и/или шаг=1 не соблюдаются и для организации циклов придется использовать оператор while.

@ Задание 5.8. Вычислить функции Y=X2+Z для 0?X?4 с шагом 1 и 1?Z?10 с шагом 2.

@ Задание 5.9. Вычислить функции Y=X2+Z для 0?X?4 с шагом 0,5 и 1?Z?10 с шагом 2.

@ Задание 5.10. Напечатать таблицу умножения.

6. МАССИВЫ

Как правило, данные для вычислений задаются в упорядоченной форме – в виде последовательности ряда (вектора) чисел или в виде таблицы (матрицы) чисел. Такие совокупности данных называются массивами. Например, вектор А длиной К чисел и матрица В из N строк и M столбцов (всего из N?M элементов) выглядят следующим (справа) образом.

Построение программ, оперирующих с элементами массивов – важнейшая часть техники программирования.

Цифры при имени массива, указывающие порядковый номер элемента, называются индексами. Элементы массивов Аi и Bij обозначаются как А[I] и B[I,J]. К массиву в целом обратиться нельзя. Обработка массива означает последовательную обработку отдельных его элементов.

Оператор описания массивов. Если предполагается работа с массивами, предварительно следует “известить” об этом компьютер в разделе описаний (VAR) программы. Для одномерного массива это оператор вида

uимя_массива: ARRAY [диапазон] OF тип_массива

Например,

VAR x,z: ARRAY [1..8] OF REAL;

y: ARRAY [5..10] OF INTEGER; b: ARRAY [1..4, 1..5] OF INTEGER;

Здесь первый оператор описывает массивы X и Z из 8-ти элементов (с номерами от 1 до 8) вещественного типа. Второй – массив Y из 5-ти элементов (с номерами от 5 до 10) целочисленного типа, третий – двумерный массив B из четырех строк и пяти столбцов.

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

VAR i,j: INTEGER;

FOR i:=1 TO 8 DO BEGIN{ввод вектора Х с подсказкой}

WRITE(‘x[‘,i,’]=’); READLN(x[i]) END;

FOR i:=1 TO 4 DO{ввод матрицы В с подсказкой}

FOR j:=1 TO 5 DO BEGIN

WRITE(‘b[‘,i,j,’]=’); READLN(b[i,j]);

END;

FOR i:=1 TO 4 DO BEGIN{построчный вывод матрицы B}

FOR j:=1 TO 5 DO WRITE(‘b[‘,i,j,’]=’,b[i,j]:4:1,’ ‘);

WRITELN{вывод пустой строки}

END;

Сначала осуществляется ввод в вектор X. На экране мы увидим, например, подсказку вида х[2]=, после чего можно ввести значение этого элемента. Аналогичную подсказку (b[2,4]=) увидим для матрицы В размерностью 4 строки на 5 столбцов. Ввод осуществляется с помощью двух циклов, один из которых вложен в другой. В наружном цикле изменяется первый индекс I элемента матрицы В, во внутреннем – второй индекс J. Индекс J изменяется быстрее, чем I (на одно изменение I индекс J изменяется 5 раз). Это означает, что ввод элементов матрицы будет производиться в следующей последовательности: B[1,1], B[1,2],…B[1,5]; B[2,1],B[2,2],…B[2,5];…;B[4,1], B[4,2], …B[4,5], т.е. по строкам. Аналогично осуществляется и вывод, но вместо оператора READLN используется оператор WRITELN. В примере производится вывод данных из матрицы В. Если позволяет ширина экрана, удобно выводить одну строку матрицы на одной строке монитора. Оператор WRITE(‘b[‘,i,j,’]= ‘,b[i,j]:4:1,’ ‘) выводит данные, например, в виде b[2,3]=25.3.Поскольку оператор WRITE не переводит строку вывода, принудительный переход на новую строку осуществляется пустым оператором WRITELN после того, как строка была полностью выведена.

Начальные значения скалярным переменным и элементам массива (в особенности при отладке) можно задать в разделе констант (начинается со слова const). Например:

CONST z:ARRAY [1..3] OF INTEGER=(4,5,2);

x: INTEGER=5;

r:ARRAY [1..3,1..2] OF INTEGER=((1,2),(3,4),(5,6));

Здесь вектору Z присваиваются значения: z[1]=4, z[2]=5, z[3]=2, переменной х: 5, а прямоугольной матрице R: r[1,1]=1, r[1,2]=2, r[2,1]=3, r[2,2]=4, r[3,1]=5, r[3,2]=6.

Пример 6-1. В векторе С предельной размерности 10 элементов найти максимальный по значению элемент и его номер в С по порядку. В программе сделана проверка для N=4 и C=[5,2,7,4] в ее обрабатывающей части. Здесь переменная М запоминает значение максимального элемента, а К – номер этого элемента в векторе С. Первоначально в качестве такого элемента берется самый первый.

program P6_1;var i,n,m,k: integer;c: array [1..10] of integer;beginwrite(‘n=’); readln(n);for i:=1 to n do beginwrite(‘i=’,i:2,’ c=’); readln(c[i]);end; n=4Пр оверка
m:=c[1]; k:=1;for i:=2 to n doif m m=5, k=1i=252 i=35 i=474 i=57, 3

Пример 6-2. Определим значения вкладов в банке на конец года. Положим, имеется N счетов вкладчиков. Для всех них известны значения остатков на счете в конце каждого квартала. Следует определить и напечатать значения всех вкладов на конец года с учетом известного процента роста вклада. Все суммы считаем целочисленными (копейки игнорируем).

Program P6-2;

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

if (y5000) and (y

if y10000 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.

Данные о вкладах хранятся в массиве Х из N строк и пяти столбцов. Первые четыре элемента каждой i-ой строки (Х[i,1], Х[i,2], Х[i,3], Х[i,4]), хранят остатки вклада на конец каждого из четырех кварталов года. В последний, пятый элемент строки X[i,5] следует занести вычисленную величину вклада на конец года, который равен остатку вклада на конец последнего квартала Х[i,4], плюс установленный процент от среднего значения вклада Y=(Х[i,1]+ Х[i,2]+Х[i,3]+ Х[i,4])/4 за год. Положим, определено, что на вклад до 5000 предусмотрен процент роста – 5%, на вклад до 10000 – 10%, на вклад свыше 10000 – 20%. Иными словами установлены коэффициенты роста 1.05, 1.1 и 1.2 соответственно. Кроме перечисленного, следует найти сумму всех вкладов в банке S и среднее значение вклада, приходящееся на одного вкладчика (S/N).

@ Здания для самостоятельного решения

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

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

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

Задание 6.4. Усложним предыдущее задание. Пусть бригаде установлена премия в Р=100000р., которая делится не поровну, а с учетом коэффициента трудового участи (КТУ). Рассчитайте размер премии для каждого.

Задание 6.5.Имеется прямоугольная матрица X[N,M]. Заполнить элементы матрицы числами натурального ряда в последовательности, указанной на рисунке справа.

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

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

Пример 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], оно запоминается в переменной М.

@ Здания для самостоятельного решения

Задание 6.7. Сортировка выбором.Рассмотренный алгоритм очень прост для программирования, но содержит лишние действия. Очевидно, нет необходимости делать обмен элементов всякий раз, когда встретился больший элемент. На самом деле это нужно выполнить только единожды для максимального элемента из оставшихся. Напишите такую программу.

Задание 6.8. Сортировка обменом.Метод заключается в анализе соседних элементов массива. Если х[i]

Задание 6.9.Пусть имеется таблица работников цеха со столбцами: Имя, Бригада, Отработано дней, Зарплата. Отсортировать любым методом таблицу по возрастанию значений столбца “Отработано дней”.

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

Задание 6.11.Отсортировать таблицу по номерам бригад. Подвести итоги для каждой бригады (число работников, число дней, суммарная зарплата) и для всего цеха целиком.

Задание 6.12. Поиск в отсортированном массиве.Очевидно, что найти нужное значение Х в некотором массиве можно сплошным перебором данных. Однако в худшем случае (если искомое значение находится внизу или его нет вовсе) нам придется просмотреть все элементы массива. Если массив отсортирован, имеется гораздо более быстрый алгоритм поиска, называемый бинарным. Массив делится пополам и Х сравнивается со средним элементом. Если Х оказался больше, пополам делится нижняя часть, если нет – верхняя и поиск ведется там т.д. Напишите программу поиска.

Пример 6-4.Заполнить двумерный массив A(N,N) элементами натурального ряда (т.е. числами 1,2,3, и т.д.), начиная с нижнего правого угла в направлении, показанном пунктиром на рис. 6.4а. Чтобы выявить необходимые законы перемещения по матрице, в ее клетках показаны индексы элементов. Способов решения таких такого р