Код програми. uses crt,dos; {used modules}
Program lab4_2; uses crt,dos; {used modules} type rec=record {record with case variant} author, {author of work} title:string[20]; {name of production} genre:string[10]; {genre of work} case tag:integer of 1:(capacity:string[10]); {prose} 2:(poetsize:string[8]); {poetry} 3:(trend:string[10]) {painting} end; {end of record} var opwork:rec; {variable rec type} f:file of rec; {file vaiable} i,j,p, {counters} n:byte; {number of array} ch,srch, {symbol} access:char; {access to file} flag:boolean; {flag} {------------------Input--------------------------} procedure Input; begin clrscr; {clear screen} repeat {do while user wish} repeat {menu access to the file} writeln('Access to file'); writeln('1. Serial'); writeln('2. Direct'); readln(access); {user answer for access} until(access='1')or(access='2'); {possible access is matched} {$I-} {off control intup-output} Reset(f); {open file of records if exist} {$I+} {on control intup-output} if(IOResult=0)then {if file is open} begin if(access='1')then {serial access} begin while not eof(f) do {while not end of file} begin read(f,opwork); {reading record from file} n:=n+1; {counting records in file} end; {end of while} end {end of if} else {direct access} begin seek(f,filesize(f)); {put handle of file in the end of file} n:=filesize(f); {init as number of records in file f} end; {end of else} end {end of if} else Rewrite(f); {create file if it don't exist} with opwork do {Inputing record} begin repeat {do while correct record variant input} write('input type of works: 1-prose,2-poetry,3-painting '); readln(tag); {choose case variant} until(tag=1)or(tag=2)or(tag=3); {possible variant of record} case tag of {variant of record} 1:begin {start of prose} write('author of prose: '); readln(author); write('title of prose: '); readln(title); write('genre of prose: '); readln(genre); write('capacity of prose: '); readln(capacity); end; {end of prose} 2:begin {star of poetry} write('author of poetry: '); readln(author); write('title of poetry: '); readln(title); write('genre of poetry: '); readln(genre); write('poetic size of poetry: '); readln(poetsize); end; {end of poetry} 3:begin {start of paiting} write('author of painting: '); readln(author); write('title of painting: '); readln(title); write('genre of painting: '); readln(genre); write('trend of painting: '); readln(trend); end; {end of paiting} end; {end of case} end; {end of with} write(f,opwork); {writing in file for both accesses} writeln('continue?[y/n]'); {possibility entering one more record} ch:=readkey; {reading user answer to continue} until (ch='n')or(ch='N'); {for against inputing} close(f); {close file f} end; {end of Input} {------------------Search------------------------} procedure search; var s, {string for formating} st:string[20]; {for searching request} begin clrscr; {clear screen} repeat {pole for search} writeln('1. author'); {pole from record} writeln('2. title'); writeln('3. genre'); writeln('4. capacity'); {variant 1 pole of record prose} writeln('5. poetsize'); {variant 2 pole of record poetry} writeln('6. trend'); {variant 3 pole of record painting} write('Your choise '); {user choise for searching} readln(srch); {reading user answer} until (srch>='1') and (srch<='6');{possible pole for searching record in file} write('Searching '); readln(st); {parameter searching} clrscr; {clear screen} Reset(f); {open file} j:=0; {init number of finding records} while not eof(f) do {circle for outputting finding record} begin read(f,opwork); {reding record FROM FILE} if((st=opwork.author)and(srch='1'))or((st=opwork.title)and(srch='2'))or ((st=opwork.genre)and(srch='3'))or((st=opwork.capacity)and(srch='4'))or ((st=opwork.poetsize)and(srch='5'))or((st=opwork.trend)and(srch='6'))then begin {condition for rearch} j:=j+1; {increment number of finding records} if (flag=false)then {flag for title of table} begin writeln(' Author of Title of Genre Capacity Poetsize Trend '); flag:=true; {change flag} end; {end of if} {formating table outputing} with opwork do {access to record pole} case tag of {variant of record} 1: begin {start of prose} write(tag,' ');; s:=author; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); s:=title; while(length(s)<20)do'); insert(' ',s,length(s)+1); write(s); s:=genre; while(leng insert(' ',s,length(s)+1); write(s);; s:=capacity; while(length(s)<10)do; insert(' ',s,length(s)+1); writeln(s);ry: '); end; {end of prose} 2:begin {star of poetry} write(tag,' '); s:=author; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); s:=title; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); s:=genre; while(length(s)<10)do insert(' ',s,length(s)+1); write(s); s:=poetsize; while(length(s)<8)do insert(' ',s,length(s)+1); gotoxy(63,j+1); writeln(s); end; {end of poetry} 3:begin {start of paiting} write(tag,' '); s:=author; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); s:=title; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); s:=genre; while(length(s)<10)do insert(' ',s,length(s)+1); write(s); s:=trend; while(length(s)<8)do insert(' ',s,length(s)+1); gotoxy(72,j+1); writeln(s); end; {end of paiting} end; {end of case} end; {end of with} end; {end of if} if(flag=true) then {last string in table} begin writeln; {end of table} writeln('1 - prose, 2 - poetry, 3 - painting '); end else writeln('No found seaching record'); readln; flag:=false; {exchange flag value} close(f); {close file} end; {end of search} {----------Printing of Current element-------------------------} procedure CurElem(work:rec;m:integer); var st:string; {formating string} begin with work do {access to record variable} case tag of {variant} 1: begin write(tag,' '); st:=author; while(length(st)<20)do insert(' ',st,length(st)+1); write(st); st:=title; while(length(st)<20)do insert(' ',st,length(st)+1); write(st); st:=genre; while(length(st)<10)do insert(' ',st,length(st)+1); write(st); st:=capacity; while(length(st)<10)do insert(' ',st,length(st)+1); writeln(st); end; 2:begin write(tag,' '); st:=author; while(length(st)<20)do insert(' ',st,length(st)+1); write(st); st:=title; while(length(st)<20)do insert(' ',st,length(st)+1); write(st); st:=genre; while(length(st)<10)do insert(' ',st,length(st)+1); write(st); st:=poetsize; while(length(st)<8)do insert(' ',st,length(st)+1); gotoxy(63,m+1); writeln(st); end; 3:begin write(tag,' '); st:=author; while(length(st)<20)do insert(' ',st,length(st)+1); write(st); st:=title; while(length(st)<20)do insert(' ',st,length(st)+1); write(st); st:=genre; while(length(st)<10)do insert(' ',st,length(st)+1); write(st); st:=trend; while(length(st)<8)do insert(' ',st,length(st)+1); gotoxy(p,m+1); writeln(st); end; end; end; {------------------Change------------------------} procedure change; var s, {format string} st:string[20]; {parameter of searching} chan:char; {user answer} numb:integer; {number of change element} fl:boolean; {flag} tmpwork:rec; {temp rec variable} ftmp:file of rec; {tempfile for serial access} begin clrscr; repeat writeln('Access to file'); writeln('1. Serial'); writeln('2. Direct'); readln(access); until(access='1')or(access='2'); clrscr; repeat {pole for changing} writeln('1. author'); writeln('2. title'); writeln('3. genre'); writeln('4. capacity'); writeln('5. poetsize'); writeln('6. trend'); write('Your choise '); readln(srch); until (srch>='1') and (srch<='6'); write('Changing component '); readln(st); {parameter searching} j:=0; i:=0; {initial counters} reset(f); {open file} while not eof(f) do {circle for outputing} begin read(f,opwork); {reading record} with opwork do if((st=author)and(srch='1'))or((st=title)and(srch='2'))or ((st=genre)and(srch='3'))or((st=capacity)and(srch='4'))or ((st=poetsize)and(srch='5'))or((st=trend)and(srch='6'))then begin {condition for search} clrscr; writeln(' Author of Title of Genre Capacity Poetsize Trend '); j:=j+1; {number of change elements} CurElem(opwork,j); {output current element} write('Exchange this record?[y/n]'); readln(chan); if(chan='y')then begin fl:=true; {flag} case tag of 1:begin {start of prose} write('author of prose: '); readln(author); write('title of prose: '); readln(title); write('genre of prose: '); readln(genre); write('capacity of prose: '); readln(capacity); end; {end of prose} 2:begin {star of poetry} write('author of poetry: '); readln(author); write('title of poetry: '); readln(title); write('genre of poetry: '); readln(genre); write('poetic size of poetry: '); readln(poetsize); end; {end of poetry} 3:begin {start of paiting} write('author of painting: '); readln(author); write('title of painting: '); readln(title); write('genre of painting: '); readln(genre); write('trend of painting: '); readln(trend); end; {end of paiting} end; if(access='2')then {end of case} begin seek(f,i); write(f,opwork); end {end of if} else begin tmpwork:=opwork; numb:=j; end; end; end; i:=i+1; end; if(flag=false)then writeln('No found records to change'); if(access='1') then {serial access} begin i:=0; assign(ftmp,'f1.dat'); {file variable -> physical file} rewrite(ftmp); {open files} reset(f); while not eof(f)do begin read(f,opwork); if(i=numb)then {if change element} write(ftmp,tmpwork) {write it in file} else write(ftmp,opwork); i:=i+1; end; close(ftmp); close(f); erase(f); rename(ftmp,'f.dat'); end; readln; if(access='2')then close(f); end; {end of change} {------------------Delitem-----------------------} procedure delitem; var s, {format string} st:string[20]; {parameter of searching} chan:char; {user answer} numb:integer; {number of change element} fl:boolean; {flag} tmpwork:rec; {temp rec variable} ftmp:file of rec; {tempfile for serial access} begin clrscr; repeat writeln('Access to file'); writeln('1. Serial'); writeln('2. Parallel'); readln(access); until(access='1')or(access='2'); clrscr; repeat {pole for changing} writeln('1. author'); writeln('2. title'); writeln('3. genre'); writeln('4. capacity'); writeln('5. poetsize'); writeln('6. trend'); write('Your choise '); readln(srch); until (srch>='1') and (srch<='6'); write('Deleting component '); readln(st); {parameter searching} j:=0; reset(f); {open file} i:=0; while not eof(f) do begin {circle for outputing} read(f,opwork); {reading record} with opwork do if((st=author)and(srch='1'))or((st=title)and(srch='2'))or((st=genre)and(srch='3'))or ((st=capacity)and(srch='4'))or((st=poetsize)and(srch='5'))or((st=trend)and(srch='6'))then begin {condition for deleting} clrscr; fl:=true; writeln(' Author of Title of Genre Capacity Poetsize Trend '); j:=j+1; CurElem(opwork,j); {output current element} write('Delete this record?[y/n]'); readln(chan); if(chan='y')then begin if access='2' then {serial access} begin while not eof(f) do {while not end of file} begin read(f,tmpwork); {read next element} seek(f,filepos(f)-2); {move handle back} write(f,tmpwork); {write iin this position elem} seek(f,filepos(f)+1); {move to next element} end; {end of while} seek(f,filesize(f)-1); {cut file for one record} truncate(f); end else numb:=i;{number of del element} end; {end of if} end; {end of if codition} i:=i+1; end; if(fl=false) then writeln('No found record to delete'); if(access='1')then {serial} begin i:=0; assign(ftmp,'f1.dat'); rewrite(ftmp); reset(f); while not eof(f)do begin read(f,opwork); if(i<>numb)then write(ftmp,opwork); i:=i+1; end; close(ftmp); close(f); erase(f); rename(ftmp,'f.dat'); end; readln; if(access='2')then close(f); end;{end of delitem} {------------------Task1-------------------------} procedure task1; var k,m:integer; s:string; begin clrscr; repeat writeln('Access to file'); writeln('1. Serial'); writeln('2. Parallel'); readln(access); until(access='1')or(access='2'); clrscr; {$I-} Reset(f); {$I+} if(IOResult=0)then begin if(access='1')then begin while not eof(f) do begin read(f,opwork); n:=n+1; end; Reset(f); end else n:=filesize(f); end else Rewrite(f); if(n>0)then begin j:=2; k:=2; m:=2; writeln('Prose Poetry Painting'); while not eof(f) do begin read(f,opwork); with opwork do case tag of 1:begin gotoxy(1,j); s:=author; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); j:=j+1; end; 2:begin gotoxy(21,k); s:=author; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); k:=k+1; end; 3:begin gotoxy(41,m); s:=author; while(length(s)<20)do insert(' ',s,length(s)+1); write(s); m:=m+1; end; end;{end of case} end;{end of while} end;{end of if} readln; close(f); end; {end of task1} {------------------Task2-------------------------} procedure task2; var s,st:string; j:integer; begin clrscr; write('Painter''s name who draws naturmort '); readln(st); j:=1; clrscr; Reset(f); writeln(' Author of Title of Genre Trend '); while not eof(f) do {circle fo outputing} begin read(f,opwork); with opwork do begin if(st=author)and(genre='naturmort')then begin p:=54; CurElem(opwork,j); p:=72; j:=j+1; end; end; end; writeln; writeln('Number of works by ',st,' in naturmort genre is ',j-1); readln; close(f); end; {end of task2} {------------------Task3-------------------------} procedure task3; var fl:boolean; ftmp:file of rec; chan:char; tmpwork:rec; numb:integer; begin clrscr; repeat writeln('Access to file'); writeln('1. Serial'); writeln('2. Parallel'); readln(access); until(access='1')or(access='2'); clrscr; clrscr; Reset(f); j:=1; i:=1; writeln(' Author of Title of Genre Capacity Poetsize '); while not eof(f) do {circle fo outputing} begin read(f,opwork); with opwork do begin if(genre='roman')then begin CurElem(opwork,j); j:=j+1; write('Delete this record?[y/n]'); readln(chan); if(chan='y')then begin if access='2' then begin while not eof(f) do begin read(f,tmpwork); seek(f,filepos(f)-2); write(f,tmpwork); seek(f,filepos(f)+1); end; {end of while} seek(f,filesize(f)-1); truncate(f); end else numb:=i; end; {end of if} end; {end of if codition} i:=i+1; end; end; writeln(j-1,' records were deleted'); if(fl=false) then writeln('No found record to delete'); if(access='1')then begin i:=0; assign(ftmp,'f1.dat'); rewrite(ftmp); reset(f); while not eof(f)do begin read(f,opwork); if(i<>numb)then write(ftmp,opwork); i:=i+1; end; close(ftmp); close(f); erase(f); rename(ftmp,'f.dat'); end; readln; if(access='2')then close(f); end; {end of task3} {------------------Output------------------------} procedure Output; var st:string[20]; begin {$I-} Reset(f); {$I+} if not(IOResult=0)then Rewrite(f); clrscr; i:=0; writeln(' Author of Title of Genre Capacity Poetsize Trend '); while not eof(f) do begin read(f,opwork); CurElem(opwork,i+1); i:=i+1; end; writeln; {end ofcase} writeln('1 - prose, 2 - poetry, 3 - painting '); readln; close(f); end; {end of outputing} {-------------------Menu-------------------------} procedure menu; begin repeat {do while not exit} clrscr; {clear screen} gotoxy(21,3); writeln('MENU'); {Main menu of program} gotoxy(15,5); writeln('1. Append item'); {Input new record and add it in file} gotoxy(15,7); writeln('2. Change item'); {Change record from file} gotoxy(15,9); writeln('3. Delete item'); {Delete record in file} gotoxy(15,11); writeln('4. Search item'); {Seacrching item} gotoxy(15,13); writeln('5. Output item'); {View all records} gotoxy(15,15); writeln('6. Output genre'); {Output authors in gerne} gotoxy(15,17); writeln('7. Number of naturmort''s works by author');{Output number of works} gotoxy(15,19); writeln('8. Delete works in genre ''roman''');{Deleting roman from file} gotoxy(15,21); writeln('9. Exit'); {Exit program} ch:=readkey; {reading user answer} case ch of {case of answer} '1': input; {inputing} '2': change; {exchange record} '3': delitem; {deleting record} '4': search; {searching} '5': Output; {outputing} '6': task1; {view genre by authors} '7': task2; {count naturmort works} '8': task3; {deleting romans} '9':exit; {exit of program} end; {end of case} until ch='9'; {exit pressed} end; {end of menu} {---------Main program----------} begin clrscr; {clear screen} flag:=false; {initialization flag} n:=0; {init number of records} p:=72; {init place for table column} assign(f,'f.dat'); {file variable -> physical file} menu; {main menu} readln; end. {end of program}
8. ScreenShot’s
9. Аналіз роботи Ми бачимо виконання кожного з пунктів меню на ScreenShot’ах. 1. Меню має 9 пунктів. Користувач має вибрати один з цих варіантів. Здійснено перевірку на введення коректних пунктів меню. 2. Користувач вибрав перший пункт меню Додати запис. Відкрилось підменю доступу до файлу(послідовний або прямий) та вибору виду запису(першого - прози, другого - поезії, третього - живопису). Зациклення програми на введення можливого доступу до файлу та виду запису. Введення першого виду запису, після чого питання на продовження введення нового запису з подальшим вибором виду запису. 3. Користувач вибрав другий пункт меню Редагування запису. Вводиться параметр пошуку та ключ пошуку(запит). Якщо запис знайдений, то користувачу пропонується редагувати поточний знайдений запис. 4. Користувач вибрав третій пункт меню Видалення запису. Якщо запис знайдений, то користувачу пропонується видалити поточний знайдений запис. 5. Користувач вибрав четвертий пункт меню Пошук запису. Виводяться всі знайдені записи. 6. Користувач вибрав п’ятий пункт меню Виведення записів. Виведення здійснюється у табличному вигляді. 7. Користувач вибрав шостий пункт меню Виведення жанрів. Здійснюється виведення авторів за видом запису. 8. Користувач вибрав сьомий пункт меню Кількість робіт автора у жанрі натюрморт. Введення автора, кількість робіт якого бажає лічити користувач. За цим параметром відбувається пошук робіт автора та лічення натюрмортів. 9. Користувач вибрав восьмий пункт меню Видалення романів. Відбувається пошук романів та видалення всіх цих робіт. 10. Дев’ятий пункт меню – вихід з програми, після чого завершується її виконання. У кожному пункті меню користувач має на вибір доступ до файлу, де це має значення.
|