Fortran και Αντικειμενοστραυής προγραμματισμός www.corelab.ntua.gr/courses/fortran_naval/naval Γδάζθνληεο: Άξεο Παγνπξηδήο (pagour@cs.ntua.gr) (Δπίθνπξνο Καζεγεηήο ΣΖΜΜΥ ) Γώξα Σνύιηνπ (dsouliou@mail.ntua.gr) (ΔΓΗΠ ΣΖΜΜΥ) 3ε ελόηεηα Βξόρνη επαλάιεςεο Βξόρνο DO Βξόρνο DO WHILE Παξαδείγκαηα Αξρηθέο Δηαθάλεηεο ζε Pascal: Δ. Εάρνο, Ν. Παπαζπύξνπ Πξνζαξκνγή ζε Fortran - ζπκπιεξώζεηο: Α. Παγνπξηδήο, Γ. Σνύιηνπ
Βξόρνη Δπαλάιεςεο (i) Δληνιή DO DO Εληνιή 1 Εληνιή 2... Εληνιή n Γπλεηηθά αηέξκνλνο βξόρνο, απαξαίηεηε ε ρξήζε EXIT 2
Δληνιέο ΔΦΗΤ θαη CYCLE Με ηελ εληνιή ΕΧΙΤ δηαθόπηεηαη ε εθηέιεζε ηνπ βξόρνπ θαη ε εθηέιεζε ηνπ πξνγξάκκαηνο ζπλερίδεη κεηά ην ηέινο ηνπ βξόρνπ. Με ηελ εληνιή CYCLE δηαθόπηεηαη ε εθηέιεζε ηεο ηξέρνπζαο επαλάιεςεο θαη ε εθηέιεζε ζπλερίδεη κε ηελ επόκελε επαλάιεςε. 3
Δύξεζε ΜΚΓ κε βξόρν DO (i) PROGRAM GCD1! Εύρεζε ΜΚΔ δύο αρηζκώλ IMPLICIT NONE INTEGER :: a, b, c WRITE(*,*) 'Δώζε 2 ζεηηθούς αθεραίοσς: ' READ(*,*) a, b IF (a < b) THEN c = a ELSE c = b END IF... 4
Δύξεζε ΜΚΓ κε βξόρν DO (i)! PROGRAM GCD1 ζσλέτεηα. DO..! Δοθηκές αρηζκώλ c,c-1, έως όηοσ! βρεζεί θοηλός δηαηρέηες IF ((MOD(a,c)==0).AND.(MOD(b,c)==0)) THEN EXIT ELSE c = c - 1 END IF WRITE(*,*) 'Ο ΜΚΔ είλαη ο', c END PROGRAM GCD1 5
Δύξεζε ΜΚΓ κε βξόρν DO (ii) PROGRAM GCD2 IMPLICIT NONE INTEGER :: a, b! Εύρεζε ΜΚΔ δύο αρηζκώλ WRITE(*,*) 'Δώζε 2 ζεηηθούς αθεραίοσς: ' READ(*,*) a, b DO IF ((a == 0).OR. (b == 0)) EXIT IF (a > b) THEN a = a - b ELSE b = b - a END IF WRITE(*,*) 'Ο ΜΚΔ είλαη ο', a+b END PROGRAM GCD2 6
Δύξεζε ΜΚΓ κε βξόρν DO (iii) PROGRAM GCD3 IMPLICIT NONE INTEGER :: a, b, t! Εύρεζε ΜΚΔ δύο αρηζκώλ WRITE(*,*) 'Δώζε 2 ζεηηθούς αθεραίοσς: ' READ(*,*) a, b IF (a < b) THEN! πρέπεη a>=b αιιηώς t = a! οη ηηκές ηοσς αληαιιάζζοληαη a = b b = t END IF DO t = MOD(a, b) IF (t == 0) EXIT a = b b = t WRITE(*,*) 'Ο ΜΚΔ είλαη ο', b END PROGRAM GCD3! σποιογηζκός ηοσ σποιοίποσ t! αλ t = 0 o MKΔ είλαη ο b! αιιηώς ζσλετίδοσκε κε! ηολ ΜΚΔ ηωλ b θαη t 7
Δύξεζε ΜΚΓ κε βξόρν DO (iv) PROGRAM GCD4 IMPLICIT NONE INTEGER :: a, b, t! Δύξεζε ΜΚΓ δύν αξηζκώλ WRITE(*,*) 'Γώζε 2 ζεηηθνύο αθεξαίνπο: ' READ(*,*) a, b! Απινπνίεζε: δελ ρξεηάδεηαη λα ειέγμνπκε αλ a < b DO t = MOD(a, b)! ππνινγηζκόο ηνπ ππνινίπνπ t IF (t == 0) EXIT! αλ t = 0 o MKΓ είλαη ν b a = b! αιιηώο ζπλερίδνπκε κε b = t! ηνλ ΜΚΓ ησλ b θαη t WRITE(*,*) 'Ο ΜΚΓ είλαη ν', b END PROGRAM GCD4 8
Δύξεζε ΜΚΓ κε βξόρν DO (v) PROGRAM GCD5 IMPLICIT NONE INTEGER :: a, b, t! Δύξεζε ΜΚΓ δύν αξηζκώλ WRITE(*,*) 'Γώζε 2 ζεηηθνύο αθεξαίνπο: ' READ(*,*) a, b! Δνκεκέλνο πξνγξακκαηηζκόο: νξζόηεξε ρξήζε ηνπ IF DO t = MOD(a, b)! ππνινγηζκόο ηνπ ππνινίπνπ t IF (t == 0) THEN EXIT! αλ t = 0 o MKΓ είλαη ν b ELSE a = b! αιιηώο ζπλερίδνπκε γηα λα βξνύκε b = t! ηνλ ΜΚΓ ησλ b θαη t ENDIF WRITE(*,*) 'Ο ΜΚΓ είλαη ν', b END PROGRAM GCD5 9
DO κε κεηαβιεηή ειέγρνπ (i) DO control variable = αξρή, ηέινο, βήκα Εληνιή 1 Εληνιή 2... Εληνιή n Παξάδεηγκα DO a=1,10,1 WRITE(*,*) a! Εθηειείηαη 10 θνξέο 10
Δληνιή DO (ii) Παξαδείγκαηα DO i=10,1,-1 WRITE(*,*)i DO i=41,-3,-1 WRITE(*,*)i f=2 DO i=1,15 WRITE(*,*) f*i 11
Δληνιή DO (iii) Παξαδείγκαηα (ζπλέρεηα) DO i=1,5 DO j=1,10 WRITE(*, '(A1\)') '*' WRITE(*,*) ********** ********** ********** ********** ********** DO i=1,5 DΟ j=1,2*i WRITE(*, '(A1\)') '*' WRITE(*,*) ** **** ****** ******** ********** 12
Δληνιή DO (iv) Δηδηθέο πεξηπηώζεηο γηα ηα όξηα: DO i=10, 10... (* κία θνξά *) DO i=12, 10... (* θακία θνξά *) Ζ κεηαβιεηή ειέγρνπ δελ κπνξεί λα κεηαβιεζεί (π.ρ. κε αλάζεζε) κέζα ζην ζώκα ηνπ βξόρνπ Τα όξηα ππνινγίδνληαη κηα θνξά ζηελ αξρή 13
Βξόρνο DO WHILE (i) Δπαλάιεςε βξόρνπ όζν ηθαλνπνηείηαη κηα ζπλζήθε DO WHILE (ζπλζήθε) Εληνιή 1 Εληνιή 2... Εληνιή n Παξαδείγκαηα DO WHILE (x>15); k=k+2; DO WHILE (state.and. (x>15)) x=x-5; WRITE(*, *) 'a' 14
Δληνιή DO WHILE (ii) Παξαδείγκαηα i=1 DO WHILE (i<15) WRITE(*, *) i; i=i+1 i=40 DO WHILE (i>2) WRITE(*,*) i;!θα ηεξκαηίζεη ν βξόρνο; i=i+5 15
Δληνιή DO WHILE (ii) Παξαδείγκαηα f=10; g=5 DO WHILE (g*f<200) WRITE(*, *) g*f; g=g+10 ans = 'Y' DO WHILE (ans == 'Y') READ (*,*) n WRITE (*,*) 'square of ', n, 'is ', n*n WRITE (*,*) 'continue? (Y/N)' READ (*,*) ans 16
Δληνιή DO WHILE (iii) Ο αξηζκόο επαλαιήςεσλ γεληθά δελ είλαη γλσζηόο εθ ησλ πξνηέξσλ Αλ ε ζπλζήθε είλαη αξρηθά ςεπδήο, ν βξόρνο ηεξκαηίδεηαη ρσξίο λα εθηειεζηεί ην ζώκα. 17
Υπνινγηζκόο ηνπ Παξαγνληηθνύ! Πξόγξακκα πνπ ππνινγίδεη ην παξαγνληηθό PROGRAM PARAGONTIKO IMPLICIT NONE INTEGER:: n, i, result result=1 WRITE(*,'(A)') "Give number" READ(*, *) n DO i=1,n result = result * i WRITE(*, *) result END 18
Υπνινγηζκόο ησλ αξηζκώλ FIBONACCI PROGRAM FIBONACCI! Πξόγξακκα εθηύπσζεο αξηζκώλ Fibonacci IMPLICIT NONE INTEGER:: n, i, fib, fib_prev=0, fib_last=1 WRITE(*,'(A)')"Give number" READ(*, *) n WRITE(*,'(I5\)') fib_prev WRITE(*,'(I5\)') fib_last DO i=3,n fib = fib_prev + fib_last WRITE(*,'(I5\)') fib fib_prev = fib_last fib_last = fib END 19
Ύςσζε ζε Γύλακε PROGRAM POWER! Πξόγξακκα ύςσζεο ζε δύλακε IMPLICIT NONE INTEGER:: a, b, i, p p=1 WRITE(*,'(A)') "Give the first number" READ(*,*) a WRITE(*,'(A)') "Give the second number" READ(*,*) b DO i=1,b p=p*a WRITE(*,*) p END 20
Υπνινγηζκόο ηνπ ΜΚΓ PROGRAM GCD4 IMPLICIT NONE; INTEGER:: a,b,i,j WRITE(*,'(a)') "Give number a"; READ(*,*) a WRITE(*,'(a)') "Give number b"; READ(*,*) b i=a; j=b DO WHILE ((i>0).and.(j>0)) IF (i>j) THEN i=mod(i,j) ELSE j=mod(j,i) END IF WRITE (*,'(I10)') i+j! Γηαηί δνπιεύεη ζωζηά; END 21
Τη κάζακε Βξόρνη επαλάιεςεο Απιή κνξθή: βξόρνο DO. Πξέπεη λα θξνληίδνπκε γηα ηελ έμνδν από ην βξόρν κε EXIT. Βξόρνο DO κε θαζνξηζκέλν αξηζκό επαλαιήςεσλ. Βξόρνο DO WHILE: έμνδνο ππό ζπλζήθε. Πξνηηκήζηε ηνλ γηα δνκεκέλν πξνγξακκαηηζκό! Οη βξόρνη επαλάιεςεο είλαη από ηα πιένλ βαζηθά ζπζηαηηθά ηνπ (πξνζηαθηηθνύ) πξνγξακκαηηζκνύ! 22