Άσκηση 1 Να γραφεί κώδικας FORTRAN που θα υπολογίζει το άθροισμα όλων των στοιχείων ενός διανύσματος a (μονοδιάστατη array) διάστασης Ν. Τα στοιχεία του διανύσματος a δίνονται από τη σχέση: a(i) = 2*i O υπολογισμός να γίνει: α) με την τεχνική αθροίσματος σε μεταβλητή program vector integer, allocatable, dimension(:):: a integer N, i, s print *, 'Give the dimension of the vector' allocate(a(n)) a(i) = 2*i s = 0 s = s + a(i) print *, 'sum=', s deallocate(a) β) με τη χρήση της εσωτερικής συνάρτησης sum( ) program vector integer, allocatable, dimension(:):: a integer N, i, s print *, 'Give the dimension of the vector' allocate(a(n)) a(i) = 2*i
s = sum(a) print *, 'sum=', s deallocate(a) Άσκηση 2 Να γραφεί κώδικας FORTRAN που θα υπολογίζει το άθροισμα όλων των στοιχείων ενός τετραγωνικού πίνακα A (διδιάστατη array) διάστασης ΝxΝ. Τα στοιχεία του πίνακα Α δίνονται από τη σχέση: A(i, j) = 2*i - j O υπολογισμός να γίνει: α) με την τεχνική αθροίσματος σε μεταβλητή program matrix integer, allocatable, dimension(:,:):: A integer N, i, j, s allocate(a(n,n)) A(i,j) = 2*i - j s = 0 s = s + A(i,j) print *, 'sum=', s deallocate(a) β) με τη χρήση της εσωτερικής συνάρτησης sum( )
program matrix integer, allocatable, dimension(:,:):: A integer N, i, j, s allocate(a(n,n)) A(i,j) = 2*i - j s = sum(a) print *, 'sum=', s deallocate(a) Άσκηση 3 Να γραφεί κώδικας FORTRAN που θα υπολογίζει και θα εκτυπώνει (σε πινακοποιημένη μορφή) τα στοιχεία ενός τετραγωνικού πίνακα ΝxN (διδιάστατη array). Ο πίνακας αυτός πρέπει να απεικονίζει: α. Ενα μοναδιαίο πίνακα (τα διαγώνια στοιχεία έχουν τιμή 1 και τα υπόλοιπα 0). β. Ενα διαγώνια (χιαστί) μοναδιαίο πίνακα. γ. Ενα τρι-διαγώνιο μοναδιαίο πίνακα. Παράδειγμα: α. 1 0 0 Α = 0 1 0 0 0 1 β. 1 0 1 Α = 0 1 0 1 0 1 γ. 1 1 0 Α = 1 1 1 0 1 1
α. program monadiaios integer, allocatable, dimension(:,:) :: A integer N, i, j allocate(a(n,n)) A = 0 if(i==j) A(i,j)= 1 print *, (A(i,j),j=1,N) deallocate(a) β. program xiasti integer, allocatable, dimension(:,:) :: A integer N, i, j allocate(a(n,n)) A = 0 if(i==j) A(i,j) = 1 if((i+j)==(n+1)) A(i,j) = 1
print *, (A(i,j),j=1,N) deallocate(a) γ. program tridiagonios integer, allocatable, dimension(:,:) :: A integer N, i, j allocate(a(n,n)) A = 0 if(i==j) A(i,j) = 1 if(i==(j+1)) A(i,j) = 1 if(i==(j-1)) A(i,j) = 1 print *, (A(i,j),j=1,N) deallocate(a) Άσκηση 4 Μία μονοδιάστατη array F περιέχει 10 στοιχεία, F i, τα οποία προέρχονται από πειραματικές μετρήσεις. Κάθε ένα από αυτά, εκτός των δύο ακραίων, πρέπει να αντικατασταθεί με F i-1 +F+F i i+1 3 Αυτή είναι μία απλή τεχνική εξομάλυνσης (smoothing) των μετρήσεων έτσι ώστε να μειωθεί η επίδραση των τυχαίων λαθών κατά τις μετρήσεις.
Ελέγξτε τα αποτελέσματά σας σύμφωνα με τον παρακάτω πίνακα: F Fsmooth 0 0.000000 100 116.6667 250 213.3333 290 333.3333 460 416.6667 500 521.6667 605 621.6667 760 731.6667 830 833.3333 910 910.0000 program smoothing real, allocatable, dimension(:) :: f, fsmooth integer N,i N=10 allocate(f(n), fsmooth(n)) f(1)=0. ;f(2)=100.;f(3)=250.;f(4)=290.;f(5)=460. f(6)=500.;f(7)=605.;f(8)=760.;f(9)=830.;f(10)=910. fsmooth(1)=f(1) fsmooth(n)=f(n) do i = 2, N-1 fsmooth(i)=(f(i-1)+f(i)+f(i+1))/3 do i = 1,N print *, f(i),fsmooth(i) deallocate(f, fsmooth) Άσκηση 5 ίνονται Ν πραγματικοί αριθμοί που είναι αποθηκευμένοι σε μια μονοδιάστατη array. Να υπολογιστεί ο μεγαλύτερος και ο μικρότερος. O υπολογισμός να γίνει:
α) χωρίς τη χρήση εσωτερικών συναρτήσεων program min_max real, allocatable, dimension(:) :: a integer N,i real min,max print *, 'This program computes the minimum and the & &maximum of N real numbers' print *, 'Give the N' allocate(a(n)) print *, 'Give the N real numbers' read *, (a(i),i=1,n) min=a(1) max=a(1) do i = 2, N if(a(i)<min) min=a(i) if(a(i)>max) max=a(i) deallocate(a) print *, 'min=',min print *, 'max=',max β) με τη χρήση των κατάλληλων εσωτερικών συναρτήσεων. program min_max real, allocatable, dimension(:) :: a integer N,i real min,max print *, 'This program computes the minimum and the & &maximum of N real numbers' print *, 'Give the N' allocate(a(n)) print *, 'Give the N real numbers'
read *, (a(i),i=1,n) min=minval(a) max=maxval(a) deallocate(a) print *, 'min=',min print *, 'max=',max Άσκηση 6 Να γραφεί κώδικας FORTRAN που θα υπολογίζει την τομή δύο δοθέντων συνόλων Α και Β με Μ και N ακέραια και μη επαναλαμβανόμενα στοιχεία, αντίστοιχα. TIP: Πρέπει να δημιουργήσετε 3 μονοδιάστατες arrays a, b και c. Τα στοιχεία των a, b (διάστασης Μ και Ν αντίστοιχα) θα τα δίνει ο χρήστης. Ο κώδικας θα υπολογίζει την c (διάστασης ;) που θα περιέχει τα κοινά στοιχεία των a, b. program tomi integer, allocatable, dimension(:) :: A, B, C integer M, N, i, j, k print *, 'Give the dimension of the array A' read *, M print *, 'Give the dimension of the array B' allocate(a(m), B(N)) print *, 'Give the ',M,' elements of the array A(in one line)' read *, (A(i),i=1,M) print *, 'Give the ',N,' elements of the array B(in one line)' read *, (B(i),i=1,N) k = 0 do i = 1, M if(a(i)==b(j)) then
k = k + 1 if allocate(c(k)) k = 0 do i = 1, M if(a(i)==b(j)) then k = k + 1 C(k)= A(i) if print *, 'The union of A and B has',k,'elements' print *, (C(i),i=1,k) deallocate(a, B, C) Άσκηση 7 Να γραφεί κώδικας FORTRAN που θα δέχεται από τον χρήστη έναν τετραγωνικό πίνακα ΝxN και θα υπολογίζει τον ανάστροφό του χωρίς τη χρήση της εσωτερικής συνάρτησης transpose( ). Παράδειγμα: Ο ανάστροφος ενός πίνακα 1 4 7 B= 2 5 8 3 6 9 1 2 3 Α = 4 5 6 7 8 9 είναι ο πίνακας program transpose integer, allocatable, dimension(:,:) :: A, B integer N, i, j allocate(a(n,n), B(N,N))
print *, 'Give the elements of the matrix A line by line' read *, (A(i,j),j=1,N) B(j,i) = A(i,j) print *, (B(i,j),j=1,N) deallocate(a, B) Άσκηση 8 Να γραφεί κώδικας FORTRAN που θα δέχεται από τον χρήστη έναν τετραγωνικό πίνακα Α διάστασης ΝxN και θα υπολογίζει τον ανάστροφό του χωρίς τη χρήση της εσωτερικής συνάρτησης transpose( ) και χωρίς τη χρήση δεύτερης array (δηλ. ο ανάστροφος θα αποθηκεύεται μέσα στην ίδια διδιάστατη array Α). program transpose integer, allocatable, dimension(:,:) :: A integer N, i, j, b allocate(a(n,n)) print *, 'Give the elements of the matrix A line by line' read *, (A(i,j),j=1,N) do j = i, N - 1 b = A(i,j+1) A(i,j+1) = A(j+1,i)
A(j+1,i) = b print *, (A(i,j),j=1,N) deallocate(a) Άσκηση 9 Να γραφεί κώδικας FORTRAN που θα δημιουργεί ένα διάνυσμα (μονοδιάστατη array) με Ν στοιχεία, που το περιεχόμενο του i στοιχείου του θα είναι το άθροισμα των στοιχείων της i γραμμής ενός δοθέντος τετραγωνικού πίνακα Α(N,N), από το διαγώνιο στοιχείο και δεξιά αν το i είναι περιττός και από το διαγώνιο στοιχείο και αριστερά αν το i είναι άρτιος Παράδειγμα: Αν Ν = 3 και 6 δημιουργεί ο κώδικας είναι 9 9 1 2 3 Α = 4 5 6 7 8 9 τότε το διάνυσμα που πρέπει να program vector integer, allocatable, dimension(:,:) :: A integer, allocatable, dimension(:) :: B integer N, i, j, k allocate(a(n,n), B(N)) print *, 'Give the elements of the matrix A line by line' read *, (A(i,j),j=1,N) B = 0 k = i/2 if(2*k==i) then do j = 1, i
B(i) = B(i) + A(i,j) else do j = i, N B(i) = B(i) + A(i,j) if print *, 'The vector B is:' print *, B(i) deallocate(a, B)