ОСНОВНЫЕ КОНСТРУКЦИИ ЯЗЫКА

Паскаль - язык структурного программирования. Это означает, что программист должен выражать свои мысли очень дисциплинированно, с использованием малого числа четко оговоренных конструкций, используя как чередование их, так и вложения друг в друга. Не рекомендуется (хотя и возможно) использовать оператор перехода goto.

Реализация последовательности действий (т.е. структуры следования) выполняется с помощью составного оператора:

begin <последовательность операторов> end

Раздел операторов в программе всегда является составным оператором. Служебные слова begin и end часто называют операторными скобками.

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

Структура и действиеусловного оператора таковы:

If <логическое выраженне>

then <оператор 1>

else <оператор 2>

Условный оператор может быть неполным,т.е. не содержать часть «else <оператор 2>». В этом случае, если значение логического выражения равно false, условный оператор не вызывает никаких действий.

Пример: составим программу, которая определяет длину общей части двух отрезков числовой оси, заданных координатами своих концов соответственно а, b и с, d (а < b, с < d). Если отрезки имеют общую часть, то левая координата общей части отрезков m равнамаксимальному из чисел а и с, а правая n - минимальному из чисел b и d.

Программа 3

 

program cross;

var a,b,c,d,m,n,l:real;

begin

writeln('введите координаты концов отрезков') ;

read(a,b,с,d) ;

writeln;

if a<c then m:=c else m:=a;

if b<d then n:=b else n:=d;

if m<n then l:=n-m else 1:=0;

writeln("длина общей части отрезков=',1:6:2)

end.

Оператор варианта имеет следующую форму:

case <выражение> of

<список констант 1> : <оператор 1>;

<список констант 2> : <оператор 2>;

…………………………

<список констант N> : <оператор N>

end.

 

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

Оператор варианта вычисляет значение выражения, записанного после case. Если его значение совпадает с одной из констант в некотором списке, то выполняется оператор, стоящий после этого списка. Если значение выражения не совпало ни с одной константой во всех вариантах, то оператор варианта ничего не делает.

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

Программа 4

program seasons;

var k:integers

begin

writeln('введите номер месяца') ;

readin(k);

case k of

1,2,12:writeln('зима');

3, 4,5:writeln('весна') ;

6, 7,8:writeln('лето');

9,10,11:writeln('осень')

end

end.

 

Для реализации циклов в Паскале имеются три оператора Если число повторений известно заранее, то удобно воспользоваться оператором цикла с параметром. В других случаях следует использовать операторы цикла с предусловием (цикл «пока» ) или с постусловием (цикл «до»).

Цикл с предусловием является наиболее мощным в Паскале. Другие операторы цикла можно выразить через него. Его форма такова:

 

while - <логическое выражение> do <оператор>

 

Действие: вычисляется значение логического выражения. Если оно равно true, то выполняется оператор, после чего снова вычисляется значение логического выражения, в противном случае действие заканчивается.

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

Введем обозначения: sum - сумма веса груза, хранящегося в этот момент на складе; num - число разгруженных машин; w - масса груза очередной машины. Вначале величины sum и num равны нулю. Цикл разгрузки продолжается, пока выполняется неравенство sum < 100.

 

Программа 5

program store;

var sum,w:real;

num:integer;

begin

num:=0;sum:=0;

while sum<100do

begin

writeln('введите вес груза машины');

readln(w);

sum:=sum+w;

if sum<=100 then num:=num+l

else writeln('груз уже не поместится')

end;

writeln('число разгруженных машин =',num;3)

end.

 

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

repeat <последовательность операторов>

until <логическое выражение>

Действие: выполняется последовательность операторов. Далее вычисляется значение логического выражения. Если оно равно true, то действие заканчивается, в противном случае снова выполняется последовательность операторов и т.д.

Решим предыдущую задачу, применяя цикл с постусловием. Цикл разгрузки заканчивается, если выполняется условие: sum > 100.

Программа 6

program store2;

var sum,w:real; man:integer;

begin

num: =0; sum: =0;

repeat

writeln('введите вес груза машины');

readln(w); sum:=sum+w;

if sum<=100 then num:=num+l .

else writeln('груз ухе не поместится')

until sum>=100;

writeln('количество разгруженных машин =',num:3)

end.

Операторцикла с параметром предусматривает повторное выполнение некоторого оператора с одновременным изменением по правилу арифметической прогрессии значения управляющей переменной (параметра) этого цикла. Оператор цикла с параметром имеет две формы.

Форма1:

for <параметр>:= <выражение1> to <выражение 2> do <оператор>

Параметр, выражение 1, выражение 2 должны быть одного ординального типа;

Параметр в этом цикле возрастает. Действие эквивалентно действию следующего составного оператора:

begin

<параметр>:=<выражение 1>;

while <параметр> <= <выражение 2> do

begin

<оператор>;

<параметр>:=suсс(<параметр>)

end

end.

Если в этом описании отношение <= заменить на >= , а функцию succ на pred, то параметр в цикле будет убывать, в этом случае цикл с параметром принимает форму 2.

Форма 2:

for <параметр>:=<выражение 1> downto <выражение 2> do <оператор>

Пример: составим программу, по которой будет напечатана таблица перевода километров в мили (1 миля = 1,603 км). Параметром цикла можно считать целую величину k - количество километров. Пусть эта величина изменяется от 1 до 10 (с шагом 1, разумеется).

Программа 7

program mili;

const a=1.603;b='км'; с='мили';

var k:integer; m:real;

begin

writeln(b:5,c:7); writeln;

for k:=l to 10 do

begin

m:=k/a; writeln(k:5,m:6:3)

end

end.

Запишем в этой программе цикл с параметром в форме 2:

for k:=10 downto 1 do

begin

m:=k/a; writeln(k:5,m:6:3)

end.

 

Тогда значения k в таблице будут убывать от 10 до 1 с шагом 1.

Контрольные вопросы

 

1. Как в Паскале реализуется развилка?

2. В чем различие в назначениях условногооператора и оператора варианта? Как реализуется оператор варианта?

3. Какого типа циклы реализуются в языке Паскаль? каким образом?

СТРУКТУРЫ ДАННЫХ

 

Мы уже познакомились с простыми типами real, integer, boolean, byte,char.

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

Описание перечисляемого типа выполняется в разделетипов по схеме:

type <имя типа> = <список имен>

 

Примеры:

 

type operator = (plus,minus,multi, divide);

color = (white,red,blue,yelow,purple,green);

 

В списке должно быть не более 256 имен.

Поскольку перечисляемый тип относится к ординальным, то к его элементам можно применять функции ord(x), pred(x), succ(x) и операции отношения. Отметим, что данные этого типа не подлежат вводу и выводу с помощью функций ввода/вывода и могут использоваться внутри программы для повышения ее читабельности и понятности.

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

 

Программа 8

programweek;

type days=(mon,tue,wed,thu,fri,sat,sun);

var d:days;

begin

for d:=mon to sun do

case d of

mon: writeln("понедельник");

tue writeln("вторник");

wed writeln("среда");

thu writeln("четверг");

fri writeln("пятница");

sat writein("суббота") ;

sun writeln("воскресенье")

end

end.

 

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

 

type days=(mon,tue,wed,thu,fri,sat,sun);

workday s=mon.. fri;

index=1..30;

letter='a'..'z';

 

Можно задать интервал и в разделе переменных:

 

vara:1..100;b:-25..25;

 

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

Пример: если k - номер месяца в году, то вместо описания

 

var k:integer;

 

можно написать

 

vark:1..12;

 

Интервальный тип тоже относится к простым ординальным типам.

 

СОСТАВНЫЕ СТРУКТУРЫ. Данные, с которыми имеет дело ЭВМ, являются абстракциями некоторых реальных или существующих в воображении людей объектов. Мы уже познакомились с некоторыми типами данных: стандартными, перечислимыми, интервалами. Этими типами можно было обойтись при решении простых задач. Однако естественно и часто очень удобно группировать однотипные данные в последовательности - массивы, строки символов, объединять разнотипные данные об одном и том же объекте в виде записей. Значительные удобства представляются пользователю в Паскале при организации однотипных величин в виде множества с соответствующим набором операций: объединения, пересечения и т.д. Наконец, последовательность однотипных величин переменной длины можно представить в Паскале в виде файла данных и хранить на внешних носителях, используя его в разных программах.

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

Часто используемый составной тип - массив. Массив - это последовательность, состоящая из фиксированного числа однотипных элементов. Все элементы массива имеют общее имя (имя массива) и различаются индексами. Индексы можно вычислять, их тип должен быть ординальным. При описании массивов используются служебные слова array и of. В описании массива указывается тип его элементов и типы их индексов.

Схема описания такова:

 

type <имя типа> = array [<список типов индексов>] оf <тип элементов>

 

Тип элементов - произвольный, он может быть составным. Число типов индексов называется размерностью массива. После описания типа массива конкретные массивы можно задать в разделе описания переменных.

Например:

 

type vector = array [1.. 10] of real;

table = array ['A'..'Z',1..5] of integer;

var a,b : vector;

с: table;

 

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

Например:

 

а[7]:=3.1; b[k*k+l]:=0; с['М',3]:=-14;

 

Если массивы имеют одно и то же описание, то во многих версиях Паскаля допустимо их копирование, например b:=а;

Описание массива можно совместить с описанием соответствующих переменных:

 

var a,b : array [1.. 10] of real;

d : array [byte] of char;

 

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

Схема описания констант массива:

 

const <имя массива>: <тип массива> = (<список значений элементов>)

 

Тип массива может быть описан ранее:

 

type digits = array [1 ..5] of char;

const a : digits =('0';2','4';6';8');

 

Пример: используя массив, составим программу, которая напечатает на экране 20 чисел Фибоначчи.

Последовательность Фибоначчи определяется равенствами

 

а[1]=а[2]=1; a[k]=a[k-l]+a[k-2] прик>2.

 

Использование массива позволяет создать эффективную программу. Для вывода каждого члена последовательности отведем на экране 5 позиций.

 

Программа 9

program fibon; "''

const n=20;

var a: array[l..n] of integer;

k: integer;

begin

a[l]:=l;a[2]:=l;

for k:=3 to n do a[kl:=a[k-l]+a[k-2];

for k:=l to n do write(a[k]:5);

writeln

end.

 

Рассмотрим часто встречающуюся задачу упорядочения членов числовой последовательности по какому-либо признаку.

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

Используем метод упорядочения, носящий имя «пузырек». Будем просматривать пары соседних элементов последовательно справа налево и переставлять элементы в

паре, если они стоят неправильно:

 

5,3,2,4,1 → 5,3,2,1,4 → 5,3,1,2,4 →5,1, 3,2,4 → 1,5,3,2,4

 

В начале просмотра присвоим некоторой логической переменной значение true:

p:=true; если при просмотре пар была хотя бы одна перестановка, изменим значение логической переменной на противоположное: p:=false; это означает, что последовательность еще не была упорядочена и просмотр пар надо повторить. Цикл просмотров заканчивается, если после очередного просмотра выполняется условие: p=true. Последовательность зададим в программе как константмассивиз 10 элементов - целых чисел.

 

Программа 10

program bubble; '

const a:array[l..10] of integer=(19,8,17,6,15,4,13,2,11,0);

var b,i:integer; p :boolean;

begin c1rscr;

for i:=l to 10 do write(a[i]:3);writeln;writeln;

repeat p:=true;

for i:=10 downto 2 do

if a[i]<a[i-l]

then begin

 

b:=a[il;a[i]:=a[i-l]; ali-1]:=b;p:=false

end

until p=true;

for i:=l to 10 do write(a[i]:3);

writeln

end.

 

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

При решении задач на ЭВМ часто возникает необходимость в использовании последовательностей символов. Такую последовательность можно описать как массив символов, однако в Паскале для таких целей имеется специальный тип - string[n] -строка из n символов, где n <= 255. Способы описания переменных - строк - аналогичны описанию массивов.

1. Строковый тип определяется в разделе описания типов, переменные этого типа - в разделе описания переменных:

 

type word : string[20];

var a,b,c : word;

 

2. Можно совместить описание строкового типа и соответствующих переменных в разделе описания переменных:

 

var a,b,c : string[20];

d : string[30];

 

3. Можно определить строковую переменную и ее начальное значение какконстант-строку:

const l:string[l 1]='информатика';

 

Символы, составляющие строку, занумерованы слева направо; к ним можно обращаться с помощью индексов, как к элементам одномерного массива.

Для переменных одного строкового типа определен лексикографический порядок, являющийся следствием упорядоченности символьного типа:

 

'fife' < 'tree' (таккак 'f'< 't'); '4' > '237' (так как '4' > '2').

 

Кроме логических операций<, >, =, для величин строкового типа определена некоммутативная операция соединения, обозначаемая знаком плюс:

 

а:='кол'+'о'+'кол'; (в результате а='колокол').

 

Для строковых величин определены следующие четыре стандартные функции.

1. Функция соединения - concat(sl,s2,...,sk). Значение функции - результат соединения строк sl ,s2,...sk, если он содержит не более 255 символов.

2. Функция выделения - copy(s,i,k). Из строки s выделяется k символов, начиная с i-того символа:

 

а:=сору('крокодил',4,3); (в результате а='код*).

 

3. Функция определения длины строки - length(s). Вычисляется количество символов, составляющих текущее значение строки s:

 

b:=length('каникулы'); (b=8).

 

4. Функция определения позиции - pos(s,t). Вычисляется номер позиции, начиная с которого строка s входит первый раз в строку t; результат равен 0, если строка s не входит в t:

 

с:=роs('ом','компьютер'); (с=2).

 

В Паскале определены также четыре стандартные процедуры для обработки строковых величин:

1. Процедура удаления delete(s,i,k).Из строки s удаляется k символов, начиная с i-того символа.

 

s:='таракан'; delete(s,5,2); (в результате S='таран').

 

2. Процедура вставки - insert(s,t,i). Строка s вставляется в строку t, начиная с позиции i:

 

t:='таран'; insert ('ka',t,5); (t='таракан').

 

3. Процедура преобразования числа в строку символов - str(k,s). Строка s получается «навешиванием» апострофов на число k:

 

str(564,s); (s='564').

 

4. Процедура преобразования строки из цифр в число - val(s,k,i). Число i=0, если в строке s нет символов, отличных от цифр, в противном случае i=позиции первого символа, отличного от цифры:

 

val('780',k,i); (k=780; i=0).

 

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

1. Составить программу, определяющую количество гласных в русском тексте, содержащем не более 100 символов.

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

 

Программа 11

program vowel;

const с:зtring[18]='аеиоуыэюяАЕИОУЫЭЮЯ' ;

var a :string[100]; k,n:integer;

begin

writeln('введите текст'); readln(a);n:=0;

for k:=l to length(a) do

if pos(a[k],c)>0 then n:=n+l;

writeln('кол. гласных=',n) end.

2. Заменить в арифметическом выражении функцию sqr на ехр. Замена выражения sqr на ехр достигается последовательным применением процедур delete и insert:

 

Программа 12

program stroka;

var a,b:string[40]; k:integer;

begin

writeln('введите строку <= 40 символов');

readin(a);b:=a;

repeat k:=pos('sqr',b);

if k>0 then

begin

delete(b,k,3);insert('ехр',b,k) ;

end

until k=0;

writein('старая строка=',a); writein('новая строка"',b);

end.

 

3. Ввести и упорядочить по алфавиту 10 латинских слов. В программе определим массивиз 10 элементов-строк и упорядочим его элементы методом пузырька.

 

Программа 13

program order;

const s=10;

type word=string(20] ;

var i, j, k: 1. . s;

b:word; p:boolean; list :array[l..s] of word;

begin

clrscr;writeln<'введите список слов');

for i:=l to s do readln(list[i]);

repeat p:=true;

for i:=s downto 2 do

if list[i]<list[i-l] then

begin

b:list[i);list[i]:=list[i-l]; list[i-l]:=b;p:=false end

until p=true;

writein('упорядоченныйсписок слов:');

for i:=l to s do writeln(list[i])

end.

Множество в Паскале имеет такой же смысл, как и в алгебре - это неупорядоченная совокупность отличных друг от друга однотипных элементов. Число элементов множества не должно превышать 255. В качестве типа элементов может быть любой скалярный тип, кроме типа integer и его интервалов, содержащих числа > 255. Тип элементов множества называется базовым. При описании множественного типа используются служебные слова set и of. Задание конкретного множества определяется правилом (конструктором) - списком элементов или интервалов, заключенным в квадратные скобки. Пустое множество обозначается двумя символами [].

Множественный тип можно определить в разделе описания типов по схеме:

 

type <имя> = set of <тип элементов>

 

Например:

 

type t=set of byte;

var a:t;

 

Можно совместить описание множественного типа и соответствующих переменных:

 

var code: set of0..7;

digits: set of'0'..'9';

 

Можно описать переменную множественного типа и задать ее первоначальное значение в разделе описания констант, как константмножество. Тип множества можно описать ранее, например,

 

type up=setof'A'..'Z';

low=set of'a'.. "z";

const upcase : up=['A'. . 'Z'];

vocals :low=['a', 'e', 'i', 'o', "u", 'y'];

delimiterset of char=[ '..' /',':'..' ? '];

 

Для данных множественного типа определены операции объединения, пересечения и дополнения множеств, обозначаемые в Паскале соответственно знаками +, * и -, а также отношения равенства множеств (А=В), неравенства (А<>В), включения (А<=В,А>=В).

Логическая операция принадлежностих in А принимает значение true, если элемент х принадлежит множеству А и false в противном случае. Так как к элементам множества прямого доступа нет, то операция in часто используется для этой цели.

Заметим, что операции отношения на множествах выполняются быстрее, чем соответствующие операции на числах, поэтому их выгодно применять в программах.

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

Пусть alfa - множество всех букв латинского алфавита. Будем вводить заданный текст с клавиатуры символ за символом, одновременно формируя множество Е -множество латинских букв текста. В конце текста введем символ *. Затем с помощью операции in будем проверять, какие буквы алфавита имеются во множестве Е. Множество N - ненайденных букв в тексте - определяется оператором: N := alfa - Е .

 

Программа 14

program search;

const alfa:set of char=['a'. .'z'];

var c:char;E,N:set of char;

begin

cirscr; E:=[]; writeln('введите текст, конец ввода -*'); read(c);

while c<> '*' do

begin

if с in alfa then E:=E+[c]; read(c)

end;

writeln;

if E=alfa then writeln('найдены все латинские буквы')

else begin

N:=alfa-E;

writeln('найдены:');

for c:='a' to 'z' do if с in E then write(c);

writeln; writeln('не найдены:');

for c:='a' to 'z' do if с in N then write(c);

writeln

end

end.

 

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

Пример: составить программу «спортлото 5 из 36», которая позволяет человеку ввести с клавиатуры пять натуральных чисел из интервала 1..36, затем генерирует случайным образом пять различных чисел из того же интервала и объявляет величину выигрыша по правилу: если угаданы человеком 0, 1 или 2 числа, объявляется проигрыш; если угаданы 3 числа, объявляется выигрыш 3 рубля; если угаданы 4 числа, объявляется выигрыш 100 рублей; если угаданы 5 чисел, объявляется выигрыш 1000 рублей.

В программе используются обозначения: mn — множество натуральных чисел из интервала 1 . . 36, а - множество чисел, задуманных человеком, х - множество чисел, . генерируемых компьютером, z=a*x - пересечение множеств а и х; i, k, s - переменные, значения которых принадлежат интервалу 1..36. Случайное число из этого интервала генерируется оператором: s:=random(35)+l. Программа сначала выводит на экран сообщение о выигрышных номерах, затем определяет величину выигрыша.

 

Программа 15

program lottery;

type mn = set of 1 . . 36;

var x,a,z: nm; i, k, s: 0 . . 36;

begin

writeln; a:=[];

for i:=l to 5 do

begin write('введите ',i,' -тое число '); readin(k);a:=a+[k] end;

randomize;

k:=0; x:=[];

whilek<5 do

begin

s:random (35) +1;

if not(s in x) then begin k:=k+l; x:=x+[s]

end

end; writeln;

writeln('выигрыш выпал на следующие номера : ');

for i:=l to 36 do if (i in x) then write(i,' ');

writeln; z:=a*x; k:=0;

for i:=l to 36 do if (i in z) then begin writeln('угадано: ',i); k:=k+l

end;

case k of

0, 1, 2 : writeln('вы проиграли ');

3 : writeln('получите 3 руб') ;

4 : writeln('получите 100 руб');

5 : writein('получите 1000 руб')

end

end.

Записи (комбинированный тип) - одна из наиболее гибких и удобных структур данных, применяющихся при описании сложных объектов, которые характеризуются различными свойствами, а также при создании различных информационных систем. Запись - это последовательность, состоящая из фиксированного числа величин разных типов, называемых полями или компонентами записи. Так же, как и массив, запись содержит ряд отдельных компонент, но компонентами записи могут быть данные различных типов. Например, адресные данные (индекс, город, улица, номер дома, квартиры) можно представить как запись (record):

 

type address = record

index : string[6];

city: string[20];

street : string[20];

haus.ilat: integer

end;

 

Из примера видно, что тип «запись» описывается по схеме

 

type имя типа записи = record

имя поля 1 : тип;

имя поля 2 : тип;

имя поля N: тип

end;

 

Как и при описании массивов, можно совместить описание типа записи и соответствующих переменных. Например, данные о двух студентах можно описать так:

 

fio :string[20];

fas :string[10]

grup :string[8]

end

 

Переменную типа «запись» и ее первоначальное значение можно определить как констант-запись в разделе констант по схеме

 

const<имя>: <имя типа> = <константное значение>

 

Константное значение - это список имен полей и соответствующих значений, заключенный в круглые скобки. Элементы списка разделяются знаком «точка с запятой». Например, запись о начале координат можно определить так:

 

type point = record

х, у, z: integer

end;

const o: point = (x:0; y:0; z:0);

 

С компонентами записи можно обращаться как с переменными соответствующего типа. Обращение к компонентам записи осуществляется с помощью указания имени поля через точку. Пусть, например, переменная х имеет тип address, т.е. в программе имеется описание var x: address. Тогда допустимы следующие присваивания:

 

x.haus := 52; х.street:='пр.Мира'; x.city:= 'Красноярск';

x.flat:= 135; x.index :='б60049'

 

Проиллюстрируем работу с записями на задаче, в которой требуется найти сумму и произведение двух комплексных чисел:

 

zl=al+i*blиz2=a2+i*b2.

 

Программа 16

program cornpl;

type compi =record

re : real;

im : real

end;

var zl,z2,s,p : compl;

begin

writeln('компл.число a+i*b вводите двумя числами а и Ь: 'it-write('введи 1 число: '); readln(zl.re,zl.im);

write('введи 2 число: '); readin(z2.re,z2.im);

s.re := zl.re + z2.re;

s.im := zl.re + z2.im;

p.re := zl.re * z2.re - zl.im * z2.im;

p.im := zl.re * z2.im + z2.re * zl.im;

writeln('s=',s.re:4:2,' + i *',s.im:4:2);

write('p=',p.re:4:2,' + i *',p.im:4:2)

end.

 

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

 

with <имя записи> do <оператор>;

 

В этом случае в операторе, написанном после служебного слова do, имена полей указанной записи описываются без имени записи и точки. Например, печать суммы s в предыдущем примере можно организовать с использованием оператора with так:

 

with s do writeln('s=',re:4:2,'+i*',im:4:2);

 

В операторах присваивания разрешается использовать не только имена полей, но и имена записей.

Тип поля может быть записью.

Например:

 

man = record

fio:record

fam, im,otch: string[10];

end;

data : record

day: 1..31;

mes:1..12;

god:integer

end;

pol: char;

telef: record

dom,rab : string[10];

end;

end;

 

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

Рассмотрим пример эффективного использования записей в программе начисления стипендии студентам по шаблону:

 

N ФИО Эк1 Эк2 ЭкЗ Балл Сумма Проф Итого

1 Васнецов Н.В. 4 4 3 11 50.00 0.25 49.75

 

Предположим, что вводится список группы с соответствующими оценками за экзамены. Графа «Балл» вычисляет суммарную оценку за семестр. Графа «Сумма» определяет размер стипендии по упрощенному правилу: если нет двоек и балл равен 15, то стипендия 75 руб.; при условии, что 12 < «Балл» < 15 стипендия 62 руб 50 коп., а если 9 < «Балл» < 12 , то - 50 руб. (в других случаях сумма равна нулю). В графе «Проф» указывается профсоюзный взнос в размере 0,5% от стипендии, а графа «Итого» определяет сумму денег к выдаче.

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

 

Программа 17

program spisok;

type stud = record

fio :string[20];

ex1, ex2, ex3 : 2 . . 5;

bal :6 . . 15;

sum :real;

nalog :real;

itog :real;

end;

var x : array[1..30] of stud;

i,k,m,n :integer;

у : 6..15;

z : stud;

begin write('введи число студентов: '); readln(n);

for i:= 1 to n do with x[i] do

begin write('введи ФИО ',i,'-ro студента: ');

readln(fio); write('Bведи его три оценки: ');

readin(exl,ex2,ex3);

end;

for i:= 1 to n do with x[i] do

begin bal:=exl+ex2+ex3;

if (exl=2) or (ex2=2) or (ex3=2)

then sum:=0

else if bal=15 then sum:=75

else if bal>12 then sum:=62.5

else if bal>9 then sum:=50

else sum:=0;

nalog:=sum*0.005; itog:=sum-nalog;

end;

for k:= 1 to n-1 do

begin y:=x[k].bal; m:=k;

for i:=k+l to n do if y<x[i].bal then

begin y:=x[i].bal; m:=i

end; z:=x[k]; x(k]:=x[m]; x(m]:=z;

end;

writeln; writeln ('СТИПЕНДИАЛЬНАЯ ВЕДОМОСТЬ ');

for i:=l to 64 do write('-'); writeln;

write ('N | ФИО | эк1 | эк2 | эк3 | балл | сумма | проф | итого |') ;

for i:=l to 64 do write('-'); writeln;

for i:=l to n do with x[i] do

begin write(i:3,fio:20,exi:4, ex2:4,ex3:4);

writeln(bal:5,sum:9:2,nalog:8:2,- itog:7:2);

end

end.

 

Контрольные вопросы и задания

 

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

2. Для чего может понадобиться интервальный тип данных?

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

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

5. Какие операции допустимы над множествами?

6. В чем принципиальные различия между одномерными массивами и записями?

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

8. Вычислите объем призмы, боковые грани которой квадраты, а основанием служит равносторонний треугольник, вписанный в круг радиуса г.

9. Числа а и b выражают длины катетов одного прямоугольного треугольника, числа с и d - другого. Определите, являются ли треугольники подобными.

10. Напечатайте числа а, b, с в порядке возрастания.

11. Определите все пары двузначных чисел, обладающих свойством: (20+25^2 = = 2025.

12. Вычислите в числовом массиве а1,а2,...,аn суммы положительных и отрицательных элементов.

13. Вычислите скалярное произведение двух десятимерных векторов Х и Y.

14. Упорядочите массив х1,х2,...,хn по неубыванию, используя метод сортировки вставками: пусть первые k элементов уже упорядочены по неубыванию; берется (K+1)-й элемент и размещается среди первых k элементов так, чтобы упорядоченными оказались уже (k+1) первых элементов.

15. Составьте программу решения треугольной системы уравнений порядка n.

16. Замените в заданном арифметическом выражении все вхождения sin на cos и sqrt на abs.

17. Для заданного текста определите длину содержащейся в нем максимальной последовательности цифр 0, 1,2,..., 9.

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

19. Найдите и напечатайте в порядке убывания все простые числа из диапазона [2..201].

20. Опишите тип «запись» для следующих данных:

а) адрес(город, улица, дом, квартира);

б) дата(число,месяц.год);

в) студент(фио,факультет,курс,группа).

21. Заданы N точек на плоскости. Найдите точку, ближайшую к началу координат. Используйте тип «запись».

 

ПРОЦЕДУРЫ И ФУНКЦИИ

 

Описание и вызов. В Паскале подпрограммы называются процедурами и функциями и описываются в разделе с тем же названием.

Процедура имеет такую же структуру, как и программа, но с двумя отличиями:

• заголовок процедуры имеет другой синтаксис и включает служебное слово procedure;

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

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

 

procedure <имя> (<список описаний формальных параметров>) Описание формальных параметров может иметь вид

<список имен>: <тип> или var <список имен>: <тип>

 

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

Оператор вызова процедуры имеет вид

 

<имя процедуры> (<список выражений>);

 

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

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

Пример: составим программу, которая с помощью строки символов разделит экран на части, где напечатает таблицу квадратных корней для чисел 1, 2,..., 10 и таблицу натуральных логарифмов для чисел 1, 2,..., 5.

Печатьстроки символов оформим как процедуру. Так как никакую информацию передавать из процедуры в программу не надо, то аргументы процедуры (вид и количество символов) будут описаны как параметры-значения.

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

 

Программа 18

program section;

var x:integer;

procedure line(a:integer;c:char) ;

var j:integer;

begin

for j:=l to a do write (c);

writeln

end;

begin

line(35,'-'); writeln('таблица квадратных корней');

line(35,'-');

for x:=l to 10 do writeln(x:8,sqrt(x):8,4);

line (35,'-'); writein('таблица натуральных логарифмов');

line(35,'-');

for x:=l to 5 do writein(x:8,In(x):8:4);

line(35,'*')

end.

Функция - это подпрограмма, определяющая единственное скалярное, вещественное или строковое значение. Отличия подпрограммы-функции от процедуры:

• заголовок функции начинается со служебного слова function и заканчивается указанием типа значения функции:

 

function <имя> (список описаний формальных параметров): <тип>;

 

•раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции;

• обращение к функции - не оператор, а выражение вида

 

<имя функции> (<список фактических параметров>).

 

Функции (и процедуры) могут использовать свое имя в собственном описании, т.е. могут быть рекурсивными.

Пример: составим программу, которая для заданных четырех натуральных чисел а, b, с, d напечатает наибольшие общие делители первой и второй пар чисел и сравнит их по величине.

В программе определим рекурсивную функцию nod(x,y) по формулам

 

| x, если у = 0

nod(x,y) = | nod(y.x). если х < у

| nod(x mod у,у), если х > у

Применяя эти формулы к числам 21 и 15, последовательно находим nod(21,15) = nod(6,15) = nod(15,6) = nod(3,6) = nod(6,3) = nod(0,3) = nod(3,0) = 3.

 

Программа 19

program four;

var a,b,c,d,m,n:integer;

function nod(x,у:integer):integer;

var h:integer;

begin

if y=0 then h:=x

else if x<y then h:=nod(y,x)

else h:=nod(x mod у, у);

nod: =h end;

begin

writeln('введите 4 натуральных числа');

read(а,Ь,с,d); writeln;

m:=nod(a,b); n:=nod(c,d);

writeln('нод(',а,',',b,')=',m);

writeln('нод(',c,',',d,')=',n);

if m>n then writeln('первый > второго')

else if m<n then writeln ('первый < второго')

else writeln('нод пар равны') end.

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

Бывают случаи, когда одни и те же подпрограммы могут использоваться в различных программах одного и даже нескольких пользователей. В подобных ситуациях целесообразно создавать внешние подпрограммы, которые можно в необходимый момент подключать в любые программы. Как правило, внешние подпрограммы объединяют в отдельные пакеты, так называемые, библиотеки внешних подпрограмм. Могут создаваться личные библиотеки, специализированные библиотеки коллективного пользования и др. С одной из таких библиотек - встроенной библиотекой стандартных подпрограмм - пользователи имеют дело практически всегда. В состав этой библиотеки входят процедуры и функции вычисления значений ряда элементарных функций: синуса, косинуса, экспоненты и т.д., процедуры и функции обработки символьных величин, процедуры ввода-вывода и др. (список их приведен в конце § 3). Встроенная библиотека подключается к любой программе автоматически при компиляции. Поэтому откомпилированный файл с расширением .corn (иногда называемый «комовским»), как правило, занимает в 8 -10 раз больше места в памяти, чем исходный текст.

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

Пример. Создадим внешнюю библиотеку из двух процедур и одной функции. Первая процедура программы 20 очищает экран, выдает приветствие, затем после нажатия клавиши <Пробел> снова очищает экран. Вторая процедура возводит число а в степень b. Третья подпрограмма-функция вычисляет значение экспоненты с некоторым грубым приближением на основе ряда Тейлора.

 

Программа 20

procedure PRIVET;

var a: char;

begin

cirscr; gotoxy(20,10) ;

write('здравствуйте , желаю успехов !') ;

repeat (цикл позволяет)

gotoxy(35,50);write('пробел'); (сменить экран}

read(kbd,а); (по нажатию клавиши)

until а=''; (* 'пробел' )

cirscr;

end;

procedure STEPEN(a,b:real;var y:real);

begin

y:=exp(b*ln(a)) ;

end;

function MEXP(x:real):real;

begin

mexp:=l+x+x*x/2+x*x*x/6+x*x*x*x/24;

end;

Пусть представленные три подпрограммы записаны в файл с именем lab.pas. А теперь составим программу, использующую созданную внешнюю библиотеку.

 

Программа 21

program primeri;

($i lab) (директива подключения библиотеки} var a,b : real;

begin

PRIVET;

STEPEN(2,4,a); writeln('2 в степени 4 =',a); b:=MEXP(l);

write('машинная exp(1)=',EXP(1):6:4,' моя exp(1)=',b:6:4);

end.

 

В программе используется стандартная функция - экспонента ЕХР(1) и наша подпрограмма МЕХР(1).

Модули используют в более поздних версиях Паскаля для создания библиотек и разделения больших программ на логически связанные независимые друг от друга составные части. В состав модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заголовок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и функции, представленные списком заголовков и доступные пользователям в теле основной программы. Раздел «реализация» содержит тела процедур и функций, перечисленных в интерфейсной части модуля. Раздел «инициализация» содержит операторы, необходимые для инициализации модуля. Таким образом модуль - это набор констант, типов данных, переменных, процедур и функций. Каждый модуль компилируется отдельно; результат компилляции - файл с расширением .tpu (Turbo Pascal Unit). Каждый элемент модуля можно использовать в программе пользователя без дополнительного объявления, для чего достаточно записать имя используемого модуля в директиве Uses в начале программы после его заголовка.

В Турбо-Паскале версии 5.0 и выше применяют стандартные модули CRT, GRAPH и др. В этих модулях содержатся сервисные процедуры и функции по работе с экраном дисплея, с клавиатурой, графическими примитивами и т.п. Модули подключаются к программе путем специальной команды, размещаемой сразу после заголовка:

 

uses <имя модуля>

 

Программист может сам создать модуль. Ниже приведен пример с соответствующими комментариями.

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

Будем представлять комплексные числа парами действительных: (а, b). Как известно, действия над ними выполняются по правилам

 

(a,b) + (c.d) = (a+c,b+d),

(a,b)-(c,d)=(a-^,b-d),

(a,b) * (c,d) = (a*c-b*d , a*d+b*c),

(a,b) / (c,d) = ( (a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d)).

 

Создаваемый модуль будет включать четыре процедуры: Sum - сумма,Raz -разность, Proiz - произведение, Chastn - частное.

Этот модуль может быть отдельно откомпилирован. После этого любая программа, написанная на Паскале, может получить доступ к интерфейсным объектам (в данном случае - процедурам) этого модуля с помощью директивы Uses CompChisla.

Обратим внимание, что в интерфейсной части модуля от процедур присутствуют лишь заголовки, а в части «реализация» от заголовков процедур остаются лишь их имена.

 

Программа 22

unit CompChisla;

interface

procedure Sum(a,b,c,d: real; varx,y: real);

procedure Raz(a,b,c,d: real; varx,y: real);

procedure Proiz (a,b,c,d: real; varx,y: real);

procedure Chstn(a,b,c,d: real; varx,y: real);

implementation

procedure Sum;

beginx:=a+c; y:=b+d end;

procedure Raz;

beginx:=a-c; y:=b-d end;

procedure Proiz;

begin x:=a*c-b*d; y:=a*d+b*c

end;

procedure Razn;

var z:real;

begin z:= c*c+d*d; x:=(a*c+b*d)/z; y:=(b*c-a*d)/z end;

end.

 

Контрольные вопросы

 

1. Какова структура процедуры? функции?

2. Какие параметры называют формальными и какие - фактическими?

3. В чем различие между локальными и глобальными переменными?

4. В чем сходство и различие между процедурой и модулем?

 

РАБОТА С ФАЙЛАМИ

 

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

Файлы позволяют решить две проблемы:

1) возможность формирования и сохранения значений для последующего использования другими программами (например, в программах многократной обработки информационных систем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного хранения информации очевидна);

2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принтером, АСП и т.п.

В Паскале эти проблемы снимаются с помощью структурированных данных файлового типа.

Файловый тип данных в программе задается следующем образом:

 

type <имя файлового типа> = file of <тип компонентов>

 

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

 

type

intfile = file of integer;

refile = file of real;

chfile = file of char;

ran = 1 .. 10;

st = set of ran;

vector = array[ran] of real;

comp = record

re,im : integer;

end;

setfile=file of st;

vecfile = file of vector;

compfile= file ofcompt;

 

Описание файловой переменной задается обычным способом в разделе описаний. Например:

 

var f: intfile; или var f: file of integer;

 

Файловая переменная является буфером между Паскаль-программой и внешним устройством и должна быть логически с ним связана. Связь осуществляется оператором языка Паскаль:

 

assign (<имя файловой переменной>,'<имя устройства>')

 

Как правило, файлы для хранения данных связаны с устройством внешней памяти на магнитных носителях (дисковод) и носят название внешние файлы. Если, например, файл с именем primer, dat логически связан с дисководом А:, то все данные, помещаемые в файл, будут храниться на этом дисковом накопителе, aустановка «окна» между программой и файлом будет определяться через файловую переменную f оператором

 

assign (f, 'primer.dat')

 

Если внешним устройством является принтер, то связь осуществляется оператором assign(f, '1st:'). Здесь 1st - логическое имя печатающего устройства. Ниже приведены логические имена внешних устройств ввода-вывода:

con - консоль; trm - терминал; kbd - клавиатура; 1st - принтер; aux - буфер сети;

usr-драйвер пользователя.

После осуществления связи файловая переменная f отождествляется с соответствующим файлом.

Для работы с файлом его необходимо открыть, а по окончании работы — закрыть Файл открывается для чтения оператором reset(f), для записи - оператором rewrite(f).

Чтение и запись данных осуществляется известными командами read/write, только в начале списка помещается имя файловой переменной:

 

read (f, <список ввода>); readln (f, <список ввода>);

write(f, <список вывода>); writeln(f, <список вывода>).

 

Закрытие файла осуществляется командой close(f).

условно файл можно представить в виде ленты, у которой есть начало, а конец не фиксируется. Компоненты файла записываются на эту ленту последовательно, друг за другом:

 

Здесь т.м. - текущий маркер, указывающий на рабочую позицию (окно) файла; м.к. (маркер конца файла) - специальный код, автоматически формируемый вслед за последним элементом файла.

Такого рода файлы называются файлами последовательного доступа. В исходной версии Паскаля файлов прямого доступа, для которых можно непосредственно «достать» любую компоненту, не предусмотрено; однако, в Турбо-Паскале элементы прямого доступа есть (например, через функцию seek, см. ниже).

Команда rewrite(f) - открыть файл для записи - устанавливает файл в начальное состояние режима записи; текущий маркер устанавливается на маркер конца файла. Если в файле f до этого была информация, то она уничтожается.

В открытом для чтения командой reset(f) файле текущий маркер устанавливается на нулевое состояние, однако содержимое файла не утрачивается.

 

Команда закрытия файла close (Q обязательна, поскольку эта команда формирует маркер конца файла, что в большинстве случаев является необходимым нaпpимep, для работы с функцией eof(f), см ниже).

В системе Турбо-Паскаль предусмотрены встроенные функции по работе с файлами:

 

filesize(f) - текущее количество компонент открытого файла;

filepos(f) -номер текущей позиции маркера;

геnamе (f,имя) - переименование файла, связанного с f;

erase(f) -уничтожение файла;

execute(f) - выполнение СОМ-файла;

chain(f) -выполнение CHN-файла;

seek(f,N) - устанавливает маркер на позицию N;

eof(f) - возвращает TRUE, если найден конец файла;

ealn(f) - возвращает TRUE, если найден конец строки.

 

На практике широко используются текстовые файлы, которые состоят из литерных (логических) строк. Поэтому в языке Паскаль предусмотрен стандартный файловый тип TEXT (он не является file of char, скорее всего, это - file of string[n]). Логические строки бывают разной длины, в том числе и нулевой. В конец каждой строки помещается специальный символ «конец строки» (eoln - «end of line»). В качестве печатного символа конца строки используют литеру #. Текстовый файл (text) является строго последовательным, к нему не применимы некоторые встроенные функции, в частности, seek. В отличие от типизированных файлов, с текстовым файлом нельзя одновременно проводить операции чтения (read) и записи (write). Однако, допустимы операторы writein и readln. Числовые данные, целые и вещественные, в текстовом файле должны записываться через пробел.

Ниже приведены несколько примеров, иллюстрирующих работу с файлами. Пример 1. Вывод данных на печатающее устройство - принтер (1st:).

 

Программа 23

program print;

var

fal :text;x :real; name :string[25];

begin

assign (fal, ' 1st:'); rewrite (fal); x:2.5; name:"'Слава';

writeln(fal,x:8:2) ;

writeln(fal,'Привет, '.name); close(fal) :

end. (Здесь файловая переменная fal связывается с принтером 1st:, и запись в файл fal практически означает вывод на печать)

Пример 2. Создание и сохранение в файле «xxx.dat» последовательности целых чисел от 10 до 20.

 

Программа 24

program zapis;

var

f: file of integer; i: integer;

begin

assign(f,'xxx.dat'); rewrite(f);

for i:=10 to 20 do write(f,i); close (f);

end. (После выполнения программы формируется внешний файл xxx.dat)

Пример 3. Считывание первых пяти компонент из существующего файла «xxx.dat» и вывод на дисплей квадратовэтих значений.

 

Программа 25

program read;

var ff: file of integer; j,i : integer;

begin

assign(ff,'xxx.dat'); reset(ff) ;

for j:=l to 5 do begin read(ff.i); writeln(i*i);

end;

close(ff);

end.

Пример 4. В текстовом файле (text) «slov.txt» содержится русский текст. Определить сколько гласных букв в тексте.

 

Программа 26

program text;

var

ft : text; n : integer; ch : char; st : set of chart begin

assign (ft,'slov.txt'); reset(ft);

st := ['A'.'E','И','О','У,'Ы','Э','Ю','Я'];

st := st+['a','e','и','о','у','ы','э','ю','я'];

n: =0;

while not eof(ft) do begin

read(ft, ch); if ch in st then n:=n+l;

end;

close(ft);

writeln; write('кол-во гласных букв =',n);

end.

 

Поскольку длина текста (файла) неизвестна, то в цикле «пока» используется логическая функция eof(f), которая возвращает значение TRUE, если найден конец файла.

Пример 5. Шифрование и дешифрование текста.

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

Значение смещения n находится во внешнем файле 'n.key', который формируется программой key. Зашифрованный текст выводится во внешний файл с именем «шифр.eхe» , а также на дисплей.

Программа дешифровки (retsek) считывает шифрованный текстиз файла «шифр.tхt» и выводит на экран дисплея искомый текст.

 

Программа 27 (а)

program key;

var

n : integer; f : file of integer;

begin , .

assign (f,'n.key'); rewrite(f); write\('Bвeди ключ(смещение): ');

readln(n);

write(f,n); close(f);

end.

Программа 27 (б)

program sekret;

var

| slovo,anslovo: string[100];

alfavit : string[33];

n, i, k, p : integer;

fkl : file of integer;

fs : text;

begin

alfavit:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';

assign(fkl,'n.key'); reset(fkl); read(fkl,n); close(fkl);

writeln; write('введи текст: ');

readln(slovo); anslovo:='';

for k:=l to length(slovo) do begin for i:=l to 33 do

if slovo[k]=alfavit[i] then begin p:=i+n;

if p >33 then p:=p mod 33;

anslovo:=anslovo+alfavit[p];

end;

end;

assign(fs,'шифр.txt'); rewrite(fs); write(fs,anslovo);close(fs);

writeln; write(ansiovo) ;

end.

Программа 27 (в)

program retsek;

var slovo, anslovo : string[100];

alfavit : string[33];

n, i, k, p : integer;

fi : file of integer;

f : text;

begin alfavit:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';

assign(fi,'n.key'); reset(fi); read(fi.n); close(fi);

assign(f,'шифр.txt'); reset(f); read(f,anslovo); close(f)

slovo:='' ;

for k:=l to length(anslovo) do

begin for i:=l to 33 do

if anslovo[k]=alfavit[i] then

begin p:=i-n; if p < 1 then p:=33-p mod 33;

slovo:=slovo+alfavit[p];

end;

end;

writeln; write('TeKCT шифровки: ',slovo);

end.

 

Контрольные вопросы и задания

1. Какие проблемы решаются при использовании файлов?

2. Какие операции и функции используются при работе с файлами?

3. Найдите площадь выпуклого четырехугольника со сторонами х, у, z, t и одной

из диагоналей d.

4. Заданы три комплексных числа. Найдите их сумму,

5. Имеется внешний файл записей «lab.zap», содержащий сведения об ученика.' школы. Файл формируется приведенной ниже программой.

Составьте программу, в которой необходимо сделать следующее:

а) упорядочить файл по признаку «class» в порядке возрастания;

б) упорядочить файл по признаку «god» в порядке убывания;

в) упорядочить файл в алфавитном порядке.

program lab;

type shcoo 1= record

fiо : string[20], class : 1 .. 11; god : integer; pol: char;

end;

var x:array[1..100] ofshcool; n,i:integer; f:file of school;

begin

write ('введите кол-во учеников:'); readln(n); assign(f,'lab.zap'); rewnte(f);

for i:=l to n do with x[i] do

begin \write('введи Ф.И.О.',1,'-ого ученика:'); readln(fio);

write('клacc:'); readln(class);

write('гoд рождения:-'); readln(god); write('пол(M/Ж):-');

readln(pol); write(f,x[i])…;

end; close(f);

end.

6. Задание рассчитано на двух студентов, использующих «электронную почту» на одном компьютере. Первый студент составляет программу, в которой формирует внешний файл «письмо». Второй студент должен «прочитать» файл и сформировать «ответ».

ПИСЬМО ОТВЕТ

а) последовательность целых чисел до 100 | квадраты этих чисел;

б) простые числа в интервале от 1 до 200 | сумма этих чисел