книги / Практикум по основам программирования. Язык Паскаль
.pdfПрименение перечислимого типа повышает на глядность программы и дает возможность автоматиче ски контролировать допустимость значений перемен ных. Например, описание
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, указанный в качестве типа индек са, содержит три объекта и описан ранее. Три компо-