Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Развёрнутые лекции по Паскалю.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
512.51 Кб
Скачать

13.2.Вывод данных на монитор

=>Write(<список параметров через запятую>); - Вывод переменных на

экран монитора.

Write(A,B,C);=Write(A);Write(B);Write(C);

Данные выводятся в одну строку без пробелов.

=>WriteLn[(<список параметров через запятую >)]; - Вывод переменных

на экран монитора и перевод курсора в начало следующей строки.

Примечания:

->Для отделения выводимых данных необходимо вставлять пробелы:

WriteLn(A,' ',B,' ',C);

->Переменные целого, символьного, строкового типов выводятся в

реальную длину.

->Переменные вещественного типа выводятся: один знак до запя-

той, десять-после и степень с показателем в виде буквы E(e).

->Переменные логического типа выводятся словами TRUE и FALSE.

->Переменные перечисляемого типа непосредственно не выводятся

на монитор, для их вывода необходимо использовать оператор

выбора Case или константы.

Пример 20. {продолжение примеров 7, 14, 18}

->Begin

Case Col Of

Red:WriteLn('красный');

Green:WriteLn('зеленый');

Blue:WriteLn('голубой');

Black:WriteLn('черный');

End;

End.

->Const Arcol:Array[Color] Of String[7]=('красный','зеленый',

'голубой','черный');

Begin

WriteLn(Arcol[Col]);

End.

->На месте выводимых параметров могут стоять идентификаторы

функций и/или выражения.

Пример 21.

WriteLn(Sin(X),' ',Chr(97),' ',A+B*C);

13.3.Форматирование при выводе данных

Форматирование используется для наглядности представления дан-

ных и расположения их в нужном месте экрана монитора или документа.

а)При выводе переменных целого типа можно указать ширину или

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

если реальное их число не больше указанной ширины.

A:=10;B:=2;C:=115;

WriteLn(A,B,C); -> 102115,

WriteLn(A:2,B:2,C:2); -> 10 2115

WriteLn(A:3,B:2,C:5); -> 10 2 115,

WriteLn(A:-3,B:2,C:-5); -> 10 2115 .

б)При выводе переменных вещественного типа можно указать шири-

ну-общее число символов, включая точку, и число знаков после точки.

При отбрасывании лишних символов используется правило округления, а,

если число знаков до запятой больше отведенного, то выводится реа-

льное их число. Если указано число знаков после точки больше общей

длины, то выводится указанное число знаков после точки.

X:=421.53;

WriteLn(X); -> 4.2153000000E+02 {так будет на экране}

└───10───┘

WriteLn(X:4); -> 4.2E+02 {округление и вывод только 3}

└3┘ {знаков, включая ., пока ши-}

{рина не будет = числу знаков + 5 - на десятичный множитель}

WriteLn(X:6:2); -> 421.53

║ └2┘

╚══6═╝

WriteLn(X:8:2); -> 421.53, {так будет на экране}

WriteLn(X:8:4); -> 421.5300,

WriteLn(X:-8:2); -> 421.53 .

в)При выводе переменных символьного и строкового типов можно

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

WriteLn(C:2,St:20);

WriteLn(' ':25,C:20,St:20);

WriteLn('':10,'арбуз'#10' ',C:2,#10,St:10);

WriteLn(^G,#10,C:2,St:15);

г)Игнорирование неправильного ввода данных.

=>IoResult:Word; - Функция, возвращающая код ошибки ввода-вывода

(кое-где пишут, что ее тип Integer).

Uses Crt; {подключаем блок Crt}

Var B:Byte;

Begin

ClrScr; {очищаем экран}

Repeat

Write('Введите целое число ');

{$I-}

ReadLn(B);

{$I+}

Until IoResult=0; {введено ли число в диапазоне 0..255}

...

End.

или

Until (IoResult=0)And(B<Max)And(B>Min); -если необходимо огра-

ничить диапазон значений вводимой переменной.

д)Вывод управляющих символов

Операторы вывода срабатывают на символы: #10,#13(^M),#7,#8,#9.

При выводе на экран символы с 1 по 31 необходимо задавать че-

рез Chr( ). При этом, помимо выше перечисленных, не выводятся сим-

волы с номерами: 11, 13, 26.

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

В ТР определены 4 типа структурированных данных: массивы, за-

писи, множества и файлы. Они характеризуются множественностью обра-

зующих этот тип элементов. В ТР допускается произвольная глубина

вложенности типов, но суммарный размер любого типа не должен превы-

шать 65520 байт.

=>SizeOf(X):Word; - Функция, возвращающая размер в байтах любой пе-

ременной, в том числе и структурированного типа.

14.1.Тип массив Array[ ] Of

Массив - это совокупность однотипных элементов.

Примечания:

->Синтаксис этого типа <идентификатор массива>=Array[<диапазо-

ны индексов через запятую>] Of <тип элементов>;

->Каждый элемент массива может быть явно обозначен, и к нему

возможен прямой доступ с использованием квадратных скобок [].

->Число элементов в массиве определяется при его описании и не

может быть изменено в дальнейшем.

->В качестве <диапазона индексов> может быть использован любой

порядковый тип, кроме LongInt.

-><тип элемента> может быть любым, включая массив, то есть во-

зможны многомерные массивы. Многомерный массив хранится так,

что самый правый индекс увеличивается первым.

->Функции Low и High возвращают значение нижней и верхней гра-

ниц массива.

->Массивы типа Array[0..N] Of Char называются массивом симво-

лов с нулевой базой и используются для хранения строк с нуль

окончанием, которые совместимы со значениями PChar {$X+}.

->Открытым массивом называется массив вида Array Of <тип>. Они

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

1.Как объявить переменную типа массив?

-развернутая схема (через введение типа):

Пример 22.

Type ArReal=Arrey[1..50] Of Real; {вещественный}

ArByte=Array[Char] Of Byte; {символьный}

ArChar=Array[Color] Of Char; {перечисляемый}

ArAr=Array[1..10] Of Array[1..5] Of Real= {многомерный}

Array[1..10,1..5] Of Real;

Var Ar1:ArReal;

Ar2:ArByte;

Ar3:ArChar;

-короткая схема:

Пример 23.

Var Ar1:Array[1..50] Of Real;

Ar2:Array[Char] Of Byte;

Ar3:Array[Color] Of Char;

2.Какие массивы бывают?

->Пользовательские, т.е. те, которые вы сами объявили в про-

грамме, как в примерах 22 и 23.

->Стандартные (предопределенные), т.е. те, которые определе-

ны разработчиками ТР. Таких массивов в TP пять: Mem, MemW,

MemL - обеспечивают доступ к оперативной памяти, а Port,

PortW - обеспечивают доступ к портам ввода/вывода процес-

сора ЭВМ. Компоненты Mem и Port -Byte, MemW и PortW -Word,

MemL -LongInt.

Пример 24.

->Известно, что по адресу 0:$408 в памяти ЭВМ хранится номер

порта принтера. Следующая программа распечатывает строку си-

мволов через этот порт.

Uses Crt;

Var Np:Word;S:String;I:Byte;

Begin

Np:=MemW[0:$408];

For I:=1 To Length(S) Do Begin

Port[Np+1]:=1;

Delay(5);

Port[Np]:=S[i];

Delay(5);

Port[Np+1]:=0;

Delay(5);

End;

End.

->While Port[$B2] And $80=0 Do; {ожидание нажатия клавиши}

->Известно, что по адресу 0:$410 памяти ЭВМ хранится перемен-

ная, свидетельствующая о подключенном оборудовании к ЭВМ.

NumPrinter:=MemW[0:$410] Shr 14; {Число портов для принтера}

NumDrivers:=1+(MemW[0:$410] And $0010) Div $40; {Дисководов}

->В ЭВМ есть буфер ввода с клавиатуры, состоящий из регистров,

начиная с адреса 0:$41A. Его размер 32 байта. Для его обну-

ления надо указать в программе MemW[0:$41A]:=MemW[0:$41C];

3.Как используются массивы?

->Как переменные в программе для хранения, приема и передачи

данных.

->Как типизированные константы.

Пример 25.

->Const (значения обязательно записываются в круглых скобках)

Digits:Array[0..9] Of Char=('0','1','2','3','4','5','6','7',

'8','9');

->Type Cube=Array[0..1,0..1,0..1] Of Integer;

Const Maze:Cube=(((0,1),(2,3)),((4,5),(6,7)));

4.Как осуществляется доступ к элементам массива?

Maze[0,0,0]:=0; {напомним, что значения}

Maze[1][0][1]:=2; {типизированных констант}

Maze(.0,1,1.):=3; {можно изменять в программе}

Var Bool:Array[Boolean] Of Byte;

Begin

Bool[False]:=5;

Bool[True]:=10;

...

Type Row=(A,B,C,D,E,F,G,H);

ChessPiecis=(White(Black)King, {король}

White(Black)Queen, {ферзь}

White(Black)Rook, {ладья}

White(Black)Knight, {конь}

White(Black)Bishop, {слон}

White(Black)Pown, {пешка}

Empty); {пусто}

ChessBoard=Array[Row,1..8] Of ChessPiecis;

Var InitPosition:ChessBoard;

CurRow:Row;

J:Byte;

Begin

For J:=3 To 6 Do

For CurRow:=A To H Do InitPosition[CurRow,J]:=Empty;

For CurRow:=A to H Do InitPosition[CurRow,2]:=WhitePown;

For CurRow:=A to H Do InitPosition[CurRow,7]:=BlackPown;

InitPosition[A,1]:=WhiteRook;

...

InitPosition[H,1]:=WhiteRook;

...

5.Какие действия возможны с массивами?

->Если в программе объявлены массивы одного типа, например:

Var Ar1,Ar2:Digits; то можно присвоить элементы одного ма-

ссива другому оператором присвоения: Ar1:=Ar2;

->Любые другие действия: математические, логические и т.п.,

а также ввод с клавиатуры и вывод на дисплей и принтер мо-

жно выполнять только с отдельными элементами массива, как

показано в пункте 4.

6.Сортировка массивов

->Сортировка обменом (метод пузырька). Последовательно срав-

ниваются пары соседних элементов Xк и Xк-1 и, если Xк<Xк-1,

то они переставляются. Таким образом, наибольший элемент

станет последним. В следующем цикле следующий по старшенс-

тву элемент станет предпоследним и т.д.

Пример 26.

Const N=100;

Var M,K,I:Byte;

X:Array[1..N] Of Real;

R:Real;

Begin

For I:=N DownTo 2 Do

For K:=2 To I Do

If X[K]<X[K-1] Then Begin

R:=X[K];

X[K]:=X[K-1];

X[K-1]:=R;

End;

End.

->Сортировка выбором. Ищется максимальный элемент, запомина-

ется его номер и по окончании цикла этот элемент переноси-

тся в конец массива, затем то же самое выполняется для

всех, кроме последнего и т.д.

Пример 27. {константы и переменные как в примере 26}

Begin

For I:=N DownTo 2 Do

Begin

M:=1;

For K:=2 To I Do If X[K]>X[M] Then M:=K;

R:=X[I];

X[I]:=X[M];

X[M]:=R;

End;

End.

7.Обнуление целых массивов

=>FillChar(Mize,SizeOf(Mize),0);

Пример 28.

Распечатать все элементы, которые являются минимальными в сво-

ей строке и максимальными в своем столбце.

Program MiniMax;

Label L;

Const Max=100;

Var Matrix:Array[1..Max,1..Max] Of Real;

I,J,K:Byte;

M:Real;

Begin

Randomize;

For I:=1 To Max Do

For J:=1 To Max Do Matrix[I,J]:=Random*1E+3; {заполняем}

For I:=1 To Max Do Begin

K:=1;

M:=Matrix[I,1];

For J:=2 To Max Do If Matrix[I,J]<M Then Begin

M:=Matrix[I,J];

K:=J;

End;

For J:=1 To Max Do If Matrix[J,K]>M Then Goto L;

WriteLn('Строка=',I,' столбец=',K,' значение=',

Matrix[I,K]:6:2);

L:End;

End.

8.Перемещение данных внутри массива

=>Move(Sourse,Dest,Count); - Перемещает Count байт из Sourse в

Dest.

Пример 29.

Var A:Array[1..1000] Of <тип>;

Begin

Move(A[1],A[101],500*SizeOf(<тип>));

Move(Mem[$B800:0],Mem[$B900:0],4000); - Копирование экрана.

Move(Mem[$B900:0],Mem[$B800:0],4000); - Восстановление экр.

...

14.2.Тип строка String

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

похож на одномерный массив символов Array[1..N] Of Char. Количество

символов в строке не более 255. Если в результате различных дейст-

вий над строками будет получаться больше, то лишние символы отбра-

сываются.

Примечания:

->Первый байт в строке имеет индекс 0 и содержит код символа,

соответствующий длине строки.

->Для хранения переменной типа String необходимо на 1 байт бо-

льше, чем реальная длина строки за счет байта с индексом 0.

1.Как объявить переменную типа строка?

-развернутая схема (через введение типа):

Type St12=String[12]; {это примеры строк пользовательского}

St50=String[50]; {типа}

Var S1:St12;S2:St50;

-короткая схема:

Var S1:String[12];S2:String[50]; {S1-строка из 12 символов}

S:String; {это пример строки стандартной}

2.Какие строки бывают?

->Пользовательские, т.е. те, которые вы сами объявили в про-

грамме, как в пункте 1.

->Стандартные: S:String; или, если они объявлены в модуле.

Пример 30.

В блоке DOS объявлены:

Type ComStr=String[127]; - Командная строка.

PathStr=String[79]; - Строка пути к файлу.

DirStr=String[67]; - Драйвер + имя файла.

NameStr=String[8]; - Имя файла.

ExtStr=String[4]; - Расширение файла.

3.Как используются строки?

->Как переменные в программе для хранения, приема и передачи

данных.

->Как типизированные константы:

Const S1:String[12]='Это-паскаль!';

Type St12=String[12];

Const S2:St12='Это-паскаль!';

Type ArSt=Array[Color] Of String[7]; {для примеров 18, 20}

Const ArCol:ArSt=('красный','зеленый','голубой','черный');

4.Как осуществляется доступ к отдельным символам строки?

St[5]; - это пятый символ в строке.

St1[5]:='n';

ArCol[1,4]:='c';

5.Какие действия возможны над строками?

->Можно присваивать значение одной строки другой, но надо

учитывать длины строк для исключения выхода за размер.

->Можно проводить операции отношения типа: =, <>, <, >, >=,

<=. При этом, если одна короче другой, то недостающие по-

зиции добавляются символом Chr(0). Сравнение производиться

слева направо посимвольно в соответствии с кодами из таб-

лицы ASCII:

'ПАскаль'<'Паскаль';

'Turbo'<'Turbo Pascal';

->Строковые процедуры:

=>Delete(St,Pos,Num); - Удаляет Num символов из строки St, начиная

с позиции Pos.

=>Insert(S1,St,Pos); - Вставляет строку S1 в строку St, начиная с

позиции Pos. Если Pos > длины строки, то до-

бавляется в конец строки.

=>Str(Value,St); - Преобразует численное значение Value к символь-

ной записи и запоминает результат в строке St.

Примечания:

->Value может быть целого и вещественного типа.

->Value может сопровождаться указанием формата (раздел 11.3).

=>Val(St,Van,Error); - Преобразование строки St к целому или веще-

ственному значению и запоминание в перемен-

ной Van. Если некоторые символы не цифры и

не ., то Error = номеру первой ошибочной по-

зиции. В строке допускаются ведущие пробелы

(' ' или #32), которые игнорируются. Конце-

вые пробелы необходимо исключать.

=>FillChar(St[1],80,' '); - Заполнение строки St пробелами (80 шт),

St[0]:=Chr(80); начиная с 1 позиции.

Пример 31.

St:='ABCDEFG';

Delete(St,2,4); -> 'AFG';

Delete(St,2,10) -> 'A'.

Insert('XX',St,3); -> 'ABXXCDEFG';

Insert('XX',St,9); -> 'ABCDEFGXX';

I:=1234; Str(I:5,St); -> St:=' 1234';

R:=2.5E4; Str(R:10:0,St); -> St:=' 25000';

St:='234'; Val(St,I,Res): -> I=234;Res=0;

St:='12Z'; Val(St,I,Res): -> I=?;Res=3;

St:='12.5E4'; Val(St,R,Res): -> R=12500;Res=0;

->Строковые функции:

=>Copy(St,Pos,Num):String; - Возвращает строку, содержащую Num сим-

волов из строки St, начиная с позиции

Pos. Если Pos > длины строки, то возв-

ращается пустая строка.

=>Length(St):Word; - Возвращает длину строки - число символов в ней.

Определить длину строки можно с помощью функции определения по-

рядка, применив ее к нулевому байту строки, т.е. Ord(St[0]);

=>Pos(S1,St):Word; -Возвращает позицию, c которой подстрока S1 пер-

вый раз входит в строку St. Если не найдена, то

Pos=0;

Строки можно складывать арифметически.

Пример 32.

St:='ABCDEFG';

Svar:String[12];

Svar:=Copy(St,3,2); -> Svar:='CD';

Svar:=Copy(St,4,10); -> Svar:='DEFG';

Length(St)=7;

Pos('CD',St)=3;

Pos('H',St)=0;

S1:='ABC'; S2:='DEF';

S1:=S1+S2; S1='ABCDEF';

Примечания:

->В качестве Pos, Num, Value в Delete, Insert, Str, Copy, в

качестве St в Val, Copy, Length, Pos, а также в качестве S1

в Insert и Pos могут быть использованы константы, переменные

или непосредственные значения.

->В качестве St в Delete, Insert, Str, FillChar, в качестве,

Van, Error в Val могут использоваться только переменные.

6.ASCIIZ-строка (строка с нуль-окончанием)

В TP версии 7.0 Для совместимости с другими языками введен еще

один вид строк-строки, оканчивающиеся нулевым байтом (#0) с факти-

ческим размером до 65535 байт. Ее тип - PChar. Такая строка не име-

ет байта с индексом 0, поэтому ее реальная длина определяется нуль-

символом Null(#0). При их использовании следует подключать в секции

Uses блок String и задавать расширенный синтаксис {$X+}. Для работы

с такими строками в TP может использоваться и блок WinDos.

Хранятся строки с нуль-окончанием в виде символьных массивов,

нижний индекс которых равен нулю Array[0..X] Of Char.

Все процедуры и функции в блоке String, предназначенные для ра-

боты с подобными строками, начинаются на Str****.

15.СОВМЕСТИМОСТЬ И ПРЕОБРАЗОВАНИЕ ТИПОВ

а)Переменные считаются совместимыми, если:

->Они одного стандартного типа.

->Одного пользовательского типа.

->Один тип является строковым, а другой символьным.

->Оба типа являются целочисленными.

->Один является поддиапазоном другого.

->Вещественные совместимы с целыми, а наоборот нет.

Пример 33.

->Var Al,A2:Array[1..5] Of Real;

->Type ArByte=Array[1..10] Of Byte;

Var B1,B2:ArByte;

б)Несовместимыми будут массивы A1 и A2, если их объявить как

Var A1:Array[1..5] Of Real;

A2:Array[1..5] Of Real;

Переменные разных типов нельзя присваивать друг другу, сравни-

вать между собой. Например, если:

R:Real;B:Byte;

R:=1.0;B:=1; R<>B как и при любых других значениях. Как можно

тогда сравнить? Для этого можно записать: If R=B/1 Then <оператор>.

Преобразование (приведение) типов основано на использовании ко-

нструкции <имя типа>(переменная/значение).

Пример 34.

->Integer('Y'); -> код символа 'Y' в формате Integer,

->Boolean(1): -> логическое значение True,

->Ic:=130-1; Char(Ic); -> Символ ASCII с кодом 129,

->B:Byte; S:ShortInt;

B:=Byte(S); Если S=-2, то B=254,

Byte(534)=22; (22+2*256)

->См. также пример 5.

->C:=Char(48); -> цифра 0 в виде символа '0'. {Chr(X)=Char(X)}

16.АБСОЛЮТНЫЕ ПЕРЕМЕННЫЕ

Переменные можно размещать в точно определенном месте памяти

компьютера, в этом случае они называются абсолютными. Для указания

таких переменных используется директива Absolute. Существуют следу-

ющие формы их определения.

Пример 35.

Var

{1-я форма - точное указание адреса в памяти}

CrtMode:Byte Absolute $0040:$0049;

{2-я форма - размещение по адресу другой переменной}

St:String[32];

StrLen:Byte Absolute Str; {хранит длину строки Str}

Примечание:

В среде Windows и в защищенном режиме Dos первая форма может

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

17.ПОДПРОГРАММЫ В ПАСКАЛЕ

Как и многие языки программирования ТР включает аппарат подпро-

грамм. Подпрограммы используются для сокращения текста и объема про-

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

читаемыми. Наиболее целесообразно использовать подпрограмму тогда,

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

надо иметь ввиду, что скорость выполнения программы в этом случае

уменьшается.

В ТР предусмотрено два основных вида подпрограмм: процедуры и

функции. Очевидно, что как и стандартные процедуры и функции, ваши

программы должны иметь свои индивидуальные имена - идентификаторы.

Основное отличие функции от процедуры заключается в том, что по

окончании выполнения функции ее идентификатору (имени), как обычной

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