Переделать программу, чтобы использовались динамические массивы - Turbo Pascal
Формулировка задачи:
Есть программа, в которой данные хранятся, в виде записи. Нужно переделать, чтобы использовались динамические массивы.
Без понятий, как это делается. Что нужно поменять?
uses crt; type info=record band:string; album:string; year:integer; genre:string; cdtype:string; number:integer; cost:integer; end; massiv=array[1..10] of info; menu=array[1..6] of string; {### GRAPHIC PROCEDURES ###} procedure w_error(error:string); begin textbackground(4); textcolor(0); writeln(error); textbackground(0); textcolor(15); end; {end procedure w_error} procedure readboolean(var b:boolean; s:string); var c:char; begin writeln(s,' (Y,y,N,n)'); repeat c:=readkey; until c in['Y','y','N','n']; b:=c in ['Y','y']; if b then writeln('yes') else writeln('no'); end; {end procedure readboolean} procedure select(var a:menu;i,j,x,y:integer;s:string); var q:integer; begin textbackground(black); textcolor(white); clrscr; gotoxy(x,y-1); write(s); for q:=1 to j do begin if q=i then textbackground(green) else textbackground(black); gotoxy(x,y-1+q); write(a[q]); end; gotoxy(80,25); end; procedure select2(var c:char;var choise:integer;n:integer); begin if c=#0 then begin c:=readkey; case c of #80: if choise<n then choise:=choise+1; #72: if choise>1 then choise:=choise-1; end; end; end; {### FILE PROCEDURES ###} procedure inforecord(var q:massiv; var nn:integer); var buff:string; z,d:integer; begin repeat write('Band: '); readln(buff); if length(buff)>30 then w_error('Max simbols: 30') else q[nn].band:=buff; until (length(buff)<30); repeat write('Album: '); readln(buff); if length(buff)>30 then w_error('Max simbols: 30') else q[nn].album:=buff; until (length(buff)<30); repeat write('Year: '); readln(buff); val(buff,z,d); if(d<>0) then w_error('Year must be number') else if (z<1900) or (z>2013) then w_error('Year must be in [1900;2013]') else q[nn].year:=z; until (d=0) and ( (z>=1900) and (z<=2013) ); repeat write('Genre: '); readln(buff); if length(buff)>30 then w_error('Max simbols: 30') else q[nn].genre:=buff; until (length(buff)<30); repeat write('Type of CD: '); readln(buff); if length(buff)>30 then w_error('Max simbols: 30') else q[nn].cdtype:=buff; until (length(buff)<30); repeat write('Number: '); readln(buff); val(buff,z,d); if(d<>0) then w_error('Number must have number format') else if (z<0) or (z>10000) then w_error('Cost must be in [0;10000]') else q[nn].number:=z; until (d=0) and ( (z>=0) and (z<=10000) ); repeat write('Cost: '); readln(buff); val(buff,z,d); if(d<>0) then w_error('Cost must be number') else if (z<0) or (z>5000) then w_error('Cost must be in [0;5000]') else q[nn].cost:=z; until (d=0) and ( (z>=0) and (z<=5000) ); end; {end procedure inforecord} procedure vvod(var q:massiv; var nn:integer); var add:boolean; begin nn:=1; textcolor(15); add:=true; repeat begin inforecord(q,nn); readboolean(add,'Add another disc?'); if add then nn:=nn+1; end; until (add=false); end; {end procedure vvod} procedure vivod(var q:massiv; nn:integer); var i:integer; begin textcolor(3); gotoxy(1,1); write('ь'); gotoxy(3,1); write('Band'); gotoxy(20,1); write('Album'); gotoxy(37,1); write('Year'); gotoxy(42,1); write('Genre'); gotoxy(55,1); write('CD Type'); gotoxy(65,1); write('Number'); gotoxy(76,1); writeln('Cost'); writeln('--------------------------------------------------------------------------------'); for i:=1 to nn do begin gotoxy(1,i+2); write(i); gotoxy(3,i+2); write(q[i].band); gotoxy(20,i+2); write(q[i].album); gotoxy(37,i+2); write(q[i].year); gotoxy(42,i+2); write(q[i].genre); gotoxy(55,i+2); write(q[i].cdtype); gotoxy(65,i+2); write(q[i].number); gotoxy(76,i+2); writeln(q[i].cost); end; textcolor(15); end; {end procedure vivod} procedure writetofile(var q:massiv; nn:integer;from:string); var f:file of info; n,i:integer; error:word; begin clrscr; gotoxy(1,1); textcolor(4); if (from='menu') then begin vvod(q,n); nn:=n; end; {$I-} assign(f,'base.dat'); rewrite(f); {$I+} error:=ioresult; if error<>0 then begin w_error('Error of creating file. ь');write(error); exit; end; for i:=1 to nn do {$I-} write(f,q[i]); {$I+} error:=ioresult; if error<>0 then begin w_error('Error of writing file. ь');write(error); exit; end; {$I-} close(f); {$I+} error:=ioresult; if error<>0 then begin w_error('Error of closing file. ь');write(error); exit; end; textcolor(15); end; {end procedure writetofile} procedure readfromfile(var q:massiv; var nn:integer;from:string); var f:file of info; i:integer; error:word; begin clrscr; gotoxy(1,1); textcolor(4); {$I-} assign(f,'base.dat'); reset(f); {$I+} error:=ioresult; if error<>0 then begin w_error('File base.dat does not exist. ь');write(error); exit; end; i:=0; while (not eof(f)) do begin inc(i); {$I-} read(f,q[i]); {$I+} error:=ioresult; end; if not eof(f) then w_error('More then 10 elements in file'); if error<>0 then begin w_error('Error of reading file. ь');write(error); exit; end; nn:=i; {$I-} close(f); {$I+} error:=ioresult; if error<>0 then begin w_error('Error of closing file. ь');write(error); exit; end; textcolor(15); if (from='menu') then begin vivod(q,nn); readkey; end; end; {end procedure readfromfile} procedure addrecord(var q:massiv; var nn:integer); var id:integer; begin clrscr; gotoxy(1,1); readfromfile(q,nn,'add'); nn:=nn+1; inforecord(q,nn); writetofile(q,nn,'add'); end; {end procedure addrecord} procedure changerecord(var q:massiv; var nn:integer); var id:integer; begin clrscr; gotoxy(1,1); write('Record ID: '); readln(id); inforecord(q,id); writetofile(q,nn,'change'); end; {end procedure changerecord} procedure deleterecord(var q:massiv; var nn:integer); var i,id:integer; begin clrscr; gotoxy(1,1); write('Record ID: '); readln(id); for i:=id to nn-1 do begin q[id].band:=q[id+1].band; q[id].album:=q[id+1].album; q[id].year:=q[id+1].year; q[id].genre:=q[id+1].genre; q[id].cdtype:=q[id+1].cdtype; q[id].number:=q[id+1].number; q[id].cost:=q[id+1].cost; end; nn:=nn-1; {ignore last doubled record} writetofile(q,nn,'delete'); end; {end procedure deleterecord} var cd:massiv; a:menu; c:char; n,i,d:integer; kl:integer; vr2:string; choise:integer; begin clrscr; textcolor(15); a[1]:='1. Read base'; a[2]:='2. Rewrite all base'; a[3]:='3. Add record'; a[4]:='4. Change record'; a[5]:='5. Delete record'; a[6]:='6. Exit'; choise:=1; select(a,choise,6,1,2,'==Music CD Shop=='); repeat c:=readkey; select2(c,choise,6); if c=#13 then case choise of 1:readfromfile(cd,n,'menu'); 2:writetofile(cd,n,'menu'); 3:addrecord(cd,n); 4:changerecord(cd,n); 5:deleterecord(cd,n); 6:exit; end; select(a,choise,6,1,2,'==Music CD Shop=='); until (c=#13) and (choise=6); end.
Решение задачи: «Переделать программу, чтобы использовались динамические массивы»
textual
Листинг программы
Var cd:^massiv; ////// New(cd);//выделяем место под массив //потом уже обращаешься к данным массива по следующей схеме Cd^[1].band:='asd';//что то делаешь там...обращаться теперь к данным нужно с добавлением[B] ^[/B] После того как всё что нужно сделал Dispose(cd);//освобождаем место занятое массивом
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д