Рекомендации по использованию циклов
Структурированные типы данных. Операторы языка.
Цель работы: Изучить использование в программе структурированных типов данных: массивов, строковых типов, записей, множеств. Уметь применять простые и структурированные операторы Паскаля для составления программ. Приемы оптимизации программ.
Теоретическая часть.
1. Структурированные типы данных. В языке Pascal 7.0 используются следующие структурированные типы: массив, запись, множество, файл.
Массивпредставляет собой заранее известное количество однотипных компонентов, снабженных индексами. Массив может быть одномерным и многомерным. Характеристики массива:
- тип — общий тип элементов массива;
- размерность (ранг) — количество индексов массива;
- диапазон — количество допустимых значений каждого индекса;
- форма — совокупность размерности и диапазонов.
Массив описывается в разделе var с использованием конструкции: array[1..n,1..m] of type; где вместо type должен быть указан общий для всех элементов тип (базовый тип). Пример описания одномерного массива: var months_of_the_year: array[1..12] of byte;
Пример сложения двух двумерных массивов, задаваемых случайным образом:
program massiv;
Const
max=10;
Var
array1:array[1..max,1..max] of integer;
array2:array[1..max,1..max] of integer;
array3:array[1..max,1..max] of integer;
i,j:integer;
Begin
randomize;
for i:=1 to max do
for j:=1 to max do
Begin
array1[i,j]:=random(100);
array2[i,j]:=random(100);
array3[i,j]:=array1[i,j]+array2[i,j];
end;
for i:=1 to max do
for j:=1 to max do
if j=max then writeln(array3[i,j]:4,' ') else write(array3[i,j]:4,' ');
writeln;
End.
Строковый тип.Особым типом одномерных массивов являются строки. В Pascal 7.0 последовательность символов, заключенная в апострофы, называется строкой и описывается типом string. Пример описания строковой переменной: var stroka: string[10];
Целое число в квадратных скобках (атрибут длины) задает длину строки. Максимально допустимая длина строки составляет 255 символов и назначается строковой переменной, если атрибут длины не указан. Для строк часто используется функция длины Length(str).
Запись включает в себя несколько полей, тип которых может отличаться друг от друга. Для задания записи используется зарезервированное слово record, затем следует задание типов полей с использованием двоеточия. Доступ к полям записи осуществляется через имя переменной и имя поля, записываемого через точку. Обработка записей производится с помощью оператора with: with <имя записи> do <оператор>;
Пример использования структурного типа данных — записи для задания имени, фамилии и года рождения:
program rec;
Type
human=record
name:string;
surname:string;
data:integer;
end;
Var
human1:human;
Begin
With human1 do
Begin
name:='Катя';
surname:='Иванова';
data:=1984;
writeln(name,' ',surname,' ',data);
end;
End.
Множества. Тип множество задает интервал значений, который является множеством всех подмножеств базового типа. Описание множества содержится в предложении описания переменных var и использует зарезервированное слово set. Пример описания множества: var S:set of char; зарезервированное слово in используется для определения принадлежности множеству. Прокомментируйте следующую программу:
program mnog;
Type
num=set of '0'..'9';
Const
mn2=['.',',', '!',':',';','?','-'];
mn1:num=['0'..'9'];
Var
nnn:string;
leng:integer;
i,num1,m1:integer;
Begin
nnn:='1234567890.,;-!?';
leng:=length(nnn);
num1:=0;
m1:=0;
for i:=1 to leng do
Begin
if nnn[i] in mn1 then num1:=num1+1
Else
if nnn[i] in mn2 then m1:=m1+1;
end;
writeln('num1=',num1,' m1=',m1);
End.
2. Операторы языка
Операторы языка описывают некоторые алгоритмические действия, которые необходимо выполнить для решения задачи. Тело программы представляет собой последовательность таких операторов. Идущие друг за другом операторы разделяются точкой с запятой. Все операторы языка можно разбить на две группы: простые и структурированные.
Простые операторы.Простыми операторы могут быть:
— операторами присваивания;
— операторами обращения к процедуре;
— операторами безусловного перехода GOTO;
— пустыми операторами.
С помощью оператора присваивания какой-либо переменной присваивается значение, например: f:=false; str:='qwerty'; i:=(a+b+c)/c;
Для обращения к процедуре необходимо указать ее имя со списком фактических параметров, например tab_in(n,m);
Оператор безусловного перехода GOTO нарушает нормальное выполнение программы и переводит его на указанную метку. Все используемые метки должны быть перечислены в разделе объявления меток, начинающемся зарезервированным словом Label.
Современный стиль программирования не рекомендует использование этого оператора, так как он затрудняет чтение и отладку.
Пустой оператор никаких действий не производит и не отображается в программе.
Структурные операторы
К структурным операторам в Pascal 7.0 относятся операторы:
1) составной оператор и end;
2) условные операторы:
-условный оператор if;
-оператор выбора case;
3) операторы цикла:
-с предусловием while;
-с постусловием repeat;
-со счетчиком for;
4) оператор для записей with.
Операторы цикла
Операторы цикла используются для вычислений, повторяющихся многократно. В Паскале три вида циклов: цикл с предусловием while, цикл с постусловием repeat и цикл со счетчиком for. Каждый из них состоит из определенной последовательности операторов.
Блок, ради выполнения которого организуется цикл, называется телом цикла. Остальные операторы служат для управления процессом повторения вычислений: это начальные установки, проверка условия продолжения цикла и модификация параметра цикла (рис. 1). Один проход цикла называется итерацией.
А) Б)
Рис. 1. Проверка условия продолжения цикла:
а) цикл с предусловием; б) цикл с постусловием
Начальные установки служат для того, чтобы до входа в цикл задать значения переменных, которые в нем используются.
Проверка условия продолжения цикла выполняется на каждой итерации либо до тела цикла (тогда говорят о цикле с предусловием, рис. 1, а), либо после тела цикла (цикл с постусловием, рис. 1, б). Разница между ними состоит в том, что тело цикла с постусловием всегда выполняется хотя бы один раз, после чего проверяется, надо ли его выполнять еще раз. Проверка необходимости выполнения цикла с предусловием делается до тела цикла, поэтому возможно, что он не выполнится ни разу.
Параметром цикла называется переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Количество повторений такого цикла можно определить заранее.
Оператор цикла while...do. Этот цикл называется с предусловием, т.к. проверка проводится до начала очередной итерации:
while <выражение> do <оператор>.
Выражение должно быть логического типа. Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равенtrue, выполняется расположенный после служебного слова do простой или составной оператор. Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания цикла управление передается на следующий за ним оператор.
Если в теле цикла необходимо выполнить более одного оператора, необходимо заключить их в блок с помощью begin и end.
Пример №1.Программа печати таблицы значений функции
для аргумента, изменяющегося в заданных пределах с заданным шагом.
Опишем алгоритм в словесной форме.
1. Ввести исходные данные.
2. Взять первое значение аргумента.
3. Определить, какому из интервалов оно принадлежит.
4. Вычислить значение функции по соответствующей формуле.
5. Вывести строку таблицы.
6. Перейти к следующему значению аргумента.
7. Если оно не превышает конечное значение, повторить шаги 3 - 6, иначе закончить.
Шаги 3 - 6 повторяются многократно, поэтому для их выполнения надо организовать цикл. Назовем в программе начальное значение аргумента Xn, конечное значение аргумента Xk, шаг изменения аргумента dX, параметр - t. Все величины вещественные. Программа выводит таблицу, состоящую из двух столбцов - значений аргумента и соответствующих им значений функции.
program tabl_fun;var Xn, Xk, dX, t, x, y : real;begin writeln('Введите Xn, Xk, dX, t'); readln(Xn, Xk, dX, t); writeln(' --------------------------- '); writeln('| X | Y |'); writeln(' --------------------------- '); x := Xn; { Начальные установки } while x <= Xk do begin { Заголовок цикла } if x < 0 then y := t; if (x >= 0) and (x < 10) then y := t * x; if x >= 10 then y := 2 * t; writeln('|', x:9:2,' |', y:9:2,' |'); x := x + dX; { Модификация параметра цикла } end; writeln(' --------------------------- ');end. Обратите внимание, что до первого входа в цикл переменной x уже должно быть присвоено какое-либо значение!
Оператор цикла repeat...until. Этот оператор называется циклом с постусловием, т.к. проверка условия осуществляется после каждого выполнения тела цикла:
Тело цикла с постусловием заключено между служебными словами repeat и until, поэтому заключать его в блок не требуется:
repeat<тело цикла> until <выражение> В отличие от цикла while, этот цикл будет выполняться до тех пор, пока логическое выражение после слова until ложно. Как только результат выражения станет истинным, произойдет выход из цикла. Вычисление выражения выполняется в конце каждой итерации цикла.
Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз.
Пример №2.Программа, вычисляющая квадратный корень вещественного аргумента X с заданной точностью eps по итерационной формуле:
yn = 1/2(yn-1 + x/yn-1),
где yn-1 - предыдущее приближение к корню (в начале вычислений выбирается произвольно), yn- последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее, чем на величину заданной точности.
program square_root;var X, eps, { аргумент и точность } Yp, Y : real; { предыдущее и последующее приближение }begin repeat writeln('Введите аргумент и точность (больше нуля): '); readln(X, eps); until (X > 0) and (eps > 0); Y := 1; repeat Yp := Y; Y := (Yp + X / Yp) / 2; until abs(Y - Yp) < eps; writeln('Корень из ', X:6:3, ' с точноcтью ', eps:7:5, 'равен ', Y:9:5);end. Цикл выполняется до тех пор, пока условие не станет истинным.
Оператор цикла for...do.
Этот оператор применяется, если требуется выполнить тело цикла заранее заданное количество раз. Параметр порядкового типа на каждом проходе цикла автоматически либо увеличивается, либо уменьшается на единицу:
for параметр := выражение_1 to выражение_2 do операторfor параметр := выражение_2 downto выражение_1 do оператор Выражения должны быть того же типа, что и переменная цикла, оператор - простым или составным.
В Borland Pascal оператор for имеет два существенных ограничения:
1) Шаг изменения счетчика циклов может быть только или +1 (если используется ключевое слово to), или -1 (если используется ключевое слово downto).
2) Переменная, выступающая в роли счетчика циклов, может быть только порядкового типа и должна быть локальной для того блока, в котором находится оператор for.
Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат оператор goto и процедуры break,continue,exit,halt.
Пример №3.
Программа выводит на экран в столбик числа от 10 до 1 и подсчитывает их сумму:
var i, sum : integer;begin sum := 0; for i := 10 downto 1 do begin writeln(i); inc(sum, i) end; writeln('Сумма чисел: ', sum);end. Если в теле цикла необходимо выполнить более одного оператора, необходимо заключить их в блок с помощью begin и end.
Выражения, определяющие начальное и конечное значения счетчика, вычисляются один раз до входа в цикл. Цикл for реализован в Паскале как цикл с предусловием, то есть его можно представить в виде эквивалентного оператора while. После нормального завершения цикла значение счетчика не определено.
Рекомендации по использованию циклов
Часто встречающимися ошибками при программировании циклов являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись условия продолжения цикла. Нужно помнить и о том, что в операторе while истинным должно являться условие повторения вычислений, а в операторе repeat - условие их окончания.
Чтобы избежать ошибок, рекомендуется:
· не забывать о том, что если в теле циклов while и for требуется выполнить более одного оператора, нужно заключать их в блок;
· убедиться, что всем переменным, встречающимся в правой части операторов присваивания в теле цикла, до этого присвоены значения, а также возможно ли выполнение других операторов;
· проверить, изменяется ли в теле цикла хотя бы одна переменная, входящая в условие продолжения цикла;
· предусматривать аварийный выход из итеративного цикла по достижению некоторого предельно допустимого количества итераций.
Отметим отличия и особенности хорошего стиля работы с рассмотренными операторами
Сравнение работы операторов while, repeat и for
Цикл с предусловием while
(пока условие истинно)
| Цикл с постусловием repeat (до истинности условия)
| 1) До начала цикла должны быть сделаны начальные установки переменных, управляющих условием цикла, для корректного входа в цикл
| 2) В теле цикла должны присутствовать операторы, изменяющие переменные условия так, чтобы цикл через некоторое чоисло итераций завершился
| 3) Цикл работает пока условие истинно
(пока True)
| 3) Цикл работает пока условие ложно
(пока False)
| 4) Цикл завершается, когда условие становится ложным (до False)
| 4) Цикл завершается, когда условие становится истинным (до True)
| 5) Циклможет не выполниться ни разу, если исходное значение условия при входе в цикл равно False
| 5) Цикл обязательно выполняется как минимум один раз
| 6) Если в теле цикла требуется более одного оператора, то необходимо использовать составной оператор
| 6) Независимо от количества операторов в теле цикла использование составного оператора не требуется
| Цикл со счетчиком for
| 1) Начальная установка переменной счетчика циклов до заголовка не требуется
| 2) Изменение в теле цикла значений переменных, стоящих в заголовке цикла, не допускается
| 3) Количество итераций цикла неизменно и точно определяется значениями нижней и верхней границ и шага
| 4) Нормальный ход работы цикла может быть нарушен оператором gotoили процедурами Break и Continue
| 5) Цикл может не выполниться ни разу, если шаг цикла будет изменять значение счетчика от нижней границы в направлении, противоположном верхней границе
|
Задание 1.Размерность массива задается именованной константой.
Вариант 1
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Сумму отрицательных элементов массива.
2.Упорядочить элементы массива по возрастанию.
Вариант 2
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Сумму положительных элементов массива.
2.Упорядочить элементы массива по убыванию.
Вариант 3
В одномерном массиве, состоящем из пцелочисленных элементов, вычислить:
1.Произведение элементов массива с четными номерами.
2.Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные нулю, считать положительными).
Вариант 4
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Сумму элементов массива с нечетными номерами.
2.Сжать массив, удалив из него все элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 5
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Максимальный элемент массива.
2.Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а, Ь]. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 6
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Минимальный элемент массива.
2.Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю, а потом — все остальные.
Вариант 7
В одномерном массиве, состоящем из пцелочисленных элементов/вычислить:
1.Номер максимального элемента массива.
2.Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях.
Вариант 8
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Номер минимального элемента массива.
2.Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает единицу, а потом — все остальные.
Вариант 9
В одномерном массиве, состоящем из пвещественных элементов, вычислить:
1.Максимальный по модулю элемент массива.
2.Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Вариант 10
В одномерном массиве, состоящем из пцелочисленных элементов, вычислить:
1.Минимальный по модулю элемент массива.
2.Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине — элементы, стоявшие в нечетных позициях.
Задание 2.Размерности массивов следует задать именованными константами.
Вариант 1
Дана целочисленная прямоугольная матрица. Определить:
1.Количество строк, не содержащих ни одного нулевого элемента
2.Максимальное из чисел, встречающихся в заданной матрице более одного раза
Вариант 2
Дана целочисленная прямоугольная матрица.
1. Определить количество столбцов, не содержащих ни одного нулевого элемента.
2. Номер столбца, в котором находится самая длинная серия одинаковых элементов.
Вариант 3
Дана целочисленная прямоугольная матрица. Определить:
1.Количество столбцов, содержащих хотя бы один нулевой элемент.
2.Номер строки, в которой находится самая длинная серия одинаковых элементов.
Вариант 4
Дана целочисленная квадратная матрица. Определить:
1. Произведение элементов в тех строках, которые не содержат отрицательных элементов.
2. Максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
Вариант 5
Дана целочисленная квадратная матрица. Определить:
1.Сумму элементов в тех столбцах, которые не содержат отрицательных элементов.
2.Минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.
Вариант 6
Дана целочисленная прямоугольная матрица. Определить:
1.Сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.
2.Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
Вариант 7
Дана целочисленная прямоугольная матрица. Определить:
1. Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.
2. Для заданной матрицы размером 8x8 найти такие k, что k-я строка матрицы совпадает с k-м столбцом.
Вариант 8
Дана целочисленная прямоугольная матрица. Определить:
1. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.
2. Найти номер первого из столбцов, не содержащих ни одного положительного элемента.
Вариант 9
Дана целочисленная прямоугольная матрица. Определить:
1. Найти количество строк, среднее арифметическое элементов которых меньше заданной величины (оформить в виде функции).
2. Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные нулями (оформить в виде процедуры).
Задание 3.Задана строка символов.
Вариант 1. удалить из нее первый знак препинания;
Вариант 2. удалить из нее последний знак препинания;
Вариант 3. определить число пробелов в строке;
Вариант 4. заменить в ней все восклицательные знаки на точки;
Вариант 5. заменить в ней все 'А' на 'ААА';
Вариант 6. группы символов в ней между группами пробелов считаются словами. Посчитать, сколько слов содержит данная строка;
Вариант 7. вывести ее на экран задом наперед;
Вариант 8. определить длину самого короткого слова.
Вариант 9. определить сколько раз встречается символ в строке, введенный пользователем.
Задание 4.Создайте список с указанием ваших фамилий, имён, телефонных номеров и дат рождения (число, месяц, год). Использовать тип запись (RECORD), вывести в удобном для просмотра формате.
Задание 5. Из множества целых чисел [1..100] выделить следующие множества:
Вариант 1. делящихся на 6 без остатка;
Вариант 2. делящихся без остатка на 2 или на 3;
Вариант 3. делящихся на 2 без остатка;
Вариант 4. делящихся без остатка на 3 или на 5;
Вариант 5. множество простых чисел;
Вариант 6. делящихся без остатка на 5;
Вариант 7. делящихся без остатка на 3;
Вариант 8. делящихся без остатка на 10.
Вариант 9. делящихся без остатка на 4 и 3.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|