Upload
others
View
22
Download
0
Embed Size (px)
Citation preview
Kontrola toka izvršavanja programa« Numericke metode »
Ivo Batistic
Fizicki odsjek, PMFSveucilište u Zagrebu
predavanja 2005/2006
Pregled predavanja
Grananje programa - IF naredba
Grananje programa - CASE naredba
DO petlje
Bezuvjetni GO TO
Grananje programa
◮ Tijekom izvršavanja programa mogu se pojaviti razlicite situacijekoje je potrebno na razlicite nacine rješavati.
◮ To se postiže s naredbama za grananje programa.
Npr. citaju se realni brojevi s tipkovnice (standardni unos), te seispisuje kvadratni korijen.
Medutim, ako je upisan negativni broj treba ispisati da je rezultatimaginaran. Je li upisan pozitivni ili negativni broj, to se ne možeunaprijed znati, nego tek u trenutku izvršavanja programa.
Logicki IF
U fortranskom programu postoji veci broj razlicitih vrsta IF naredbi.Logicki IF je naredba od samo jedne linije.
IF (a < 0.0) PRINT *,’Imaginarni broj’
◮ Iza rijeci IF slijedi logicki izraz zatvoren u okrugle zagrade.
◮ Vrijednost logickog izraza je tocno ili pogrešno.
◮ Iza logickog izraza slijedi naredba koja se izvršava samo ako jelogicki izraz tocan.
◮ IF nema direktni utjecaj na izvršavanje naredbi koje slijede izanjega.
Primjer
PROGRAM kvadratni_korijen
REAL :: a
PRINT *,’Upiši neki realni broj’READ (*,*) a
IF (a < 0.0) PRINT *,’Glupane to je negativni broj’IF (a >= 0.0) PRINT *,’Kvadratni korijen je = ’,SQRT(a)
END PROGRAM
IF - THEN - END IF
Umjesto logickog IFa, moguce se koristiti IF u kombinaciji s THEN iEND IF
IF (a < 0.0) THENPRINT *,’Imaginarni broj’
END IF
◮ IF (logicki izraz) THEN zapocinje blok (skupinu) naredbi koja cese izvršavati samo ako je logicki izraz tocan, a END IF (ili ENDIF)je oznaka kraja bloka naredbi.
◮ Unutar bloka moguce imati ili jednu ili više naredbi.
◮ U blok naredbi IF - THEN - END IF moguce je ugnjezditi jedan iliviše drugih IF - THEN - END IF blokova ili logickih IF-ova.
Primjer
POGRAM kvadratni_korijen
REAL :: aPRINT *,’Upiši neki realni broj’READ (*,*) a
IF (a < 0.0) THENPRINT *,’Glupane to je negativni broj’
END IFIF (a >= 0.0) THEN
IF (INT(SQRT(a))**2 == a) THENPRINT *,’Upisani broj je kvadrat cijelog broja = ’,INT(SQRT (a))
END IFIF (INT(SQRT(a))**2 /= a) THEN
PRINT *,’Kvadratni korijen je = ’,SQRT(a)END IF
END IFEND PROGRAM
IF - THEN - ELSE - END IF
Postoji složenija forma IF naredbe koja koja se sastoji od dva bloka.Prvi blok naredbi se izvršava ako je logicki izraz tocan, a drugi ako jelogicki izraz pogrešan.
◮ Prvi blok pocinje s IF ( logi cki izraz ) THEN, a završava slinijom ELSE.
◮ Linija ELSE je ujedno pocetak drugog bloka naredbi koje seizvršavaju kada je logicki izraz pogrešan. Ovaj blok završava sEND IF, što je ujedno i kraj IF naredbe.
IF (a >= 0.0) THENPRINT *,’Kvadratni korijen je = ’,SQRT(a)
ELSEPRINT *,’Glupane to je negativni broj’
END IF
IF - THEN - ELSE - END IF
Svaki blok naredbi (IF-dio i ELSE-dio) mogu sadržavati druge složenije ijednostavnije verzije IF-naredbe.
POGRAM kvadratni_korijenREAL :: aPRINT *,’Upiši neki realni broj’READ (*,*) aIF (a .GE. 0.0) THEN
IF (INT(SQRT(a))**2 .EQ. a) THENPRINT *,’Upisani broj je kvadrat cijelog broja = ’,INT(SQRT (a))
ELSEPRINT *,’Kvadratni korijen je = ’,SQRT(a)
END IFELSE
PRINT *,’Glupane to je negativni broj’END IFEND PROGRAM
IF - THEN - ELSE IF - THEN - . . . - ELSE - END IF
Postoji i vrlo složena forma IF naredbe koja može provjeravati višerazlicitih logickih izraza, te izvršavati blok (skupinu) fortranskih naredbiako je samo jedan od njih tocan, te opcionalno ELSE grupu naredbiako niti jedan od logickih izraza nije tocan.
IF (a < 0.0) THENPRINT *,’Glupane to je negativni broj’
ELSE IF ((a > 0.0) .AND. (a < 100.0)) THENPRINT *,’Kvadratni korijen broja ’,a,’ je ’,SQRT(a)
ELSEPRINT *,’Ne znam vaditi korjene brojeva vecih od 100’
END IF
Primjer
PROGRAM kalodontCHARACTER (LEN=100) :: rijecCHARACTER :: slovoPRINT *,’Upisi zemlju’; READ (*,*) rijecslovo = rijec(LEN_TRIM(rijec):LEN_TRIM(rijec))IF (slovo == ’a’) THEN
PRINT *,’Albanija’ELSE IF (slovo == ’b’) THEN
PRINT *,’Bugarska’ELSE IF (slovo == ’c’) THEN
PRINT *,’Cipar’ELSE IF (slovo == ’d’) THEN
PRINT *,’Danska’...ELSE
PRINT *,’Ne postoji takva zamlja’END IFEND PROGRAM
CASE naredba
CASE naredba je vrlo slicna najsloženijem obliku IF naredbe, s tim da nijenužno da se izracunavaju logicki izrazi, vec to može biti bilo koji izraz.
SELECT CASE (broj)CASE (1,2,3,5,7,11,13,17,19,23,29,31,37)
PRINT *,’Prosti broj’CASE (1,4,9,16,25,36)
PRINT *,’Kvadrat cijelog broja’CASE (40:)
PRINT *,’Preveliki broj’CASE (:0)
PRINT *,’Negativni broj’CASE DEFAULT
PRINT *,’Koga briga za taj bezvezni broj’END SELECT
CASE naredba
◮ U pojedinim slucejevima može se navesti lista vrijednostiodvojena zarezom.
◮ Moguce je navesti podrucje vrijednosti pomocu dvotocke. Ispreddvotocke stoji pocetna vrijednost, a iza dvotocke stoji konacnavrijednost intervala. Granice su ukljucene.
◮ Za navodenje polubeskonacnog intervala može se donja ili gornjagranica ispustiti.
◮ Vrsta vrijednosti (konstanti) mora odgovarati vrsti izraza koji senavodi u pocetnoj SELECTliniji CASE naredbe.
◮ Izvršava se jedna ili više naredbi koje se nalaze u bloku koji slijediiza CASEiskaza ovisno o vrijednosti izraza.
Primjer
PROGRAM kalodontCHARACTER (LEN=100) :: rijecINTEGER :: i
PRINT *,’Upisi zemlju’; READ (*,*) rijeci = LEN_TRIM(rijec)
SELECT CASE (rijec(i:i))CASE (’a’); PRINT *,’Albanija’CASE (’b’); PRINT *,’Bugarska’CASE (’c’); PRINT *,’Cipar’CASE (’d’); PRINT *,’Danska’...CASE DEFAULT; PRINT *,’Predajem se. Ne znam’
END SELECTEND PROGRAM
S tocka-zarezom odvojili smo razlicite fortranske naredbe na istoj liniji!
DO petlje
◮ Za višestruko ponavljanje grupe naredbi služimo se petljama.
◮ U Fortranu petlja pocinje s rjecju DOa završava s END DO
◮ Postoji više verzija DO-petlje:◮ Petlja s kontrolnim parametrom◮ Stara verzija DO-petlje s labelom.◮ Petlja DO-WHILE koja se ponavlja dok je neki uvijet zadovoljen.◮ Beskonacna petlja
DO petlja s kontrolnim parametrom
Zbrajanje brojeva od 1 do 100:
suma = 0suma = suma + 1suma = suma + 2suma = suma + 3...suma = suma + 98suma = suma + 99suma = suma + 100
PRINT *,’Suma je ’,suma
Ekvivalentni racun uz pomoc DO-petlje:
suma = 0DO i=1,100
suma = suma + i ! naredba koja seEND DO ! 100 puta ponavljaPRINT *,’Suma je ’,suma
◮ Naredbe unutar bloka DO - END DOse ponavljaju. Kod svakogslijedeceg ponavljanja parametar i se povecava.
◮ Kod prvog izvodenja pocetna vrijednost parametra i je 1.◮ Kod zadnjeg izvodenja, konacna vrijednost parametra i je 100.
DO petlja s kontrolnim parametrom
Zbrajanje brojeva od 1 do 100:
suma = 0suma = suma + 1suma = suma + 2suma = suma + 3...suma = suma + 98suma = suma + 99suma = suma + 100
PRINT *,’Suma je ’,suma
Ekvivalentni racun uz pomoc DO-petlje:
suma = 0DO i=1,100
suma = suma + i ! naredba koja seEND DO ! 100 puta ponavljaPRINT *,’Suma je ’,suma
◮ Naredbe unutar bloka DO - END DOse ponavljaju. Kod svakogslijedeceg ponavljanja parametar i se povecava.
◮ Kod prvog izvodenja pocetna vrijednost parametra i je 1.◮ Kod zadnjeg izvodenja, konacna vrijednost parametra i je 100.
DO petlja s kontrolnim parametrom
Zbrajanje brojeva od 1 do 100:
suma = 0suma = suma + 1suma = suma + 2suma = suma + 3...suma = suma + 98suma = suma + 99suma = suma + 100
PRINT *,’Suma je ’,suma
Ekvivalentni racun uz pomoc DO-petlje:
suma = 0DO i=1,100
suma = suma + i ! naredba koja seEND DO ! 100 puta ponavljaPRINT *,’Suma je ’,suma
◮ Naredbe unutar bloka DO - END DOse ponavljaju. Kod svakogslijedeceg ponavljanja parametar i se povecava.
◮ Kod prvog izvodenja pocetna vrijednost parametra i je 1.◮ Kod zadnjeg izvodenja, konacna vrijednost parametra i je 100.
DO petlja s kontrolnim parametrom
Zbrajanje brojeva od 1 do 100:
suma = 0suma = suma + 1suma = suma + 2suma = suma + 3...suma = suma + 98suma = suma + 99suma = suma + 100
PRINT *,’Suma je ’,suma
Ekvivalentni racun uz pomoc DO-petlje:
suma = 0DO i=1,100
suma = suma + i ! naredba koja seEND DO ! 100 puta ponavljaPRINT *,’Suma je ’,suma
◮ Naredbe unutar bloka DO - END DOse ponavljaju. Kod svakogslijedeceg ponavljanja parametar i se povecava.
◮ Kod prvog izvodenja pocetna vrijednost parametra i je 1.◮ Kod zadnjeg izvodenja, konacna vrijednost parametra i je 100.
DO petlja s kontrolnim parametrom
Zbrajanje brojeva od 1 do 100:
suma = 0suma = suma + 1suma = suma + 2suma = suma + 3...suma = suma + 98suma = suma + 99suma = suma + 100
PRINT *,’Suma je ’,suma
Ekvivalentni racun uz pomoc DO-petlje:
suma = 0DO i=1, 100
suma = suma + i ! naredba koja seEND DO ! 100 puta ponavljaPRINT *,’Suma je ’,suma
◮ Naredbe unutar bloka DO - END DOse ponavljaju. Kod svakogslijedeceg ponavljanja parametar i se povecava.
◮ Kod prvog izvodenja pocetna vrijednost parametra i je 1.◮ Kod zadnjeg izvodenja, konacna vrijednost parametra i je 100.
DO petlja s kontrolnim parametrom
◮ Na pocetnoj liniji DO-petlje se specificira ime parametara kojikontrolira izvodenje petlje. To je cijeli broj.
◮ Na pocetnoj liniji DO-petlje se specificira pocetna i konacnavrijednost kontrolnog parametra.
DO parametar=pocetna,kononacna...END DO
◮ Moguce je i opcionalno navesti korak povecanja (ili smanjenja)parametra.
DO parametar=pocetna,kononacna,korak...END DO
DO petlja s kontrolnim parametrom
◮ Ako korak nije naveden onda se podrazumijeva da je on jedan.
◮ Ako je pocetna vrijednost veca od konacne, a korak je pozitivanpetlja se ne izvodi.
◮ Ako je pocetna vrijednost manja od konacne, a korak je negativanpetlja se ne izvodi.
! fact = n!fakt = nDO i=n-1,2,-1
fakt = i*faktEND DO
! fact2 = n!!fakt2 = nDO i=n-2,2,-2
fakt2 = i*fakt2END DO
◮ Unutar DO-petlje mogu se nalaziti druge DO-petlje
Primjer
PROGRAM harmonijska_suma
REAL :: suma = 0.0INTEGER :: n,i
PRINT *,’Upisi cijeli broj’READ (*,*) n
DO i=1,nsuma = suma + 1.0/REAL(i)
END DO
PRINT *,sumaEND PROGRAM
Primjer
PROGRAM prosti_brojeviINTEGER :: i,j,k,nLOGICAL :: prosti
PRINT *,’Upisi cijeli broj’READ (*,*) nDO i=1,n
prosti = .TRUE.k = SQRT(REAL(i))DO j=2,k
IF (MOD(i,j) == 0) prosti = .FALSE.END DOIF (prosti) PRINT *,i
END DOEND PROGRAM
Primjer u C-u
#include <stdio.h>main () {
int n;int i;int fact;printf("Upisi broj\n");scanf("%d",&n);fact = n;for (i=n-1; i>=2; i--) { fact *= i; }printf("Faktorijela je = %d\n",fact);
}
Ekvivalent DO-petlji u Fortranu je FOR-petlja u C-u.
Primjer u fortranu 66
INTEGER i,n,fact
PRINT *,’Upisi broj’READ (*,*) n
fact = nDO 10 i=n-1,2,-1
10 fact = fact*i
PRINT *,’Faktorijela je = ’,fact
END
U Fortranu 66 DO-petlja ima labelu koja oznacava grupu naredbi kojase ponavlja.
DO petlje: Prisilni slijedeci korak i prisilni izlaz
◮ Naredba CYCLEprisiljava izvodenje slijedeceg koraka DO-petlje.Podrazumijeva se da se prelazi na slijedeci korak najniže petljeako je nekoliko DO petlji uznježdeno.
◮ DO-petlja može imati ime. Ono se može navesti kao opcionalniargument naredbi CYCLE. Tada se prelazi na izvodenje slijedecegkoraka imenovane petlje.
◮ Naredba EXIT prekida izvodenje DO-petlje. Podrazumijeva se dase prekida najniža petlju ako je nekoliko DO petlji uznježdeno.
◮ Naredba EXIT može imati kao opcionalni argument ime petlje,cime se prekida izvodenje imenovane petlje.
Primjer
PROGRAM prosti_brojeviINTEGER :: i,j,k,nPRINT *,’Upisi cijeli broj’READ (*,*) n
lab: DO i=1,nk = SQRT(REAL(i))DO j=2,k
IF (MOD(i,j) == 0) CYCLE labEND DOPRINT *,i
END DOlabEND PROGRAM
ime petlje se navodi na pocetku i na kraju petlje te se može navesti kaoargument naredbama CYCLEi EXIT .
DO WHILE petlja
◮ DO WHILE-petlja nema kontrolni parametar, nego ponavljanjeizvršavanja je kontrolirano logickim izrazom.
◮ Petlja se ponavlja dok god je logicki izraz tocan.
suma = 0DO i=1,100,3
suma = suma + iEND DO
suma = 0i = 1DO WHILE (i <= 100)
suma = suma + ii = i + 3
END DO
Isti racun napisan s razlicitim varijantama DO-petlje.
beskonacna DO petlja
◮ Beskonacna DO nema kontrolnog parametara, niti kontrolnilogicki izraz.
◮ Prestanak izvršavanja prepušten je naredbi EXIT koja se moranalaziti negdje unutar petlje.
suma = 0DO i=1,100,3
suma = suma + iEND DO
suma = 0i = 1DO
IF (i > 100) EXITsuma = suma + ii = i + 3
END DO
Isti racun napisan s razlicitim varijantama DO-petlje.
Primjer
PROGRAM savrseni_brojeviINTEGER :: i,j,l,nPRINT *,’Upisi broj’READ (*,*) ni = 1DO WHILE (i <= n)
l = 0DO j=1,(i/2)
IF (MOD(i,j) == 0) l = l + jEND DOIF (i == l) PRINT *,ii = i + 1
END DOEND PROGRAM