
- •Тема 2.2. Основные понятия языка программирования высокого уровня Free Pascal
- •Системы программирования
- •Интегрированная среда разработки FreePascal
- •Введение в язык Паскаль Характеристика языка программирования Паскаль
- •Основные понятия технологии программирования
- •Алфавит языка Паскаль
- •Структура программы на Паскале
- •Типы данных
- •Стандартные типы данных
- •Структуры данных
- •Строковый тип
- •Структурированные переменные
- •Представление основных структур программирования на языке Паскаль Операции и выражения
- •Арифметические операции и выражения
- •Логические операции
- •Оператор присваивания
- •Составной оператор
- •Условный оператор
- •Процедура write
- •Процедура ввода
- •Оператор выбора
- •Операторы повторений
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Метки и операторы перехода
- •Работа с массивами
- •Операции над строками
- •Функция Length
- •Функция Upcase
- •Функция Сopy
- •Функция Pos
- •Процедуры Insert и Delete
- •Процедура Str
- •Процедура val
- •Практические примеры работы со строковыми данными
- •Оператор присоединения with
- •Процедуры и функции Паскаля
- •Формальные и фактические параметры
- •Типизированные константы
- •Interface
- •Implementation
- •Interface
- •Interface
- •Implementation
- •Файловый тип данных Типизированные файлы
- •Текстовые файлы
Метки и операторы перехода
Рассмотренных операторов вполне достаточно для написания программ любой сложности. Тем не менее, в некоторых случаях использование операторов перехода может упростить программу.
Оператор переходаимеет вид:
GOTO <метка>.
Здесь GOTO – зарезервированное слово (перейти на метку).
<метка> – метка.
Метка в Паскале – это произвольный идентификатор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. В языке Паскаль допускается в качестве меток использование целых чисел без знака. Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Перед тем, как появиться в программе, метка должна бытьописана.Описание меток состоит из зарезервированного слова LABEL (метка), за которым следует список меток.
label 222, a1, met;
Описанной меткойдолжен быть помечен ровноодин операторпрограммы.
Оператор переходауказывает, что дальнейшая работа должна продолжаться в другой части текста программы, а именно с того места, где находится метка.
Пусть программа содержит последовательность операторов:
x :+ 2; a := b; goto 99;
14 : a := 0; x := b; 99 : y := x; write(x)
В этом случае сначала выполняются операторы x := 2 и a := b, затем следует переход к оператору, помеченному меткой 99, то есть к оператору y := x. После оператора y := x будет выполнен оператор write(x).
Задача. Выяснить, имеются или не имеются среди чисел cos(i3)sin(in), i = 1, ..., n, меньшие 0.0001. Если имеются, то выводится “есть”, если нет – “нет” (рис. 7).
Программа.
program task11;
label m1;
var i, n : integer;
begin
readln(n);
for i := 1 to n do
if cos(i*i*i)*sin(i*n) < 0.0001 then
begin
write(‘есть’)’;
goto m1
end;
write(‘нет’);
m1 : end.
Если оказывается, что некоторое число меньше 0.0001, то следующие числа уже не рассматриваются, следует вывод “есть” и переход на конец программы. Перед end расположен помеченный меткой m1 пустой оператор. Основное назначение пустого оператора – дать возможность выхода из середины программы или составного оператора.
Рис. 7. Пример блок-схемы алгоритма
Программу можно написать с двумя операторами перехода:
program task11в;
label m1,m2;
var i, n : integer;
begin
readln(n);
for i := 1 to n do
if cos(i*i*i)*sin(i*n) < 0.0001 then goto m1;
write(‘нет’); goto m2;
m1 : write(‘есть’)’;
m2 : end.
C помощью оператора перехода, расположенного вне условного оператора или оператора цикла, нельзя перейти внутрь этого условного оператора или оператора цикла. Частое использование оператора GOTO считается дурным тоном. Это затрудняет чтение программы и нарушает принципы структурного программирования.
Работа с массивами
При описании массива необходимо указать общее число входящих в массив элементов и тип этих элементов. Например:
var
a : array [1..10] of real;
b : array [0..50] of char;
c : array [–3..4] of boolean;
При описании массива используются зарезервированные слова ARRAY и OF (массив из). За словом ARRAY в квадратных скобках указывается тип-диапазон, с помощью которого компилятор определяет общее число элементов массива. Тип-диапазон задается левой и правой границами изменения индекса массива, так что массив а состоит из 10 элементов, массив b – из 51, а массив с – из 8.
Доступ к каждому элементу массива в программе осуществляется с помощью индекса – целого числа (точнее, выражения порядкового типа), служащего своеобразным именем элемента в массиве (если левая граница типа–диапазона равна 1, индекс элемента совпадает с его порядковым номером). При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках, например:
b[17] := ‘f”;
c[–2] := a[1] > a[2]
for k := 1 to 10 do a[k] := 0;
В правильно составленной программе индекс не должен выходить за пределы, определенные типом диапазоном. Например, можно использовать элементы a[1], b[38], c[0], но нельзя a[0] или с[38]. Паскаль может контролировать использование индексов в программе на этапе компиляции и на этапе счета.
Проиллюстрируем работу с массивами на примерах.
Задача. Определить количество курсантов в группе, имеющих рост выше среднего.
program task12;
const
m = 40;
var
i, n, k : integer; s : real;
r : array [1..m] of real;
begin
readln(n);
s := 0;
for i := 1 to n do
begin
readln(r[i]);
s := s + r[i]
end;
s := s/n;
k := 0;
for i := 1 to n do
if r[i] > s then k := k+1;
write (‘Количество курсантов ростом выше среднего = ‘,k)
end.
m – константа целого типа. Максимальное количество курсантов в группе может быть равно 40. Для величин ростов курсантов используется одномерный массив из m элементов. n – количество курсантов в каждой конкретной группе, для которой производится расчет. i – номер текущего курсанта. k – счетчик количества курсантов, имеющих рост выше среднего. r – массив ростов курсантов.
Задача. Задана последовательность из n чисел. Определить количество положительных, отрицательных и нулевых элементов. Запишем программу.
program task;
const
h = 20;
var i, k, l, m, n : integer;
a : array [1..h] of real;
begin
write(‘Введите n, n <= 20’); readln(n);
for i :=1 to n do
begin
write(‘Элемент ‘,i); readln(a[i])
end;
l := 0; r := 0; m := 0
for i := 1 to n do
if a[i] <0 then
k := k+1
else
if a[i] >0 then
l := l+1
else
m := m + 1;
write(‘Отрицательных ‘,k, ‘ . Положительных ‘,l,’ . Нулевых ‘,m)
end.
В программе введены вспомогательные операторы вывода write(‘Введите n, n <= 20’), write(‘Элемент ‘,i). Эти операторы служат для пояснения исходной информации. При выполнении программы на экран выводится “Введите n, n <= 20” перед остановкой в ожидании ввода. Это является подсказкой для человека, использующего программу. Вывод-подсказку перед оператором ввода следует делать всегда.
Задача. Группа из N человек сдавала в зимнюю сессию M экзаменов. Известны результаты экзаменов. Подсчитать средний балл по каждому предмету.
В данной задаче необходимо найти сумму элементов каждого столбца ∑aijдвумерного массива и тогда среднее Sj ср= Sj/N. Результатом расчета будет одномерный массив S, состоящий из M элементов.
Исходные данные: N – количество курсантов в группе, M – число экзаменов в сессию, матрица A – оценки. a[i,j] – оценка i-го курсанта по j-му экзамену. Массив А – двухмерный массив, состоящий из N строк и M столбцов. Размер массива – N х M. Размерность массива А равна двум, то есть две координаты (номер строки и номер столбца) определяют положение каждого элемента.
Программа.
program task14;
const
n = 30; m = 5;
var
i,j : integer;
s : array [1..m] of real; {Описание одномерного массива s}
a : array [1..n,1..m] of integer;{Описание двухмерного массива а}
begin
for i := 1 to n do
for j := 1 to m do
readln(a[i,j]); {Ввод элементов матрицы.}
for j := 1 to m do
begin
s[j] := 0;
for i := 1 to n do
s[j] :=s[j] +a[i,j];{Суммируются элементы каждого столбца матрицы}
s[j] := s[j]/n
end;
for j := 1 to m do writeln (s[j]) {Вывод одномерного массива}
end.