Сделай Сам Свою Работу на 5

Проектирование программы.





 

Для проектирования программы будем использовать подход МЭСИД. Процесс проектирования начинается с составления диаграмм структур выходных данных. Они представлены на рис.12. После составления необходимо убедиться в их структурной и информационной непротиворечивости. На базе этих диаграмм определяется «идеальный вход», обеспечивающий получение всех выходных документов. Структура «идеального входа» может быть получена при обработке последовательного файла «Наряд» путем прямого доступа к файлам-справочникам «Рабочий» и «Подразделение» и последовательного доступа к файлу-справочнику «Операция». Диаграммы структур входных данных показаны на рис.13. В этих диаграммах представлены только те поля записей, которые необходимы для получения «идеального входа». Диаграммы размечаются идентификаторами полей записей, полей управления, полей печати и вычислительными формулами. Убедившись в полноте и непротиворечивости постановки задачи на логическом уровне, можно перейти к составлению диаграммы структуры программы и матрицы операций (рис.14), выделив в ней отдельные столбцы для каждого выходного документа, и затем к кодированию программы.



 

Кодирование программы.

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

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





type tn=record

a:string[2];

b:string[2];

h:string[3];

c:string[4];

e:string[10];

K:integer

end;

tr=record

c:string[4];

m:string[30];

G:byte

end;

top=record

e:string[10];

p:word;

ei:string[2]

end;

tp=record

a:string[2];

x:string[25];

ph:string[7];

end;

var fn:file of tn; zn:tn;

fo:file of top; zo:top;

fr:file of tr; zr:tr;

fp:file of tp; zp:tp;

v1,v2,v3:text;

s0,sa,sb,sc,kod,chi:integer;

f:boolean;

a1,b1,bp:string[2];

c1:string[4];

nd:string;

ch:char;

Begin

write('имя осн.файла='); readln(nd);

assign(fn,nd);

write('имя файла раб.='); readln(nd);

assign(fr,nd);

write('имя файла опер.='); readln(nd);

assign(fo,nd);

write('имя файла подр.='); readln(nd);

assign(fp,nd);

assign(v1,'v1'); rewrite(v1);

assign(v2,'v2'); rewrite(v2);

assign(v3,'v3'); rewrite(v3);

writeln(v1,' Ведомость 1');

Writeln(v1,' Цех Участок Таб.номер ',

Начислено');

writeln(v2,' Ведомость 2');

writeln(v3,' Ведомость 3');

Writeln(v3,' Цех Название ',

Начислено');

s0:=0; f:=true;

reset(fn); read(fn,zn);

reset(fp); reset(fr);

While f do

Begin

a1:=zn.a; sa:=0;

zp.x:=' '; val(a1,chi,kod);

seek(fp,chi-1); read(fp,zp);

writeln(v2,'Цех ',a1:3,' ',zp.x:25);

Writeln(v2,'Участок Т.ном. ФИО',

' Начислено');

while f and(a1=zn.a) do

Begin

b1:=zn.b; bp:=b1; sb:=0;

while f and(a1=zn.a)and(b1=zn.b) do

Begin

c1:=zn.c; sc:=0;

zr.m:=' '; val(c1,chi,kod);

seek(fr,chi-1); read(fr,zr);

while f and(a1=zn.a)and(b1=zn.b)and

(c1=zn.c) do

Begin

reset(fo); zo.p:=0;

Repeat

read(fo,zo);

until eof(fo) or (zn.e=zo.e);

close(fo);

sc:=sc+zo.p*zn.k;

If not eof(fn) then read(fn,zn)

else f:=false;

end;

writeln(v1,a1:5,b1:8,c1:10,sc:10);

Writeln(v2,bp:5,c1:7,' ',zr.m:30,

sc:3);

bp:='';

sb:=sb+sc;

end;

Writeln(v1,' по участку',

sb:5);

Writeln(v2,' ',

'по участку', sb:5);

sa:=sa+sb;

end;

Writeln(v1,' по цеху',

sa:5);

Writeln(v2,' ',

' по цеху', sa:5);

writeln(v3, a1:6,zp.x:30,sa:5);

s0:=s0+sa;

end;

Writeln(v1,' ',

'всего',s0:5);

Writeln(v2,' ',

' всего',s0:5);

close(v1); close(v2); close(v3); close(fn);

End.

 

Рис.15 Текст программы.

 

Вопросы к главе 6.

1. Как можно описать файлы ?

2. Какие типы файлов существуют в Турбо Паскале ?



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

4. Особенности работы с типизированными файлами.

5. Особенности работы с текстовыми файлами.

6. Особенности работы с нетипизированными файлами.

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

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

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

10. Общий алгоритм создания файла.

11. Общий алгоритм обработки файла.


Динамическая память.

 

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

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

Можно отметить следующие достоинства динамической памяти:

- экономичность и эффективность ее использования;

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

- статические переменные существуют только в течение жизни блока, в котором они объявлены, а динамические - и после выхода из блока до окончания программы. Переменная, размещаемая динамически, не объявляется в разделе VAR и не имеет имени в программе («невидимка»). Компилятор не планирует выделение места в памяти под такие переменные.

 

Указатель.

 

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

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

Формат описания типа «указатель» следующий:

 

TYPE<идентификатор указателя>=^<тип>;

 

Примеры объявления типов «указатель» и переменных типа «указатель».

 

Type

{правильные объявления типов}

p1=^word;{ p1 - идентификатор типа «указатель» на данные типа word.}

p2=^char; { p2 - идентификатор типа «указатель» на данные типа char}

p4=array[1..10] of ^real; {p4 - идентификатор типа «указатель» на массив указателей, ссылающихся на данные типа real}

{неправильные объявления типов}

p5=^array[1..10] of real;

p6=^string[25];

p7=^record

field1 : string [15];

field2 : real;

end;

 

В формате объявления типа «указатель» должен быть указан идентификатор типа, поэтому стандартные идентификаторы (integer, real и т.д.) можно указывать непосредственно в описаниях типа «указатель». Ошибки в описаниях типов p5, p6 и p7 будут отмечены компилятором из-за того, что, в таких случаях надо прежде описать идентификатор типа, а затем использовать его в других описаниях.

Следующие описания будут правильными:

Type

...

mas = array[1..10] of real;

st = string[25];

rec = record

field1 : string [15];

field2 : real;

end;

Var

p5 : ^mas;

p6 : ^st;

p7 : ^rec;

...

Указатель может находиться в одном из трех состояний, а именно:

1) еще не инициализирован;

2) содержит адрес размещения;

3) содержит значение предопределенной константы nil; такой указатель называется пустым, то есть не указывает ни на какую переменную. Указатель со значением nilсодержит 0 в каждом из четырех байтов.

Указатели можно сравнивать с другими указателями ( =, <> ), присваивать им адрес или значение другого указателя, передавать как параметр. Указатель нельзя отпечатать или вывести на экран.

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

 

<идентификатор указателя>^

 

Рассмотрим пример обращения к переменным, размещенным в динамической памяти:

Type

sym=^char;

zap=record

field1, field2: real;

end;

m=array[0..9] of word;

Var

ch : sym;

rec : ^zap;

mas : ^m;

...

ch^:='*'; {обращение к динамической переменной типа char, запись в эту область символа звездочка}

...

Readln (rec^.field1); {обращение к полю field1 динамической записи, ввод в него данных с клавиатуры }

...

Writeln ( mas[5]^); {обращение к элементу mas[5] динамического массива, вывод на экран значения указанного элемента}

...

Фактически можно говорить, что ch^, rec^.field1иmas[5]^ исполняют роль имён динамических объектов в программе, адреса которых хранятся в указателях сh, rec и mas соответственно.

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

Например.

Var

p:pointer;

...

p^:=1; {ошибка!}


 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.