Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль (прогр) 2008июль.doc
Скачиваний:
1
Добавлен:
17.11.2018
Размер:
900.61 Кб
Скачать

Var X,I: integer;

begin

readln(x);

for i:=1 to х do if x mod i=0 then writeln(i); {перебор чисел от 1 до x}

end.

Напоминаем, что взятие модуля X по I означает получение целого остатка от деления X на I. Иными словами, если x mod i=0, то число X кратно числу I.

Пример 5-8. Для чисел X и Y найти наибольший общий делитель, т.е. наибольшее число, которое делит X и Y без остатка. Нахождение НОД будем выполнять путем последовательного перебора сверху вниз всех натуральных чисел от минимального из X и Y до 1. Наибольшим делителем считаем первое значение i, которое делит оба числа без остатка.

program P5_8 ;

Var X,y,I: integer;

begin

readln(x,y);

if x<y then k=x else k=y {определение минимального (переменная k) значения из x и y}

for i: = k downto 1 do {перебор чисел от k до 1}

if (x mod i=0) and (y mod i=0) then begin writeln(i); exit end; {если х и y делятся нацело на i, НОД=i найден}

end.

Задание 5.11. Известны числитель X и знаменатель Y дроби. Сократите дробь, если это возможно, т.е. найдите новые X и Y для которых частное будет таким же.

Задание 5.12. Вычислить наименьшее общее кратное (НОК) чисел X и Y. НОК – это минимальное число, которое делится на X и Y без остатка. Общим кратным, конечно, является произведение X на Y, но оно не обязательно наименьшее. Так если X=6, а Y=9, то X*Y=54. Однако еще есть общие кратные 36 и 18. Т.е. НОК=18. Удобно поиск НОК осуществлять, перебирая все числа от 1 до X*Y, до встречи первого числа, которое делится на X и Y без остатка.

Операторы итерационных циклов. Их несколько типов. Оператор цикла с предусловием имеет вид

WHILE условие DO оператор

Такая конструкция позволяет легко организовывать итерационные циклы (циклы с заранее неизвестным числом повторений). Оператор, входящий в тело цикла выполняется до тех пор, пока истинно условие. Для примера решим задачу – вычислять и печатать Y=2/X до обнаружения первого X=0. Программа приведена ниже.

readln(x); {Y=2/X}

while x<>0 do begin

writeln(х, 2/x);

readln(x)

end; {оператора while}

С помощью этого оператора гораздо проще решить пример 5-2 (program p5_2n). Оператор цикла с постусловием:

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

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

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

BREAK

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

СONTINUE

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

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

Пример 5-9. Вычислить с заданной погрешностью функцию ex для произвольного значения X<1. Ряд Тейлора для нее выглядит следующим образом.

ex ≈1+x+x2/2!+ x3/3!+ x4/4!+...

Отсюда можно записать аналитические зависимости: 1) y=y+r , y0=1; 2) r=rx/i, r0=1; 3) i=i+1, i0=1.

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

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

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

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

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

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

5.13. Вычислить функции Y=X2+Z для 0≤X≤5,6 с шагом 0,2 и 1≤Z≤7,5 с шагом 1,5.

5.14. Известен начальный банковский вклад X и годовой процент Р. Выяснить через сколько лет L вклад достигнет величины Y.