write('Еще ?(y/n): '); readln(o); if O='y' then goto 1;
end.
Как мы уже отмечали выше, все динамические структуры, образующиеся в памяти ЭВМ, могут рассматриваться в ОЗУ, отведенной для программы пользователя, как "КУЧА". Пользователь может работать с этой "кучей" с помощью специальных процедур. Среди них самыми важными являются запоминание состояния "кучи" и последующее воспроизведение ее. Это делается с помощью процедур MARK и RELASE.
Мы знаем, что для долговременного хранения информации в файлах используется внешняя память в виде диска или дискеты. Часто возникает необходимость записать на диск созданную динамическую структуру с целью ее сохранения и последующего воспроизведения в ОЗУ.
Для решения этой задачи необходимо представлять себе, что все динамические объекты (списки, стеки, деки, очереди, деревья), как и другие простые данные, лежат в некоторой, строго отведенной области ЭВМ. При этом начальный объект в структуре находится в ячейке памяти с номером N, образованным в результате работы процедуры NEW, а последний - в ячейке памяти с номером N+б (дельта), где б, в каком-то смысле, есть длина динамического объекта. Если знать эти числа, т.е. номера первой и последней ячеек, то можно, не обходя все дерево, переписать содержимое группы ячеек между адресами N и N+б на диск в виде файла. Затем при необходимости есть возможность списать с диска данные не куда-нибудь в память, а именно в ячейки с указанными адресами.
Для решения этой задачи используется функция HEAPPTR, которая возвращает так называемый текущий указатель "кучи", т.е. адрес ее конца. В этом случае достаточно запомнить адрес конца "кучи" в самом начале и по окончании работы с динамическими объектами.
Все эти операции реализованы в следующей программе:
procedure ZAPIS(F: file of integer);
var N,K,I,ZN: integer;
begin
N:= HEAPPTR; { Начало "кучи" }
................
{ Создание динамической структуры }
.................
K:= HEAPPTR; {Конец "кучи"}
rewrite(F); write(F, N);
for i:=1 to k do begin ZN:=MEM[i];
write(F, ZN); end;
close(F);
ПОЯСНЕНИЕ. Первым в файл идет начальный адрес "кучи". Это необходимо для того, чтобы узнать потом, с какого адреса можно воспроизвести "кучу". Далее в процедуре идет имя MEM - стандартное имя массива-памяти. То есть вся память понимается как массив, а ее индексы есть адреса ее точек. Это делается в рамках Паскаля. Вся запись и чтение в памяти идет через одномерный массив.
Рассмотрим теперь процедуру воспроизведения, где данные считываются из файла и записываются в нужные адреса памяти:
procedure VOSPROIZV(F: file of integer; var NACH: SS;)
var ZN, N:integer;
begin reset (F); read(F, ZN);
NACH:= ptr(ZN); n:= zn;
{Начальный адрес заполнения памяти}
while not eof(F) do begin read(F, ZN);
mem[N]:= ZN;
N:= N+1; end;
ПРИМЕЧАНИЕ. Здесь PTR - функция, восстанавливающая ссылку на адрес ZN - первый адрес динамической структуры. Эта ссылка запоминается в переменной NACH, после чего процедура может обращаться к динамическому объекту по данной ссылке.
Йенсен К.В. Паскаль: руководство для пользователя и описание языка. - М.: Финансы и статистика, 1982.
Абрамов В.Г., Трифонов Н.П., Трифонова Г.Н. Введение в язык Паскаль.- М.: Наука, 1989.
Эрбс Х.Э., Штольц О. Введение в программирование на языке Паскаль.- М.: Наука, 1989.
Корноухов М.А., Пантелеев И.В. Справочное руководство по языку программирования TURBO-PASCAL.- М.: Изд-во МГУ им.Ломоносова, 1985.
Хершель Р. Турбо Паскаль.- Вологда: МП "МИК", 1991.
Настоящее приложение содержит в себе сборник программ практически по всем темам данного учебного пособия. Каждая программа написана с использованием материала, включенного в текст пособия. Большая часть из них представляет собой интегрированный пакет, в который входят рассмотренные в курсе самостоятельные программы, а также процедуры и функции, объединенные в единое целое и посвященные одному разделу учебного пособия. Каждый пакет иллюстрирует работу включенных в нее программных продуктов в их взаимосвязи и при различных исходных данных. Вынесенный в приложение учебный материал поможет студентам лучше разобраться в тонкостях языка Паскаль, а преподавателям использовать его в качестве демонстрационной поддержки читаемого курса.
program RABMAS; uses crt;
const M=10; N=10;
type LINE = array[1..n ] of integer;
TAB = array[1..m] of LINE;
var S,I,J,X,Y:integer; MAS:TAB;
{ ВХОЖДЕНИЕ БКУВ В ТЕКСТ }
procedure COUNTER;
var COUNT: array['a'..'z'] of integer;
CH: char; N: integer;
¦ for CH:= 'a' to 'z' do
¦ COUNT [CH]:= 0; N:= 0;
¦ repeat
¦ ¦ read(CH); N:= N+1;
¦ ¦ if (CH >= 'a') and (CH <= 'z') then
¦ ¦ COUNT [CH]:= COUNT [CH]+1;
¦ until CH = '.'; readln; writeln;
¦ writeln('Частота вхождения букв: '); writeln;
¦ ¦write(CH,COUNT[CH]:10,COUNT[CH]*100/N:10:2,' ':15);
¦ ¦CH:=succ(CH);
¦ ¦writeln(ch,count[ch]:10,count[CH]*100/N:10:2);
¦ end;
end;
{ ЧИСЛО ДНЕЙ В МЕСЯЦЕ }
procedure NUMBRDAY;
type MONAT = (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
SEP, OKT, NOV, DEC);
var DAY: array [MONAT] of 28..31;
T: MONAT; k:integer;
¦ for T:= JAN to DEC do
¦ case T of
¦ JAN, MAR, MAY, JUL, AUG, OKT, DEC: DAY[T]:= 31;
¦ APR, JUN, SEP, NOV: DAY[T]:= 30;
¦ FEB: DAY[T]:= 28;
¦ writeln(' Число дней в месяцах: '); K:=1;
¦ for T:= JAN to DEC do begin
¦ writeln(' ',K:2,'-й',' месяц ',day[t],' дней ');
¦ K:=K+1;
{ ВВОД, ПЕЧАТЬ И ОБРАБОТКА МАССИВА }
procedure VVODMASSIV(M,N:integer;var MAS:TAB);
¦ for I:=1 to M do
¦ for J:=1 to N do
¦ read(MAS[I][J]); readln;
procedure VIVODMASSIV(M,N:integer;var MAS:TAB);
¦ begin
¦ ¦ for J:=1 to N do
¦ ¦ write(MAS[I][J]:5,' ');
¦ ¦ writeln;
procedure OBRABOTKA(M,N:integer; MAS:TAB; var SUM:integer);
¦ SUM:= 0;
¦ for J:=1 to n do
¦ if J > I then SUM:= SUM+MAS[I][J];
{ ОСНОВНАЯ ПРОГРАММА }
clrscr; writeln(' ПОДСЧЕТ ЧИСЛА ВХОЖДЕНИЙ БУКВ В ТЕКСТ');
writeln; write('Введите текст с точкой на конце: ');COUNTER;
readln;clrscr;
writeln(' ЧИСЛО ДHЕЙ В МЕСЯЦАХ ГОДА !');
writeln; NUMBRDAY; READLN;
CLRSCR;writeln('СУММА ЭЛ-ОВ МАССИВА HАД ГЛАВHОЙ ДИАГHАЛЬЮ ');
writeln; write(' Введите число стpок матpицы: '); readln(X);
write(' Введите число столбцов матpицы: ');readln(Y);
write(' Введите чеpез пpобел ',X*Y,' чисел(ла): ');
VVODMASSIV(X,Y,MAS); writeln; writeln;
writeln(' ИСХОДНЫЙ МАССИВ');
VIVODMASSIV(X,Y,MAS); OBRABOTKA(X,Y,MAS,S);writeln;
writeln(' Сумма элементов = ',s);
writeln; write (' К О H Е Ц Р А Б О Т Ы ! ');readln;
program LITERI; uses crt;
procedure SKOBKI;
var c: char; i: integer;
¦ i:=0; read(c); writeln;
¦ write('Строка без скобок: ');
¦ while c <> '.' do
¦ ¦ if c='(' then i:=1
¦ ¦ else if c = ')' then i:=0
¦ ¦ else if i=0 then write(c);
¦ ¦ read(c);
procedure SUITE;
var c,d: char;
b¦gin
¦for c:='a' to 't' do
¦ ¦for d:='a' to c do write(d);
¦ ¦writeln(' ');
procedure SOWPADENIE;
label 1;
type t = array[1..5] of char;
var s:t; y:char; i:integer;
¦ write('Введите пеpвые 5 символов: ');
¦ for i:=1 to 5 do read(s[i]); readln;
¦ write('Введите последние 5 символов:');
¦ for i:=1 to 5 do
¦ ¦ read(y);
¦ ¦ if s[i] <> y then
¦ ¦ begin writeln;
¦ ¦ ¦ write('ОТВЕТ: не совпадает');
¦ ¦ ¦ goto 1;
¦ ¦ end;
¦ writeln;write('ОТВЕТ: совпадает'); 1:;
procedure REVERSE;
var OLD_LINE, NEW_LINE: string[50];
PROBEL: integer; WORD: string[50];
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39