32
Kontrola toka izvršavanja programa « Numeriˇ cke metode » Ivo Batisti´ c Fiziˇ cki odsjek, PMF Sveuˇ cilište u Zagrebu predavanja 2005/2006

« Numericke metode »ˇ Ivo Batistic´ - grdelin.phy.hrgrdelin.phy.hr/~ivo/Nastava/Numericke_metode/predavanja/03_pred.pdf · Iza rijeˇci IF slijedi logicki izraz zatvoren u okrugle

  • 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

Bezuvjetni GO TO

Naredba GO TO(ili GOTO) prisiljava nastavak izvodenja programa namjestu naznacenom s labelom u argumentu GOTO-naredbe.

PROGRAM zagonetkaINTEGER :: i = 10

10 GOTO 5020 i=1

GOTO 3030 i=i+1

GOTO 1050 i=i+2

IF (i>5) GOTO 20PRINT *,i

END PROGRAM