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

417-Информатика 1 Муравьев

.pdf
Скачиваний:
18
Добавлен:
11.05.2015
Размер:
1.04 Mб
Скачать

 

61

PROGRAM M_if;

VAR

a1,a2:integer;

begin

{ начало программы }

Readln(a1,a2);

IF a1>a2 then

writeln('a1 больше, чем a2',' a1=',a1:5,' a2=',a2:5) else writeln('a1 меньше, чем a2',' a1=',a1:5,'

a2=',a2:5);

end.

{ конец программы }

Для другого примера: если a1 больше чем a2, вычислить произведение a1*a2, занести произведение в переменную a3 и вывести данные на экран. В этом случае необходимо использовать составной оператор.

PROGRAM M_iif;

 

 

 

VAR a1,a2,a3:integer;

 

 

begin

{ начало программы }

 

Readln(a1,a2);

 

 

 

IF a1>a2 then

 

 

 

begin a3:=a1*a2;

a2=',a2:5,'

a3=',a3:5);

writeln('a1>a2',' a1=',a1:5,'

end

writeln('a1<a2','

a1=',a1:5,'

a2=',a2:5);

else

end.

{ конец программы }

 

7.19. Оператор выбора CASE

Оператор CASE (иногда его называют оператор-переключатель) позволяет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором, и списка параметров, каждому из которых предшествует список констант выбора (список может состоять и из одной константы). Формат:

CASE <выражение-селектор> OF <список 1> : <оператор 1;> <список 2> : <оператор 2;>

<список N> : <оператор N;> ELSE <оператор E> END;

Алгоритм работы оператора CASE приведен на рисунке:

62

В этой конструкции ELSE <оператор E> может отсутствовать. Тип констант в любом случае должен быть совместим с типом селектора, для селектора запрещены типы REAL и STRING. Если в списке 1 имеется значение, равное значению селектора, тогда выполняются оператор 1 и выход из оператора, если в списке 2 - тогда оператор 2 и выход из оператора и т.д. Если в списке нет значения, равного выражению селектора, тогда выполняется оператор, следующий за ELSE.

Как пример приведем фрагмент программы, в которой переменной Vib типа STRING присваивается фамилия, если значение переменной Vr типа INTEGER равно 1, имя - если Vr=2 или 5 и отчество - если Vr=3 и вывести на экран строку 'ФИО', если Vr не равно 1,2,3,5.

CASE Vr OF

1: Vib:='Иванова';

2,5: Vib:='Мария';

3: Vib:='Николаевна';

ELSE Writeln('ФИО');

END;

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

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

63

Оператор цикла FOR состоит из заголовка и тела цикла и может быть представлен в двух форматах:

FOR <параметр цикла> := n1 TO n2 DO <оператор>;

параметр увеличивается каждый раз на единицу, изменяясь от n1 до n2 (n2 должен быть больше n1).

FOR <параметр цикла> := n1 DOWNTO n2 DO <оператор>;

параметр уменьшается каждый раз на единицу, изменяясь от n1 до n2 (n1 должен быть больше n2).

n1 и n2 - целочисленные выражения, константы или переменные, определяющие соответственно начальное и конечное значение параметра цикла. FOR... DO - заголовок цикла, <оператор> - тело цикла. В качестве параметра цикла выступает целочисленная переменная. Тело цикла может быть простым, состоящим из одного оператора и составным - тогда в качестве оператора выступает составной оператор. Оператор FOR еще называют оператором цикла с фиксированным числом циклов, поскольку к началу выполнения оператора уже определены значения n1 и n2, а значит и число циклов.

Пример - занесение в одномерный массив A целочисленного типа и размерностью 1..100 квадратов простых чисел от 1 до 100 и печать их значений на экране:

PROGRAM Kvadrat; Const n1=1;

n2=100;

Var

i :integer;

Mas_kvad :array[1..100] of integer; begin

FOR i:=n1 to n2 DO begin Mas_kvad[i]:=i*i;

Writeln('i=',i:3,' Mas_kvad[',i:3,']=',Mas_kvad[i]:5); end;

end.

64

Алгоритм работы оператора цикла FOR .. DO:

Оператор цикла с предусловием WHILE имеет формат:

WHILE <условие> DO <оператор>;

и работает следующим образом - пока условие имеет логическое значение TRUE, происходит циклическое выполнение оператора (тела цикла) до тех пор, пока значение условия не станет равно FALSE (т.е. ложным). Поэтому в теле цикла должно быть заложено условие выхода из цикла, иначе цикл будет выполняться бесконечно. Особенно надо быть осторожным, если в качестве условия используется равенство вещественных чисел, и лучше вообще отказаться от такого условия, поскольку вещественные числа представлены в памяти компьютера в округленном виде. Если в теле цикла необходимо выполнение нескольких операторов, логично использовать составной оператор.

Алгоритм работы:

65

Пример предыдущей программы, но с использованием оператора WHILE:

PROGRAM Kvadrat; Const

n2=100;

Var

i :integer;

Mas_kvad :array[1..100] of integer;

begin i:=1;

WHILE i<=n2 DO begin

Mas_kvad[i]:=i*i;

Writeln('i=',i:3,'Mas_kvad[',i:3,']=',Mas_kvad[i]:5); i:=i+1;

end;

end.

Оператор REPEAT аналогичен оператору WHILE, но проверка условия осуществляется после выполнения оператора и выход из цикла происходит, если значение условия равно TRUE. Если в операторе WHILE тело цикла может вообще не выполняться, то в операторе REPEAT оно выполняется минимум один раз. Формат:

66

REPEAT

...

операторы

...

UNTIL <условие>

Алгоритм работы:

В заключение лекций первого семестра приводится список некоторых стандартных математических функций:

Abs(X) - вычисляет абсолютную величину X.

ArcTan(X) - вычисляет арктангенс от Х.

Sin(X) - вычисляет синус от Х.

Cos(X) - вычисляет косинус от Х.

Exp(X) - вычисляет экспоненту от Х.

Ln(X) - вычисляет натуральный логарифм от Х.

Sqr(X) - вычисляет квадрат от Х.

Sqrt(X) - вычисляет квадратный корень от Х.

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

СHR(I) - возвращает символ c номером I.

67

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

Рекомендации по составлению программ

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

Для отладки программ удобно пользоваться встроенным отладчиком DEBUG, который является составной частью интегрированного компилятора TURBO-PASCAL и имеет отдельное окно главного меню. Отладчик позволяет "прогонять" программу по отдельным шагам (так называемая трассировка программы), просматривая на каждом шаге, как меняются значения переменных, которые мы определили в отдельном окне.

После набора программы выполним компиляцию программы командой Compile". Если в программе обнаружены ошибки, компилятор выдаст сообщение об этом на английском языке и в программе высветится другим цветом строка, на которой расположен неправильно написанный оператор. Типичные примеры сообщения компилятора: "Unknown Identifier" - (необъявленный идентификатор) означает что в программе существует идентификатор переменной, константы или функции, которая не описана в разделе описаний. Компилятору не известно, какого она типа. "Type mismatch" - (Неправильный тип) означает, что переменной присваивается неправильный тип значения. Например, если попытаться присвоить целочисленной переменной вещественное (дробное) значение или символьной переменной присвоить числовое или логическое значение.

Также возможны, в начале программирования, следующие типичные ошибки:

-отсутствует завершающее слово END (с точкой) в конце программы;

-отсутствует начальное слово BEGIN в начале программы;

-отсутствует разделитель операторов (точка с запятой);

-неполный составной оператор (забыто завершающее слово END). Если компиляция успешна, компилятор выдаст сообщение - "Compile

successful: Press any key" ("Компиляция успешна: нажмите любую клавишу"). После этого можно послать программу на счет (RUN). В процессе счета также возможны ошибки. Если попытаться при вводе числовой переменной с экрана ввести символ, программа остановится и

68

выдаст об этом сообщение. Либо может произойти переполнение разрядной сетки какой-либо переменной (выход ее значения за диапазон типа, к которому она принадлежит). Также возможно деление на нуль. Если какой-нибудь числовой переменной присвоить значение 0 и затем попытаться на нее поделить, естественно результат неопределен и произойдет остановка программы. Вообще говоря, любое некорректное действие приводит к остановке программы (аварийное завершение программы"). "Аварийное" не в смысле, что оно приводит к аварии и выходу из строя компьютера, а в программном смысле такая программа не работоспособна. Для таких случаев очень удобен отладчик, поскольку позволяет наблюдать значения данных в пошаговом режиме (т.е. при выполнении каждой строки программы отдельно).

При выполнении команды "Window" главного меню откроется меню, в котором можно выбрать команду "Watch", и откроется окно "Watch", в котором можно наблюдать значения переменных. Какие именно значения переменных отображать можно, установив курсор на идентификатор переменной, выбрать команду DEBUG главного меню, в нем команду "Watches" и в нем команду "Add Watch" (“горячая” клавиша Ctrl-F7) Таким образом появится строка ( если вы выполните эти действия или нажмите Ctrl-F7), в которой будет стоять идентификатор переменной. Нажав <Enter> можно занести имя этой переменной. Аналогично можно добавить имена других переменных. Справа от этих имен переменных через двоеточие будут стоять значения этих переменных. Если программа ранее не была запущена на счет, значения этих переменных будут неопределенными и вместо значений будет находиться сообщение "Unknown identifier". Трассировку программы можно осуществлять, нажимая клавиши F7 или F8. Каждое нажатие клавиши приведет к выполнению одной строчки программы. F8 осуществляет трассировку без захода в процедуры и функции, а F7 с заходом в функции и процедуры.

Переход между окнами редактора и "Watch" осуществляется нажатием функциональной клавиши F6. При переходе в окно "Watch" возможно редактирование, удаление выражений. Это же можно осуществить с помощью меню BREAK/WATCH:

-команда "Delete Watch" удаляет текущее выражение из окна "Watch" (это выражение должно быть помечено маркером);

-команда "Edit Watch" позволяет редактировать выражение в окне

"Watch";

-команда "Remove all Watches" удаляет все выражения, которые отображены в окне "Watch".

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

69

программу, вычисляющую значения синуса и печатающую значения аргумента на экране. Блок-схема программы приведена выше.

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

Program Sinus; {

название программы }

Const ennd=2*Pi; {

задание диапазона аргумента }

h=ennd/20;

{ Задание изменения аргумента (шаг)

}

 

Var

{ arg - аргумент, s1 - вычисленное

arg,s1: real;

 

значение синуса }

begin Writeln;

arg:=0; { начальное значение аргумента} While arg<=ennd do

begin

s1:=sin(arg); {Вычисление синуса} writeln('arg=',arg:5:2,' s1=',s1:5:3);

{Печать аргумента и знач-я синуса} arg:=arg+h; { изменение аргумента}

end;

end.

70

После изучения языка TURBO PASCAL постарайтесь ответить на контрольные вопросы:

1.Какого типа переменным можно присваивать значения переменных другого типа?

2.Какие типы в языке PASCAL относятся к порядковым типам?

3.Чем отличается символьный тип от строкового типа?

4.Назвать диапазоны допустимых значений для целых и вещественных типов данных.

5.Какие операторы можно использовать с логическим (BOOLEAN) типом, какие операторы возвращают значение логического типа?

6.Как объявляются перечислимые типы данных?

7.Какое максимальное число элементов перечислимого типа?

8.Привести пример ограниченного типа данных.

9.Можно ли в качестве элементов ограниченного типа использовать вещественные числа?

10.Какова максимально возможная длина строки и какова длина строки по умолчанию (без ее явного об'явления)?

11.Каков порядок выполнения арифметических операций?

12.Каков порядок выполнения логических операций?

13.Какой тип операндов у операций отношения и у логических операций?

14.Какого типа переменные Z и Y в программе, содержащей строку:

IF Z THEN Y:=A=B и что будет происходить при выполнении этой строки программы?

15.Переменные какого типа можно использовать в качестве параметров цикла FOR.TO..DO?

16.В чем отличие циклов WHILE..DO и REPEAT..UNTIL?