redxiii Δημοσ. 19 Μαΐου 2005 Δημοσ. 19 Μαΐου 2005 Χρειάζομαι βοήθεια σε ένα μικρό προγραμματάκι για φορτραν... http://www.nomorepasting.com/paste.php?pasteID=40295 Όποιος μπορεί ας ρίξει μια ματιά ! Το πρόγραμμα πρέπει να κάνει το εξής: Δίδονται 2 αταξινόμητες σειρές τιμών Xi , Yi a) Να γίνει υποπρόγραμμα ταξινόμησης με τη μέθοδο selection sort Να συγχωνευθούν οι 2 σειρές σε μια φθίνουσα σειρά λαμβάνοντας όλες τις τιμές των Xi Και Yi έστω και αν είναι ίσες g) Να εκτυπωθεί η νέα σειρά - 10 τιμές σε κάθε γραμμή ! Το ξέρω ότι έχω άπειρα λάθη..
gerontas Δημοσ. 22 Μαΐου 2005 Δημοσ. 22 Μαΐου 2005 Φίλε 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 Gi0 Δημοσ. 23 Μαΐου 2005 Moderators Δημοσ. 23 Μαΐου 2005 ..Πού[/b'] στο καλό σας διδάσκουν ακόμη FORTRAN και κυρίως γιατί; (Απαντήσεις όπως "αυτή ξέρει ο καθηγητής και δεν πρόκειται να μάθει άλλη, μέχρι να πάρει σύνταξη" απορρίπτονται ως κακοήθεις ) ..Η "Επειδη ειναι χρησιμη στους μηχανικους και παραλληλα ευκολη" δικαιολογια γινεται αποδεκτη? :smile:
GrMikeD Δημοσ. 23 Μαΐου 2005 Δημοσ. 23 Μαΐου 2005 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)
gerontas Δημοσ. 23 Μαΐου 2005 Δημοσ. 23 Μαΐου 2005 Η "Επειδη ειναι χρησιμη στους μηχανικους και παραλληλα ευκολη" δικαιολογια γινεται αποδεκτη?Εύκολη είναι, χωρίς αμφιβολία. (Αν και σε μεγάλο βαθμό η ευκολία της, οφείλεται στις αδυναμίες της, αλλά περισσότερα παρακάτω).Χρήσιμη είναι; Από πότε έχετε να δείτε μηχανικό, να λύνει πρόβλημα γράφοντας 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 Gi0 Δημοσ. 23 Μαΐου 2005 Moderators Δημοσ. 23 Μαΐου 2005 Χρήσιμη είναι; Από πότε έχετε να δείτε μηχανικό' date=' να λύνει πρόβλημα γράφοντας Fortran;[/quote'] Ειρωνικα μιλουσα geronta:wink: Μια c πιστευω πως θα ηταν πολυ καλυτερη..Και δεν θελουμε να φτιαξουμε το unix 2(λεμε τωρα) σε μια σχολη μηχανικων..Τουλαχιστον σε μενα,προβληματακια λυναμε με απλα προγραμματα μερικων γραμμων.(Προφανως δεν ειμαι μηχ.Η/Υ) Σκόρπιες σκέψεις και μόνο' date=' χωρίς διάθεση αντιπαράθεσης. Στο κάτω κάτω, μια βοήθεια ζήτησε ο άνθρωπος, ας μην του κάνουμε το thread θερινό. [/quote'] Συζητηση κανουμε και ας μας συγχωρησει και ο redxiii :wink: (..τι ομαδα εισαι τελικα?)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.