Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný.

Podobné prezentace


Prezentace na téma: "10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný."— Transkript prezentace:

1 10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný identifikátor, odkazujeme se na ní pomocí speciálního typu - typu ukazatel. Hodnotou proměnné typu ukazatel je adresa umístění dynamické proměnné v paměti. Každý typ ukazatel je vázán na jeden typ dynamické proměnné. type spoj=^objekt; {spoj je ukazatel na proměnnou typu objekt} objekt=record hodnota:integer; dalsi:spoj; end; var p:spoj;

2 Objekt je typ definovaný pro vytvoření dynamické proměnné, která je typu záznamem. P - je ukazatel na dynamickou proměnnou typu objekt. Procedura new vytváří dynamickou proměnnou v oblasti operační paměti nazývané hromada - heap. Příkaz new(p) vytvoří dynamickou proměnnou typu object a ukazatel na ní uloží do proměnné p. Speciální hodnotou typu ukazatel je hodnota nil, která říká, že ukazatel nikam neukazuje. Po vytvoření má dynamická proměnná nedefinovanou hodnotu. Příklad práce s dynamickou proměnnou:· new(p); p^.hodn:=4; p^.dalsi:=nil

3 Možné přiřazení: p:=q... proměnné typu ukazatel může být přiřazena hodnota jiné proměnné typu ukazatel, obě budou ukazovat na stejnou dynamickou proměnnou, p^:=q^... hodnota dynamické proměnné, na kterou ukazuje proměnná q se překopíruje do dynamické proměnné, na kterou ukazuje proměnná p.

4 Proměnné téhož typu ukazatel mohou být použity jako operandy relačních operátorů =,<>; p=q je true, když obě proměnné ukazují na tutéž proměnnou. Operandem v těchto relacích může být také hodnota nil. Zrušení dynamické proměnné se provede příkazem dispose(p). Tímto příkazem se pouze uvolní část paměti zabraná dynamickou proměnnou, obsah proměnné p se nemění. Uvolněnou oblast paměti pak může použít jiná dynamická proměnná. Nevhodným vytvářením a rušením dynamických proměnných mohou v hromadě vzninout díry, což vede k neefektivnímu využití paměti. Př.: Příklad použití dynamické proměnné typu pole pevné velikosti.

5 program DynamickePole; type TPole=array[1..100] of real; TPole=array[1..100] of real;var i,j,n:integer; i,j,n:integer; a:^TPole; a:^TPole; p:real; p:real; f:text; f:text;begin writeln('Ukazka pouziti dynamicke promenne'); writeln('Ukazka pouziti dynamicke promenne'); writeln('*********************************'); writeln('*********************************'); writeln; writeln; assign(f,'data.txt');reset(f); assign(f,'data.txt');reset(f); new(a); new(a); read(f,n); read(f,n); writeln('Zadana posloupnost:'); writeln; writeln('Zadana posloupnost:'); writeln; for i:=1 to n do begin for i:=1 to n do begin read(f,a^[i]); read(f,a^[i]); write(a^[i]:8:2); write(a^[i]:8:2); end; end; writeln; writeln; writeln; writeln;

6 for i:=1 to n-1 do for i:=1 to n-1 do for j:=i+1 to n do for j:=i+1 to n do if a^[j]>a^[i] then begin if a^[j]>a^[i] then begin p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; end; end; writeln('Setridena posloupnost:'); writeln; writeln('Setridena posloupnost:'); writeln; for i:=1 to n do for i:=1 to n do write(a^[i]:8:2); write(a^[i]:8:2); dispose(a); dispose(a); writeln; writeln; writeln; writeln; writeln('Konec - ENTER!'); writeln('Konec - ENTER!'); readln; readln;end.Př.: Příklad použití dynamické proměnné typu pole proměnné velikosti.

7 program DynamickePole2; type TPole=array[1..100] of real; TPole=array[1..100] of real;var i,j,n:integer; i,j,n:integer; a:^TPole; a:^TPole; p:real; p:real; f:text; f:text;begin writeln('Ukazka pouziti dynamicke promenne'); writeln('Ukazka pouziti dynamicke promenne'); writeln('*********************************'); writeln('*********************************'); writeln; writeln; assign(f,'data.txt');reset(f); assign(f,'data.txt');reset(f); read(f,n); read(f,n); GetMem(a,n*sizeof(real)); {n < 100 !!!!} GetMem(a,n*sizeof(real)); {n < 100 !!!!} writeln('Zadana posloupnost:'); writeln; writeln('Zadana posloupnost:'); writeln; for i:=1 to n do begin for i:=1 to n do begin read(f,a^[i]); read(f,a^[i]); write(a^[i]:8:2); write(a^[i]:8:2); end; end; writeln; writeln; writeln; writeln;

8 for i:=1 to n-1 do for j:=i+1 to n do for j:=i+1 to n do if a^[j]>a^[i] then begin if a^[j]>a^[i] then begin p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; p:=a^[i]; a^[i]:=a^[j]; a^[j]:=p; end; end; writeln('Setridena posloupnost:'); writeln; writeln('Setridena posloupnost:'); writeln; for i:=1 to n do for i:=1 to n do write(a^[i]:8:2); write(a^[i]:8:2); FreeMem(a); FreeMem(a); writeln; writeln; writeln; writeln; writeln('Konec - ENTER!'); writeln('Konec - ENTER!'); readln; readln;end.


Stáhnout ppt "10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný."

Podobné prezentace


Reklamy Google