yandex rtb 1
ГоловнаЗворотній зв'язок
yande share

Основы программирования

5. ЦИКЛЫ

Цикл - это выполнение определенного набора команд некоторое количество раз. Цикл реализуют при помощи конструкции if-goto или, что значительно эффективнее, при помощи специальных команд цикла. Различают три вида команд циклов: с параметром, с предусловием и с послеусловием.

1. Команда цикла с параметром (for). В языке программирования Паскаль есть два вида команды for. Рассмотрим первый:

for <параметр> := <выражение 1> to <выражение 2> do <команда 1>;

где параметр — это переменная целого, символьного, логического или перечислимого типов, а выражения 1 и 2 задают начальное и конечное значения параметра.

Действие команды. Параметру цикла присваивается значение выражения 1. Если оно меньше (равно), чем значение выражения 2, то выполняется команда 1. После этого значение параметра автоматически увеличивается на единицу и оно снова сравнивается со значением выражения 2 и т. д. Когда значение параметра станет больше, чем значение выражения 2, то выполняется следующая после цикла команда.

Пример. Пусть s = 0. После выполнения команды

for і := 4 to 6 do begin s := s + і; z := 2 * і end;

переменная s получит значение 0+4+5+6=15, а переменная z -12.

Рассмотрим второй вид команды цикла for;

for <параметр>

 

:= <выражение1>downto do <команда 1>;

 

<выражение 2>

 

 

Эта команда действует, как и предыдущая, но шаг изменения параметра равен -1.

Пример. Пусть s = 0. После выполнения команды

for і := 6 downto 4 do begin s := s + і; z := 2 * і end;

значение переменной s будет равно 0 + 6 + 5 + 4 = 15, а перемен­ной z - 8.

Замечание.  Значение параметра в середине цикла изменять нельзя.

Задача 1. Составить таблицу соответствия между унциями и граммами для нескольких значений унций. Известно, что 1 унция = 28,353495 г. Начальное значение количества унций (uncia), шаг изменения (h) этого значения и количество значений (k) задать самостоятельно в режиме диалога.

program Mera;

uses Crt;

const line = ‘---------------------;

var        uncia, grammy, h : real;

i, k : integer;

begin

clrscr;

write(‘Введите начальное значение, шаг изменения’);

writeln(‘ и количество, значений — строк в таблице’);

readln(uncia, h, k);

writeln;                       {Формируем пустую строку}

writeln(line);               {Формируем заголовок таблицы}

writeln( ‘Унции          Граммы’);

writeln(line);

for і := 1 to k do         {Выводим таблицу на экран}

begin

grammy:=28.353495 * uncia;

writeln(uncia:5:2, ‘         ‘, grammy:10:6);

uncia := uncia + h;

end;

writeln(line);

readln

end.

Задание 1. Решить задачу № 5 своего варианта.

Задача 2.   Вычислить значение выражения, состоящее из суммы и произведения

 

program SummaProisved;

uses Crt;

var       і : integer;

summa, prod, у : real;

fact : longint;

begin

{Сначала сумма равна нулю, а произведение (prod) единице}

сlrscr;

summa := 0;

prod := 1;

fact := 1;

for і := 1 to 25 do

begin

fact := fact * i;                       {Вычисляем i! = 1 * 2 * 3 * ... * i}

{Вычисляем сумму}

summa := summa + 5 * sqr(i) / fact;

prod := prod * і * і;     {Вычисляем произведение}

end;

у := summa + prod;

writeln(‘y = ‘, y:7:2);

readln

end.

Задание 2. Решить задачу № 6 своего варианта двумя способами: 1) с помощью команды for-to; 2) с помощью команды for-downto.

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

2. Команда цикла с предусловием (while). Команда while выглядит так:

while <логическое выражение> do <команда 1>

Действие команды. Пока значение логического выражения истинно, выполняется команда1. Истинное логическое выражение определяет условие продолжения цикла.

Пример. Пусть переменные х, s равны х = 4, s = 0. После выполнения команды

while х <= 8 do begin s := s + х; х := х + 1 end;

они получат значения 8 = 4 + 5 + 6 + 7 + 8 = ЗО, х = 9.

Пример. Вывести на экран таблицу чисел от 20 до 30, их квадраты и кубы, используя команду while, можно так:

і := 20;

while i <= 30 do

begin

writeln(i:4, і * і:6,i*i*i:8);

end;

Пример. Определить действительное положительное число а, для которого выполняется соотношение а/2 = 0 в компьютерной арифметике действительных чисел. Заметим, что такое число является значением нижней положительной границы типа данных real.

program MinRealNumber;

uses Crt;

var a : real;

begin

clrscr;

a:=l;

while a / 2 > 0 do a := a / 2;

writeln(‘a =’, a)

readln

end.

{Ответ: a = 2.9E-39};

Задача 3. Табулирование функции. Составить таблицу значений аргумента х и функции

у = sinx на отрезке [0; 3,1] с шагом h = 0,1. Вычислить среднее арифметическое (s1) значений функции больших, чем 0,1, и меньших, чем 0,6.

program FindSrednee;

uses Crt;

var       х, у, s, si, h, xk : real;

n : integer;

begin

clrscr;

 x := 0;

 xk :=3.1;

h:=0.1;

s := 0;

n := 0; ,

while x <= xk + h / 2 do

{Слагаемое -h / 2 обеспечивает включение последней точки xk в таблицу}

begin

у := sin(x) ;

writeln(x:3:l, y:6:2);

if (y > 0.1) and (y<0.6) then

begin

s := s + y;

n := n + 1

end;

x := x + h ;

end;

if n > 0 then

begin

s1 := s / n;

writeln (‘Среднее =’, s1)

end

else writeln(‘Taких значений нет n=0’);

readln

end.

Задача 4. Пусть x - некоторое число,а е = 0.001. Вычислить сумму элементов бесконечно убывающей знакопеременной последовательности п}, где аn = (-1)n(2x)n/n!, удовлетворяющих условию, п = 1,2,... Определить количество слагаемых. Вывести на экран результаты вычислений.

program Summal;

uses Crt;

const e =0.001;

var       summa, x, a : real;

 fact, n, z : integer;

begin

clrscr;

writeln(‘Введите число x:’);

readln(x);

summa := 0;

n:= l;

fact := 1;

a := -2 * x;

z:=-l;

while abs(a) > e do

begin

summa := summa + a;

n :=n+1;                                                             {Вычисляем an+1}

z := -z;                                                            {Вычисляем (-l)n+1}

fact := fact * n;                                               {Вычисляем факториал}

 a := z * exp(n * ln(2 * x)) / fact                    {См. Замечание}

 end;

writeln(‘Сумма =’, summa:5:2);

writeln(‘Количество слагаемых =’, n-1);

readln

end.

Замечание. Существует более экономный способ вычисления значения переменной а (элемента именно данной последовательности), используя предыдущее значение и команду присваивания вида а := а * М, где для данного примера М = -2х / (n + 1). Реализуйте этот способ самостоятельно.

Задание 3. Решите задачу № 7 своего варианта тремя способами: 1) используя программу‑пример Summal; 2) модифицируя программу, учитывая замечание (это будет программа Summa2); 3) модифицируя программу-пример при помощи следующей конструкции для вычисления знакопеременной суммы:

if odd(n) then summa := summa - a else summa := summa + a

(это будет программа Summa3). Сравните результаты. Сохраните файлы программ, поскольку они будут нужны для выполнения задания № 5 из п.8.

3. Команда цикла с послеусловием (repeat). Команда repeat имеет вид

repeat <команды> until <логическое выражение>;

Действие команды. Команды выполняются в цикле, пока значение логического выражения не станет истинным. Истинное логическое выражение эквивалентно условию выхода из цикла.

Пример. Пусть переменные х, у имеют значения х = 5, у = 0. В результате выполнения команды

 

repeat

у := у + х;

 z :=2 *х;

 х := х - 2

until х <= 1;

'переменные у,  z,  х  получат  значения у = 0 + 5 + 3 = 8,  z = б, х = 1.

Задача 5.    Протабулировать функцию  у = sin(*)  на отрезке [-p,p] с шагом h = p/ 5. Результаты вычислений вывести на экран в виде таблицы. Найти максимальное (max) и минимальное (min) значения функции на этом отрезке.

Максимальное или минимальное значения функции или значение, удовлетворяющее некоторому условию поиска, определяют методом сканирования (перебора, просмотра) всех подряд значений функции и их сравнения с некоторым эталоном.

program Tabulfuncii;

uses Crt;

var h, x, y, max, min : real;

begin

clrscr;

h:=pi/5;

x := -pi;

max := sin(x); {Предполагаем, что max и min}

min := sin(x);  {достигаются в первой точке}

writeln(‘     х      у’);

repeat

у := sin(x);

writeln(x:7:2, у:7:2);

{Определяем максимум функции}

 if у > max then max := у;

{Определяем минимум функции}

 if у < min then max := у;

х := х + h;                   {Увеличиваем х «a h}

{Проверяем условие выхода из цикла}

 until x > pi + h / 2;

writeln(‘max =’, max:5:2, ‘    min =’, min:5:2);

readln

end.

Замечание. Чтобы кроме этого определить значение аргумента (хmах), при котором функция достигает, например, максимального значения, условную команду следует использовать так:

xmax := -pi;

repeat ...

if у > max then

begin

max := y;

xmax := x

end;

Задание 4. Решите задачу № 8 своего варианта.

 

 

11