Интервальный тип (тип диапазон) 
";


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Интервальный тип (тип диапазон)



 

Описание интервального типа:

 
 

 

 


Константные выражения (границы диапазона) должны принадлежать одному и тому же упорядоченному типу, который является базовым для вводимого типа. Значение первого константного выражения не может превышать значения второго константного выражения. Символ алфавита «..» называется индикатором диапазона. Множество значений интервального типа составляют значения базового типа, принадлежащие диапазону. Интервальные типы можно использовать всюду, где допустим соответствующий базовый тип.

Примеры:

type t_month = 1 .. 12; {Интервальный тип на базе целого}

t_letter = ‘A’ .. ’Z’; {Интервальный тип на базе символьного}

var m1, m2: t_month; {Переменные интервального типа}

digit: ‘0’ .. ‘9’; {Переменная интервального типа на базе символьного}

 

Перечисляемый тип

 

Описание перечисляемого типа:

 
 

 

 


Каждый идентификатор в описании перечисляемого типа является константой определяемого типа. Например,

Type t_season = (Winter, Spring, Summer, Autumn);

Определен перечисляемый тип из четырех значений.

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

Использование перечисляемых типов улучшает смысловую читаемость программы.

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

ord(n) -возвращает код значения аргумента n (для целочисленных типов код значения - само число).

pred(n) и succ(n) - возвращают соответственно значение, предшествующее аргументу и следующее за аргументом в упорядоченной последовательности значений типа аргумента. Если соответствующего элемента в последовательности не окажется, то произойдет ошибка времени выполнения.

Примеры:

ord(Winter) = 0;

ord(Summer) = 2.

pred(Summer) = spring;

succ('a') = 'b',

pred(Winter) - ошибка,

succ(Autumn) - ошибка.

Будем называть перечисляемыми типами упорядоченные типы, нумерация элементов которых начинается с нуля. Согласно такому определению, стандартные типы boolean, char, byte, word являются перечисляемыми.

12. СТАНДАРТНЫЙ ВВОД

 

Связь программы с внешним миром осуществляется с помощью операторов ввода и вывода. Эти операторы представляют собой вызовы стандартных процедур ввода и вывода.

Процедуры ввода read и readLn позволяют инициализировать переменные значениями, вводимыми с клавиатуры.

Синтаксическая диаграмма процедуры read:

 
 

 

 


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

При вводе значений типы переменных должны быть совместимы по присваиванию с соответствующими им вводимыми значениями.

 

Ввод числовых данных

 

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

 

Пример 1.

 

var n: word; Набрать значения n и r можно в одной

r: real; строке,,

begin или в разных строках,

read(n,r);

... { операторы }.

end.

 

 

Ввод символьных данных

 

При вводе символьных данных считывается очередной символ из буфера и присваивается символьной переменной. Поэтому при последовательном вводе символов разделители не требуются. Следует обратить внимание на то, что после ввода числа в символьную переменную может быть введен только пустой символ.

 

Пример 2.

var c1,c2: char; При вводе (между a и b - пробел)

begin получим с1= ‘a’,

read(c1,c2); c2= #32 (пробел).

{операторы} Символ ‘b’ остается в буфере.

end.

 

Процедура readLn

 

Выполнение процедуры readLn отличается от read только тем, что после считывания значений и присваивания их параметрам происходит переход к новой строке.

 

Пример 3.

var n, m: byte; Набрать значения n, r и m можно в одной

r: real; строке,,

begin или в разных строках,

read(n,r);.

 

read(m); Результаты будут одинаковы:

... { операторы }

end..

 

Пример 4.

var n, m: byte; Если набрать значения n, r и m,

r: real; или

begin,

readLn(n,r); то значение 131 переменной m не будет присвоено, так как ожидается ввод значения m с новой строки.

read(m);

... { операторы } Правильный ввод:

end. или

 

.

 

27 164 gf  
Процедуру readLn можно использовать для ввода символьных данных после числовых.

 
 


Пример 5.

var n, m: byte;

с1, с2: char;

gf
begin

readLn(n,r); Допустимый ввод: или

read(c1, c2);.

... { операторы }

end.

Символьные значения вводятся с новой строки.

 

Процедуру readLn можно вызвать без параметров. В этом случае, если в буфере нет символа новой строки, выполнение программы приостанавливается до нажатия клавиши перехода к новой строке (Enter).

Ввод символьных строк будет рассмотрен в разделе «Строковый тип».

13. СТАНДАРТНЫЙ ВЫВОД

 

Вывод на дисплей выполняют процедуры write и writeLn.

Синтаксическая диаграмма вызова процедуры write:

 
 

 


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

123k
12 3 k
Вывод начинается с текущей позиции курсора на экране. После вывода значения курсор помещается за последним выведенным символом, и вывод следующего значения начнется с этой позиции. Никаких разделителей между выводимыми значениями не предусмотрено. Поэтому оператор write(12, 3,‘k’) выведет строку. Для разделения значений можно предусмотреть вывод пробелов между ними. Так, оператор

12 3 k
write(12,’ ‘,3, ‘ ‘, ‘k’) выведет.

 

Значения типа real выводятся в форме с плавающей точкой в следующем виде:

(-|)<цифра>. <цифра>{<цифра>}E(+|-)<цифра><цифра> (1)

Количество цифр после точки - 10. Общее число позиций, занимаемых вещественным числом, при этом равно 17. Например, оператор

-1.2345000000E+02
write(-123.45) выведет.

Процедура writeLn выполняется так же, как и write, но после вывода значений переводит курсор в начало новой строки. WriteLn можно использовать и без параметров для перехода к новой строке.

Форматный вывод

 

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

Формат имеет вид

 
 

 


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

Если для вывода целого, логического, символьного или строкового значения ширины поля вывода недостаточно, то поле вывода расширяется, и значение выводится без искажения.

 

Вывод значений типа real

 

1. Вывод в форме с плавающей точкой в виде (1) происходит по умолчанию (без указания формата) и в формате с одним целым. Максимальная длина выводимого значения - 17. Если в формате указано больше, то число будет выведено в 17 позициях, а свободные позиции слева заполнятся пробелами.

-1.3E+02
-1.3E+02
Значение формата, меньшее 17, используется для уменьшения количества цифр после десятичной точки. Их минимальное число - 1, то есть минимальная длина выводимого значения - 8. Если целое в формате меньше 8, то считается, что оно равно 8.

Например, оператор write(-126.45: 4) выведет. Вывод происходит с округлением.

-126.5
2. Вывод в форме с фиксированной точкой происходит при использовании формата с двумя целыми. Первое целое, по-прежнему, - ширина поля вывода. Второе целое определяет количество знаков после десятичной точки. Число выводится с округлением. Если при этом ширина поля окажется недостаточной для вывода целой части, то поле будет расширено. Оператор write(-126.465:4:1) выведет.

 

Пример программы на Паскале

 

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

 

program digits_sum;

var n: 100 .. 999; {для хранения трехзначного числа}

a, b, c: 0 .. 9; { для хранения цифр числа n}

begin

write(‘Введите трехзначное число ‘); {подсказка пользователю}

read(n);

a:= n mod 10 { а - младшая цифра n}

b:= n div 10 mod 10 { b - средняя цифра n }

c:= n div 100 {с - старшая цифра n };

writeLn(‘Сумма цифр числа ’, n, ‘ равна ’, a+b+c)

end.

 

Для n = 459 будет выведено: «Сумма цифр числа 459 равна 18».

 

14. ОПЕРАТОР БЕЗУСЛОВНОГО ПЕРЕХОДА

 

Оператор безусловного перехода g oto позволяет нарушить естественный порядок выполнения действий и передать управление из одной части программы в другую:

 
 

 


Выполнение этого оператора заключается в передаче управления оператору, помеченному меткой.

Метка - целое неотрицательное число от 0 до 9999, а в ТР метка может быть и идентификатором. Все метки описываются в разделе описания меток в виде

 

 
 

 


Порядок перечисления меток произвольный.

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

Оператор, помеченный меткой, имеет вид

 
 

 

 


Оператор безусловного перехода в структурном программировании не используется.

 

15. ПУСТОЙ ОПЕРАТОР

 

read(x, y);;a:=x+y;
Пустому оператору синтаксически не соответствуют никакие символы. Например,

 

Между оператором ввода и оператором присваивания находится пустой оператор.

Синтаксис не требует разделять точкой с запятой оператор и ключевое слово еnd; если она есть, это значит, что перед еnd стоит пустой оператор.

 

16. СТРУКТУРИРОВАННЫЕ ОПЕРАТОРЫ

Cтруктурированные операторы - операторы, в состав которых входят другие операторы.

Составной оператор

 

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

 
 

 

 


Ключевые слова begin и end называются операторными скобками.

Выбирающий оператор

 

В Паскале два вида выбирающего оператора: условный оператор и оператор переключатель.

1. Условный оператор используется при кодировании развилок, то есть для организации бинарного ветвления.

 


При отсутствии ветви еlse условный оператор будем называть неполным. После ключевых слов then и еlse синтаксис требует наличия только одного оператора. Если же по какой-либо ветви нужно выполнить несколько операторов, то следует использовать составной оператор. Перед еlse точка с запятой недопустима, так как в этом случае между then и else будут два оператора, один из которых пустой.

Если оператор, выполняемый по ветви then или еlse, является условным, то говорят о вложенных условных операторах. В случае вложенных условных операторов каждое еlse относится к ближайшему предшествующему then.

 

Примеры вложенных условных операторов (каждое else рекомендуется располагать под соответствующим then):

a) Оператор присваивает переменной max maximum{a, b, c}:

if a>b then if a>c then max:=a

else max:=c

else if b>c then max:=b

else max:=c;

 

б) Оператор, эквивалентный приведенной слева развилке, имеет вид

 
 


if a>b then

begin

if a>c then a:=0

end

else a:=1;

 

 

 
 

 


В приведенном примере вложенный условный оператор - неполный, поэтому он заключен в операторные скобки. При отсутствии операторных скобок неполным будет внешний оператор.

2. Оператор переключатель предназначен для организации множественного ветвления.

 

Синтаксическая диаграмма переключателя:


-

       
 
 
   

 

 


Выражение после ключевого слова case называется селектором. Селектор должен иметь упорядоченный тип, кроме типа longint. Константы называются метками случаев. они должны относиться к тому же типу, что и переключатель.

Работа оператора сase заключается в следующем. Вычисляется значение селектора. Если это значение совпадает с одной из меток случаев, то выполняется оператор, записанный после нее. Если значение селектора не совпало ни с одной из меток случаев, то выполняется оператор, следующий за еlse. Если ветвь еlse отсутствует, то управление передается оператору, следующему за переключателем. Диапазоны и метки случаев не должны пересекаться.

В качестве примера рассмотрим программу для определения экзаменационной оценки по количеству набранных абитуриентом баллов. Оценка выставляется по правилам, приведенным в таблице:

 

Балл (b) Оценка
bÎ[0; 4]  
bÎ[4.25; 7]  
bÎ[7.25; 9.25]  
bÎ[9.5; 10]  

 

Program ball_to_ mark;

Var b: real;

m: 2..5;

begin write (‘Введите количество баллов ‘);

read(b);

case round (b*4) of {селектор должен иметь упорядоченный тип}

0..16: m:=2; {границы диапазонов из таблицы умножены на 4}

17..28: m:=3;

29..37: m:=4

else m:=5

end;

writeln(b, ‘ баллов - оценка ‘, m)

end.

 

Оператор цикла

 

В Паскале 3 вида оператора цикла: цикл с предусловием, цикл с постусловием ицикл с фиксированным числом шагов.

1. Цикл с предусловием:

 
 


Логическое выражение в заголовке цикла является условием возобновления цикла, то есть, пока оно истинно, выполняется оператор - тело цикла. Если при входе в цикл логическое выражение ложно, то тело цикла не выполнится ни разу.

Опишем программу для нахождения наибольшего общего делителя двух чисел, используя алгоритм Евклида.

Program LCD;

var a, b, m, n, r: word;

begin

write(‘Введите два натуральных числа. ’); read(a, b);

m:= a; n:= b; {для сохранения исходных данных}

r:= a mod b;

while r <> 0 do

begin

{Тело цикла - составной оператор,содержащий три оператора}

a:= b; b:= r; r:= a mod b

end;

writeln(‘НОД(’, m, ‘, ’, n, ‘)=’, b)

end.

2. Цикл с постусловием:

 

 


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

Опишем программу для решения следующей задачи. С клавиатуры вводится последовательность символов. Признак конца ввода - точка. Определить количество введенных цифр. Вводимую последовательность не хранить.

 

Prоgram digits_sum;

Var ch: char; sum: word;

Begin writeln(‘Введите текст, оканчивающийся точкой.’);

sum:=0;

repeat {начало цикла}

read(ch); {считывание очередного символа}

if (ch >=’0’) and (ch <= ‘9’) {если символ - цифра}

then sum:= sum + 1; {увеличиваем счетчик}

until ch = ’. ’; {выход из цикла после считывания точки}

writeln(‘ Число цифр в тексте= ‘, sum)

end.

 

3. Цикл с фиксированным числом шагов:

 
 

 


-

 

В приведенной диаграмме оператор представляет собой тело цикла. Перед телом цикла - заголовок цикла. Идентификатор после ключевого слова for называется управляющей переменной или параметром цикла. Управляющая переменная должна иметь упорядоченный тип, совместимый по присваиванию с первым (начальным) и вторым (конечным) выражениями в заголовке цикла. Следовательно, начальное и конечное выражения также должны быть упорядоченного типа.

Значения начального и конечного выражений вычисляются один раз при входе в цикл. Цикл for является циклом с предусловием. При входе в цикл управляющей переменной (назовем ее i) присваивается значение начального выражения (обозначим его bn). Затем i сравнивается со значением конечного выражения (обозначим его bk). Если i£bk для цикла с ключевым словом to или i³bk для цикла с ключевым словом downto, то выполняется тело цикла. После чего изменяется значение i: для цикла с ключевым словом to i:=succ(i), для цикла с ключевым словом downto i:=pred(i). И снова i сравнивается с bk. Если условие возобновления цикла не выполняется, то происходит выход из цикла. Алгоритм работы цикла for можно описать блок-схемами.

1) for i:= bn to bk do <оператор> 2) for i:= bn dounto bk do <оператор>

 

В теле цикла for нельзя изменять параметр цикла. Так как начальное и конечное выражения вычисляются только один раз при входе в цикл, то изменение bn и bk на количество повторений не влияет. После выхода из цикла for значение параметра цикла считается неопределенным.

 

Пример 1. Последовательность Фибоначчи задается рекуррентно:

f1=1, f2=1,

fi = fi-2+ fi-1 для i>2.

Определить n-й член последовательности.

Программа для нахождения fn:

 

Program Fibonacci;

Var f1, f2, f3: longint; i, n: word;

Begin write(‘Введите n’); read(n);

f1:= 1; f2:= 1;

for i:= 3 to n do

begin

f3:= f1+f2; f1:= f2; f2:= f3

end;

writeln(n, ‘-ое число Фибоначчи=’,f2)

end.

 

17. СТИЛЬ ЗАПИСИ ПРОГРАММЫ

 

При создании понятных, удобочитаемых программ большое значение имеет стиль записи программы. Стандарта для стиля записи нет, но можно дать некоторые рекомендации:

1. Основные части программы разделять пустыми строками.

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

3. Операторы одного уровня вложенности начинать с одной позиции по вертикали.

4. Вложенные операторы записывать с некоторым смещением вправо.

5. Включать в программу комментарии.

 

Комментарии

 

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

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

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

1) назначение программы;

2) сведения об авторе;

3) название организации, в которой создана программа;

4) дату написания программы;

5) используемый метод решения;

6) указание по вводу-выводу;

7)для программ производственного характера:

а) объем занимаемой памяти;

б) время выполнения программы;

в) указания оператору ЭВМ.

Комментарии-заголовки служат для выделения и указания назначения основных частей программы.

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

Программа, содержащая такую информацию, называется самодокументированной.

Программы производственного характера считаются хорошими, если их текст содержит не менее 30% комментариев.

 

18. ОТЛАДКА ПРОГРАММ

 

Для успешного выполнения программы необходимо выполнение двух требований:

1. Программа должна быть правильной. Правильность программы определяется степенью соответствия формальным требованиям, то есть спецификации программы.

2. Входные данные должны быть правильными.

Процесс нахождения и устранения ошибок в программе называется отладкой.

Процесс поиска ошибок во входных данных называется проверкой корректности входных данных.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 300; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.12.101 (0.006 с.)