MFF UK / Ústav teoretické fyziky / Tomáš Ledvinka
Přednášky
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
  Úvod
  Programy a algoritmy
  Píšeme program
  Píšeme program II
  Procedury a funkce
  Malujeme funkce
  Chyby. Typy I.
  Typy II. Pole a Záznamy
  Pole II.Řetězce.Soubory.
  Gnuplot.Interpolace...
  Matice. Velké O...
  Fronta,Zásobník. Postscript
  Bin. soubory, ...
    Neúplné vyh. log. výrazů
    Parametr typu funkce
    Otypované soubory
    Binární soubory
    Dyn. datové struktury
  Ukazatele,Objekty, ...
Počítačová algebra
Klasická elektrodynamika (2.r)
Vybrané partie OTR

Cvičení
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
Teoretická mechanika (2.r)
Klasická elektrodynamika (2.r)


Věda
. . . . . . . . . . . . . . . . . . . . . . . . . .
Diskové zdroje v OTR
Hyperbolické systémy v OTR


Kontakt
. . . . . . . . . . . . . . . . . . . . . . . . . .
Email
Konzultační hodiny


Ostatní
. . . . . . . . . . . . . . . . . . . . . . . . .
Mallorca
Ze společnosti

Ještě k vyhodnocování výrazů

Když napíšeme a+b*c je zřejmé, kolik má být výsledek. Pokud ale a, b nebo c jsou funkce, může být kromě výsledku důležité i pořadí, v němž se funkce volají. Pokud potřebujeme zaručit dodržení nějakého konkrétního pořadí, je nejjednodušší nějdříve provést sérii přiřazovacích příkazů a pak teprve spočíst výraz:

a1 := a;
b1 := b;
c1 := c;

X := a1+b1*c1;

Shrnutí: pozor na postranní efekty funkcí volaných ve výrazech.

Neúplné vyhodnocování logických výrazů

U logických výrazů nastává zajímavý jev: počítáme-li hodnotu logického výrazu, řekněme

(a > 0) and (b-a > n)

tak pro a<=0 rovnou víme, že výsledek je FALSE ať už je hodnota b jakákoli. Neúplné vyhodnocování logických výrazů je metoda překladu logických výrazů, kdy jakmile je jasný výsledek logického výrazu při jeho vyhodnocování zleva doprava, vyhodnocování se ukončí. To má několik použití:

if (a<>0) and (b/a-c>0) then ...

takto předřazením testu na dělení nulou zabráníme vlastnímu dělení, protože a=0 znamená, že výsledek je FALSE ať už je b a c jakékoli.

if JeToZena(C) or MaVPoradkuOhryzek(C) then

může v programu pro zdravodtní pojištovny kontrolovat ...., aniž se dopustíme nedovoleného dotazu na zdravotní stav neexistující části pacientek, obzváště je-li příslušná informace uložena např. ve variantním záznamu a tak není vůbec definována.

Pozn.: Pokud se najde opravdu dobrý důvod, lze si úplné vyhodnocování vynutit zapnutím {$BOOLEVAL ON}.

Skoky

Strukturované programování mělo za cíl učinit příkaz skoku až na výjimky zbytečným. Tento svůj cíl splnilo, protože jsme jej doposud na přednášce nepotřebovali. Přesto existují situace, kdy je jejich použití na místě. K dipozici máme následující příkazy skoku:

break   ukončí průběh cyklů for, repeat a while
continue   vrací na začátek dalšího cyklu
exit   ukončí běh procedury nebo funkce
halt   ukončí běh programu
goto   skočí na určené návěští (pouze v daném bloku)

 

Příklady:

program pLabel;
label L;
begin
 L: goto L;
end.

Dále

for i :=Low(data)+1 to High(data) do if data[i-1]>data[i] then writeln('NESETRIDENO !');

z příkladu na třídění bychom spíš měli nahradit

for i :=Low(data)+1 to High(data) do if data[i-1]>data[i] then begin writeln('NESETRIDENO !'); break; end;

aby se varování vypsalo jej jednou. Podobně procedura pro nalezení položky v seznamu může využít exit.

program Test;

function JeVSeznamu(const S:array of integer; n : integer) : boolean;
var   i: integer;
begin
  JeVSeznamu := true;
  for i := low(S) to High(S) do
    if S[i] = n then exit;

  JeVSeznamu := false;
end;

begin
 Writeln( JeVSeznamu([12,5,44,69,2,5,3,44,58,56,4],3) );
 Readln;
end.

Ladění

Základním postupem při ladění je vložení ladících výpisů do programu. Program tak vypisuje, co zrovna dělá (kde je) a jaké hodnoty mají klíčové proměnné. Do místa, kde se výpisy rozcházejí s očekáváním vložíme další podrobnější výpisy, až lokalizujeme zdroj problému.

Moderní vývojové prostředky umožňují sledovat činnost programu krok za krokem. Přesněji můžeme pozastavit běh programu
- na dalším řádku se vstupem do procedur (F7)
- na dalším řádku bez vstupu do procedur (F8)
- na určeném řádku (breakpoint trvalý F5 a dočasný F4)
- po návratu z procedury (Shif-F8)

Při pozastavení programu můžeme kontrolovat hodnotu výrazů a to buď jednorázově (Ctrl-F7) nebo je můžeme zařadit do seznmu sledovaných výrazů (Ctrl-F5), hodnotu proměnných můžeme dokoce měnit a třeba zkusit, zda tak napravíme co nějaká chyba poškodila....

Ilustrace: hledáme nějakou chybu

Pozor: Když to nechodí zkusíme nejdříve zapnout {$R+,Q+} a přidat uses sysutils.

.