Лабораторная работа №1. Программирование линейных алгоритмов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №1. Программирование линейных алгоритмов



Лабораторная работа №1. Программирование линейных алгоритмов

Цель работы: выработать практические навыки работы с системой Borland Pascal, научиться создавать, вводить в компьютер, выполнять и исправлять простейшие программы на языке Pascal в режиме диалога, познакомиться с диагностическими сообщениями компилятора об ошибках при выполнении программ, реализующих линейные алгоритмы.

Общие сведения:

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

Операторы Турбо-Паскаля

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

· Оператор присваивания: (:=)

Оператор присваивания служит для присваивания значений переменным, например: x:=1; a:=5. 02; b:= 32*a+Sin(x); S:= 'Иван Иваныч';

· Составной оператор: Begin "операторы"; End;

Составной оператор служит для записи в свое тело других операторов, последовательность которых рассматривается в данном случае как один оператор. Этим оператором начинается и заканчивается раздел выполнения основной программы, подпрограммы, функции. После последнего оператора END основной программы ставится точка.

Операторы ввода/вывода данных

· Операторы вывода данных на экран Write("сп"); или Writeln("сп");

Здесь "сп" - список переменных.

Например, операторы Write(a, b, c); или Write(a); Write(b); Write(c); или Writeln(a, b, c); - выводят значения переменных "a", "b", "c" начиная с текущей позиции курсора. После вывода данных оператором Write("сп"); курсор остается за последним выведенным символом. Оператор Writeln("сп"); после вывода данных переводит курсор на первую позицию следующей строки. Например, для вывода значений переменных "a", "b", "c" в трех строках экрана следует написать:

Writeln(a); Writeln(b); Writeln(c);
Оператор Writeln; переводит курсор на начало следующей строки экрана. Оператор Write('Моя первая программа!'); выводит на экран указанный текст.

В операторах вывода допускается производить арифметические действия, например, оператор Writeln(32*a+Sin(x)); соответствует операторам b:=32*a+Sin(x); Writeln(b);

При выводе данных можно задавать формат вывода. Для этого после имени переменной ставится знак двоеточие ": ", например: Writeln(a:5:2); - при выводе значения переменной вещественного типа отводится 5 позиций (включая отрицательный знак и точку), из них 2 позиции отводится для вывода цифр в дробной части. При выводе значения переменной целого типа задается количество позиций для числа (включая отрицательный знак), например: Writeln(i:8);

При выводе значений символьных и строковых переменных формат определяет чис-ло позиций для вывода значения переменной (текста).

При выводе число или текст выравниваются по правому краю отведенного поля, например: если а:=5. 02;, то оператор Writeln('а=', a:6:2); выведет на экран: а= _ _ 5. 02, если n:= '116'; s:= 'Школа N';, то оператор Writeln(s:7, n:6); выведет на экран надпись: Школа N _ _ _ 116.

Для выравнивания числа или текста по левому краю отведенного поля первый знак формата задается отрицательным, например: оператор Writeln('а=', a:-8:2); выведет на экран надпись: а=5. 02 оператор Writeln(s:7, n:-6); выведет на экран надпись: Школа N116.

При недостатке количества позиций для вывода число или текст выводятся полностью, а формат игнорируется, кроме формата вывода дробной части числа. Если формат вывода не задавать, то значения целых и строковых переменных выводятся полностью, а вещественных - в экспоненциальной форме с количеством цифр, соответствующих типу переменной, например, оператор Writeln('а=', a); выведет на экран надпись: a=5. 0200000000E+00 (тип Real), либо a=5. 02000000000000E+0000 (тип Double).

Приведем пример программы, выполняющей различные операции с переменными разного типа.

Program N_1; { работа с переменными разного типа }

var

x, y, z: real;

x0, y0: byte; { описание типов переменных }

x1, y1, z1: integer;

xb, yb, zb: boolean;

c1, c2, c3: char;

s1, s2, s3: string;

 

Begin

x:= 5.8;

y:= 3.4;

x1:= 43;

y1:= 28; { присвоение значений }

c1:= 'Z';

c2:= 'S';

x0:= 65;

xb:= True;

yb:= False;

s1:= 'Иванов ';

s2:= 'Петров ';

Writeln('Математические операции:');

Z:= x+y; { и т. д. }

Write('x:=', x:3:1, ' y:=', y:3:1);

Writeln('Логические операции:');

Zb:= xb and yb; { и т. д. }

Write('xb:=', xb,' yb:= ', yb);

Writeln('Математические функции:');

Z:= sin(x*Pi/180); { и т. д. }

Writeln('Математические процедуры:');

Write('x1:=', x1);

Inc(x1); { и т. д. }

Writeln('Функции преобразования типов:');

c3:= Chr(x0);{ и т. д. }

Write('x0:=', x0);

readln { Задержка экрана до нажатия Enter }

end.

 

· Операторы ввода данных с клавиатуры Read("сп"); или Readln("сп");

Здесь "сп" - список переменных.

Перед вводом данных с клавиатуры желательно вывести на экран поясняющее сообщение. Для этого в программу следует включить оператор вывода, например: Write('введите значение а='); затем оператор Readln(a); При выполнении программы на экране появится надпись: введите значение а=. Оператор Readln(a); будет ждать ввода данных. Следует набрать на клавиатуре значение переменной "а", например, число и нажать клавишу Enter.

Для ввода значений нескольких переменных, например, a, b, c применяются конструкции вида: Readln(a); Readln(b); Readln(c); или Readln(a, b, c);

При вводе нескольких числовых данных, например, оператором Readln(a, b, c); необходимо после набора каждого значения переменной нажимать клавишу SpaceBar или Enter, а в конце ввода - Enter.

При вводе значений символьных переменных нажатие клавиши Enter приводит к присвоению символьной переменной значения кода клавиши Enter (#13), поэтому значения символьных переменных вводятся одна за другой без нажатия Enter или SpaceBar (#32). Например, оператор: Readln(с1, с2, с3, c4); ожидает ввода значений символьных переменных с1, с2, с3, c4, т. е. набора на клавиатуре символов, например: "У", "Р", "А", "!" и нажатия Enter. Тогда оператор Writeln(с1, с2, с3, c4); выведет на экран надпись: УРА!

Оператор Readln; без параметров служит для приостановки выполнения программы и ожидает нажатия клавиши Enter, т. е. применяется с целью приостановки вывода информации на экран для просмотра результатов. При вводе данных предпочтительнее использовать оператор Readln, поскольку оператор Read после срабатывания не считывает управляющий код (#13), который остается в буфере клавиатуры.

Приведем пример программы возведения положительного числа "x" в степень"n", т. е. y = xn. Расчет производится по формуле: y=Exp(n*ln(x)).

Program N_2; {возведение положительного числа в степень}

Var n, x, y: real;

BEGIN

Writeln('Программу разработал Иванов');

Writeln('Возведение положительного числа x степень n');

Writeln('x = ');

Readln(x);

Write('n = ');

Readln(n);

y:= exp(n*ln(x));

Writeln('результат y=', y:10:6);

readln; {задержка экрана до нажатия Enter}

END.

Пример

Определить расстояние на плоскости между двумя точками с заданными координатами M1(x1,y1) и M2(x2,y2).

Этапы решения задачи:

1. Математическая модель: расстояние на плоскости между двумя точками M1(x1,y1) и M2(x2,y2) вычисляется по формуле .

2. Составим блок схему алгоритма

 


Уточним содержимое блока "Вычисление и печать расстояния"


Дальнейшая детализация не требуется. Переводим блок-схему на язык Паскаль.


program example1;

var x1, x2, y1, y2: integer;

d:real;

begin

write('x1= ');

readln(x1);

write('y1= ');

readln(y1);

write('x2= ');

readln(x2);

write('y2= ');

readln(y2);

d:=sqrt(sqr(x2-x1)+sqr(y2-y1));

writeln('d=',d);

end.

Доработаем программу, так чтобы она обладала некоторым интерфейсом:

 

program example1;

var x1, x2, y1, y2: integer;

d:real;

begin

writeln('Эта программа вычисляет расстояние между двумя точками на плоскости');

writeln('Введите координаты двух точек:');

write('x1= ');

readln(x1);

write('y1= ');

readln(y1);

write('x2= ');

readln(x2);

write('y2 =');

readln(y2);

d:=sqrt(sqr(x2-x1)+sqr(y2-y1));

writeln('d= ',d);

writeln('нажмите Enter для завершения работы программы');

readln

end.

Контрольные вопросы:

1. Каковы назначение и возможности системы Borland Pascal?

2. Как запустить программу на трансляцию и выполнение?

3. Как записываются операторы начала и конца программы?

4. Из каких разделов состоит программа на языке Pascal?

5. В какой последовательности должны быть записаны разделы программы на языке Pascal?

6. Как записываются операторы вывода на экран в Pascal?

7. Как записываются операторы ввода на экран в Pascal?

8. Для каких целей служит оператор присваивания.

9. Чем отличаются операторы ввода Read и Readln?

10. Чем отличаются операторы вывода Write и Writeln?

11. Какие обозначения используются в форматах вывода?

Задачи:

1. Три сопротивления R1, R2, R3 соединены параллельно. Найти сопротивление соединения.

2. Определить время падения камня на поверхность земли с высоты h.

3. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.

4. Вычислить высоту треугольника, опущенную на сторону а, по известным значениям длин его сторон a, b, c.

5. Вычислить объем цилиндра с радиусом основания r и высотой h.

6. Определить расстояние, пройденное физическим телом за время t, если тело движется с постоянным ускорением а и имеет в начальный момент времени скорость V0.

7. Вычислить площадь треугольника по формуле Герона, если заданы его стороны.

8. Определить координаты вершины параболы y=ax2+bx+c (a<>0). Коэффициенты a,b,c заданы.

9. По данным сторонам прямоугольника вычислить его периметр, площадь и длину диагонали.

10. Даны два числа. Найти среднее арифметическое их квадратов и среднее арифметическое их модулей.

11. Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.

12. Найти длину окружности и площадь круга заданного радиуса R.

13. Даны координаты трех вершин треугольника (x1, y1), (x2, y2), (x3, y3). Найти его периметр и площадь.

14. Дано целое четырехзначное число. Используя операции div и mod, найти сумму его цифр.

15. Дано целое четырехзначное число. Используя операции div и mod, найти произведение его цифр.

16. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили первоначально движутся навстречу друг другу.

17. Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U < V). Время движения лодки по озеру T1 ч, а по реке (против течения) — T2 ч. Определить путь S, пройденный лодкой.

18. Дана сторона равностороннего треугольника. Найти площадь этого треугольника и радиусы вписанной и описанной окружностей.

19. Известно количество жителей в государстве и площадь его территории. Определить плотность населения в этом государстве.

20. Найти площадь кольца, внутренний радиус которого равен R1, а внешний радиус равен R2 (R1 < R2).

Задачи повышенной сложности

1. Студент начал решать задачи данного урока программирования, когда электронные часы показывали h1 часов и min1 минут, а закончил, когда было h2 часов и min2 минут. Составьте программу, позволяющую определить, сколько времени студент решал эти задачи. (Будем считать, что задачи решались не дольше суток.)

2. Дано действительное число а. Не пользуясь никакими другими операциями, кроме умножения, получить: а) а4 за две операции; б) а6 за три операции; в) а7 за четыре операции; г) а8 за три операции; д) а9 за четыре операции; е) а10 за четыре операции; ж) а13 за пять операций; з) а15 за пять операций; и) а21 за шесть операций; к) а28 за шесть операций; л) а64 за шесть операций;

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

 

 

Общие сведения

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

Оператор перехода

Оператор перехода имеет вид

GOTO <метка>.

Он позволяет передать управление непосредственно на нужный оператор программы. Перед этим оператором должна располагаться метка отделенная от него двоеточием. В Турбо Паскале в качестве меток выступают либо целые числа от 0 до 9999, либо идентификаторы. Все метки должны быть описаны в разделе объявления меток следующим образом:

label <список меток через запятую>;

Условный оператор IF

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

IF "условие" Then "оператор1" Else "оператор2";

где "условие" - выражение логического типа;
"оператор1" выполняется, если условие верно (True),
"оператор2" выполняется, если условие не верно (False).

Например, вычисление квадратного корня из числа "a" проводится при условии a>=0, операторами:

IF a>=0 Then b:= Sqrt(a) Else begin WriteLn('a<0'); Readln; Halt end;

Оператор Halt прекращает выполнение программы.

Схема выполнения условного оператора имеет вид:

 

В условном операторе может отсутствовать блок Else оператор2; т. е. условный оператор может иметь вид:

IF "условие" Then "опертор1";

например: IF a<0 Then a:=abs(a);

 

Приведем пример программы определения весовой категории в зависимости от веса спортсмена.

PROGRAM VES; { определение весовой категории спортсмена } Условная схема программыCONST A1='легкая категория'; A2='средняя категория'; A3='тяжелая категория'; A4='сверхтяжелая категория';var V: integer; BEGIN Write('введите вес спортсмена V = '); ReadLn(v); if V<62 then WriteLn(A1) {вложенный условный оператор } else if V<75 then WriteLn(A2) else if V<88 then WriteLn(A3) else WriteLn(A4) writeln('Нажмите Enter'); readln;END.

Для разложения целого числа на цифры удобно применять операции: MOD и DIV. Например, если дано трехзначное число "N" ("N" соответствует "X1X2X3"), то цифры: X1X2X3, составляющие это число определяются блоком операторов:

X3:= N mod 10; N:= N div 10; X2:= N mod 10; N:= N div 10; X1:= N;

Если требуется определить, делится ли вещественное число "A" нацело на число "B", то можно применять функции Frac(x); и Int(x); например:

x:= A/B; if Frac(x) = 0 then writeln('Число "A" делится нацело на число "B"'); if Int(x) = x then writeln('Число "A" делится нацело на число "B"');

Условный оператор может применяться для идентификации (распознавания) объекта по определенным признакам составляющих его элементов. Например, если объектом является треугольник, то элементами объекта могут быть: 1) три его угла (a, b, c); 2) три его стороны (a1, b1, c1); и т. д.

Признаками являются значения элементов по которым производится идентификация, например, для углов: 1) один угол > 90 - (один признак); 2) три угла < 90 - (три признака); и т. д.

В результате идентификации объект получает имя. Например, треугольник - остроугольный, либо тупоугольный и т. д.

Если идентификация проводится по одному признаку для нескольких элементов, то несколько условий связываются служебным словом "or", например:

If (a > 90) or (b > 90) or (c > 90) then writeln ('Треугольник - тупоугольный');

Если идентификация проводится по нескольким признакам, число которых равно числу элементов, то несколько условий связываются служебным словом "and", например:

If (a < 90) and (b < 90) and (c < 90) then writeln('Треугольник - остроугольный');

Если имя объекта составное, то добавляются признаки для идентификации второй части имени и применяются вложенные условные операторы, например, для равнобедренного треугольника:

If (a < 90)and (b < 90) and(c < 90) then If (a=b) or (b=c) or (a=c) then writeln('Треугольник - остроугольный и равнобедренный') else writeln('Треугольник - остроугольный');

Напомним, что условный оператор можно применять для контроля правильности вводимых данных, например:

If (a+b+c)<>180 then begin writeln('Сумма углов <> 180'); Halt end;

Если для идентификации объекта достаточно меньшего числа признаков, чем число элементов, то условия, связанные "and" группируются, а группы соединяются служебным словом "or". Например, четырехугольник имеет элементами четыре стороны (a, b, c, d), а его имя устанавливается по двум признакам (равенство двух пар сторон), тогда можно использовать операторы:

If ((a=b) and (c=d)) or ((a=c) and (b=d)) or ((a=d) and (b=c)) then writeln('Параллелограмм');

Оператор выбора CASE

Оператор служит для выбора одного из помеченных вариантов действия (операторов), в зависимости от значения "параметра". Оператор имеет вид:

Case "параметр" Of "список помеченных операторов" Else "оператор" End;

Здесь "параметр" - выражение или переменная порядкового типа.

Из "списка помеченных операторов" выполняется оператор с меткой, включающей значение "параметра", иначе оператор после слова Else.

Конструкция Else "оператор" может отсутствовать, тогда "оператор" будет иметь вид: Begin "операторы" end;

Пример операторов для определения порядка целого числа N от 0 до 999:

case N of 0..9: writeln('однозначное'); 10..99: writeln('двузначное'); 100..999: writeln('трехзначное') else writeln('Число "N" не входит в указанный диапазон') end;

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

PROGRAM FUTURE;var N: word;BEGIN writeln('ПРЕДСКАЗАНИЕ БУДУЩЕГО'); Randomize; N:=Random(20)+1; { N - случайное число от 1 до 20 } writeln; write('Вас ожидает '); case N of 1: writeln('счастье'); 2: writeln('пятерка'); 3: writeln('дорога'); 4: writeln('двойка'); 5: writeln('болезнь'); 6: writeln('здоровье'); 7: writeln('деньги'); 8: writeln('любовь'); 9: writeln('встреча'); 10: writeln('дети') else writeln('неудача') end; writeln('Нажми Enter'); readln; END.

Здесь функция Random(x) генерирует случайное число, с равномерной плотностью распределения на заданном интервале. Для инициализации распределения в начале программы необходимо вызвать процедуру Randomize.

Пример

Пример1: Дано действительное а. Для функций f(a),график которой представлен на рисунке,вычислить f(a).

Этапы решения задачи:

1. Математическая модель: функция вычисляется по следующей формуле

2. Составим схему алгоритма


Детализируем блок"Определяем к какому промежутку относится x."


Добавим блоки вычисления функции на каждом из промежутков:

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


Дальнейшая детализация не требуется. Переводим блок-схему на язык Паскаль.


Program example1; var a, f:real; begin write('Введите a> '); readln(a); if a<-1 then f:= -a-1 else if (a>=-1) and (a<0) then f:= a+1 else if (a>=0) and (a<1) then f:= -a+1 else f:= a+1; writeln('F= 'f); end.

Контрольные вопросы

1. Какие операторы используются для программирования разветвлений?

2. Как выполняются операторы перехода?

3. Для чего служит ключ выбора и какого он может быть типа?

4. Особенности использования вложенных условных операторов.

5. Каковы отличия оператора выбора case от оператора условия if?

6. Какую из функций: Sin(x), Abs(x), Trunc(x) можно заменить условным оператором if x<0 then x:= -x?

Задачи

1. Даны действительные положительные числа x, y, z. Выяснить, существует ли треугольник с длинами сторон x, y, z.

2. Дано действительное а. Для функции f(a), график которой представлен на рисунке, вычислить f(a).

 

3. Пусть D - заштрихованная часть плоскости и пусть u определяется по x и y следующим образом (запись (х, у) D означает, что точка с координатами х, у принадлежит D):

а)
б)

4. Даны три действительных числа. Выбрать из них те, которые принадлежат интервалу (1, 3).

5. Даны действительные числа x, y. Если x, y отрицательны, то каждое значение заменить его модулем; если отрицательное только одно из них, то оба значения увеличить на 0.5; если оба значения не отрицательны и ни одно из них не принадлежит отрезку [0.5, 2.0], то оба значения уменьшить в 10 раз; в остальных случаях x, y оставить без изменения.

6. Определить и вывести на печать номер квадранта, в котором расположена точка М(x,y), x и y заданные вещественные числа.

7. Из величин, определяемых выражениями a=sinx, b=cosx, c=ln|x| при заданном х, определить и вывести на экран дисплея минимальное значение.

8. Определить, какая из двух точек - M1(x1,y1) или M2(x2,y2) - расположена ближе к началу координат. Вывести на экран дисплея координаты этой точки.

9. Определить, какая из двух фигур (круг или квадрат) имеет большую площадь. Известно, что сторона квадрата равна а, радиус круга r. Вывести на экран название и значение площади большей фигуры.

10. Определить, попадает ли точка M(x,y) в круг радиусом r с центром в точке (x0,y0).

11. Перераспределить значения переменных X и Y так, чтобы в X оказалось меньшее из этих значений, а в Y — большее.

12. Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по возрастанию.

13. Известны два расстояния: одно в километрах, другое в футах. Какое из расстояний меньше?

14. Ввести два числа. Меньшее заменить полусуммой, а большее – удвоенным произведением.

15. Локатор ориентирован на одну из сторон света («С» — север, «З» — запад, «Ю» — юг, «В» — восток) и может принимать три цифровые команды: 1 — поворот налево, –1 — поворот направо, 2 — поворот на 180 градусов. Дан символ C — исходная ориентация локатора и числа N1 и N2 — две посланные ему команды. Вывести ориентацию локатора после выполнения данных команд.

16. Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, следующей за указанной.

17. Дано целое число в диапазоне 100 – 999. Вывести строку — словесное описание данного числа, например: 256 — «двести пятьдесят шесть», 814 — «восемьсот четырнадцать».

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

19. Составьте программу, реализующую эпизод применения компьютера в книжном магазине. Компьютер запрашивает стоимость книг, сумму денег, внесенную покупателем; если сдачи не требуется, печатает на экране «спасибо»; если денег внесено больше, то печатает «возьмите сдачу» и указывает сумму сдачи; если денег недостаточно, то печатает об этом сообщение, указывающее размер недостающей суммы.

ы

20. Даны три переменные: X, Y, Z. Если их значения упорядочены по убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное.

Задачи повышенной трудности

 

1. Две точки заданы на плоскости своими координатами, которые могут быть как декартовыми, так и полярными. Требуется вычислить расстояние между этими двумя точками.

2. Даны действительные числа a, b, c, x, y. Выяснить, пройдет ли кирпич с ребрами a,b,c в прямоугольное отверстие со сторонами x и y.

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

3. Сможет ли шар радиуса R пройти в ромбообразное отверстие со стороной P и острым углом Q?

4. Написать программу, которая печатает True или False в зависимости от того, выполняются или нет заданные условия:

o квадрат заданного трехзначного числа равен кубу суммы цифр этого числа;

o сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр;

o среди цифр заданного трехзначного числа есть одинаковые;

o среди первых трех цифр из дробной части заданного положительного вещественного числа есть цифра 0.

5. Проверить, можно ли из четырех данных отрезков составить параллелограмм.

 

 

Общие сведения

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

Операторы цикла

Цикл с параметром

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

For i:= N1 To N2 Do "оператор";

либо

For i:= N1 DownTo N2 Do "оператор";

Здесь i - параметр цикла (переменная порядкового типа),

N1, N2 - начальное и конечное значения параметра цикла i.

N1, N2 могут быть константами, переменными или выражениями порядкового типа.

Напомним, что "оператор" может иметь вид: Begin "операторы" end;

В случае связки "To" цикл выполняется при условии N1 <= N2 и происходит с единичным возрастанием параметра цикла i от N1 до N2. В случае связки DownTo цикл выполняется при условии N1 >= N2 и происходит с единичным уменьшением параметра цикла i от N1 до N2.

В операторе цикла не разрешается присваивать параметру цикла какое-либо значение.

После окончания цикла значение параметра цикла "i" неопределенно.

Оператор цикла часто применяется для суммирования значений некоторой последовательности чисел или значений функции при известном числе операций суммирования. Напомним некоторые определения, связанные с расчетом суммы последовательности.

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

a1, a2, a3,..., an

называется конечной суммой

Sn = a1 + a2 + a3+... + an

Для некоторых последовательностей известны формулы расчета конечных сумм, например:

при an = an-1 + d; Sn = (a1 + an)*n/2; - арифметическая прогрессия,

при an = an-1 * q; Sn= (a1 - an*q)/(1-q); - геометрическая прогрессия,

где d и q - постоянные числа.

Здесь N-ый член последовательности выражается через (N-1)-ый член. Такие зависимости называются реккурентными.

Конечная сумма последовательности может быть неизвестна, тогда для ее расчета применяется алгоритм суммирования членов последовательности в цикле от 1 до N. Приведем пример расчета конечной суммы последовательности: 12 + 32 + 52 +... + (2*N-1)2; Sn = N*(4*N2-1)/3;

PROGRAM SUM_K; { расчет конечной суммы }var a, S, Sn, i, N: word;Begin write('Введите число членов суммы N='); readln(N); S:= 0; For i:= 1 to N do begin { цикл суммирования } a:= Sqr(2*i-1); S:= S+a end; Sn:= N*(4*N*N-1) div 3; Writeln('Конечная сумма S=', S:10:2); Writeln('Расчет конечной суммы по формуле Sn=', Sn:10:2); Writeln('Нажми Enter'); ReadLn End.

В некоторых случаях "N"-ый член последовательности определяется через сумму предыдущих членов, например,

an= p*Sn-1,

тогда

Sn= Sn-1 + an = Sn-1*(1+р),

и конечную сумму можно рассчитать по формуле:

Sn = S0*(1+p)N,

где "S0" - начальная сумма.

Рассмотрим программу вычисления конечной суммы денежного вклада в банк через N месяцев при ежемесячной процентной ставке "pr" (5% cоответствует pr=5).

PROGRAM VKLAD; { расчет конечной суммы вклада в банк }var S, Sn, pr: Real; i, N: Integer;Begin Write('Введите начальную сумму вклада S='); readln(S); Write('Введите процент по вкладу pr='); readln(pr); Write('Введите количество месяцев вклада N='); readln(N); For i:= 1 to N do S:= S*(1+pr/100); { цикл произведений } Writeln('Конечная сумма вклада S=', S:10:2); { Оператор для расчета "Sn" напишите самостоятельно } Writeln('Расчет конечной суммы вклада по формуле Sn=', Sn:10:2); Writeln('Нажмите Enter'); readln End.

Часто применяются вложенные операторы цикла. Например, если необходимо провести все варианты расчета при изменении нескольких параметров в заданных диапазонах.

Составим программу расчета функции y = A*sin(x) - cos(x)/A; при изменении аргумента "x" в диапазоне от 0 до Pi с шагом Pi/100 и при изменении параметра "A" в диапазоне от 1 до 3 с шагом 0.5.

Program tabl;var y, x, a, dx: real; i, j: integer;Begin Writeln(' Расчет по формуле: y=A*sin(x)-cos(x)/A; '); Writeln('--------------------------------------------------'); Writeln('| X | A=1.0 | A=1.5 | A=2.0 | A=2.5 | A=3.0 |'); Writeln('--------------------------------------------------'); dx:= pi/100; for i:= 0 to 100 do begin { внешний цикл изменения аргумента "X" } x:= dx*i; Write(x:8:4); for j:= 1 to 5 do begin{ вложеннный цикл изменения параметра "A" } A:= 0.5*(j+1); y:= A*sin(x)-cos(x)/A; Write(y:8:4) end; Writeln; {перевод курсора на новую строчку} if ((i+1) mod 20) = 0 then readln{задержка прокрутки экрана до нажатия Enter} end; readln;End.

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

В Турбо-Паскале применяются два оператора цикла с условием:

While "условие" DO "оператор";

- цикл с предусловием: проверка условия перед каждым выполнением "оператора",

Repeat "операторы" Until "условие";

- цикл с постусловием: проверка условия после каждого выполнения "операторов".

Здесь "условие" - выражение логического типа (Boolean).

Схема выполнения операторов имеет вид:

Цикл WHILE Цикл REPEAT

 

В цикле While "оператор" выполняется если условие верно (True), если условие ложно (False), то цикл заканчивается, т. е. цикл While повторяется пока выполняется условие. Цикл While начинается проверкой условия, поэтому, если начальное условие ложно, то "оператор" не выполняется ни разу. Для включения в тело цикла нескольких операторов применяется составной оператор: Begin "операторы" end.

Цикл Repeat повторяется, если условие ложно (False), и заканчивается, если условие верно (True), т. е. цикл Repeat повторяется до выполнения условия.

Цикл Repeat заканчивается проверкой условия, поэтому "операторы" выполняются не менее одного раза. В теле цикла может записываться более одного оператора.

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

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

a1, a2, a3,..., an,...

называется бесконечным рядом и записывается в виде:

a1 + a2 + a3 +... + an+...

Здесь an - общий член ряда.

Сумма конечного числа членов ряда называется частичной суммой и обозначается "Sn".

Если сумма членов бесконечного ряда имеет конечный предел "S", то ряд называется сходящимся. Для некоторых рядов получены формулы расчета суммы членов ряда. Например, сумма членов числового ряда:

1 + 1/32 + 1/52 +... + 1/(2*N-1)<sup2< sup=""> +...</sup2<>

имеет предел S = Pi2/8 и общий член an = images/(2*N-1)2, где N = 1, 2, 3,...

Для сходящегося ряда вычисляется последовательность частичных сумм с заданной погрешностью. Абсолютная погрешность расчетов определяется по формуле Eps=abs(S-Sn), либо Eps=abs(an), если значение S неизвестно. Относительная погрешность расчетов определяется по формуле Eps_o=abs((S-Sn)/S), либо Eps_o=abs(an/Sn).

Частичные суммы вычисляются по формуле: Sn = Sn-1 + an

Для знакопеременного ряда следует добавить k1=-1, а в цикле: k1:=-k1, an=k1*an. В некоторых случаях "N"-ый член ряда выражается через "N-1"-ый, например, для ряда:

1 + 1/2! + 1/4! + 1/6! +... + 1/(2*N)! +...; N = 0, 1, 2,...

общий член ряда вычисляется по формуле: an = an-1*k;

Параметр k = an/an-1 - коэффициент роста вычисляется предварительно (до написания программы).

Для данного ряда

an = 1/(2*N)! = 1/(1*2*...*(2*N-2)*(2*N-1)*2*N)
an-1 = 1/(2*(N-1))! = 1/((2*N-2))! = 1/(1*2*...*(2*N-2))
k = an/an-1 = 1/((2*N-1)*2*N)

Здесь N! = 1*2*3*...*N; - вычисление факториала числа "N", причем 0! = 1.

Расчет частичных сумм производится в цикле с условием, например, для данного ряда операторами:

N:= 0; a:= 1; SN:= 1; S:= (e+1)/e; e:= 2.7182828; Repeat N:= N+1; k:= 1/((2*N-1)*2*N); a:= a*k; SN:= SN+a; Writeln('Частичная сумма Sn= ', Sn:11:6); Until abs(S-Sn) < eps; { eps - допустимая погрешность расчетов} Writeln('Сумма ряда S = ', SN:11:6);

Примеры

Пример1: На промежутке от 1 до M найти все числа Армстронга. Натуральное число из n цифр называется числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу.

Этапы решения задачи:

1. Математическая модель: xО[1;M], x=

2. Составим блок схему программы:

 

 

Распишем составные части блока"Находим все числа Армстронга на заданном промежутке и печатаем их"


Опишем блок "Подсчитываем сколько цифр в числе i"

Опишем блок "Проверяем, является ли i числом Армстронга"

Дальнейшая детализация не требуется, запишем блок-схему целиком:

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

PROGRAM Primer_1; var i,k,s,p,n: Integer; BEGIN Write('Введите M '); Readln(m); For i:=1 to M do begin s:=0; k:=i; n:=0; While k<>0 do begin k:=k DIV 10; n:=n+1 end; k:=i; While k<>0 do begin p:=k MOD 10; k:=k DIV 10; If p<>0 then s:=Trunc (s+Exp(n*Ln(p))) end; If s=f then WriteLn (f) end; END.

 

Контрольные вопросы

1. Как записывается и как работает оператор FOR?

2. Для организации каких циклов применим оператор FOR?

3. В чем отличие оператора WHILE от оператора REPEAT?

4. Как программируются циклические алгоритмы с явно заданным числом повторений цикла?

5. Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?

6. Напишите оператор цикла, который не выполняется ни разу.

7. Напишите оператор цикла, который выполняется неограниченное число раз.

8. Замените оператор "Repeat A Until B" равносильным фрагментом программы с оператором While.

Задачи

1. Найти все двузначные числа, сумма цифр которых не меняется при умножении числа на 2,3,4,5,6,7,8,9.

2. Найти все трехзначные числа, сумма цифр которых равна данному целому числу.

3. Найти все трехзначные числа, средняя цифра которых равна сумме первой и третьей цифр.

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

5. Найти все двузначные числа, сумма квадратов цифр которых делится на 17.

6. Найти все трехзначные числа, представимые в виде сумм факториалов своих цифр.

7. Найти двузначное число, обладающее тем свойством, что куб суммы его цифр равен квадрату самого числа.

8. Найти двузначное число, равное утроенному произведению его цифр.

9. В каких двузначных числах удвоенная сумма цифр равна их произведению?

10. Можно ли заданное натуральное число М представить в виде суммы квадратов двух натуральных чисел? Написать программу решения этой задачи.


Вычисление выражений:
Дано натуральное n. Вычислить:

11. ;

12. ;

Дано действительное число х, натуральное число n. Вычислить:

13. x (x - n)(x - 2 n)(x - 3 n)…(x - n2);

14. ;

15. ;
Дано натуральное n. Вычиcлить:

16. ;

17. ;



Поделиться:


Последнее изменение этой страницы: 2016-08-06; просмотров: 3306; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.198.49 (0.23 с.)