Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

WinRAR ZIP archi / 2011_Лабораторные по инф_паскаль_Ч1

.pdf
Скачиваний:
43
Добавлен:
14.02.2015
Размер:
330.12 Кб
Скачать

Начало

'Меню команд' '1. Вывести строку из

звездочек' '2. Вывести строку из минусов'

'3. Вывести строку из запятых' 'Ваш выбор?'

choice

choice

1

'*****************'

2

'------------------

'

3

',,,,,,,,,,,,,,,,,,'

else

'Неправильный выбор'

Конец

Рисунок 15.4 - Схема алгоритма программы N_15_4

31

Оператор безусловного перехода goto

Оператор безусловного перехода goto имеет следующую форму: goto метка

Он переносит выполнение программы к оператору, помеченному меткой метка.

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

label1: оператор

Метки должны быть описаны в разделе меток с использованием служебного слова label:

label 1,2,3;

Например, в результате выполнения программы

label 1,2; begin

var i := 5;

2: if i<0 then goto 1; write(i);

Dec(i); goto 2; 1:

end.

будет выведено 543210.

Метка должна помечать оператор в том же блоке, в котором описана. Метка не может помечать несколько операторов.

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

Использование оператора безусловного перехода в программе считается признаком плохого стиля программирования. Для основных вариантов

32

использования goto в язык Паскаль введены специальные процедуры: break - переход на оператор, следующий за циклом, exit - переход за последний оператор процедуры, continue - переход за последний оператор в теле цикла.

Единственный пример уместного использования оператора goto в программе - выход из нескольких вложенных циклов одновременно. Например, при поиске элемента k в двумерном массиве:

var a: array [1..10,1..10] of integer;

...

var found := False; for var i:=1 to 10 do for var j:=1 to 10 do if a[i,j]=k then begin

found := True; goto c1;

end;

c1: writeln(found);

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

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

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

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

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

Задачи для решения

1.Выяснить, принадлежит ли точка с координатами (x, y) кругу единичного радиуса с центром в начале координат.

2.Даны действительные числа x, у, z. Вывести на печать:

a)Максимальное из чисел x, у, z.

b)Минимальное из чисел . x, у, z.

c)Максимальное и минимальное из чисел x у, z.

3. Даны действительные числа x, у, z. Проверить, выполняется ли условие х≥у≤1, и напечатать результат проверки.

33

4. Даны действительные числа x, у. Вычислить z по одной из формул и вывести на печать:

ìx - y, если x > y,

z = íîy - x +1, в противном случае.

5. Даны два действительных числа. Заменить первое число нулем, если оно меньше или равно второму, и оставить числа без изменения в противном случае.

7.Даны действительные числа x, у, z . Напечатать из них те, которые принадлежат интервалу [0 . . 4].

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

9.Даны два действительных числа. Возвести в квадрат те из них. значения которых неотрицательны.

10.Даны два различных действительных числа. Преобразовать:

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

b)Большее из чисел заменить из полусуммой, а меньшее из них заменить их удвоенным произведением.

34

Лабораторная работа №16

Программы циклической структуры

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

Предмет и содержание работы: разработка и отладка компьютерной программы, содержащей циклы.

Технические средства и программное обеспечение: персональный компьютер с операционной системой Windows™, система PascalABC.NET

Существует множество случаев, когда нужно повторить выполнение некоторой группы операторов фиксированное число раз. Для этой цели используется оператор for, который имеет две формы:

for <переменная:=нач. значение> to <кон. значение> do begin

оператор_1; оператор_2;

…………….

оператор_N end;

или

for <переменная:=нач. значение> downto <конечное значение> do begin

оператор_1; оператор_2;

оператор_N end;

35

I:=1..5

A := A + I

B := B * I

Вывод

A, B

Рисунок 16.1. Фрагмент алгоритма с использованием цикла FOR

Текст от слова for до слова do включительно называется заголовком цикла, а оператор после do - телом цикла. Переменная после слова for называется параметром цикла. Для первой формы цикла с ключевым словом to параметр цикла меняется от начального значения до конечного значения, увеличиваясь всякий раз на единицу, а для второй формы ключевым словом downto - уменьшаясь на единицу. Для каждого значения переменной-параметра выполняется тело цикла. Однократное повторение тела цикла называется итерацией цикла.

Если для цикла for .. to начальное значение переменной цикла больше конечного значения или для цикла for ... downto начальное значение переменной цикла меньше конечного значения, то тело цикла не выполнится ни разу.

Если цикл используется в процедуре или функции, то переменнаяпараметр цикла должна быть описана как локальная.

Если для выполнения тела цикла достаточно одного оператора, то операторные скобки begin – end могут быть опущены.

Например:

for en:=red to blue do write(Ord(en):2);

Изменение переменной-параметра цикла внутри цикла является логической ошибкой. Например, следующий фрагмент с вложенным оператором for является ошибочным:

36

for i:=1 to 10 do for i:=1 to 5 do write(i);

Описание переменных в заголовке цикла for

Одной из проблем использования циклов for в языке Pascal является некорректное использование переменной-параметра цикла после цикла. Кроме того, описание такой переменной в разделе описаний замусоривает его.

В PascalABC.NET можно описывать параметр цикла for непосредственно в заголовке цикла:

var str := '';

for c: char := 'a' to 'z' do str += c;

Oбласть видимости такой переменной ограничена заголовком и телом цикла. Кроме того, можно использовать автоопределение типа параметра цикла, пользуясь следующей разновидностью описания в заголовке цикла:

var p := 1;

for var i := 1 to 10 do p *= i;

Пример N_16_1. Вычислить сумму целых чисел от 1 до 10:

10

S= åi

i=1

Сначала составляем схему алгоритма вычисления суммы,

Начало

summa := 0

index := 1 to 10

summa := summa + index

'сумма = ', summa

Конец

Рисунок 16.2 - Схема алгоритма решения примера 16.1

37

а затем записываем алгоритм на языке программирования: program N_16_1;

{Cуммирование первых десяти целых чисел} var

summa, index: integer;{описание переменных}

begin

 

summa := 0;

// заголовок цикла

for index := 1 to 10 do

summa := summa + index;

// тело цикла

writeln('сумма = ', summa);

 

end.

 

Переменная index называется индексной переменной цикла или просто переменной (счетчиком) цикла. В начале цикла ей присваивается начальное значение, равное 1. Переменная цикла index автоматически увеличивается на 1, принимая значение 2, а цикл повторяется. Когда переменная цикла index достигает значения 11, оператор for определяет, что это значение превышает конечное граничное значение, равное 10, и выполнение цикла прекратится, при этом управление передается следующему оператору.

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

Оператор цикла while имеет следующую форму:

while <условие> do begin

оператор_1; оператор_2;

……

оператор_N end;

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

Если <условие> всегда оказывается истинным, то может произойти зацикливание:

while 2>1 do write(1);

38

Чтобы прервать зациклившуюся программу, следует использовать ком-

бинацию клавиш Ctrl-F2 или кнопку (завершить). Пример 16_2. Организация цикла с предусловием WHILE.

Начало

index := 0

'Значение индекса до начала цикла=', index

index < 10

Y index

index := index + 1

'Значение индекса в конце цикла=', index

Конец

Рисунок 16.2. Схема алгоритма цикла WHILE

program N_16_2; {Организация цикла While} var

index: integer;{описание переменных}

begin

index := 0;

writeln('Значение индекса до начала цикла=', index);

while index < 10 do begin

writeln(index); index := index + 1;

end;

writeln('Значение индекса в конце цикла=', index);

end.

39

Пример 16_3. Организация цикла с предусловием REPEAT.

Начало

Index:=0

Вывод

Index

I:=I+1

Нет

I<10

Да

Вывод

Index

Конец

Рисунок 16.3. Схема алгоритма цикла REPEAT

program N_16_3; {Организация цикла Repeat} var

index: integer;{описание переменных}

begin

index := 0;

writeln('Значение индекса до начала цикла=', index);

repeat writeln(index); index := index + 1;

until index < 10;

writeln('Значение индекса в конце цикла=', index);

end.

Пример N_16_4. Программа выводит на экран строку из звездочек и затем на отдельной строке вопрос "Вывести еще? (Д)". На ввод пользователем любого символа, кроме «Д», программа выводит слово СТОП и останавливается. На ввод пользователем буквы "Д" программа снова выводит строку звездочек и повторяет вопрос "Вывести еще? (Д)".

40