Рассмотренных операторов вполне достаточно для написания программ любой сложности. Тем не менее, в некоторых случаях использование операторов перехода может упростить программу.
Оператор перехода имеет вид:
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).
Задача 11. Выяснить, имеются или не имеются среди чисел cos(i3)sin(in), i = 1,..., n, меньшие 0.0001. Если имеются, то выводится “есть”, если нет – “нет” (рис. 50).
Программа.
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пустой оператор. Основное назначение пустого оператора – дать возможность выхода из середины программы или составного оператора.
Программу можно написать с двумя операторами перехода:
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]. Турбо Паскаль может контролировать использование индексов в программе на этапе компиляции и на этапе счета.
Для иллюстрации работы с массивами составим программы для задач, алгоритмы которых разработаны в теме 2.
Задача 12. Определить количество студентов в группе, имеющих рост выше среднего.
Соответствует задаче 7 в теме 2.
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 – массив ростов студентов.
Задача 13. Задана последовательность из n чисел. Определить количество положительных, отрицательных и нулевых элементов. Это задача 8 из темы 2, где разработан алгоритм и приведена схема алгоритма. Запишем программу.
program task13;
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” перед остановкой в ожидании ввода. Это является подсказкой для человека, использующего программу. Вывод – подсказку перед оператором ввода следует делать всегда.
Задача 14. Группа из N человек сдавала в зимнюю сессию M экзаменов. Известны результаты экзаменов. Подсчитать средний балл по каждому предмету.
В задаче 13, приведенной в теме 2, разработан алгоритм расчета среднего балла для каждого студента. В нашей задаче отличие заключается в том, что необходимо найти сумму элементов каждого столбца 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 write (s[j]) {Вывод одномерного массива}
end.