Трассировка программы
Аспекты структуры данных, построения и выдачи дерева вызовов процедур. Роль и использование модулей в программе. Их функциональная схема и описание составляющих частей, производимые ими операции. Особенности листинга и результатов работы программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 24.04.2009 |
Размер файла | 30,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
17
11
Содержание
1. Задание
2. Использование модулей в программе
3. Структура данных
4. Функциональная схема
5. Описание программы и подпрограмм
6. Листинг программы
7. Результат работы программы
1. Задание
Трассировка программы, не содержащей рекурсивных вызовов и повторяющихся имен процедур, распечатана в виде списка выполняемых процедур. Процедура попадает в список, если к ней произошло обращение из вызывающей процедуры, либо возврат управления из вызванной ей процедуры. Структура программы такова, что каждая вызываемая процедура вложена в вызывающую ее процедуру. Начало и окончание программы должны быть в головной процедуре. Известен объем памяти, который требуется для загрузки каждой процедуры. При выходе из процедуры занимаемая ей память освобождается. Построить и выдать дерево вызовов процедур. Определить размер памяти, необходимый для работы программы, и цепочку вызовов, требующую максимальной памяти.
2. Использование модулей в программе
Модуль Crt содержит процедуры и функции управления тестовым выводом на экран дисплея, и чтения клавиатуры.
Стандартные процедуры (модуля crt)
clrscr - очищает экран и помещает курсор в левый верхний угол.
gotoxy - перемещает курсор по заданным координатам.
textcolor - задает цвет выводимого на экран текста.
textbackground - задает цвет экрана.
readkey- читает символ из буфера клавиатуры.
3. Структура данных
type
ukaz=^derevo;
derevo= record
name: string[20];
pr: char;
memory: integer;
vniz: ukaz;
next:ukaz;
vverh: ukaz;
vpravo: ukaz;
end;
var
t, ver, p, pp, p_p, del_p, p_del, temp,nachalo: ukaz;
znak: boolean;
ch: char;
a:array[1..100] of integer;
mas:array[1..50] of string[3];
b:array[1..50] of string;
c:array[1..40] of string;
Proced:array[1..50] of string;
Ukazat:array[1..50] of ukaz;
s,d,m,w,memorys,most,ind,proverka3,proverka,proverka2,chislo:integer;
str,stroka,most2,koren,st2,filename,st,st1,chislo_str: string;
i, x, y, j, k, n: byte;
mnog: set of byte;
f,f_memory:text;
Derevo- запись с несколькими полями : name- имя вершины дерева; memory- кол-во занимаемой процедурой памяти при её вызове ; pr- признак вершин(листовая или не листовая вершина); vniz, next, vverh, vpravo - указатели связи.
t, ver, p, pp, p_p, del_p, p_del, temp,nachalo- указатели используемые при построении дерева.
znak- логическая переменная используемая для определения признака вершины.
a- массив содержащий длины всех возможных путей обхода нашего дерева.
b- массив содержащий все возможные пути обхода нашего дерева.
c- массив используемый в промежуточных действиях по нахождению путей обхода нашего дерева.
mas- массив используемый в промежуточных действиях по построению дерева.
Proced- массив содержащий трассировку вызова процедур.
Ukazat- массив содержащий указатели на вершины деревьев, используемые для более быстрого перехода на ту или иную вершину при построении дерева.
s,d,m,w,memorys,most,ind,chislo,i, x, y, j, k, n,mnog - целочисленные переменные (счетчики, идентификаторы и т.д.).
proverka3,proverka,proverka2- флаги, используемые при проверке соответствия данных о количестве памяти требуемой при вызове процедур к самим процедурам.
str,most2,koren,stroka,st,st1,chislo_str- переменные используемые при различных операциях над строками(перевод строки в число, получение путей обхода дерева и т.д.).
filename- переменная используемая при вводе имени и пути файла содер-го трассировку.
f,f_memory- текстовые файлы содержащие трассировку и кол-во памяти процедур.
ch- переменная, используемая при запросах на повторение циклов в программе.
4. Функциональная схема
17
11
5. Описание программы и подпрограмм
Программа написана на языке Borland Pascal 7.1. Программа состоит из главной программы и подпрограмм
Описание подпрограмм
Soob : процедура, запрашивающая о дальнейшем действии программы после ошибки ввода пути или имени файла, в котором хранится трассировка вызова подпрограмм: произвести остановку программы или попробовать еще раз ввести правильный путь.
Faile : Процедура ввода пути и имени файла в котором хранится трассировка вызова подпрограмм. Если не было ошибок, трассировка считывается в массив.
Preobraz : Процедура замены строчных букв на прописные.
Poisk_memory : Процедура считывающая из текстового файла кол-во памяти соответствующей той или иной вызываемой процедуре.
New_tree : Процедура построения нашего дерева вызова процедур на основе указателей.
Listing : Процедура прорисовки получившегося дерева для более наглядного вида.
Poisk : Процедура поиска на дереве вызова процедур пути максимального веса.
6. Листинг программы
Procedure soob(mess:string); {Процедура ,запрашивающая о дальнейшем действии}
begin {программы после ошибки ввода пути или имени}
Writeln(mess); {файла ,в котором хранится трассировка вызова}
repeat {подпрограмм: произвести остановку программы}
writeln('Exit Y\N'); {или попробовать еще раз ввести правильный путь}
ch:=readkey;
if (ch<>#121) or (ch<>#110) then GotoXY(1,3);
if ch=#121 then Halt;
if ch=#110 then break;
until false;
end;
Procedure Faile; {Процедура ввода пути и имени файла в котором}
begin {хранится трассировка вызова подпрограмм .Если}
repeat {не было ошибок трассировка считывается в массив.}
clrscr;
Write('Введите путь и имя файла : ');
Readln(filename);
if filename='' then soob ('Файл не задан')
else assign (f,filename);
{$i-}
Reset(f);
{$i+}
if Ioresult=0 then break
else if filename<>'' then soob ('Ошибка открытия или данный файл не существует !');
until false;
m:=1;
while not eof(f) do
begin
readln(f,st);
for i:=1 to length(st) do
begin
if st[i]<>',' then
begin
stroka:=stroka+st[i];
end
else
begin
Proced[m]:=stroka;
m:=m+1;
stroka:='';
end;
end;
Proced[m]:=stroka;
end;
end;
Procedure Poisk; {Процедура поиска на дереве вызова процедур}
begin {пути максималного веса.}
for i:=1 to 2 do
for m:=2 to s-1 do
begin
if a[i]<a[m] then
begin
most:=a[i];
a[i]:=a[m];
a[m]:=most;
most2:=b[i];
b[i]:=b[m];
b[m]:=most2;
end;
end;
end;
Procedure Poisc_memory; {Процедура считывающая из текстового файла}
begin {кол-во памяти соответствующей той или иной}
Assign(f_memory,'c:\memory.txt'); {вызываемой процедуре.}
reset(f_memory);
proverka2:=0;
proverka:=0;
proverka3:=0;
chislo_str:='';
while not eof(f_memory) do
begin
i:=0;
readln(f_memory,st2);
while i<>length(st2) do
begin
i:=i+1;
if st2[i]=proced[ind] then
begin
proverka2:=1;
proverka:=1;
break;
end;
end;
if proverka=1 then break;
end;
if proverka2=0 then
begin
writeln('Для процедуры ',proced[ind],' не задано кол-во памяти!');
ch:=readkey;
proverka3:=1;
exit;
end
else
begin
repeat
i:=i+1;
if st2[i]='(' then
begin
i:=i+1;
while st2[i]<>')' do
begin
if st2[i]='(' then
begin
write('В текстовом файле синтаксическая ошибка!');
ch:=readkey;
exit;
end;
chislo_str:=chislo_str+st2[i];
i:=i+1;
end;
end;
until st2[i]=')';
end;
chislo:=0;
stroka:=chislo_str;
for j:=1 to length(stroka) do
begin
if (ord(stroka[j])>47) and (ord(stroka[j])<58) then chislo:=chislo*10+(ord(stroka[j])-48);
end;
close(F_memory);
end;
Procedure listing; {Процедура прорисовки получившегося дерева}
begin {для более наглядного вида.}
x:=0;
window(1,1,80,25);
clrscr;
stroka:='';
mnog:=[];
pp:=ver;
t:=pp;
writeln(pp^.name);
s:=1;
repeat
if (pp^.vniz<>nil) or (pp^.vpravo<>nil) then
begin
if pp^.vpravo<>nil then
begin
pp:=pp^.vpravo;
b[s]:=b[s]+'-'+pp^.name;
a[s]:=a[s]+pp^.memory;
x:=x+1;
t:=pp^.vverh;
if t^.vniz=nil then mnog:=mnog+[x-1]
else mnog:=mnog-[x-1];
end
else if pp^.vniz<>nil then
begin
stroka:=b[s];
for i:=1 to length(b[s])-1 do
begin
c[i]:=stroka[i];
b[s+1]:=b[s+1]+c[i];
end;
s:=s+1;
a[s]:=a[s-1]-pp^.memory;
pp:=pp^.vniz;
b[s]:=b[s]+pp^.name;
a[s]:=a[s]+pp^.memory;
end;
end
else
begin
w:=1;
s:=s+1;
a[s]:=a[s-1]-pp^.memory;
repeat
w:=w+1;
pp:=t;
a[s]:=a[s]-pp^.memory;
x:=x-1;
if t^.vniz<>nil then mnog:=mnog-[x];
if pp=ver then exit;
repeat
t^.pr:='o';
t:=t^.vverh;
w:=w+1;
until t^.pr='t';
until pp^.vniz<>nil;
if t<>ver then
begin
stroka:=b[s-1];
for i:=1 to length(b[s-1])-w do
begin
c[i]:=stroka[i];
b[s]:=b[s]+c[i];
end;
end;
pp:=pp^.vniz;
b[s]:=b[s]+pp^.name;
a[s]:=a[s]+pp^.memory;
end;
if pp<>t then
begin
for i:=1 to (x-1) do
begin
if (not (i in mnog)) then write('¦ ')
else write(' ');
end;
if pp^.vniz=nil then write('L---<')
else write('+---<');
writeln(pp^.name,'> "',pp^.memory,'"');
end;
until pp=t;
end;
Procedure preobraz; {Процедура замены строчных букв на прописные}
begin
for i:=1 to length(str) do
begin
case ord(str[i]) of
97..122, 160..175: str[i]:=chr(ord(str[i])-32);
224..239: str[i]:=chr(ord(str[i])-80);
241: str[i]:=chr(ord(str[i])-1);
end;
end;
end;
Procedure new_tree; {Процедура построения нашего дерева вызова}
BEGIN {процедур на основе указателей.}
new(p);
ver:=p;
pp:=p;
t:=pp;
t^.pr:='o';
pp^.vniz:=nil;
pp^.vpravo:=nil;
mas[1]:=proced[1];
str:=proced[1];
preobraz;
koren:=str;
pp^.name:=str;
ukazat[1]:=ver;
ind:=1;
REPEAT
for i:=1 to ind do
begin
if mas[i]=proced[ind+1] then znak:=true;
end;
if not znak then
begin
if p^.pr='t' then
begin
p:=p^.vpravo;
pp:=p;
if p^.vniz=nil then
begin
ind:=ind+1;
new(p);
pp^.vniz:=p;
p^.vverh:=pp;
pp:=p;
p^.pr:='o';
str:=proced[ind];
Poisc_memory;
pp^.memory:=chislo;
preobraz;
pp^.name:=str;
pp^.vniz:=nil;
pp^.vpravo:=nil;
mas[ind]:=proced[ind];
ukazat[ind]:=p;
znak:=false;
end
else
begin
repeat
p:=p^.vniz;
until p^.vniz=nil;
pp:=p;
ind:=ind+1;
new(p);
pp^.vniz:=p;
p^.vverh:=pp;
pp:=p;
p^.pr:='o';
str:=proced[ind];
Poisc_memory;
pp^.memory:=chislo;
preobraz;
pp^.name:=str;
pp^.vniz:=nil;
pp^.vpravo:=nil;
mas[ind]:=proced[ind];
ukazat[ind]:=p;
znak:=false;
end;
end
else
begin
p^.pr:='t';
ind:=ind+1;
new(p);
pp^.vpravo:=p;
p^.vverh:=pp;
pp:=p;
p^.pr:='o';
str:=proced[ind];
Poisc_memory;
pp^.memory:=chislo;
preobraz;
pp^.name:=str;
pp^.vniz:=nil;
pp^.vpravo:=nil;
mas[ind]:=proced[ind];
ukazat[ind]:=p;
end;
end
else
begin
j:=0;
repeat
j:=j+1;
until mas[j]=proced[ind+1];
p:=ukazat[j];
pp:=p;
znak:=false;
ind:=ind+1;
end;
UNTIL ind=m;
p:=ver;
p^.pr:='t';
END;
BEGIN {Основная программа.}
textcolor(15);
clrscr;
Faile;
new_tree;
if proverka3=1 then exit;
if (ver^.vpravo<>nil) then listing;
Poisk;
Writeln;
Writeln('Путь занимающий наибольшее кол-во памяти : ',koren+b[1] );
Writeln('Его сумма составляет :',a[1]);
readln;
END.
7. Результат работы программы
Подобные документы
Разработка программы, моделирующей игру "Кости". Использование в программе генератора псевдослучайных чисел. Схема иерархии модулей. Описание работы программы. Регистрация игрока, окно программы. Определение языка программирования, основные операторы.
курсовая работа [3,2 M], добавлен 29.07.2010Проектирование пользовательского интерфейса. Выбор формата представления данных, используемые переменные. Список процедур и макросов, их назначение. Используемые в программе функции. Тестирование и отладка правильной работы программы, схема листинга.
курсовая работа [28,6 K], добавлен 17.05.2013Разработка полноценной правильно функционирующей игровой программы "Парные картинки", изучение процедур и функций. Использование масштабируемых средств для построения баз данных. Компоненты Delphi в программе. Описание пользовательского интерфейса.
курсовая работа [1,3 M], добавлен 13.07.2012Изучение условий поставленной задачи и используемых данных для разработки программы хранения информации о рейсах поезда. Описание разработанных функций, листинга, блок-схем алгоритмов и дерева функции. Рассмотрение сценария диалога данной программы.
курсовая работа [532,7 K], добавлен 20.07.2014Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.
курсовая работа [721,4 K], добавлен 10.11.2010Особенности работы с процедурами и двумерными массивами, последовательность вызова процедур. Способы описания и использования многомерных массивов, назначение процедур, их описание и обращение к ним. Набор программы, ее отладка и тестирование данных.
лабораторная работа [112,1 K], добавлен 03.10.2010Использование класса статических массивов структур и базы данных "ODER" при создании программы на языке С++. Основные формы выдачи результатов. Технические и программные средства. Тесты для проверки работоспособности алгоритма создания программы.
курсовая работа [1,1 M], добавлен 17.03.2015Разработка программы для работы с множеством данных, перечень и работа ее модулей. Проверка работы программы. Реализация поиска элемента в файле по его номеру и добавление элементов в конец уже созданного НД. Возможности и особенности применения программы
курсовая работа [3,5 M], добавлен 22.06.2012Графическая схема алгоритма выполнения программы определения запасов сырья. Решение задачи с помощью программы MS Excel. Разработка макроса для построения диаграммы. Использование интерфейса программы для работы с таблицей. Разработка базы данных.
курсовая работа [1,2 M], добавлен 24.04.2014Создание программы, работающей с набором данных на внешнем устройстве. Описание программного комплекса. Обзор структуры главной программы. Процедура добавления новых элементов, поиска и создания на экране вертикального меню. Проверка работы программы.
курсовая работа [265,6 K], добавлен 28.08.2017