makis318 έγραψε:
Είχες δίκιο φίλε μου... Σ'ευχαριστώ πολύ... Βέβαια εγώ ήθελα να έχω την εντολή
ΟΣΟ ι<=(Ν-1) ΚΑΙ Πρώτος=ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ
αλλά μου το έβγαζε ως συντακτικό σφάλμα... Τέλος πάντων το διόρθωσα χρησιμοποιώντας μια βοηθητική μεταβλητή και τρέχει πλέον το πρόγραμμα αλλά δεν κάνει αυτά που περίμενα....
Ένα από τους λόγους που δεν κάνει αυτό που θες είναι η γραμμή :
Κώδικας:
ΑΝ Πρώτος(ξ)= ΑΛΗΘΗΣ ΚΑΙ Πρώτος(ι)= ΑΛΗΘΗΣ ΤΟΤΕ
όταν επιστρέφει από την Πρώτος(ι) η γλωσσομάθεια ξανά ελέγχει την γραμμή από την αρχή (μάλλον bug). Αυτό μπορείς να το δεις πολύ απλά με την βηματική εκτέλεση που έχει η γλωσσομάθεια. Το αποτέλεσμα είναι να «κολλάει» σε αυτή την γραμμή για πάντα. Για να το λύσεις αυτό το πρόβλημα μπορείς να σώζεις σε 2 λογικές μεταβλητές την τιμή που επιστρέφει κάθε Πρώτος και να ελέγχεις τις μεταβλητές αντί για την συνάρτηση στην ΑΝ. Επίσης αν αντικαταστήσεις όλες τις Πρώτος στην ΑΝ με αυτές τις μεταβλητές , το πρόγραμμα θα γίνει αρκετά πιο γρήγορο. Δηλαδή :
Κώδικας:
ΔΙΑΔΙΚΑΣΙΑ Παράγοντες(Ν)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Ν,ι,ξ
ΛΟΓΙΚΕΣ: ΞΠ, ΙΠ
ΑΡΧΗ
ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ Α_Μ(Ν^(1/2))
ξ <-- Ν DIV ι
ΑΝ Ν MOD ι=0 ΤΟΤΕ
ΞΠ <-- Πρώτος(ξ)
ΙΠ <-- Πρώτος(ι)
ΑΝ ΞΠ = ΑΛΗΘΗΣ ΚΑΙ ΙΠ = ΑΛΗΘΗΣ ΤΟΤΕ
ΓΡΑΨΕ ι,ξ
ΑΛΛΙΩΣ_ΑΝ ΞΠ = ΑΛΗΘΗΣ ΤΟΤΕ
ΚΑΛΕΣΕ Παράγοντες(ι)
ΓΡΑΨΕ ξ
ΑΛΛΙΩΣ_ΑΝ ΙΠ = ΑΛΗΘΗΣ ΤΟΤΕ
ΓΡΑΨΕ ι
ΚΑΛΕΣΕ Παράγοντες(ξ)
ΑΛΛΙΩΣ
ΚΑΛΕΣΕ Παράγοντες(ι)
ΚΑΛΕΣΕ Παράγοντες(ξ)
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
Επίσης η Πρώτος = ΑΛΗΘΗΣ μπορεί να χρησιμοποιηθεί μέσα στην Συνάρτηση αρκεί να δώσεις μια τιμή στην Πρώτος πριν την ελέγξεις.
Κώδικας:
ΣΥΝΑΡΤΗΣΗ Πρώτος(Ν): ΛΟΓΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Ν,ι
ΑΡΧΗ
Πρώτος <-- ΑΛΗΘΗΣ
ι <-- 2
ΟΣΟ ι<=(Ν-1) ΚΑΙ Πρώτος = ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ
ΑΝ Ν MOD ι=0 ΤΟΤΕ
Πρώτος <-- ΨΕΥΔΗΣ
ΤΕΛΟΣ_ΑΝ
ι <-- ι+1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Επίσης θα ήταν καλό να κοιτάξεις λίγο καλύτερα την λογική της διαδικασίας Παράγοντες.
Για να γίνω λίγο πιο συγκεκριμένος και να σε βοηθήσω ας δούμε τι γίνετε αν δώσουμε το 45 ως Ν.
Καλείται η Παράγοντες(45)
Και η επανάληψη γίνετε ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ 6 (45^(1/2) = 6.7082039324993690892275210061938… )
Άρα έχουμε στην αρχή ι = 2
Άρα ξ = 45 div 2 = 12 και δεν μπαίνει μέσα στην πρώτη ΑΝ γιατί 45 MOD 2 <> 0 .
To Α_Μ(Ν^(1/2)) παραμένει ίδιο (6) άρα ι = 3
Άρα ξ = 45 div 3 = 15 και μπαίνει μέσα στην πρώτη ΑΝ γιατί 45 MOD 3 = 0 .
Το Πρώτος(3) επιστρέφει αληθής και το Πρώτος(15) ψευδής.
Άρα γράφει το 3 και πάει στη παράγοντες(6)
Για ι από 2 έως 2 άρα θα μπει μόνο μια φορά, με ι = 2
Ξ = 6 div 2 = 3 και 6 mod 2 = 0 άρα καλεί τις Πρώτος για 2 και 3 από τις οποίες και οι 2 επιστρέφουν αληθής. Άρα γράφει 3 5.
Μέχρι στιγμής στην οθόνη έχουμε :
Κώδικας:
3
3 5
Η παράγοντες(6) επιστρέφει.
Η παράγοντες(45) συνεχίζει με ι = 4
Άρα ξ = 45 div 4 = 11 και δεν μπαίνει μέσα στην πρώτη ΑΝ γιατί 45 MOD 4 <> 0 .
Συνεχίζει με ι = 5
Άρα ξ = 45 div 5 = 9 και μπαίνει μέσα στην πρώτη ΑΝ γιατί 45 MOD 5 = 0 .
Η Πρώτος (5) επιστρέφει αληθής ενώ η πρώτος (9) επιστρέφει ψευδής.
Άρα γράφει 5 στην οθόνη και καλεί την παράγοντας(9) η οποία θα δεν θα μπει στην Αν για ι=2 (αφού 9 MOD 2 <> 2 ) αλλά θα μπει με ι = 3 (ξ = 9 DIV 3 = 3). Θα καλέσει 2 φορές την Πρώτος(3) η οποία θα επιστρέψει αληθής και τις 2 φορές, άρα στην οθόνη θα γράψει 3 3. Η παράγοντες(9) επιστρέφει και για ι = 6 δεν μπαίνει στην ΑΝ και έτσι καταλήγει να επιστρέψει η παράγοντες(45) και να τερματιστεί το πρόγραμμα.
Να δούμε τι έχει στην οθόνη ?
Κώδικας:
3
3 5
5
3 3
3*3*5*5*3*3 = 45*45 = 2025 οχ! 2025 ? δεν μοιάζει με το 45 … μήπως έκανα κάπου λάθος στις πράξεις ? Τις ξανά ελέγχω… πάλι 2025 βγάζει.
Άρα τι συμβαίνει ? Αυτό θα σε αφήσω να το βρεις μόνο σου γιατί εκεί πιστεύω ότι έχει την περισσότερη πλάκα στο να φτιάχνεις προγράμματα
( ίσως εκτός από το να τα βλέπεις να λειτουργούν σωστά ? ) . Πάλι αν θες και άλλη βοήθεια στο να το λύσεις πες το και θα χαρώ να βοηθήσω… (σημείωση: Το ότι το 2025 είναι το τετράγωνο του 45 δεν σημαίνει ότι πάντα βγάζει τους παράγοντες του τετραγώνου του αριθμού που δίνουμε. Επίσης το 45 μάλλον δεν είναι το καλύτερο παράδειγμα γιατί δεν είναι ένας 100% τυχαίος αριθμός αφού κάθε φορά που καλείται μια παράγοντες από την παράγοντες του 45 επιστρέφει σωστά τους παράγοντες, αλλά κάνει πιο εύκολα παρατηρήσιμο το λάθος επειδή αυτό περιορίζεται).
ΥΓ. ξ <-- Ν DIV ι θα κερδίσεις αρκετή ταχύτητα στο πρόγραμμα αν το βάλεις μέσα στην ΑΝ MOD ι=0 ΤΟΤΕ ειδικά για μεγάλους αριθμούς αλλά αυτό δεν είναι τόσο σημαντικό τώρα.
ΥΓ. συγνώμη για την μακροσκελή απάντηση.