Команды ветвления и повторения на языке Паскаль
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Цель работы: Повторить правила синтаксиса команд ветвления и выбора. Ознакомиться с видами команды повторения, научиться составлять программы с использованием этих команд на языке Паскаль.

Теоретические сведения

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

Если в программе возникает необходимость неоднократно выполнить некоторые операторы, то используются операторы повтора (цикла). В языке Паскаль различают три вида операторов цикла: while, repeat, for. Они используются для организации циклов различных типов. Выражение, управляющее повторениями, должно иметь булевский тип.

Если число повторений оператора (составного оператора) заранее неизвестно, а задано лишь условие его повторения (или окончания), используются операторы while, repeat. Оператор for используется, если число повторений заранее известно.

Оператор повтора for

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

Он может быть представлен в двух форматах:

for < параметр цикла > := <S1> to <S2> do < оператор >;

for < параметр цикла > := <S1> downto <S2> do < оператор >;

где Sl и S 2 — выражения, определяющие соответственно начальное и конечное значения параметра цикла;

for ... do — заголовок цикла;

<оператор> — тело цикла.

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

Заголовок оператора повтора for определяет:

• диапазон изменения значений управляющей переменной (параметра цикла) и одновременно число повторений оператора, содержащегося в теле цикла;

• направление изменения значения параметра цикла (возрастание — to или убывание—downto).

Пример использования оператора for:

for I := 1 to 100 do Read ( M [ I ]);             {Чтение элементов массива}

for I:= 100 downto 1 do Write(M[I]);   { Вывод элементов массива }

При первом обращении к оператору for вначале вычисляются выражения S1, S2 и осуществляется присваивание <параметр цикла>:= S 1.

После этого циклически повторяются следующие действия:

1. Проверяется условие <параметр цикла>: <= S 2.

2. Если условие выполнено, то оператор for продолжает работу (выполняется оператор в теле цикла), если условие <параметр цикла>:<= S 2 не выполнено, то оператор for завершает работу, и управление в программе передается на оператор, следующий за циклом.

3. Значение управляющей переменной изменяется на +1 (в случае to) или –1 (в случае downto).

Шаг изменения управляющей переменной - единица.

Ограничения использования параметра цикла в операторе for. На использование управляющей переменной (параметра цикла) в цикле for налагаются следующие ограничения:

1. В качестве параметра должна использоваться простая переменная, опи­санная в текущем блоке.

2. Управляющая переменная должна иметь дискретный тип.

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

4. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).

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

перехода.

Примеры программ с использованием оператора for

Программа DemoFor1  выводит на экран таблицу перевода из градусов по шкале Цельсия(С) в градусы по Фаренгейту(Р) для значений от 15°С до 30°С с шагом 1 градус. Перевод осуществляется по формуле: F = С*1.8+32.

program DemoFor1;

var

I: integer;

F: real;

begin

Writeln (' Температура ') ;

for I:= 15 to 30 do {Заголовок цикла с параметром}

begin         {Начало тела цикла}

F:= I*1.8+32;

Writeln('no Цельсию= ',I,' по Фаренгейту= ', F:5:2)

end;         {Конец тела цикла}

end.

В блоке описания переменных описаны параметр цикла I типа integer и переменная F — температура по Фаренгейту типа real. Переменная I, помимо функций управляющей переменной, является переменной, хранящей целочисленные значения температуры по шкале Цельсия. В начале выполнения программы на экран выводится надпись ' Температура ', а затем оператором повтора выводится таблица соотношения температуры в шкалах Цельсия и Фаренгейта. Печать таблицы выполняется оператором Write l n('По Цельсию= ',I,' по Фаренгейту= ' , F: 5:2).

Цикл выполняется следующим образом.

При первом обращении к оператору for вычисляются значения начального (15) конечного (30) параметров цикла, и управляющей переменной I присваивается начальное значение 15.

Затем циклически выполняется следующее:

1. Проверяется условие I <=30.

2. Если оно соблюдается, то выполняется составной оператор в теле цикла, т.е. рассчитывается значение выражения I* 1.8+32, затем оно присваивается переменной F, и на экран выводится сообщение: 'По Цельсию= ', I, ' по Фаренгейту= ', F:5:2.

Если условие I <=30 не соблюдается, т. е. как только I станет > 30, оператор тела цикла не выполняется, а управление в программе передается за пределы оператора for, в нашем примере на оператор end. Программа завершает работу.

3. Значение параметра цикла I увеличивается на единицу, и управление передается в заголовок цикла for для проверки условия.

Далее цикл повторяется, начиная с пункта 1.

Вторым примером оператора цикла for может служить программа DemoFor 2, которая печатает на экране символы американскою стандартного кода обмена информацией (ASCII) в порядке убывания кода.

program DemoFor2;

var

A: integer;

begin

for A:= 255 downto 0 do {Цикл с убыванием параметра }

Writeln('код символа = ',А, ' символ == ',Chr(A));

end.

В данной программе применяется цикл for с убыванием значения управляющей переменной А (используется указание downto - убывание).

 

Оператор повтора Repeat

Оператор повтора repeat имеет две особенности:

1. Условие проверяется после очередного выполнения операторов тела цикла (очередной итерации) и таким образом гарантируется хотя бы однократное выполнение цикла.

2. Критерием прекращения цикла является равенство выражения константе True.

За это цикл repeat часто называют циклом с постусловием, или циклом "ДО", так как он прекращает выполняться, как только значение выражения условия, записанного после слова until, равно True (истина).

Оператор повтора repeat состоит из заголовка repeat, тела и условия окончания until.

Формат записи:

repeat

<оператор;>

<оператор>

until <условие окончания цикла>;

Операторы, заключенные между словами repeat и until,  являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Именно поэтому цикл, организованный с помощью оператора repeat, в любом случае выполнится хотя бы один раз. Если результат булевского выражения равен False, то тело цикла активизируется еще раз; если результат True, происходит выход из цикла.

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

 

Пример программы с использованием оператора repeat

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

program DemoRepeat;

var

X: integer;

Sum; real;

begin

 Sum:=0;                                                   

 repeat                             { Повторять }

Write('Значение X= '); { Начало тела цикла }

Readln(X); {Считать очередное значение Х с клавиатуры}

if X <> 999 then

Sum:= Sum+X ;

 until X = 999; {Условие окончания цикла (пока Х не станет равным 999)}

Writeln('Сумма введенных чисел= ',Sum) ;

end.

В данном примере в разделе описания переменных описана переменная Х целочисленного типа integer и Sum вещественного типа real.

В начале выполнения программы обнуляется значение суммы чисел. Затем зарезервированным словом repeat объявляется цикл, после чего следуют операторы тела цикла, которые выводят на экран запрос 'Значение Х= ', считывают введенное с клавиатуры значение X. Оператор if проверяет его на неравенство числу 999 и, если оно не равно 999, увеличивает значение суммы Sum на значение числа X. В конце цикла оператор until X = 999 проверяет условие окончания цикла. Если значение выражения Х = 999 истинно, то цикл завершится, а управление в программе будет передано на оператор, находящийся за словом until, т. е. первый оператор за границей цикла repeat. Это вызов процедуры Write l n, которая выведет сообщение 'Сумма введенных чисел равна' и напечатает значение переменной Sum.

Оператор повтора while

Оператор while (пока) часто называют оператором цикла с предусловием за то, что проверка условия выполнения тела цикла производится в самом начале оператора.

Формат записи:                                          

while <условие продолжения повторений> do

     <тело цикла>;

Условие - булевское выражение, тело цикла - простой или составной оператор.

Перед каждым выполнением тела цикла вычисляется значение выражения условия. Если результат равен True, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен False, происходят выход из цикла и переход к первому после while оператору.

 

Пример программы с использованием оператора повтора while

 

Программа DemoWhile производит суммирование 10 произвольно введенных целых чисел.

program DemoWhile;     

const

Limit =10; {Ограничение на количество вводимых чисел}

var Count, Item, Sum: integer;

begin

Count:=0; { Счетчик чисел } 

Sum:= 0;  { Сумма чисел }

while (Count < Limit) do { Условие выполнения цикла }

                  begin

             Count:= Count+1;

Write('Введите ', Count, ' - e целое число: ');

Readln(Item);{Ввод очередного числа с клавиатуры}

Sum:= Sum+Item;

                  end;    

Writeln('Сумма введенных чисел равна ', Sum) ;

end.

В данном примере в разделе описания констант описана константа Limit=10, задающая ограничение на количество вводимых чисел. В разделе описания переменных описаны переменные Count, Item, Sum целочисленного типа. В начале выполнения программы обнуляются значения счетчика введенных чисел Count и их суммы Sum. Затем выполняются цикл ввода 10 чисел и их суммирование. Вначале оператор условия while проверяет условие Count < Limit. Если условие верно, то выполняется составной оператор в теле цикла:

begin

Count:= Count+1;

Write('Введите ', Count, '-e целое число: ');

Readln(Item) ;

Sum:= Sum+Item;

End;

в котором вводится значение очередного числа, и на это значение увеличивается значение суммы. После этого управление в программе вновь передается оператору цикла while, опять проверяется условие Count < Limit. Если условие верно, то выполняется составной оператор и т. д., пока значение переменной Count будет меньше 10. Как только значение Count станет равно 10 и условие Count < Limit не будет соблюдено, выполнение цикла завершится, а управление в программе будет передано на оператор, находящийся за словом end, т. e. первый оператор за границей while. Это вызов процедуры Write l n, которая выведет сообщение 'Сумма введенных чисел равна' и напечатает значение переменной Sum.

Задание 1

Составьте программу для решения одной из следующих задач:

1.1. Для данного натурального числа проверить, делится ли оно на числа: 2, 3, 5, 6, 9.

1.2. По введенному номеру группы выдать сообщение: на каком факультете и на каком курсе учится студент.

1.3. Пройдет ли кирпич со сторонами а, b и с сквозь прямоугольное отверстие со сторонами r и s? Стороны отверстия должны быть параллельны граням кирпича.

1.4. Может ли шар радиуса r пройти через ромбообразное отверстие с диагоналями p и q?

1.5. Можно ли коробку размером a´b´c упаковать в посылку размером r´s´t? «Углом» укладывать нельзя.

1.6. Можно ли на прямоугольном участке застройки размером a´b разместить два дома размерами p´q и r´s метров? Дома можно располагать только параллельно сторонам участка.

 

Задание 2

Составьте программу для решения одной из следующих задач. Программу запишите на диск под своей фамилией.

2.1. Решить невырожденное (т.е. а¹0) биквадратное уравнение ax4+bx2+c=0.

2.2. Решить невырожденное (т.е. а¹0) квадратное неравенство ax2+bx+c>0.

2.3. Дано натуральное число (n£100), определяющее возраст человека (в годах). Дать для этого числа наименования ”год", ”года", ”лет".

2.4. Дано время (часы, минуты, секунды)-три натуральных числа. Определить время через 10 секунд.

2.5. Определить дату следующего дня. Например:

31.12.1985 01.01.1986 29.04.1985 30.04.1985

2.6. Определить, каким днем недели является дата, заданная в виде число, месяц (в текущем году).

2.7. Определить число полных лет на текущий момент по введенной с клавиатуры дате.

2.8. По введенной дате рождения определить, является ли на сегодняшний день совершеннолетним пользователь программы.

2.9. Даны целые числа m, n (0<m£12, 0£n<60), указывающие момент времени: ” m часов, n минут". Определить наименьшее время (число полных минут), которое должно пройти до того момента, когда часовая и минутная стрелки на циферблате:

1)совпадут;

2)расположатся перпендикулярно друг другу.

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

Задание 3

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

Задание 4

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



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

Одномерные массивы

Цель работы: Сформировать понятие одномерного массива числового типа. Овладеть умениями обращения к элементам одномерного массива, ввода и вывода массива, составления алгоритмов обработки массивов.

Теоретические сведения

Массивы. Описание массивов

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

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

Название регулярный тип (или ряды) массивы получили за то, что в них объединены однотипные (логически однородные) элементы, упорядоченные по индексам, определяющим положение каждого элемента в массиве.

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

Элементы, образующие массив, упорядочены таким образом, что каждому элементу соответствует совокупность номеров (индексов), определяющих его местоположение в общей последовательности. Доступ к каждому отдельному элементу осуществляется путем индексирования элементов массива. Индексы представляют собой выражения любого скалярного типа, кроме вещественного. Тип индекса определяет границы изменения значений индекса. Для описания массива предназначено словосочетание: array of (массив из).

Формат записи массивов:

Type

<имя типа> = array [тип индекса] of <тип компонента>;

Var

<идентификатор,..> : <имя типа>;

Массив может быть описан и без представления типа в разделе описания типов данных:

V ar

<идентификатор,...> : array [тип индекса] of <тип компонента>;

Примеры описания одномерных и двумерных массивов

Если в описании массива задан один индекс, массив называется одномерным, если два индекса - двумерным, если n индексов — n -мерным массивом. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный - понятию прямоугольной таблицы (матрицы, набору векторов). Размерность ограничена только объемом памяти конкретного компьютера.

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

Одномерные массивы:

Type

Klass = (К1, К2, КЗ, К4) ;

Znak = array [1..255] of char;

Var

Ml: Znak;     {Тип Znak предварительно описан в разделе типов}

М2: array[1..60] of integer;     {Прямое описание массива М2}

МЗ: array[1..4] of Klass;

Mas: array[1..4] of integer;

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

Двумерные массивы :

Type

Vector = array[1..4] of integer;

Massiv = array[1..4] of Vector;

Var

Matrix : Massiv;

Ту же структуру можно получить, используя другую форму записи:

Var

Matrix : array[1..4,1..4] of integer ;

Для описания массива можно использовать предварительно определенные константы:

Const

G1 = 4; G2 = 6;

Var

MasY: array[1..Gl, l..G2] of real;

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

Например, если имеется массив:

A:array[1..5,1..5] of integer;

то в памяти элементы массива будут размещены по возрастанию адресов:

А[1,1] А[1,2] … А[1,5] А[2,1] А[2,2] … А[5,5]

Контроль правильности значений индексов массива может проводиться с помощью директивы компилятора R. По умолчанию директива R находится в пассивном состоянии {$R-}. Перевод в активное состояние вызывает проверку всех индексных выражений на соответствие их значений диапазону типа индекса.

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

Действия над массивами

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

Например, если массивы А и В описаны как

Var

А , В ; array[1..20] of real;

то применение к ним допустимых операций даст следующий результат:

Выражение     Результат

А=В                           True, если значение каждого элемента массива А равно соответствующему значению элемента массива В

А<>В                        True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В

А:=В                          Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.

Дата: 2019-02-02, просмотров: 387.