Мегаобучалка Главная | О нас | Обратная связь


Подготовительный этап работы программы



2019-12-29 168 Обсуждений (0)
Подготовительный этап работы программы 0.00 из 5.00 0 оценок




На этапе инициализации необходимо выполнить:

1) считывание и распечатку на экране формы таблицы;

2) установку начальных значений для глобальных переменных;

3) считывание данных из таблицы и размещение их в одномерном массиве записей.

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

Листинг 2

uses Crt;

procedure Init; { Инициализация }

var F:Text; S:string;

begin

ClrScr; { Очистить экран }

 { Открыть файл для чтения и проверить правильность открытия }

Assign(F,'Tab_Form.txt');

{$I-} { Убрать автоматический контроль за открытием файла }

Reset(F);

{$I+} { Установить автоматический контроль за открытием файла }

if IOResult<>0 then

begin

writeln('Не найден файл Tab_Form.txt.'); writeln('Программа завершает работу.');

writeln('Для продолжения нажмите любую клавишу.'); ReadKey; Halt(1); end;

 { Распечатать форму таблицы на экране }

repeat

ReadLn(F,S); WriteLn(S); until EOF(F);

end;

procedure Run; { Основной цикл }

begin

repeat

until KeyPressed;

end;

procedure Done; { Завершение работы }

begin

ClrScr; end;

begin { Начало основной программы }

Init; { Инициализация }

Run; { Основной цикл }

Done; { Завершение работы }

end. { Конец основной программы }

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

Листинг 3

type Directions=(ReadFile,WriteFile); { Направление чтение/запись }

...

{ Процедура открытия текстового файла }

procedure OpenTextFile( FileName:String;     { Имя файла }

var F:Text;              { Файловая переменная }

Direction:Directions);      { Направление }

var OK:boolean; { Открытие файла прошло успешно }

begin { OpenTextFile }

Assign(F,FileName); OK:=True;

case Direction of

ReadFile: { Открытие файла для чтения }

begin

{$I-} Reset(F); {$I+}

if IOResult<>0 then

begin

ClrScr; writeln('Не найден файл ',FileName,'.'); OK:=False;

end;

end;

WriteFile: { Открытие файла для записи }

begin

{$I-} ReWrite(F); {$I+}

if IOResult<>0 then

begin

ClrScr; writeln('Ошибка открытия ',FileName,'.'); OK:=False; end;

end;

end; { Case }

if not OK then

begin

writeln('Программа завершает работу.');

writeln('Для продолжения нажмите любую клавишу.'); ReadKey; Halt(1); end;

end; { OpenTextFile }

...

{ Процедура инициализации }

procedure Init;

{ Процедура чтения формы таблицы из файла }

procedure ReadTableForm;

var F:Text; S:string;

begin

OpenTextFile('Tab_Form.txt',F,ReadFile);

repeat

readln(F,S); writeln(S); { Чтение и распечатка очередной строки }

until EOF(F);

Close(F);

end;

begin { Init }

ClrScr; { Очистить экран }

ReadTableForm; { Чтение формы таблицы из файла }

end; { Init } …

Заметьте, что в приведенном листинге процедура чтения формы таблицы из файла (ReadTableForm) локальная (она не должна вызываться где-либо кроме процедуры Init). Хотя многие из уже перечисленных процедур (как и ReadTableForm ) вызываются всего в одном месте и всего один раз, использование их оправдано, так как в этом случае программа становится более наглядной и понятной (выполняется условие читабельности программы).

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

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

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

Nrow     - Количество строк в таблице.

Ncol      - Количество столбцов в таблице.

InitRow - Начальная строка данных в таблице.

ColPos - Массив положений столбцов на экране.

Листинг 4

{ Глобальные константы, определяющие максимальный размер таблицы }

const

MaxRows=20;{ Максимальное количество строк }

MaxCols=10; { Максимальное количество столбцов }

type

{ Тип для массива местоположений столбцов таблицы на экране }

ColumnsPositionsArray=array[1..MaxCols] of byte;

{ Перечисляемый тип для описания фирмы-изготовителя }

Corporations=(Intel,AMD,Cyrix);

{ Массив имен фирм-изготовителей }

const CorpName:array[Intel..Cyrix] of string=('Intel','AMD','Cyrix');

type

Processor=record   { Тип записи в строке таблицы }

N:byte;                    { Номер по порядку }

Corp:Corporations; { Наименование фирмы }

Freq:word;              { Частоты }

Notice:string;           { Замечания }

Count:word;            { Количество }

Price:real;                { Цена }

Summ:real;              { Сумма }

end;

{ Тип массива записей в таблице }

ProcessorArray=array[1..MaxRows] of Processor;

...

{ Процедура подготовки программы к работе (инициализации) }

procedure Init( { П а р а м е т р ы п р о ц е д у р ы }

var X,         { Номер столбца в таблице }

Y,         { Номер строки в таблице }

Nx,       { Количество строк в таблице }

Ny,       { Количество столбцов в таблице }

InitY:byte; { Номер начальной строки в таблице на экране}

var Xpos:ColumnsPositionsArray; { Массив координат столбцов}

var P:ProcessorArray); { Массив записей в таблице }

 { Процедура чтения формы таблицы из файла }

procedure ReadTableForm;

var F:Text; S:string; TableEnd:boolean; X,Y:byte;

 { Процедура определения координаты начала столбца }

procedure ColumnsPositions;

var Xp:byte;

begin { ColumnsPositions }

InitY:=Y; Nx:=1; Xpos[Nx]:=2;

for Xp:=2 to length(s) do

if s[Xp]=chr(197) { Признак конца очередного столбца +}

then begin inc(Nx); Xpos[Nx]:=Xp+1; end;

Xpos[Nx+1]:=Xp+1; { Начало следующего столбца }

end; { ColumnsPositions }

begin { ReadTableForm }

Ny:=0; Nx:=0; Y :=0; X :=0;

InitY:=0; TableEnd:=False;

OpenTextFile('Tab_Form.txt',F,ReadFile);

repeat

readln(F,S); writeln(S); { Чтение и распечатка очередной строки }

if s[1]=chr(192) then TableEnd:=True; { Признак конца таблицы }

if (InitY<>0)and(not TableEnd) then inc(Ny); { Счет строк таблицы }

if s[1]=chr(195) then ColumnsPositions; {Определение координат столбцов}

until EOF(F);

Close(F);

end; { ReadTableForm }

...

{ Глобальные переменные }

var

Nrow, { Количество строк в таблице }

Ncol, { Количество столбцов в таблице }

InitRow {Координата начальной строки данных таблицы на экране}

:byte;

ColPos: { Положение столбца на экране }

ColumnsPositionsArray;

begin { Основная программа }

 { Инициализация }

Init(Ncol,Nrow,InitRow,ColPos);

Run; { Основной цикл }

Done; { Завершение работы }

end. { Основная программа }

Теперь можно перейти к последнему пункту инициализации - чтению данных из файла таблицы, преобразованию данных из строки в соответствующий тип, размещению данных в одномерном массиве и на экране. Этим в процедуре Init будет заниматься локальная процедура ReadTable. Для начала она будет только выводить на экран считанную из файла строку данных в поля таблицы, используя процедуру перемещения курсора по клеткам таблицы (MoveCursor, которую также добавим на этом этапе).

Листинг 5

{ Процедура перемещения курсора по клеткам таблицы }

procedure MoveCursor

({ П а р а м е т р ы  п р о ц е д у р ы }

X,      { Номер столбца в таблице }

Y,      { Номер строки в таблице }

InitY { Номер начальной строки в таблице на экране }

:byte;

Xpos { Массив координат столбцов }

:ColumnsPositionsArray);

begin

GotoXY(Xpos[X]+1,Y+InitY); end;

 { Процедура подготовки программы к работе }

procedure Init(

var X,         { Номер столбца в таблице }

Y,         { Номер строки в таблице }

Nx,       { Количество строк в таблице }

Ny,       { Количество столбцов в таблице }

InitY    { Номер начальной строки в таблице на экране }

:byte;

var Xpos    { Массив координат столбцов }

:ColumnsPositionsArray;

var P           { Массив записей в таблице }

:ProcessorArray);

...

procedure ReadTable;

var

Line,   { Номер строки в таблице }

Column { Номер столбца в таблице }

:byte;

Field   { Содержимое поля в виде строки }

:string;

F:Text;  { Текстовый файл с таблицей }

S:string; { Строка текстового файла с таблицей }

begin

OpenTextFile('Table.txt',F,ReadFile);

for Line:=1 to InitY do ReadLn(F,S); { Пропустить шапку }

for Line:=1 to Ny do

begin

ReadLn(F,S);

for Column:=1 to Nx do

begin

{ Выделение поля из строки }

Field:=Copy(S,Xpos[Column]+1,Xpos[Column+1]-Xpos[Column]-3);

{ Распечатка содержимого поля на экране

(потом на этом месте должна быть процедура ввода поля) }

MoveCursor(Column,Line,InitY,Xpos); Write(Field);

end;

end;

end;

begin { Init }

ClrScr;        { Очистить экран }

ReadTableForm; {Чтение формы таблицы из файла }

ReadTable; { Чтение таблицы из файла }

{Установка курсора в начало таблицы }

Y:=1; X:=1; MoveCursor(X,Y,InitY,Xpos);

end; { Init }

...

Как при вводе данных из файла, так и с клавиатуры, вводимые данные представлены в виде строки, поэтому есть необходимость преобразования данных из строки к типу, соответствующему тому или иному полю таблицы. Эти действия переданы процедуре «Ввод поля» (EnterField), взамен простой распечатки на экране монитора, как это было сделано на предыдущем этапе. Параметры, необходимые для работы процедуры, представлены в листинге 6.

На данную процедуру возложено выполнение многих функций:

а) получать строку данных из файла или вызывать ввод с клавиатуры (функция KeyBoardInput, которую на данном этапе не будем пока рассматривать подробно, а только представим формальное описание; кроме того, заметим, что логическая переменная KeyBoard будет определять, откуда процедура EnterField берет строку данных: или с клавиатуры, после вызова функции KeyBoardInput, или из файла в строке FileStr;

б) приводить строку к виду без начальных и конечных пробелов (процедура

DeleteSpaces);

в) сравнивать длину вводимой строки с шириной поля таблицы (функция LengthCompare);

г) преобразовывать данные из строкового типа в тип данных соответствующего поля ( процедуры StrToByte, StrToCorp, StrToWord, StrToReal, которые здесь использованы, но без описания и подробных объяснений, так как эти процедуры достаточно просты, хотя и обязательно должны содержать проверку правильности преобразования из строки в соответствующий тип);

д) выводить проверенные данные в виде строки на экран (при этом понадобится дополнительная процедура для вывода сообщения об ошибке Error, которая в свою очередь использует процедуру для выхода в строку, расположенную ниже таблицы GoToSpecialLine).

Листинг 6

 { Процедура ввода поля таблицы }

procedure EnterField(

                { П а р а м е т р ы п р о ц е д у р ы }

KeyBoard:boolean;           { Ввод с клавиатуры или из файла }

P:ProcessorArray;            { Массив записей }

R,                                      { Номер строки }

C,                                      { Номер столбца }

Ny,                                   { Количество строк }

InitY:byte;                        { Начало таблицы на экране }

Xpos:                               { Координаты столбцов на экране}

ColumnsPositionsArray;

 FileStr:string;                  { Строка из файла }

       { Л о к а л ь н ы е п е р е м е н н ы е в п р о ц е д у р е }

var i,StrLen:byte; S:string; E:boolean;

         { Процедура вывода курсора в специальную строку.

Используется при вводе с клавиатуры и выводе сообщений об ошибке } procedure GoToSpecialLine(LineNum:byte { Номер строки });

begin

 { Переход в строку под таблицей }

GotoXY(1,InitY+Ny+1+LineNum);

end;

 {Функция ввода с клавиатуры }

function KeyBoardInput:string;

begin { KeyBoardInput }

KeyBoardInput:='Функция ввода с клавиатуры.';

end; { KeyBoardInput }

 {Процедура вывода сообщения об ошибке }

procedure Error(

S:string;   { Строка сообщения }

var Sf:string); {Строка ввода поля данных в таблице }

begin

Sf:=''; GoToSpecialLine(1); Write('       ',S); Delay(2000);

GoToSpecialLine(1); ClrEol; MoveCursor(C,R,InitY,Xpos);

end;

 {Функция сравнения длины вводимой строки с шириной поля таблицы }

function LengthCompare(

C:byte;                           {Номер столбца таблицы }

S:string;                         {Введенная строка }

var StrLen:byte              {Ширина поля в таблице })

: boolean;

begin

StrLen:=(Xpos[C+1]-Xpos[C]-3); LengthCompare:=(StrLen>=length(S)); end;

...

begin { основная часть процедуры EnterField }

{ Ввод строки или с клавиатуры, или из файла }

if KeyBoard then S:=KeyBoardInput else S:=FileStr;

DeleteSpaces; { Удаление пробелов в начале и в конце строки }

if S<>'' then { Если строка ввода не пустая }

begin

if LengthCompare(C,S,StrLen)

then { если длина строки не больше столбца }

begin

with P[R] do { Преобразования из строки в тип поля }

 case C of { Выбор по номеру поля }

1: StrToByte(S,N);       2: StrToCorp(S,Corp);

3: StrToWord(S,Freq); 4: Notice := S;

5: StrToWord(S,Count); 6: StrToReal(S,Price);

7: StrToReal(S,Summ);

end;

if S<>'' then

begin { Если преобразование прошло без ошибок }

{ Вывод значения поля в виде строки на экран }

MoveCursor(C,R,InitY,Xpos);

while length(S)<StrLen do S:=' '+S; { Добавление пробелов }

Write(S);                                      { Вывод строки }

end;

end

else { Если длина строки больше столбца }

Error('Длина строки ввода больше ширины столбца.',S); end;

{ Вернуть курсор в соответствующую ячейку таблицы }

MoveCursor(C,R,InitY,Xpos);

end; { Основная часть процедуры EnterField } …



2019-12-29 168 Обсуждений (0)
Подготовительный этап работы программы 0.00 из 5.00 0 оценок









Обсуждение в статье: Подготовительный этап работы программы

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (168)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)