Kurs FORTRANU | ||
---|---|---|
Předcházející | Další |
Příkazy se ve Fortranu provádějí postupně od začátku zdrojového textu do konce, není-li řečeno jinak.
Rozvětvení řídícího toku programu lze realizovat třemi typy podmínek:
if( podmínka ) příkaz 1
if( podmínka ) then příkaz 1 příkaz 2 endif
if( podmínka ) then příkaz 1 else příkaz 2 endif
Tyto zápisy říkají počítači, že má vyhodnotit podmínku a je-li splněna pokračovat prvním příkazem. V opačném případě buď pokračuje druhým příkazem nebo neudělá nic.
Opakované provádění příkazů zajišťují cykly.
do příkaz endo
do i = 1,n,krok příkaz enddo
do while( podmínka ) příkaz enddo
První cyklus je nekonečný cyklus, opakuje se donekonečna pokud není přerušen například příkazem exit. který vyskočí z cyklu. Tato konstrukce umožňuje psát cykly s podmínkou na začatku, na konci i kdekoli jinde.
V dalších dvou případech cykly fungují tak, že říkají počítači aby vyhodnotit podmínku a je-li splněna vstoupit do cyklu, vykonat v něm příkazy, opět testovat podmínku, pokud je splněna vykonat příkazy, atd. While cykus má za podmínku logický výraz, prostřední aritmetický cyklus testuje hodnotu řídící proměnné kterou po každém vyhodnocení těla cyklu zvětší o hodnotu krok.
Normálně končí program v okamžiku, když už nemá na vykonání žádné příkazy. Jiná možnost bezpodmínečného ikončení programu je příkaz stop 'text' ktery ukončí program a na standardní výstup vypíše 'text'.
Příkaz skoku přenese další provádění programu na zvolený řádek. Příkaz goto 666 skočí na řádek označený návestím 666. Obyčejně je na řádku prázdný příkaz continue který nedělá nic. Dvojice těchto příkazů má především význam při ukončování komplikovaných vnořených cyklů s podmínkami a dále pak při ošetření havarie.
Dvě nejpoužívanější jednoduché metody řešení rovnic jsou robustní ale pomalé půlenní intervalu a rychlá ale méně stabilní Newtonova metoda. Na těchto jednoduchých metodách budeme demonstrovat základní použití podmínek a cyklů.
Tahle metoda hledá řešení rovnice v předem zadaném intervalu na jednom jejímž okraji je funkce kladná na na druhém záporná. Program pak dělí zadanný interval na polovinu tak dlouho, dokud není jeho délka menší než předem zadaná hodnota. Jediným problémem je rozhodnout, ve kterém ze dvou vytvořených intervalů je skutečný kořen rovnice. Ten je ovšem opět v takovém intervalu, kde mají hodnoty opačná znaménka a tedy jejich součin je záporný.
program pulky ! program resi rovnici cos(x) = 0 metodou puleni intervalu integer :: i,maxn real :: a,b,x,fa,fb,fx,tol ! zadani intervalu a = 1 b = 2 ! maximalni pocet opakovani maxn = 100 ! hledana presnost vypoctu tol = 1e-2 ! vypocet funkce na krajich intervalu fa = cos(a) fb = cos(b) i = 1 do ! vypocet pulky intervalu a hodnoty v nem x = (a + b)/2.0 fx = cos(x) ! vypis aktualniho korene write(*,*) "iterace = ",i," hodnota funkce = ",fx," odhad korene = ",x ! testy ukonceni if( fx == 0.0 ) exit if( abs(b - a)/2.0 < tol ) exit if( i >= maxn ) exit i = i + 1 ! urceni intervalu ve kterem je koren if( fx*fb < 0 ) then ! v intervalu x..b je koren a = x fa = fx else ! v intervalu a..x neni koren b = x fb = fx endif enddo ! vypis vysledku write(*,*) "pocet iteraci = ",i write(*,*) "hledany koren = ",x write(*,*) "hodnota funkce = ",fx end
Tato metoda vychazí z myšlenky obráceneho Taylorova rozvoje funkce:
program Newton ! program resi rovnici cos(x) = 0 newtonovou metodou integer :: i,maxn real :: x,fx,f1,tol ! zadani pocatecniho odhadu minima, napr. z pulek x = 1.5 ! maximalni pocet opakovani maxn = 100 ! hledana presnost vypoctu tol = 1e-5 ! vypocet funkce f = cos(x) do i = 1, maxn ! vypocet derivace f1 = -sin(x) ! vypocet noveho odhadu korene if( f1 /= 0.0 ) then x = x - f/f1 else stop 'Nulova derivace' endif ! vypis aktualniho korene write(*,*) "iterace = ",i," funkce = ",fx," derivace = ", f1, & " odhad korene = ",x, ! testy na ukonceni if( abs(x) < tol ) exit enddo ! vypis vysledku write(*,*) "pocet iteraci = ",i write(*,*) "hledany koren = ",x write(*,*) "hodnota funkce = ",fx end
Tento poslední program obsahuje jednu nebo více chyb.
Předcházející | Domů | Další |
Jednoduchý program | Programové jednotky |