2η άσκηση Να γραφεί πρόγραμμα που θα ζητάει τους a,b συντελεστές και τους δύο πρώτους όρους x 1, x 2 της αναγωγικής ακολουθίας x n = ax n-1 +bx n-2 και θα υπολογίζει τον n-οστό της όρο.
Πίνακες Γιατί χρειάζονται οι πίνακες; Παράδειγμα Να γραφεί πρόγραμμα το οποίο, εφόσον διαβάσει Ν αριθμούς στη συνέχεια θα υπολογίζει τη μέση τιμή και την τυπική απόκλιση
Πίνακας είναι μια σύνθετη μεταβλητή που καταλαμβάνει παραπάνω από μια θέση στην μνήμη του Η/Υ, έχει ένα συγκεκριμένο όνομα και δέχεται ένα συγκεκριμένο τύπο δεδομένων. Συνήθεις λόγοι για τη χρήση των πινάκων είναι οι εξής : Η χρησιμοποίηση των δεδομένων παραπάνω από μια φορά. Η αποθήκευση των δεδομένων πριν τη χρησιμοποίηση τους.
Μονοδιάστατοι πίνακες Οι πίνακες γενικά χωρίζονται σε 2 μεγάλες κατηγορίες : Στατικοί πίνακες (static arrays). Ένας πίνακας που καταλαμβάνει έναν συγκεκριμένο χώρο μνήμης σε όλη την εκτέλεση του προγράμματος ονομάζεται στατικός πίνακας. Η διάσταση των στατικών πινάκων ορίζεται στην αρχή του προγράμματος και καταλαμβάνει συγκεκριμένο ποσό μνήμης σε όλη τη διάρκεια του προγράμματος. Αυτό έχει ως αποτέλεσμα τη δέσμευση μεγάλου μέρους της μνήμης του Η/Υ.
Δυναμικοί πίνακες (dynamic arrays). Οι δυναμικοί πίνακες δηλώνονται όπως και οι στατικοί πίνακες στην αρχή του προγράμματος, αλλά η διάστασή τους ορίζεται στη διάρκεια εκτέλεσης του προγράμματος, οπότε και την συγκεκριμένη στιγμή καταλαμβάνουν κομμάτι της μνήμης του Η/Υ. Στη συνέχεια, αν δεν χρειάζονται, μπορούμε να τους καταργήσουμε αποδεσμεύοντας το συγκεκριμένο κομμάτι της μνήμης του Η/Υ για άλλες λειτουργίες.
Πως δηλώνουμε ένα πίνακα Α) Στατικοί πίνακες π.χ. REAL A(10) INTEGER YEAR(1900:2000), C(12) CHARACTER (LEN=20) NAME(15), FN(13) ή REAL, DIMENSION(10) :: A INTEGER, DIMENSION (1900:2000)::YEAR CHARACTER (LEN=20), DIMENSION(15)::NAME
Β)Δυναμικοί πίνακες π.χ. REAL, ALLOCATABLE:: A(:) INTEGER, ALLOCATABLE:: YEAR(:), C(:) CHARACTER (LEN=20), ALLOCATABLE:: D(:) ή REAL, DIMENSION(:), ALLOCATABLE :: A ALLOCATE (A(10)) DEALLOCATE (A)
Τοποθέτηση τιμών σε πίνακα α) Από το χρήστη 1 ος Τρόπος (απευθείας ανάγνωση του Α) REAL A(10) READ*,A 2 ος Τρόπος (με χρήση της εντολής DO-END DO) REAL A(10) DO I=1,10 READ*,A(I) END DO
3 ος Τρόπος (με implied do) REAL A(10) READ*,(A(I),I=1,10) β) Από το πρόγραμμα Με τη σύνταξη: Όνομα πίνακα=(/τιμές/) π.χ. REAL A(4) A=(/2.4,4.0,8,5.9/) Όταν τα δεδομένα δίνονται από το χρήστη προτιμούνται ο δεύτερος και τρίτος τρόπος.
Παράδειγμα Έστω ότι θέλουμε να εισάγουμε σε ένα πίνακα τα ονόματα κάποιων πόλεων και σε έναν άλλο τις αντίστοιχες μέσες θερμοκρασίες για κάποιο μήνα, π.χ. για δέκα πόλεις ΠόληΘερμοκρασία Θεσσαλονίκη15 Βόλος18 Κομοτηνή11…
PROGRAM PINAKES1 IMPLICIT NONE CHARACTER(LEN=15), ALLOCATABLE::TOWN(:) INTEGER, ALLOCATABLE::TEMP(:) INTEGER N,I PRINT*, ‘DOSE DIASTASI PINAKON’ READ*, N ALLOCATE (TOWN(N), TEMP(N)) DO I=1, N READ*, TOWN(I), TEMP(I) END DO END PROGRAM PINAKES1 ή
PROGRAM PINAKES1 IMPLICIT NONE CHARACTER(LEN=15), ALLOCATABLE::TOWN(:) INTEGER, ALLOCATABLE::TEMP(:) INTEGER N,I PRINT*, ‘DOSE DIASTASI PINAKON’ READ*, N ALLOCATE (TOWN(N), TEMP(N)) READ*, (TOWN(I), TEMP(I), I=1,N) END PROGRAM PINAKES1
Εμφάνιση τιμών ενός πίνακα στην οθόνη 1 ος τρόπος (απευθείας όλο τον πίνακα) π.χ. PRINT*,A ή WRITE(6,*) A 2 ος τρόπος (με DO-END DO) π.χ. DO I=1,5 PRINT*,A(I) END DO
3 ος τρόπος (με implied DO) π.χ. PRINT*,(A(I),Ι=1,5) Με το πρώτο και το τρίτο τρόπο εκτύπωσης περίπτωση τα στοιχεία του πίνακα εμφανίζονται το ένα δίπλα στο άλλο, ενώ με τον δεύτερο το ένα κάτω από το άλλο.
Παράδειγμα Έστω ότι θέλουμε να εισάγουμε σε ένα πίνακα τα ονόματα κάποιων πόλεων σε έναν άλλο τις αντίστοιχες μέσες θερμοκρασίες για κάποιο μήνα, π.χ. για δέκα πόλεις ΠόληΘερμοκρασία Θεσσαλονίκη15 Βόλος18 Κομοτηνή11… και στη συνέχεια να εκτυπώνουμε τους πίνακες με την παραπάνω μορφή
PROGRAM PINAKES1 IMPLICIT NONE CHARACTER(LEN=15), ALLOCATABLE::TOWN(:) INTEGER, ALLOCATABLE::TEMP(:) INTEGER N,I PRINT*, ‘DOSE DIASTASI PINAKON’ READ*, N ALLOCATE (TOWN(N), TEMP(N)) DO I=1, N READ*, TOWN(I), TEMP(I) END DO PRINT*, ‘Πόλη’, ‘Θερμοκρασία’ DO I=1, N PRINT*, TOWN(I), TEMP(I) END DO END PROGRAM PINAKES1
Άσκηση Να διαβαστούν 100 ακέραιοι αριθμοί και να τοποθετηθούν σε ένα πίνακα Α. Να βρεθούν και να εμφανισθούν : α) το πλήθος των αριθμών που βρίσκονται έξω από το διάστημα [-30,30], β) το γινόμενο των αριθμών που είναι διάφοροι του μηδενός και βρίσκονται στο διάστημα [-3,3], γ) το άθροισμα των αριθμών που είναι πολλαπλάσια του 5, δ) ο μέσος όρος των άρτιων αριθμών.
PROGRAM PINAKES3 IMPLICIT NONE REAL S1,S2,MO,P INTEGER I,PL1,PL2 INTEGER A(100) READ*, (A(I),I=1,30) PL1=0;P=1;S1=0;S2=0;PL2=0 DO I=1,100 IF ((A(I) 30)) PL1=PL1+1 IF(((A(I)>=-3).AND.(A(I)<=3)).AND.(A(I)/=0)) & P=P*A(I) IF (MOD(A(I),5)==0) S1=S1+A(I)
IF (MOD(A(I),2)==0) THEN S2=S2+A(I) PL2=PL2+1 END IF END DO PRINT*,"Πλήθος αριθμών έξω & από το [-30,30]=",PL1 PRINT*,"Γινόμενο μη μηδενικών αριθμών μέσα & στο [-3,3] =",P PRINT*,"Άθροισμα πολλαπλασίων του 5 =",S1 IF (PL2==0) THEN PRINT*,"Δεν υπάρχουν άρτιοι» ELSE MO=S2/PL2 PRINT*,"Μέσος όρος άρτιων αριθμών =",MO END IF END PROGRAM PINAKES3