- •Московский государственный социальный университет
- •Часть I
- •Лекция 1: Введение в программирование.
- •Лекция 2: Язык Паскаль и системы программирования на Паскале.
- •Лекции 3-4: Базисные конструкции языка.
- •Лекции 5-6: Простые операторы и программы с линейной структурой.
- •Лекция 7: Операторы с условиями.
- •Лекция 8: Методика разработки простых программ.
- •Лекция 9: Концепция типа данных.
- •Лекция 10: Структурный тип - Массив.
- •Лекция 11: Структурный тип - Строка.
- •Лекция 15: Структурный тип - Множество.
- •Лекция 16: Структурный тип - Запись.
- •Часть II
- •Лекции 17-19: Модули и их использование.
- •Interface
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Лекция 20: Структурный тип - Файл.
- •Лекции 21-22: Основные задачи обработки файлов.
- •Interface
- •Implementation
- •Лекция 23: Динамическая память и указатели.
- •Лекции 24-25: Использование указателей для представления динамически структур данных.
- •Лекции 26-27: Объекты и объектно-ориентированное программирование.
- •Interface
- •Implementation
- •Оглавление
- •Часть I 3
- •Часть II 53
Interface
procedure sort_file(var f:text;r:Boolean);
Implementation
procedure sort_file; {Сортировка текстового файла}
{r=false - по убыванию, true - по возрастанию}
var f1,f2:text;b,b1,b2:string;i,i1,i2,p:Boolean;k:integer;
function more_less(x,y:string;ord:Boolean):Boolean;
begin if ord then more_less:=(x<y)
else more_less:=(x>=y)
end { more_less};
procedure read_str(var t:text;var buf:string;var big:Boolean);
var s:string;
begin s:=buf;readln(t,buf);if (buf=s) then big:=false
else big:=more_less(buf,s,r);
end { read_str};
procedure write_str(var t:text;buf:string;var int:Boolean);
begin if not int then writeln(f,buf);if eof(t) then int:=true
end { write_str};
BEGIN {sort_file} assign(f1,'F1');assign(f2,'F2');
repeat {разделение на 2 файла}reset(f);rewrite(f1);rewrite(f2);
k:=1;readln(f,b);writeln(f1,b);while not eof(f) do
begin read_str(f,b,i);if i then k:=k+1;if odd(k)
then writeln(f1,b) else writeln(f2,b)
end;{конец разделения} p:=r;i1:=false;i2:=false;if k>1 then
begin {слияние файлов} rewrite(f);reset(f1);reset(f2);
readln(f1,b1);readln(f2,b2);if more_less(b1,b2,p)
then write_str(f1,b1,i1) else write_str(f2,b2,i2);
repeat if more_less(b1,b2,p) then if not eof(f1)
then begin read_str(f1,b1,i1);if i1 then p:=not p;i1:=false end
else p:=not p else if not eof(f2)
then begin read_str(f2,b2,i2);if i2 then p:=not p;i2:=false end
else p:=not p;
if more_less(b1,b2,p) then write_str(f1,b1,i1)
else write_str(f2,b2,i2);
until (i1 and i2);
end{конец слияния файлов};
until(k<=2);close(f);close(f1);close(f2);erase(f1);erase(f2);
END{sort_file};
END{s_text}.
program sort_page; { Сортировка текстового файла по страницам}
uses s_text;
var f,f_page,outf:text;{Файлы входной, страница и выходной}
s,c,nm:string; p,pg,count,j:byte;
begin {Ввод имени файла и открытие файла f}
repeat writeln('Введите имя исходного файла:');readln(nm);
assign(f,nm);{$I-}reset(f);{$I+}
if IOResult <>0 then
begin writeln('Ошибка в имени файла');nm:='' end;
until not (nm=''){Конец открытия файла f};
assign(f_page,'F_P');assign(outf,'OUTF');rewrite(outf);pg:=0;
repeat rewrite(f_page);p:=0;
{ Формирование страницы}
repeat readln(f,s);count:=0;
for j:=1 to length(s) do
if upcase(s[j]) in ['A'..'Z'] then inc(count);
str(count:2,c);s:=c+s;writeln(f_page,s);inc(p);
until (p=8) or eof(f);
inc(pg); for j:=1 to 30 do write(outf,' ');
writeln(outf,'-',pg,'-');
sort_file(f_page,true) { Конец формирования страницы};
reset(f_page); {Перепись страницы в outf}
repeat readln(f_page,s);delete(s,1,2);writeln(outf,s);
until eof(f_page);writeln(outf,#12){ Конец переписи} ;
until eof(f); close(outf);close(f_page);erase(f_page);
end{sort_page}.
5. Коррекция текстовых файлов.
Под коррекцией в широком смысле понимают изменение содержания файла. Можно выделить две группы основных процедур коррекции: обновление записей файла и удаление "лишних" записей. При этом критерии обновления и определения "лишних" записей допускают много возможных трактовок. Так критерием обновления может быть время существования записи, а критерием "лишних" записей - дублирование записей в файле. Разумеется, обе группы процедур коррекции могут взаимодействовать друг с другом, т.е. использоваться совместно. Для текстовых файлов Турбо Паскаля коррекция возможна только путём создания нового файла со скорректированными записями-строками. Ниже приводится пример простой программы коррекции текстового файла, решающей задачу "чистки файла" от записей-дублей и пустых записей (состоящих из пустых строк или строк из одних пробелов):
program clean_file;{ Чистка текстового файла от повторяющихся строк}
var f,outf:text; {Входной и выходной файлы}
nm,s,del_s:string; j,k,beg,c:integer; d,d1:Boolean;
BEGIN writeln('ПРОГРАММА ЧИСТКИ ФАЙЛА');writeln;
repeat write('Введите имя файла:');readln(nm);
{ Проверка существования и открытие файла f для чтения}
assign(f,nm);{$I-}reset(f);{$I+}
if IOResult <>0 then begin writeln('Ошибка в имени файла');nm:='' end;
until (nm<>'');k:=0; d:=true;c:=0; assign(outf,'OUTF');rewrite(outf);
repeat {основной цикл}
readln(f,s);del_s:=s;reset(f);inc(k);beg:=1;
{ d:=false, если строка s повторяется }
repeat readln(f,s);if (s=del_s) and (beg<k) then d:=false;inc(beg);
until (eof(f) or (beg>k)) {конец d:=false};d1:=false;
{d1:=true, если s cодержит символ-непробел}
for j:=1 to length(del_s) do
if del_s[j]<>' ' then d1:=true {конец d1:=true};
{Вывод неповторяющейся строки, отличной от строки пробелов}
if (d and d1) then writeln(outf,del_s);
if (not d) and d1 then
{Вывод повторяющейся строки, отличной от строки пробелов}
begin if c=0 then writeln('Повторяющиеся строки:');
writeln(del_s);inc(c);
end;
d:=true;
until eof(f) {конец основного цикла};
close(outf); if c=0 then writeln('Повторяющихся строк нет')
else writeln('Всего ',c,' повторяющихся строк');
END{clean_file}.
Заметим, что эта задача может быть решена более просто, если предварительно отсортировать файл, например, по возрастанию записей (в лексикографическом порядке строк).
6. Поиск и выборка данных из файлов.
Поиск, как правило, выполняется по заданным критериям (обычно представляющим некоторое логическое условие) и предполагает просмотр всего файла или его части. Эффективность поиска определяется его способностью просматривать минимум лишних записей (не удовлетворяющих критерию поиска). Поэтому для последовательных файлов поиску обычно предшествует процедура сортировки, позволяющая затем ограничить область поиска. Результатом поиска является выборка: это может быть либо фактографическая информация (набор записей или некоторых полей записей, удовлетворяющих критерию поиска) или статистическая информация (вычисления на наборе записей, удовлетворяющих критерию поиска). Гибкие средства поиска и выборки данных обычно реализуются системами управления базами данных (с использованием специализированных языков запроса, например SQL). Достаточно просто задачи поиска и выборки данных из файла программируются на Турбо Паскале. Пример программы выборки данных по запросу из файла записей о группе студентов (продолжающей пример, рассмотренный выше для задачи создания такого файла):
program search;
{ Выборка из файла данных о группе студентов}
uses CRT;
type stud =record num:byte;name:string[20];average:real end;
gr_st=file of stud{данные о группе студентов};
var gr:gr_st{группа студентов};
st:stud{запись о студенте};
nm:string{имя исходного файла};
avr:string{условие для average};
sgn:string[1]{знак в условии};ball:real{запрошенный балл};
pr:boolean{признак выбранной записи};k:integer{кол-во выборок};
er:integer{ошибка преобразования в число};
BEGIN clrscr;repeat {открытие файла на чтение}
write('Введите имя файла:'); readln(nm);
if nm='' then halt;assign(gr,nm);
{$I-} reset(gr);{$I+} if IOResult<>0 then nm:='';
until nm<>''; {анализ запроса }
repeat write('Введите запрос для среднего балла: ');readln(avr);
sgn:=copy(avr,1,1);avr:=copy(avr,2,length(avr)-1);
val(avr,ball,er); if er<>0 then ball:=0;
until (ball>=2)and(ball<=5); k:=0; writeln('Запрошенные данные:');
repeat {реализация запроса к файлу nm}
read(gr,st);with st do
begin if sgn='>' then pr:=average>ball else pr:=average<=ball;
if pr then begin writeln(name,average:1:2);inc(k);delay(1000) end
end until eof(gr);if k<>0 then writeln('Всего студентов: ',k)
else writeln('Пустая выборка');readkey
END {search}.
7. Печать текстовых файлов.
Вывод файла на печать - один из завершающих этапов обработки данных, предоставляющий информацию пользователям в удобной форме. Форматирование выводимых данных - важнейшая особенность программ печати. Большие возможности по форматированию документальной информации предоставляют текстовые редакторы, системы управления базами данных, генераторы отчётов. Для того чтобы продемонстрировать возможности форматирования данных средствами Турбо Паскаля приведем простую программу постраничной печати текстового файла в двух вариантах:
program print_text; {Печать текстового файла}
uses Printer;
var f:text; {Исходный файл}
c:char;s,nm:string;
j,p:word;
const bel=#7;FF=#12;
BEGIN writeln('ПЕЧАТЬ ТЕКСТА ');writeln;write('Имя файла:');readln(nm);
if nm<>'' then
begin {открытие f с контролем существования файла}
assign(f,nm);{$I-} reset(f);{$I+}
if IOResult<>0 then begin writeln('Ошибка');halt end {конец открытия f} ;
j:=1;p:=1;repeat {цикл печати}if j mod 50=0 then
begin writeln(LST,FF);writeln(bel,'Конец страницы ',p:3);
writeln('Печатать следующую страницу(Y/N)?',bel);
readln(c);if upcase(c)<>'Y' then
begin close(f);halt end;p:=p+1;
for j:=1 to 35 do
write(LST,' ');writeln(LST,'-',p,'-');j:=1
end;readln(f,s);writeln(LST,s);inc(j);
until eof(f) {конец цикла печати};writeln(LST,FF);close(f)
end
END{print_text}.
program print_text2;
{Вариант программы print_text с выводом LST на экран}
var f,LST:text;c:char;s,nm:string;j,p:word;
const bel=#7;FF=#12;
BEGIN writeln('ПЕЧАТЬ ТЕКСТА ');writeln;
write('Имя файла:');readln(nm);if nm<>'' then
begin assign(f,nm);{$I-} reset(f);{$I+}
if IOResult<>0 then begin writeln('Ошибка');halt end;
assign(LST,'con');rewrite(LST);j:=1;p:=1;
repeat if j mod 50=0 then
begin writeln(LST,FF);writeln(bel,'Конец страницы ',p:3);
writeln('Печатать следующую страницу(Y/N)?',bel);
readln(c);if upcase(c)<>'Y' then
begin close(f);halt end;p:=p+1;for j:=1 to 35 do
write(LST,' ');writeln(LST,'-',p,'-');j:=1
end;readln(f,s);writeln(LST,s);inc(j);
until eof(f);writeln(LST,FF);close(f)
end
END{print_text2}.