л.р. № 1 часть 2 вариант 28
.docБелорусский государственный университет
информатики и радиоэлектроники
Факультет заочного, вечернего и дистанционного обучения
Специальность - ПОИТ
Янков Максим Игоревич
Зачетная книжка 701023с-28
Электронный адрес Yankoff@open.by
Контрольная работая №1 – ОАИП 2-я часть
Лабораторная работа по 2 части ОАиП (база данных)
Радиоателье.
В радиоателье хранятся квитанции о сданной в ремонт аппаратуре. Данные о квитанциях хранятся в динамическом списке. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиотелефон и т.п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Необходимо выдать информацию о состоянии готовности заказов на текущие сутки по группам изделий.
В программе должны присутствовать следующие процедуры:
-
Формирование динамического списка;
-
Вывод списка на экран;
-
Вывод состояния готовности;
-
Добавление элемента в список;
-
Удаление элемента из списка;
-
Поиск элемента списка по соответствующему полю;
-
Сортировка по алфавиту;
-
Запись в файл и загрузка из файла.
Выбор необходимого действия обеспечить через удобный интерфейс. Для записи и загрузки из файла использовать типизированный файл.
используемые процедуры:
procedure AddDevice(var Head:pDevice); - добавление элемента
procedure DrawSeparator; - рисование разделительной лини между элементами и при выводе на экран
procedure ShowElement(p:pDevice;isReady:string); - выводит на экран определенный элемент
procedure ShowList(Head:pDevice; showType:integer; grName:string); - вывод списка в зависимости от значения передаваемой переменной showType (может принимать значения ALL(это константа определена вверху проги)- вывод всего списка, READY – только готовых изделий, BYGROUP – в зависимости от введенной группы grName)
function SearchDevice(Head:pDevice; delId:integer;var p,pr:pDevice) : boolean; - поиск изделия (записи) по идентификаторы (delId)
procedure DelDevice(var Head:pDevice; id : integer); - удаление определенного изделия по идентификатору(использует SearchDevice для поиска этого изделия(записи))
procedure ChangeReady(var Head:pDevice; deviceId:integer); - смена готовности изделия на противополжное
procedure SaveToFile(Head:pDevice); - сохранение списка в файл
procedure ClearList(var Head:pDevice); - удаление списка, очистка памяти
procedure LoadFromFile(var Head:pDevice); - загрузка списка из файла
procedure ChangeData(p,pr:pDevice); - меняет данные соседних элементов списка (используется при сортировке)
procedure SortByGroup(Head:pDevice;sortType:integer); - сортировка(не только по группе в зависимоти от переданной перемененной sortType )
Код
program atelle;
uses crt,dos;
const
{optii sorirovok i vivoda na ekran}
{vivod vseh elementov spiska}
ALL=0;
{vivod ozdelii proshedshih remont}
READY=1;
{vivod izdelii opredelennooi gruppi; takghr primanietsi dlia sortirovki}
BYGROUP=3;
{sortirovka po od}
BYID=4;
{sortirovka po marke}
BYMARK=5;
type
{opredeliaem tip - ukazatel na zapis ob izdelii}
pDevice=^Device;
Device=record
{identifikato izdelia - nughrn dlia ustnivlenia odnoznachnogo sootvetstia dlia izdelia}
Id:integer;
Group:string[15];
Mark : string[15];
{ukazatel na sled. element v spiske}
Next : pDevice;
{data sdacho v remont}
BeginRepairDate : DateTime;
{sostoianie gotovnosti}
IsReady : boolean;
end;
var
{ukazatel na golovu(pervii element) spiska }
Head:pDevice;
{ukazateli ispolzuemir dlia peredvighenia po spisku}
p,pr:pDevice;
{i-dlia ciklov for; dow - DayOfWeek - den nedeli, posilaetsia v proceduru poluchenia tekushchei dati}
i,dow:word;
sKey:integer;
{vvodimii simvol s klavi - opredeliaet punkt menu dlia vibora}
iOption:char;
{isReady - simvolnoe predstavlenie gotovnosti izdelia: group - nazvanie gruppi dlia vivoda na ekran opredelennoh elementov}
isReady,group:string[15];
{maximalnii id i id izdelia dlia udalenia}
maxId,delId:integer;
{vozvrashchaet maximalnii identifikator}
function GetMaxId:integer;
begin
maxId:=maxId+1;
GetMaxId:=maxId;
end;
{.........Dobavlenie elementa..........}
procedure AddDevice(var Head:pDevice);
var
{ukazatel na sozdavaemii element}
p:pDevice;
{ukazatel dlia obhoda spiska}
pr:pDevice;
{sohranenie simvola vvodimogo s klaviaturi}
q:char;
begin
clrscr;
while (true) do
begin
writeln('...Vvod dannih...');
writeln;
new(p);
writeln('Tip izdelia(naprimer televizor, sotovii)');
readln(p^.Group);
writeln('Marka izdelia');
readln(p^.Mark);
{ustanavlivaem dlia novogo izdelia maximalnii identifikator}
p^.Id:=GetMaxId;
{poluchaem tekushchuiu datu}
GetDate(p^.BeginRepairDate.Year,p^.BeginRepairDate.Month,p^.BeginRepairDate.Day,dow);
p^.Next:=nil;
{esli spisok pust}
if (Head = nil) then
Head:=p
else
{ustanavlivaem ukazatel na golovu i ishem mesto dlia vstavki, esli spisok ne pust}
begin
pr:=Head;
{ischem poslednii element}
while pr^.Next<>nil do
pr:=pr^.Next;
{dobavliaem v spisok novi element}
pr^.Next:=p;
end;
writeln('Dlia vihoda nagmite "q" libo druguiu klavishu dlia prodolghenia');
{schitivaem simvol s klaviaturi}
q:=readkey;
if ((q='q') or (q='Q')) then
break;
end;
end;
{riset na ekrane liniu razdeliauschuiu izdelia}
procedure DrawSeparator;
begin
writeln;
for i:=1 to 80 do
write('-');
writeln;
end;
{otobraghaet opredelennoe izdelie na ektrane}
procedure ShowElement(p:pDevice;isReady:string);
begin
DrawSeparator;
write('|',p^.Id:5,'|',p^.Group:15,'|':2,p^.Mark:15,'|':2,isReady:15,'|':2);
write('':10,p^.BeginRepairDate.Day,'.',p^.BeginRepairDate.Month,'.',p^.BeginRepairDate.Year,'|');
end;
{............‚Vivod spiska na ekran ..................}
procedure ShowList(Head:pDevice; showType:integer;grName:string);
var
p:pDevice;
isReady:string[15];
begin
{Stavim ukazatel na golovu}
p:=Head;
{spisok pust}
if p=nil then
writeln('V spiske net elementov...')
else
begin
writeln(' IZDELIA');
{risuem liniu}
DrawSeparator;
{risuem zagolovok}
write('|', 'ID':5,'|','TIP ':15,'|':2,'MARKA':15,'|':2,'GOTOVNOST':15,'|':2,'DATA NACH. REMONTA':11,'|');
{obhodim vas spisok}
while p<>nil do
begin
{ustavlivaem simvolnoe predstavlenie gotovnosti}
if (p^.IsReady=true) then
isReady:='Vipolneno'
else
isReady:='Na remonte';
{v zavisimosti ot peredannoi v proceduru opcii(vida otobragheniaa) osuchestvliaem vivod na ekran}
case showType of
{vse elementi}
ALL : ShowElement(p,isReady);
{otremontirovannie(gotovie) izdelia}
READY:
begin
if (p^.IsReady=true) then ShowElement(p,isReady);
end;
{izdelia opredelennoi gruppi}
BYGROUP:
begin
if (p^.Group=grName) then ShowElement(p,isReady);
end;
end;
{ustanavliaem ukazatel na sleduischii element spiska}
p:=p^.Next;
end;
end;
end;
{..............Poisk izdelia po ego identifikatoru...........}
function SearchDevice(Head:pDevice; delId:integer;var p,pr:pDevice) : boolean;
begin
p:=Head;
{obhodim ves spisok}
while p<>nil do
begin
{esli nashli izdelie s nughnim id vihodim iz proceduri}
if (delId=p^.Id) then
begin
SearchDevice:=true;
exit;
end;
{ustanavlivaem pred element;
nughno potomu kak dannaia procedura ispolsutsia pri udalenii elementa
i nam nughno znat pred element pered udaliaemim }
pr:=p;
{ustavlivaem ukazatel na sled element spiska}
p:=p^.Next;
end;
{esli doshli do etoi stroki znachit izdelie ne nashli}
SearchDevice:=false;
end;
{..............Udalenie izdelia po id...........}
procedure DelDevice(var Head:pDevice; id : integer);
var
{tekuschii element}
p:pDevice;
{predidushii element}
pr:pDevice;
begin
{esli ne nashli izdelie}
if (not SearchDevice(Head, id, p,pr)) then
begin
writeln('Nepravilnii id izdelia dlia udalenia':25);
exit;
end;
{esli naidenii element golova, to zamenim golovu na sled element}
if p=Head then
Head:=Head^.Next
else
{perebrasivaem ukazatel(Next) pred elementa na Next udaliaemogo,
tem samim iskluchaia udaliemii element iz spiska}
pr^.Next:=p^.Next;
{ochishaem pamiat ot elementa}
dispose(p);
end;
{meniaet sostoianie gotovnosti izdelia na protivopologhnoe}
procedure ChangeReady(var Head:pDevice; deviceId:integer);
var
p:pDevice;
pr:pDevice;
begin
{esli ne nashli izdelie}
if (not SearchDevice(Head, deviceId, p,pr)) then
begin
writeln('Nepravilnii id izdelia dlia udalenia':25);
exit;
end;
{meniaet sostoianie gotovnosti izdelia na protivopologhnoe}
p^.IsReady:=not p^.IsReady;
end;
{..........Sohranenie v fail..........}
procedure SaveToFile(Head:pDevice);
var
Fl: file of Device;
p: pDevice;
begin
p:=Head;
{otrkrivaem fail dlia zapisis}
assign(Fl,'atelle.dat');
rewrite(Fl);
{obhodim ves spisok}
while p<>nil do
begin
write(Fl,p^);
p:=p^.Next;
end;
close(Fl);
end;
{OCHISTKA SPISKA}
procedure ClearList(var Head:pDevice);
var
p,pr:pDevice;
begin
p:=Head;
{obhodim ves spisok}
while (p<>nil) do
begin
{pr - ukazatel na pred element}
pr:=p;
p:=p^.Next;
{oshishaem pamiat od elementa}
Dispose(pr);
end;
p:=nil;
pr:=nil;
Head:=nil;
end;
{........Zagruzka dannih iz faila ........}
procedure LoadFromFile(var Head:pDevice);
var
Fl: file of Device;
p,pr:pDevice;
begin
assign(Fl,'atelle.dat');
{otkrivaem fail dlia chtenia}
reset(Fl);
{ochistka spiska}
ClearList(Head);
{maximalnii id ustavlivaem v nol}
maxId:=0;
{chitaem iz faila do ego konca}
while not Eof(Fl) do
begin
{videliaem pamiat na element}
new(p);
{schitivaem dannie v element}
read(Fl,p^);
{esli maximalnii id izdelia menshe id izdelia iz faila zameniem max id}
if (maxId<p^.Id) then
maxId:=p^.Id;
p^.Next:=nil;
{esli eto pervii element dobavliaemii v spisok to ustanavlivaem ukazatel golovi na dannii element}
if Head=nil then
Head:=p
else
{v spisok ughe dobavleni izdelia}
begin
pr:=Head;
{nahodim mesto dlia dobavlenia v spisok}
while pr^.Next<>nil do
pr:=pr^.Next;
{ustanavlivaem ukazatel na sled. element poslednego elementa spiska na dobavliemii element }
pr^.Next:=p;
end;
end;
close(Fl);
end;
{zameni dannih sosednih elementov}
procedure ChangeData(p,pr:pDevice);
var
{nighen dlia vremennogo hranenia dannih}
tmp:pDevice;
Id:integer;
begin
{videliaem pamiat}
new(tmp);
tmp^.Id:=p^.Id;
tmp^.Mark:=p^.Mark;
tmp^.Group:=p^.Group;
tmp^.BeginRepairDate:=p^.BeginRepairDate;
tmp^.IsReady:=p^.IsReady;
{meniaem mestami dannie elementov p,pr}
p^.Id:=pr^.Id;
p^.Group:=pr^.Group;
p^.BeginRepairDate:=pr^.BeginRepairDate;
p^.Mark:=pr^.Mark;
p^.IsReady:=pr^.IsReady;
pr^.Id:=tmp^.Id;
pr^.Mark:=tmp^.Mark;
pr^.BeginRepairDate:=tmp^.BeginRepairDate;
pr^.IsReady:=tmp^.IsReady;
pr^.Group:=tmp^.Group;
{udaliaem pamiat}
dispose(tmp);
end;
{sortirovka elemetov po gruppe}
procedure SortByGroup(Head:pDevice;sortType:integer);
var
p,pr : pDevice;
begin
p:=Head;
pr:=p;
{emulitia puzirkovoi sortirovki}
while(p<>nil) do
{obhodim ves spisok dvigaias s pomoshiu p}
begin
pr:=p;
{obhodim ves spisok dvigaias s pomoshiu pr}
while (pr^.Next<>nil) do
begin
pr:=pr^.Next;
{esli ne v alfavitnom poriadke menieam dannie elementov mestami}
case sortType of
BYID:
begin
if (pr^.Id<p^.Id) then
ChangeData(p,pr);
end;
BYGROUP:
begin
if (pr^.Group<p^.Group) then
ChangeData(p,pr);
end;
BYMARK:
begin
if (pr^.Mark<p^.Mark) then
ChangeData(p,pr);
end;
end;
end;
p:=p^.Next;
end;
end;
{........................................}
begin
clrscr;
while true do
begin
clrscr;
writeln('--------------------------------');
writeln(' ',' Glavnoe menu ');
writeln(' ','1 - Dobavlenia izdelia');
writeln(' ','2 - Vivod vseh izdelii');
writeln(' ','8 - Vivod gotovih zakazov');
writeln(' ','3 - Udalenie izdelie');
writeln(' ','4 - Izmenit sostianie gotovnosti');
writeln(' ','5 - Poisk po gruppe');
writeln(' ','6 - Sohranit v fail');
writeln(' ','7 - Zagruzit iz faila');
writeln(' ','9 - Vihod');
writeln(' ','0 - Sortirovka');
writeln('--------------------------------');
iOption:=readkey;
case iOption of
'1':
{dobavlenie elementa}
AddDevice(Head);
'3':
begin
{udalenie}
clrscr;
writeln('Udalenie izdelia...');
write('Vvedite identifikator izdelia: ':27);
read(delId);
DelDevice(Head, delId);
writeln('Nazghmite liubu klavishu dlia prodolghenia');
readkey;
end;
'4':
begin
writeln('Izmenenia sostoyania gotovnosti izdelia na protivopologhnoe.');
writeln('Vvedite identifikator izdelia:');
read(delId);
ChangeReady(Head,delId);
readkey;
end;
'5':
begin
{poisk po gruppe}
clrscr;
writeln('Poisk po tipu(gruppe) izdelia...');
write('Vvedite tip(gruppu) izdelia: ');
readln(group);
clrscr;
ShowList(Head,BYGROUP,group);
readkey;
end;
'2':
begin
{vivod vsego spiska}
clrscr;
p:=Head;
ShowList(Head,ALL,'');
readkey;
end;
'9':
begin
{vihod iz progi}
ClearList(Head);
exit;
end;
'6':
begin
{sohranenie v fail}
writeln;
writeln('Idet sohranenie v fail...':34);
SaveToFile(Head);
writeln('Sohranenie zaversheno.');
readkey;
end;
'7':
begin
{Zagruzka iz faila}
writeln;
writeln('Idet zagruzka dannih iz faila...':34);
LoadFromFile(Head);
writeln('Zagruzka zavershena.');
readkey;
end;
'8':
begin
{vivod gotovih izdelii}
clrscr;
p:=Head;
ShowList(Head,READY,'');
readkey;
end;
'0':
begin
{sortirovka po gruppe}
writeln('Nachinaetsia sortirivka');
clrscr;
writeln('Viberite nughnuiu sortirovku');
writeln('1 - Po identifikatoru');
writeln('2 - Po gruppe');
writeln('3 - Po marke');
iOption=readkey;
case iOption of
'1':
SortByGroup(Head,BYID);
'2':
SortByGroup(Head,BYGROUP);
'3':
SortByGroup(Head,BYMARK);
end;
writeln('Sortirovka zavershena');
readkey;
end;
end;
end;
end.