Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

л.р. № 1 часть 2 вариант 28

.doc
Скачиваний:
6
Добавлен:
01.04.2014
Размер:
93.18 Кб
Скачать

Белорусский государственный университет

информатики и радиоэлектроники

Факультет заочного, вечернего и дистанционного обучения

Специальность - ПОИТ

Янков Максим Игоревич

Зачетная книжка 701023с-28

Электронный адрес Yankoff@open.by

Контрольная работая №1 – ОАИП 2-я часть

Лабораторная работа по 2 части ОАиП (база данных)

Радиоателье.

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

В программе должны присутствовать следующие процедуры:

  1. Формирование динамического списка;

  2. Вывод списка на экран;

  3. Вывод состояния готовности;

  4. Добавление элемента в список;

  5. Удаление элемента из списка;

  6. Поиск элемента списка по соответствующему полю;

  7. Сортировка по алфавиту;

  8. Запись в файл и загрузка из файла.

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

используемые процедуры:

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.