Προς το περιεχόμενο

Help gia fortran !


redxiii

Προτεινόμενες αναρτήσεις

Δημοσ.

Χρειάζομαι βοήθεια σε ένα μικρό προγραμματάκι για φορτραν...

 

http://www.nomorepasting.com/paste.php?pasteID=40295

 

Όποιος μπορεί ας ρίξει μια ματιά ! Το πρόγραμμα πρέπει να κάνει το εξής:

 

Δίδονται 2 αταξινόμητες σειρές τιμών Xi , Yi a) Να γίνει υποπρόγραμμα ταξινόμησης με τη μέθοδο selection sort B) Να συγχωνευθούν οι 2 σειρές σε μια φθίνουσα σειρά λαμβάνοντας όλες τις τιμές των Xi Και Yi έστω και αν είναι ίσες g) Να εκτυπωθεί η νέα σειρά - 10 τιμές σε κάθε γραμμή !

 

Το ξέρω ότι έχω άπειρα λάθη..

Δημοσ.

Φίλε redxiii καλησπέρα (Red - 13 !!! Τί περίεργος συνδυασμός είναι αυτός; -:) )

Πριν απ' όλα προσπάθησε να ξεκαθαρίσεις τη λειτουργά μιας Subroutine: Παίζει τον ίδιο ρόλο με μια procedure της Pascal ή μιας void function της C και (άν δεν έχω χάσει επεισόδια) ο κώδικάς της δεν πρέπει ν' ανακατεύεται ποτέ με τον κώδικα του κυρίως προγράμματος (ή μια άλλης subroutine) που την καλεί.

Η σύνδεση με το Κυρίως Πρόγραμμα γίνεται με την εκτέλεση μια εντολής CALL, για παράδειγμα:

>
     PROGRAM LOL
     ...
     CALL SELSORT(Χ,100)
     CALL SELSORT(Υ,100)
     ...
     STOP
     END

     SUBROUTINE SELSORT(Z,N)
     ....
     ....
     RETURN
     END

Οι μεταβλητές θα μεταφεθούν μία προς μία, δλδ. με την πρώτη κλήση ο πίνακας X (του Κ.Π) θα "αντιγραφεί" στον πίνακα Z της subroutine της οποίας το n θα πάρει την τιμή 100. Αφού εκτελεσθεί ο όποιος κώδικας της subroutine. ο έλεγχος θα επιστρέψει στο Κ.Π. αμέσως μετά την CALL: Θα κληθεί λοιπόν η subroutine εκ νέου με τον πίνακα Z αυτή τη φορά να παίζει τον ρόλο του Y κ.ο.κ.

 

Ως προς αυτή καθαυτή τη διαδικασία της ταξινόμησης:

1. Η επικοινωνία μεταξύ κυρίως προγράμματος και subroutine δεν χρειάζεται παρά μόνο τον πίνακα και τον αριθμό των στοιχείων του. Ο πίνακας X (ή Y) από Ν στοιχεία, θα μεταφερθεί στην subroutine αταξινόμητος και θα επιστρέψει ταξινομημένος. Οποιαδήποτε άλλη μεταβλητή (temp,i,j,min κλπ.) δεν έχει κανένα λόγο να μεταφέρεται ανάμεσα στα δυό τμήματα του κώδικα και η αναφορά του στην δήλωση του υποπρογράμματος είναι περιττή.

2. Ο έλεγχος

if (Z(min).gt.Z(j)) then...

θα μεταφέρει κάθε φορά το μικρότερο στοιχείο στις πρώτες θέσεις και συνεπώς θα ταξινομήσει τον πίνακα κατ' αύξουσα σειρά. Αν κατάλαβα καλά το επόμενο ερώτημα, αυτό που ζητάι η άσκηση, είναι ταξινόμηση κατά φθίνουσα σειρά, συνεπώς ο έλεγχος πρέπει να γίνει

if (Z(min).lt.Z(j)) then...

Καλό θα ήταν με την ευκαιρία τη μεταβλητή MIN να τη βαφτίσουμε MAX, αφού κάθε φορά επιλέγουμε το μεγαλύτερο στοιχείο του πίνακα

3. Η εντολή Do nnn, σημαίνει "εκτέλεσε όλες τις εντολές έως τη nnn και ξανακάνε έλεγχο". Ευνόητο είναι ότι η nnn δεν πρέπει να είναι μια εντολή τερμαισμού όπως η EXIT ή η END. Συνηθίζεται να βάζουμε τελευταία εντολή σε ένα loop μια εντολή CONTINUE.

4. Εννοείται επίσης, ότι στη διαδικασία της αντιμετάθεσης δεν πρέπει ν' ανακατεύουμε τους πίνακες X και Z.

Από τη στιγμή που επιλέγουμε να γίνει η διαδικασία με κλήση subroutine (και σωστά: Αν το κάναμε στο Κ.Π. θα ήμασταν αναγκασμένοι να γράψουμε τον ίδιο κώδικα δύο φορές, μια για τον X και ια για τον Y) θ' αναφερθούμε αποκλειστικά στον πίνακα Ζ.

Μετά απ' αυτά η SUBROUTINE SELSORT (που θα κληθεί για τους δυό πίνακες με τον τρόπο που αναφέρεται παραπάνω) μπορεί να γραφεί κάπως ετσι:

>      SUBROUTINE SELSORT(Z,N)
     DIMENSION Z(N)
     I=1
     J=1
     DO 10 I=1,N-1
        MAX = I
        DO 20 J=I+1,N
              IF (Z(MAX).LT.Z(J)) THEN
                 MAX = J
              END IF
20       CONTINUE
        TEMP = Z(I)
        Z(I) = Z(MAX)
        Z(MAX) = TEMP
10    CONTINUE
     RETURN
     END

 

Για τη συγχώνευση των δύο ήδη ταξνομημένων πινάκων καλούμε μια SUBROUTINE MERGE(A,M,B,N) που συγχωνεύει τον πίνακα A (από M στοιχεία) και τον πίνακα Β (από Ν στοιχεία) σ' ενα δικό της εσωτερικό πίνακα C, τον οποίο και τυπώνει.

Οσο δεν έχουν εξαντληθεί τα στοιχεία των δύο πινάκων τα συγκρίνει μεταξύ τους και γράφει στον πίνακα C αυτό που είναι μεγαλύτερο. Οταν τα στοιχεία του ενός πίνακα εξαντληθούν (η λογική σχέση με το .AND. γίνεται ψευδής), μ' ένα απλό DO μεταφέρει στον C τα υπόλοιπα στοιχεία του άλλου πίνακα. (Από τα δύο DO που ακολουθούν μόνο το ένα εκτελείται).

Η κλήση και ο κώδικας της υπορουτίνας θα είναι κάπως έτσι:

>
     ...
     CALL MERGE(X,10,Y,10)
     ...

     SUBROUTINE MERGE(A,M,B,N)
     DIMENSION A(M),B(N),C(M+N)    
     I=1
     J=1
     K=1
     DO  WHILE ((I.LE.M).AND.(J.LE.N))
         IF  (A(I).GT.B(J)) THEN
             C(K)=A(I)
             I=I+1
         ELSE
             C(K)=B(J)
             J=J+1
         ENDIF
         K=K+1
     ENDDO
     DO 10 I=I,M
     C(K)=A(I)
     K=K+1
  10 CONTINUE
     DO 11 J=J,N
     C(K)=B(J)
  11 CONTINUE
     WRITE(*,*)
     WRITE(*,*) 'SORTED MERGED DATA'
     WRITE(*,900) (C(I),I=1,M+N) 
     RETURN
 900 FORMAT(10F7.2)
     END

 

Αν η DO WHILE ... δεν δουλεύει στην υλοποίηση που δουλεύεις, είναι κάτι που ξεπερνιέται εύκολα. Γι αυτό κι οτιδήποτε άλλο, τα ξαναλέμε.

Καλή τύχη.

 

ΥΓ: Και μια δική μου απορία: Πού στο καλό σας διδάσκουν ακόμη FORTRAN και κυρίως γιατί; (Απαντήσεις όπως "αυτή ξέρει ο καθηγητής και δεν πρόκειται να μάθει άλλη, μέχρι να πάρει σύνταξη" απορρίπτονται ως κακοήθεις :-) )

  • Moderators
Δημοσ.
..Πού[/b'] στο καλό σας διδάσκουν ακόμη FORTRAN και κυρίως γιατί; (Απαντήσεις όπως "αυτή ξέρει ο καθηγητής και δεν πρόκειται να μάθει άλλη, μέχρι να πάρει σύνταξη" απορρίπτονται ως κακοήθεις :-) )

..Η "Επειδη ειναι χρησιμη στους μηχανικους και παραλληλα ευκολη" δικαιολογια γινεται αποδεκτη?swoon.gif

:smile:

Δημοσ.

Idiaitera se sxoles mixanikwn, i didaskalia tis Fortran exei 2 pleonektimata:

1) H suntriptiki pleiopsifia "all times classic" epistimonikwn paketwn (mathimatikwn px) einai grammena se fortran. Blepe px to lapack pou ta perissotera panepistimiaka mathimata sxetika me epistimoniko upologismo kai grammiki algebra xrisimopoioun ws reference.

2) Exei ena simantiko xaraktiristiko: einai eukoli stin ekmathisi kai eisagei me ton pio anodino tropo stis arxes programmatismou. Opote einai isws idaniki gia tin sugrafi ergasiwn opou o foititis prepei na sugedrwthei stin ousia (business logic tou pragmatos) kai oxi se tertipia tis glwssas (blepe pointers, access methods ktl)

Δημοσ.
Η "Επειδη ειναι χρησιμη στους μηχανικους και παραλληλα ευκολη" δικαιολογια γινεται αποδεκτη?
Εύκολη είναι, χωρίς αμφιβολία. (Αν και σε μεγάλο βαθμό η ευκολία της, οφείλεται στις αδυναμίες της, αλλά περισσότερα παρακάτω).

Χρήσιμη είναι; Από πότε έχετε να δείτε μηχανικό, να λύνει πρόβλημα γράφοντας Fortran;

Exei ena simantiko xaraktiristiko: einai eukoli stin ekmathisi kai eisagei me ton pio anodino tropo stis arxes programmatismou. Opote einai isws idaniki gia tin sugrafi ergasiwn opou o foititis prepei na sugedrwthei stin ousia (business logic tou pragmatos) kai oxi se tertipia tis glwssas (blepe pointers, access methods ktl)
Για την ευκολία φίλε Mike, είπαμε: Δεκτό.

Είναι όμως η ευκολία, κριτήριο στην κατάρτιση του προγράμματος σπουδών σε μια σχολή μηχανικών;

Εισάγει η F. τον φοιτητή στις Αρχές Προγραμματισμού ή μήπως τις καλύπτει;

Μήπως προσανατολίζει τη σκέψη του σε ξεπερασμένες και στατικές δομές; Καλοί οι Πίνακες και τα Γραμμικά Μοντέλα, όμως αρκούν; Πόσες φορές δεν καταλήγουμε σε Συστήματα με μεγάλο Πλήθος Μηδενικών Συντελεστών, όπου η FORTRAN αγκομαχάει με τους Πίνακες, καθώς αδυνατεί να υποστηρίξει π.χ. Αραιές Μήτρες;

Πώς να βελτιστοποιήσεις κυκλοφοριακά συστήματα με μιά γλώσσα που δεν υπολογίζει (σε αντίθεση με όλες τις σύγχρονες) Δομές Ουράς ή Γραμμικής Λίστας;

Πόσο ευκολώτερο δεν είναι να χειριστείς τη Μέθοδο Πεπερασμένων Στοιχείων με δυναμικές Δομές, όπως οι Γράφοι ή τα Δένδρα;

Τώρα που τα μοντέλα γίνονται όλο και πιό σύνθετα και ο όγκος των παρατηρήσεων μεγαλώνει, κρίμα δεν είναι να ταξινομούμε με Bubblesort ή Straight Selection καθώς η Fortran δεν υποστηρίζει αναδρομή -recursion εννοώ- και η υλοποίηση της quicksort θέλει και αρκετό μαζοχισμό;

 

Για τα επιστημονικά πακέτα που έχουν ήδη γραφεί, επίσης δεκτό, αλλά φτάνει;

 

Σκόρπιες σκέψεις και μόνο, χωρίς διάθεση αντιπαράθεσης. Στο κάτω κάτω, μια βοήθεια ζήτησε ο άνθρωπος, ας μην του κάνουμε το thread θερινό. :-)

  • Moderators
Δημοσ.

Χρήσιμη είναι; Από πότε έχετε να δείτε μηχανικό' date=' να λύνει πρόβλημα γράφοντας Fortran;[/quote']

Ειρωνικα μιλουσα geronta:wink: Μια c πιστευω πως θα ηταν πολυ καλυτερη..Και δεν θελουμε να φτιαξουμε το unix 2(λεμε τωρα) σε μια σχολη μηχανικων..Τουλαχιστον σε μενα,προβληματακια λυναμε με απλα προγραμματα μερικων γραμμων.(Προφανως δεν ειμαι μηχ.Η/Υ)

Σκόρπιες σκέψεις και μόνο' date=' χωρίς διάθεση αντιπαράθεσης. Στο κάτω κάτω, μια βοήθεια ζήτησε ο άνθρωπος, ας μην του κάνουμε το thread θερινό. :-)[/quote']

Συζητηση κανουμε και ας μας συγχωρησει και ο redxiii :wink: (..τι ομαδα εισαι τελικα?)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...