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

Практикум по основам программирования. Язык Паскаль

.pdf
Скачиваний:
9
Добавлен:
15.11.2022
Размер:
6.27 Mб
Скачать

Применение перечислимого типа повышает на­ глядность программы и дает возможность автоматиче­ ски контролировать допустимость значений перемен­ ных. Например, описание

TYPE DAY= (MO,TU(WE,TH,FR,SA,SU);

VAR D1,D2,D3:DAY;

означает, что переменные D1,D2,D3 типа DAY при вы­ полнении программы могут принимать только одно из семи указанных значений. Объект, указанный в списке, может присутствовать не более чем в одном описании. Так как значение FOUR встречается в обоих типах, следующие два задания типов несовместимы:

TYPE Tl=(ONE,TWO,THREE,FOUR);

TYPE T2=(FOUR,FIVE,SIX);

Имена объектов, указанных в описании перечисли­ мого типа, являются константами этого типа. Поэтому, имея описания

TYPE NAME=(JOHN,TOM,NICKTANNrrANE);

TYPE COLOR= (RED.BLUE.BLACK);

VAR X,Y,Z:NAME; Cl,C2,C3:COLOR;

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

Cl:= BLUE; X:=ANN; Y:=TOM; C2: = RED

Нельзя присваивать переменной значение из описания другого типа.

Операторы присваивания Z:=BLACK; СЗ:=ТОМ недопу­ стимы.

Для перечислимого типа данных существенен поря­ док указанных объектов. К данным перечислимого ти­ па применимы операции отношения. Например, из предыдущего описания и примеров операторов при­ сваивания следует, что выражения X>JOHN, С2<С1, Y<X имеют значение TRUE.

Для объектов перечислимых типов определены стандартные функции PRED.SUCC и ORD, имеющие тот же смысл, что и для стандартных скалярных ти­ пов. Например, для типа COLOR результатом функции SUCC(RED) является значение BLUE, результатом функции PRED(BLACK) - BLUE. Функция ORD(BLUE)

выработает значение, равное единице, так как нумера* ция объектов в списке начинается с нуля.

Приведенный ниже пример цикла с предусловием по заданному значению переменной 1Т(фамилии) при­ сваивает переменной IT соответствующее имя:

PROGRAM РТ(INPUT,OUTPUT)5

TYPE ИМЯ^(АНДРЕИ эАЛЕКСЕИ,БОРИС fГЛЕБ); ФАМИЛИЯ=(ИВАНОВ,ПЕТРОВ,СИДОРОВ,ШИЛОВ);

VAR FT,Р1:ФАМИЛИЯ;1Т,Р2:ИМЯ;

Р 1:«ИВАНОВ; Р2:«АНДРЕИ;

WHILE P1<FT DO BEGIN

Pls«SUCC(Pl); P2:=SUCC(P2>

END;

IT:=P2;

В языке ПАСКАЛЬ нельзя непосредственно вводить и выводить на внешние устройства значения перечислимых типов.

Ниже рассматриваются способы организации ввода/вывода значений перечислимых скалярных типов с по­ мощью оператора варианта.

3.2 ОГРАНИЧЕННЫЕ ТИПЫ

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

T Y P E D A Y =(MO,TU,WE,TH,FR,SA,SU);

NOM=10..25;

SSS=’C ..’X ’;

W D=SA.SU;

для ограниченного типа NOM базовым является це­ лый тип, для SSS - символьный, для WD - определен-

42

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

К переменным ограниченного типа применимы все операции и стандартные функции, которые допу­ стимы при работе с переменными соответствующего базового скалярного типа.

3.3 ОПЕРАТОР ВАРИАНТА

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

Общий вид оператора варианта:

CASE < СЕЛЕКТОР> OF

< СПИСОК

МЕТОК

ВАРИАНТА>:

< ОПЕРАТОР >;

< СПИСОК

МЕТОК

ВАРИАНТАМ

< ОПЕРАТОР >

END;

Здесь и далее в тексте угловые скобки < > упот­ ребляются для обозначения словами (метасимволами) синтаксических конструкций языка.

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

Рассмотрим программу с использованием операто­ ра CASE:

PROGRAM WAR(INPUT,OUTPUT);

VAR SYM:'A'..'G'; IvJsl..9; BEGIN

READLN;

WRITE(ВВЕДИ БУКВУ ИЗ ДИАПАЗОНА A-F *>'); READLN(SYM); WRITE(‘ВВЕДИ ЦЕЛОЕ ЧИСЛО ИЗ ДИАПАЗОНА 1-9 *>'); READLN(I>: CASE SYM OF

*A*,*B*,‘С*,*E*: WRITELN(SYM:3,* БУКВА И РУССКАЯ И ЛАТИНСК •D‘t*F‘t‘G‘i WRITELN(SYMs3,* БУКВА ЛАТИНСКАЯ')

END;

CASE I OF

2,4,8: BEGIN WRITE(I:2,' КРАТНО 2' J:«ROUND(I/2); WRITELN(* 1/2= *,J:2)

END;

3,9: BEGIN WRITE(I:2,‘ КРАТНО 3*); WRITELNC 1/3*'.ROUND(1/3):2)

END;

A: WRITELN(1:2,* КРАТНО 2 И 3',' I/А=*.ROUND(I/2/3):, 1,5,7: WRITELN(1:2,* ПРОСТОЕ ЧИСЛО')

END END.

П р о т о к о л р а б о т ы п р о г р а м м ы с входными данными - F и 9:

ВВЕДИ БУКВУ ИЗ ДИАПАЗОНА A - F = > F

ВВЕДИ ЦЕЛОЕ ЧИСЛО ИЗ ДИАПАЗОНА 1 - 9 = > 9 F БУКВА ЛАТИНСКАЯ

9 КРАТНО 3 1/3= 3

Переменные SYM и I описаны как переменные ограниченных типов. Конкретные значения вводятся при помощи оператора READLN до выполнения опе­ ратора варианта. READLN без параметров необходим для пропуска пустой строки из стандартного файла ввода (см. гл. 1).

В первом фрагменте оператор варианта в зависи­ мости от значения переменной SYM печатает символ и комментарий о принадлежности латинскому алфави­ ту или латинскому и русскому алфавиту.

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

Обращение к стандартной функции ROUND обязательно, так как операция деления выра­ батывает всегда вещественный результат.

Оператор варианта удобно использовать для ввода и вывода значений перечислимых скалярных типов. Например, в следующем фрагменте с внешнего носи­ теля вводится порядковый номер объекта из списка значений перечислимого типа COLOR. Оператор CASE присваивает соответствующее значение переменной CLR. Аналогично осуществляется вывод значений пе­ ременной CLR при помощи оператора варианта.

PROGRAM CAS(INPUT,OUTPUT); TYPE COLOR=(RED,BLUE,BLACK); VAR X:INTEGER;CLR:COLOR;

BEGIN WRITE(*==>*); READLN(X); CASE X OF

0:CLR:=RED;

1:CLR:=BLUF;

2:CLR:=BLACK

END;

WRITE( COLOR-*); CASE CLR OF

RED:WRITELN <'RED*):

BLUE:WRITELN('BLUE *);

BLACK:WRITELN <*BLACK *) END

END.

П р о т о к о л р а б о т ы п р о г р а м м ы :

= = >2

COLOR-BLACK

3.4ВОПРОСЫ И УПРАЖНЕНИЯ

1.Описать переменную I как переменную ограничен­ ного типа, принимающую целочисленные значения от

20 до 35.

2. Можно ли задать переменную ограниченного типа, принимающую вещественные значения на отрезке [2; 5]?

3. Ойисать переменную перечислимого типа, прини­ мающую значения названий дней недели.

4*. Указать ошибки в следующих описаниях:

CONST А=2..30; В:=’В’; Р1=3,14159; ТУРЕ ОТРЕЗОК=(1..20);

ГОРОД= (МОСКВА; ТОМСК; ОМСК; БАКУ);

БУКВЫ= (’A’.’BVC’.’D’); ЦИФРЫ=(0,1,2,3,4,5,б,7,8,9);

5. Можно ли в разделе типов описать одновременно два следующих перечислимых типа?

TYPE КАРАНДАШИ= (СИНИЙ,КРАСНЫЙ,ЗЕЛЕНЫЙ); ЦВЕТА» (ЖЕЛТЫЙ,ГОЛУБОЙ,синий);

б*. Имеются следующие описания;

ТУРЕ ФИГУРА» (КРУГ,КВАДРАТ,РОМБ);

VAR Т.Х.ФИГУРА; г,У:(КОРЗИНА,СУМКА,ПОРТФЕЛЬ);

Какие из перечисленных операторов присваивания не­ правильно записаны и почему?

а)

Х:=КРУГ;

б) Z:=КВАДРАТ;

в)

Т:=Х;

г) Y:=ORD(Z)+l;

7*. В разделе типов описан список деталей

TYPE СПИСОКДЕГАЛЕЙ» (ШУРУП,ГАЙКА,ВИНТ,ШПИЛЬКА);

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

8*. Дано описание переменной ТЕКСТ перечислимого типа:

VAR ТЕКСТ:(ЛЕТО,ОСЕНЬ,ЗИМА,ВЕСНА);

По введенному целочисленному значению пере­ менной I присвоить переменной ТЕКСТ соответствую­ щее значение. Написать фрагмент программы.

9. Правильно ли описаны следующие переменные:

VAR ТЕКСГ:(ЛЕГО,ОСЕНЬ,ЗИМА.ВЕСНА); ТЕКСГ1:ЛЕТО..ЗИМА; ТЕКСГ2:ВЕСНА..ОСЕНЬ; ТЕКСТЗ:ЗИМА..ЗИМА;

10*. Найти ошибки в следующей программе:

PROGRAM ERROR (INPUT ,OUTPUT >;

TYPE МЕСЯЦ»(ЯНВ,ФЕВ,MAP,АПР,МАИ,ИМИ,ИЮЛ, АВГ,СЕН,ОКТ,НОЯ,ДЕК >:

ОСЕНЬ=СЕН..НОЯ;

VAR М;ОСЕНЬ; D;-0 -..•<?•; К:0..9; BEGIN READ(М,D,K>;

IF М>СЕН THEN Dr“К ELSE Kt=0RD(M)-8t WRITELN<K,D+K>

END.

Объяснить, какие правила языка ПАСКАЛЬ наруше­ ны?

11. Описать переменную ГОДРОЖДЕНИЯ, характеризу­ ющую допустимые года рождения учащихся технику­ ма. Какой тип данных целесообразно использовать?

46

2. Получение навыков в организации ввода/вывода зна­ чений переменных перечислимых типов данных.

П о с т а н о в к а з а д а ч и По заданным номеру квартала, дате, включающей

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

С о д е р ж а н и е о т ч е т а

1.Постановка задачи для конкретного варианта.

2.Блок-схема программы.

3.Текст программы.

4.Результаты отладки по тестам и счета основного ва­ рианта.

5.Анализ ошибок.

М е т о д и ч е с к и е у к а з а н и я 1. Задание может быть выполнено двумя способами:

а) номер квартала, дата и день недели задаются непосредственно в программе в виде констант;

б) исходная дата и день недели вводятся при по­ мощи оператора варианта.

2. Пример программы, которая по заданной дате (чис­ ло, месяц, год) определяет дату следующего дня:

PROGRAM ТА(INPUT,OUTPUT)|

TYPE МЕСЯЦ» <ЯНВ,ФЕВ,МАР,АЛР,МАИ,ИЮНfИЮЛ,АВГ,СЕНfОКТ,НОЯ,ДЕК); ДЕНЬ-1..31; ГОД-1900..2000;

VAR ДхДЕНЬ; М«МЕСЯЦ; Г*Г0Д| НОМ*1..12; BEGIN WRITE!*-»>*>; READLN!Д,НОМ,Г>;

CASE НОМ OF 1* Ms-ЯНВ; 2х Ms-ФЕВ; 3* Ms-МАР; 4; Мх-АПР; 5х Ms-МАИ; 6s Ms-ИЮН; 7s Ms-ИЮЛ; 8s Ms-АВГ; 9s Ms-СЕН; 10s Ms-ОКТ; 11s Ms-НОЯ; 12s Мх-ДЕК

END;

CASE M OF ЯНВ,MAP,МАИ,ИЮЛ,АВГ,OKTs IF Д-31 THEN

BEGIN Д:-1; Mr-SUCC(M) END ELSE Д:=Д+1;

АЛР,ИЮН,СЕН,НОЯ* IF Д-30 THEN BEGIN Да-l; Ms-SUCC<M) END ELSE Дх—Д-*-!;

ДЕК*

IF Д=31 THEN BEGIN Д:=1;M:=ЯНВ;Г:=Г+1 END

ФЕВ*

ELSE Д:=Д+1;

(Г MOD 100=0))

IF (Д=2В)

AND ((Г MOD 400) OR

 

 

 

 

AND

(Г MOD 40000)

 

 

THEN BEGIN Д:=1; M*=MAP END

 

END)

ELSE Д*=Д+1

 

 

WRITE(Д:2)|

 

 

CASE M OF

ЯНВАРЯ);

 

 

ЯНВ*

WRITEC

 

 

ФЕВ:

WRITE С

ФЕВРАЛЯ);

 

 

MAP*

WRITEC

МАРТА*);

 

 

АПР*

WRITEC

АПРЕЛЯ*);

 

 

MAPI: WRITEC

МАЯ ):

 

 

ИЮН*

WRITEC

ИЮНЯ*);

 

 

ИЮЛ:

WRITE <* ИЮЛЯ*);

 

 

АВГ*

WRITEC

АВГУСТА*);

 

 

СЕН: WRITEC

СЕНТЯБРЯ );

 

 

ОКТ* WRIТЕС

ОКТЯБРЯ *);

 

 

НОЯ: WRITEC

НОЯБРЯ*);

 

 

ДЕК: WRIТЕС

ДЕКАБРЯ *)

 

 

END:

 

ГОДА*)

 

 

WRITELN(Г:5,*

 

 

END.

 

 

 

 

П р о т о к о л

р а б о т ы

п р о г р а м м ы для

исход­

ной даты 28 февраля 1980 года:

 

 

 

 

= = >

28 2 1980

 

 

 

 

 

 

 

 

29 ФЕВРАЛЯ 1980 ГОДА

 

 

 

 

 

В а р и а н т ы з а д а н и я

 

 

 

 

 

 

Дата и день

 

 

Дата и день

 

 

недели

 

 

недели

1

1

27 февраля

пятница

11

3

30 августа воскре­

 

2

 

 

 

 

 

 

сенье

 

2

12 апреля

воскре­

12

4

7 октября среда

3

3

сенье

 

 

 

 

1

23 января пятница

26 августа

среда

13

4

4

30 ноября

понедель­

14

2

11 мая понедельник

 

1

ник

 

 

 

 

3

22 сентября

вторник

5

23 марта понедель­

15

6

2

ник

 

 

 

16

4

16 ноября понедель­

9 мая суббота

 

 

 

 

 

 

 

 

ник

 

7

3

1 сентября

втор­

17

1

29 марта

воскре­

 

 

ник

 

 

 

 

 

сенье

 

8

4

9 декабря среда

18

2

1 июня понедель­

 

 

 

 

 

 

 

 

ник

 

9

1

12 января

понедель­

19

3

13 августа

четверг

10

2

ник

 

 

 

 

4

 

 

1 мая

пятница

20

21 декабря

поне­

 

 

 

 

 

 

 

 

дельник

 

РЕГУЛЯРНЫЕ ТИПЫ ДАННЫХ

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

4.1. МАССИВЫ

Регулярный тип, или массив, есть упорядоченный набор данных одинакового типа. Массив описывается при помощи задания типа его компонентов и типа индексов. При задании типа индексов(Т1) фактически указывается число компонентов массива, поэтому тип индексов может быть любым скалярным или ограни­ ченным, кроме неограниченного целого. Следует также помнить, что вещественный тип нельзя использовать при задании типа индексов. Тип компонентов массива(Т2) может быть любым простым или сложным.

Общий вид описания массива: ARRAYfTl] OF Т2. Рассмотрим примеры описания типов и перемен­

ных:

TYPE

COLOR=(RED,BLUE.BLACK);

 

 

MASl'ARRAYC-5..151 OF REAL;

 

MAS2=ARRAYI1..10,1..103 OF INTEGER;

 

MAS3=ARRAYC'A '..#C '1 OF

ARRAYС1. .5 1 OF BOOLEAN;

VAR

MAS4=ARRAYrBOOLEAN! OF

CHAR ;

AsMASt; B:MAS2;

C:t1AS3;

D;MAS4;

 

E :ARRAY tDOLORI

OF RE AL:

 

Переменная А есть вектор с вещественными ком­ понентами, перенумерованными от - 5 до 15. Пере­ менная В есть квадратная матрица целых чисел, со­ стоящая из 10 строк и 10 столбцов. Переменная С описана как матрица логических величин, у которой задано три строки ’А’,’В’,’С и пять столбцов. Обраще­ ние к элементу этой матрицы, стоящему на пересече­ нии 2-й строки и 1-го столбца, выглядит так: С[’В’, 1].

Переменная D -это символьный вектор, состоящий из двух компонентов; Тип переменной Е описан непос­ редственно в разделе переменных и является трехком­ понентным вещественным вектором, так как перечис­ лимый тип COLOR, указанный в качестве типа индек­ са, содержит три объекта и описан ранее. Три компо-