maria_cy_20 Δημοσ. 8 Φεβρουαρίου 2014 Δημοσ. 8 Φεβρουαρίου 2014 (επεξεργασμένο) Γεια σας. Είμαι καινούρια στο forum και χρειάζομαι τη βοήθειά σας για ένα πρόβλημα στη fortran. Δεν γράφω εδώ για να μου το λύσετε, παρά μόνο για να με βοηθήσετε καθώς έχω κολλήσει κάπου και θέλω να ξεμπλοκάρω. Δεν ξέρω αν έχω τη λογική του προβλήματος ή γενικά την προγραμματιστική σκέψη, απλά το προσπαθώ καθώς θέλω να την μάθω, τη χρειάζομαι και για την σχολή μου! Λοιπόν. Το πρόγραμμα μου ζητάει να τυπώνω ζεύγη διαφορετικών αριθμών προς αλλήλους (αυτοί που διαιρούνται ταυτόχρονα με τη μονάδα) από το 2 μέχρι το 20 και αν το πρόγραμμα δίνει το ζεύγος (n,m), να μην εκτυπώνει και το ζεύγος (m,n). ^το τελευταίο οφείλω να ομολογήσω πως δεν κατάλαβα τι ακριβώς πρέπει να κάνω για να μην μου τυπώνει 2 φορές το ίδιο ζεύγος με άλλη σειρά, σκέφτηκα κάτι όμως και το έγραψα. (το πιο πιθανόν να είναι εντελώς λάθος). program ex6 implicit none integer i, j, k, l, counter, c do i=2,20 ! ksekina o metritis tou 1ou zeugous do j=2,20 ! ksekina o metritis tou 2ou zeugous counter=0 do k=2,i-1 ! ksekina o metritis tou i gia to mod mexri 19 c=0 do l=2,j-1 ! ksekina o metritis tou j gia to mod mexri 19 if (mod(i,k).eq.0) counter=counter+1 if (mod(j,l).eq.0) c=c+1 ! auksisi 2ou metriti gia to 2o zeugos end do ! kleisimo metriti k end do ! kleisimo metriti l if ((counter.eq.0).and.(c.eq.0)) write(*,*)'(',i,',',j,')' ! an paramenoun k oi 2 metrites 0 tote einai 1oi if (mod(j,i).eq.0) stop end do ! kleisimo tou metriti j end do ! kleisimo tou metriti i end ^το έκανα επεξεργασία γιατί είχα αρκετά λάθη και ακόμη δεν εξαλείφθηκαν! Επεξ/σία 8 Φεβρουαρίου 2014 από maria_cy_20
zynif Δημοσ. 8 Φεβρουαρίου 2014 Δημοσ. 8 Φεβρουαρίου 2014 1o λάθος : Απέφυγε την χρήση της goto . Μπορεί να σου κόψει μονάδες ο καθηγητής2ο λάθος : Απέφυγε τα τόσα πολλά σχόλια. Μπορεί να σου κόψει μονάδες ο καθηγητής και δεν θα καταλάβει την λύση σου3ο λάθος : το do k=2,i-1 δεν εκτελείται επειδή το i-1 θα πάρει την τιμή 1 που είναι μικρότερη του 1. Άρα ο κώδικας θα τρέξει την εντολή if (mod(j,i).eq.0) go to 10 . H πράξη (mod(j,i).eq.0) είναι αληθής και γιαυτό το πρόγραμμα πάει στο label 10 και τερματίζει4ο: Δεν είμαι μαθηματικός αλλά η εκφώνηση είναι λίγο περίεργη . Όλοι οι αριθμοί δεν δαιρούνται με το ένα ;Άρα θέλεις όλους τους δυνατούς συνδυασμούς των αριθμών χωρίς να εμφανίζονται με ανάποδη σειρά . Δεν χρειάζεσαι παραπάνω από 2 do εαν θέλεις να δοκιμάσεις ποια ζεύγη διαφορετικών διαιρούνται ταυτόχρονα με τον ίδιο αριθμό
Moderators Kercyn Δημοσ. 8 Φεβρουαρίου 2014 Moderators Δημοσ. 8 Φεβρουαρίου 2014 2ο λάθος : Απέφυγε τα τόσα πολλά σχόλια. Μπορεί να σου κόψει μονάδες ο καθηγητής και δεν θα καταλάβει την λύση σου Αυτό. Τα σχόλια δεν είναι για να εξηγείς πώς δουλεύει η γλώσσα αλλά πώς δουλεύει ο κώδικάς σου. Όλοι μπορούμε να καταλάβουμε ότι το counter = 0 εκχωρεί την τιμή 0 στη μεταβλητή counter. Το να το γράφεις ως σχόλιο είναι όχι μόνο περιττό, αλλά κάνει τον κώδικά σου δυσανάγνωστο και δείχνει έλλειψη σιγουριάς όταν γράφεις. Επίσης, θα συμφωνήσω για το θέμα με την εκφώνηση. Δεν κατάλαβα τι ακριβώς σου ζητείται. Να γράφεις όλα τα ζευγάρια αριθμών από το 1 μέχρι το 20;
maria_cy_20 Δημοσ. 8 Φεβρουαρίου 2014 Μέλος Δημοσ. 8 Φεβρουαρίου 2014 Καταρχάς ευχαριστώ που απάντησες! Γράφω πολλά σχόλια για να καταλαβαίνετε τι κάνω και γιατί ο ίδιος ο καθηγητής μας είπε πως τα θέλει για να καταλαβαίνει την λογική μας και να μην χάνεται, αλλά όντως, εκεί που δεν χρειάζεται θα τα μειώσω! Σ'ευχαριστώ! Για το goto ο ίδιος και πάλι μας έδειξε αρκετά παραδείγματα που το χρησιμοποιούσε, ωστόσο αντί για goto θα βάλω stop μάλλον! Είχα ακριβώς την ίδια απορία. Θα βάλω ακριβώς την εκφώνηση. Ίσως εννοεί να τυπώνω τους πρώτους αριθμούς, όμως να θέλει να τους τυπώνω σε ζεύγη.. Διαφωτίστε με αν μπορείτε. "Γράψτε ένα πρόγραμμα το οποίο βρίσκει όλα τα ζεύγη από διαφορετικούςθετικούς ακέραιους αριθμούς στο διάστημα 2 έως 20 που είναι “πρώτοι προςαλλήλους” (έτσι ονομάζονται κάποιοι αριθμοί όταν ο μόνος αριθμός πουτους διαιρεί ταυτόχρονα είναι η μονάδα). Αν το πρόγραμμα δίνει το ζεύγος(n,m), δεν θα πρέπει να δίνει και το ζεύγος (m,n)." Θα το ξαναπροσπαθήσω! Το i-1 στην επαναληπτική δομή νομίζω πως χρειάζεται γιατί όταν κάνει την διαίρεση π.χ 13/13 θα ισχύει αυτόματα και το counter ποτέ δεν θα είναι 0, oπότε δεν θα μου τυπώνει το 13 ως πρώτο αριθμό και αυτό είναι λάθος.. Οπότε πρέπει πάντα να τον διαιρεί με i-1 για να μην διαρείται με τον εαυτό του! Έκανα το ίδιο πρόβλημα να μου τυπώνει τους πρώτους αρθμούς μέχρι το 100 και τρέχει κανονικά!
zynif Δημοσ. 8 Φεβρουαρίου 2014 Δημοσ. 8 Φεβρουαρίου 2014 Δύο ή περισσότεροι αριθμοί λέγονται πρώτοι προς αλλήλους αν ο Μ.Κ.Δ. τους είναι το 1
maria_cy_20 Δημοσ. 8 Φεβρουαρίου 2014 Μέλος Δημοσ. 8 Φεβρουαρίου 2014 Σ'ευχαριστώ! Δηλαδή ασπούμαι θέλει να τυπώνω (2,3), (3,5), (5,7), (7,11) κτλ? που έχουν κοινό διαιρέτη το 1 και είναι πρώτοι? (για να σιγουρευτώ!)
Moderators Kercyn Δημοσ. 8 Φεβρουαρίου 2014 Moderators Δημοσ. 8 Φεβρουαρίου 2014 Δε θέλει να του τυπώνεις τους πρώτους αριθμούς, θέλει τους "πρώτους προς αλλήλους". Δηλαδή τα ζευγάρια (2,3), (3,5) και (3,7) πρέπει να εκτυπωθούν, ενώ τα (2,4), (3,6), (4,16) όχι. Τώρα, για να εκτυπώνονται τα ζευγάρια μόνο μία φορά, μπορείς να έχεις ένα πίνακα με το γινόμενο των 2 αριθμών. Στην περίπτωση του 5 και του 3, μπορείς να βάλεις το 15 στον πίνακα. Έτσι, όταν έρθει το 3 και το 5, θα δει ότι το γινόμενο υπάρχει ήδη στον πίνακα και έτσι δε θα εκτυπωθεί δεύτερη φορά. Edit γιατί γράφω βλακείες...
maria_cy_20 Δημοσ. 8 Φεβρουαρίου 2014 Μέλος Δημοσ. 8 Φεβρουαρίου 2014 Χίιιιιλια ευχαριστώ! Πάω να το δοκιμάσω!!!!
bird Δημοσ. 8 Φεβρουαρίου 2014 Δημοσ. 8 Φεβρουαρίου 2014 Στα ζευγάρια που πρέπει να τυπώσεις δεν ειναι απαραίτητο ότι οι αριθμοι θα ειναι πρώτοι, πρέπει να ειναι πρώτοι μεταξύ τους. π.χ. στο ζευγάρι (4,7) οι αριθμοί είναι πρώτοι μεταξύ τους (οπότε πρέπει να τους τυπώσεις) αλλα δεν είναι και οι δύο πρώτοι.Για να μην βγάλεις και το ζευγάρι (7,4) αρκεί ο εσωτερικός βρόγχος να ξεκινάει από τον μετρητή του εξωτερικού βρόχου + 1 do i = 2, 20 do j = i+1, 20 ... 108 συνδυασμοί βγαίνουν ; Αν μπορεί να πάρει και την τιμή 20 ναι, αν πηγαίνει μέχρι και 19 είναι 101...
gon1332 Δημοσ. 8 Φεβρουαρίου 2014 Δημοσ. 8 Φεβρουαρίου 2014 Στα ζευγάρια που πρέπει να τυπώσεις δεν ειναι απαραίτητο ότι οι αριθμοι θα ειναι πρώτοι, πρέπει να ειναι πρώτοι μεταξύ τους. π.χ. στο ζευγάρι (4,7) οι αριθμοί είναι πρώτοι μεταξύ τους (οπότε πρέπει να τους τυπώσεις) αλλα δεν είναι και οι δύο πρώτοι. Για να μην βγάλεις και το ζευγάρι (7,4) αρκεί ο εσωτερικός βρόγχος να ξεκινάει από τον μετρητή του εξωτερικού βρόχου + 1 do i = 2, 20 do j = i+1, 20 ... Σωστά. Μιλάμε για σχετικά πρώτους αριθμούς. Επίσης ο τρόπος αρχικοποίησης του δείκτη στο εσωτερικό loop όπως σου έδειξε ο bird, παραλείπει τους περιττούς συνδυασμούς: i\j| 2 3 4 5 6 7 8 . . . ---+--------------------------------------------- 2 | x (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) 3 | x x (3,4) (3,5) (3,6) (3,7) (3,8) 4 | x x x (4,5) (4,6) (4,7) (4,8) 5 | x x x x (5,6) (5,7) (5,8) 6 | x x x x x (6,7) (6,8) 7 | x x x x x x (7,8) 8 | x x x x x x x . . .
maria_cy_20 Δημοσ. 9 Φεβρουαρίου 2014 Μέλος Δημοσ. 9 Φεβρουαρίου 2014 Σας ευχαριστώ! Με τα σχόλια σας κατάλαβα τι ακριβώς ζητάει η άσκηση! Δοκίμασα αυτό, και δεν μου τρέχει σωστά... Ξέρετε τι πάει λάθος με το πρόγραμμα; program ex6 implicit none integer i,j,counter do i = 2, 20 counter=0 do j = 1+1, 19 if ((mod(i,j).ne.0).and.(i/j.eq.0).or.(i/j.eq.1)) then counter=counter+1 end if if (counter.ne.0) then write(*,*)'(,',i,',',j,') end if end do end do end
Moderators Kercyn Δημοσ. 9 Φεβρουαρίου 2014 Moderators Δημοσ. 9 Φεβρουαρίου 2014 do j = 1+1, 19 Δε θα έπρεπε να είναι i + 1;
zynif Δημοσ. 9 Φεβρουαρίου 2014 Δημοσ. 9 Φεβρουαρίου 2014 Μου φαίνεται ότι δυσκολεύεσαι χωρίς λόγο .Θες αυτό : counter=0 Για i από 2 εως και 20 με βήμα 1 Για j από i+1 εως και 20 με βήμα 1 Αν Μ.Κ.Δ(i,j) είναι 1 counter=counter+1 Εμφάνισε i,j Και Πηγή: εδώ θα βρεις υλοποιήσεις του Μ.Κ.Δ
maria_cy_20 Δημοσ. 9 Φεβρουαρίου 2014 Μέλος Δημοσ. 9 Φεβρουαρίου 2014 Ναι! do j = i+1,19 το έχω γραμμένο, απλά μου ξέφυγε! Παρατηρείς κάτι άλλο; Έβαλα μέχρι 19 γιατί όταν το i παίρνει την τιμή 20, το j θα πάρει την τιμή 21 και θα τυπώνει μέχρι 21 και θα ξεφεύγω από τα όρια που θέλω... (από 2-20)
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα