Τώρα είναι Πέμ 09 Ιούλ 2020 02:31 pm

Όλοι οι χρόνοι είναι UTC + 2 ώρες [ DST ]




Δημιουργία νέου θέματος Απαντήστε στο θέμα  [ 4 Δημοσιεύσεις ] 
Συγγραφέας Μήνυμα
ΔημοσίευσηΔημοσιεύτηκε: Δευτ 10 Μάιος 2010 09:45 pm 
Χωρίς σύνδεση

Εγγραφή: Τρί 20 Απρ 2010 04:00 pm
Δημοσιεύσεις: 2
Είναι ένα προγραμματάκι που πήγα να φτιάξω για τον υπολογισμό όλων των πιθανών παραγοντοποιήσεων που μπορεί να δεχτεί ένας αριθμός...
Syntax: [ Download ] [ Hide ]
ΠΡΟΓΡΑΜΜΑ Πιθ_Παρ_Αρ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Ν
ΑΡΧΗ
  ΔΙΑΒΑΣΕ Ν
  ΚΑΛΕΣΕ Παράγοντες(Ν)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Πιθ_Παρ_Αρ

ΔΙΑΔΙΚΑΣΙΑ Παράγοντες(Ν)
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Ν,ι,ξ
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ Α_Μ(Ν^(1/2))
    ξ <-- Ν DIV ι
    ΑΝ Ν MOD ι=0 ΤΟΤΕ
      ΑΝ Πρώτος(ξ)= ΑΛΗΘΗΣ ΚΑΙ Πρώτος(ι)= ΑΛΗΘΗΣ ΤΟΤΕ
        ΓΡΑΨΕ ι,ξ
      ΑΛΛΙΩΣ_ΑΝ Πρώτος(ξ)= ΑΛΗΘΗΣ ΤΟΤΕ
        ΚΑΛΕΣΕ Παράγοντες(ι)
      ΑΛΛΙΩΣ_ΑΝ Πρώτος(ι)= ΑΛΗΘΗΣ ΤΟΤΕ
        ΚΑΛΕΣΕ Παράγοντες(ξ)
      ΑΛΛΙΩΣ
        ΚΑΛΕΣΕ Παράγοντες(ι)
        ΚΑΛΕΣΕ Παράγοντες(ξ)
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΣΥΝΑΡΤΗΣΗ Πρώτος(Ν): ΛΟΓΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ:Ν,ι
ΑΡΧΗ
  Πρώτος <-- ΑΛΗΘΗΣ
  ι <-- 2
  ΟΣΟ ι<=(Ν-1) ΚΑΙ Πρώτος(Ν)= ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ
    ΑΝ Ν MOD ι=0 ΤΟΤΕ
      Πρώτος <-- ΨΕΥΔΗΣ
    ΤΕΛΟΣ_ΑΝ
    ι <-- ι+1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


Δεν μπορώ να καταλάβω γιατί δεν τρέχει... Κάτι λέει στο error message αλλά δεν προλαβαίνω να το διαβάσω.... Αν μπορούσε να με βοηθήσει κανείς θα το εκτιμούσα... ( Η φάση είναι ότι λειτουργεί για είσοδο μέχρι τον αριθμό 5)


Κορυφή
 Προφίλ  
 
ΔημοσίευσηΔημοσιεύτηκε: Δευτ 10 Μάιος 2010 10:25 pm 
Χωρίς σύνδεση

Εγγραφή: Παρ 30 Μάιος 2008 09:46 pm
Δημοσιεύσεις: 49
Το πρόβλημα, αν δεν κάνω λάθος, είναι στο
Κώδικας:
ΟΣΟ ι<=(Ν-1) ΚΑΙ Πρώτος(Ν)= ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ

Το πρόγραμμα καλεί ξανά και ξανά τη συνάρτηση πρώτος όταν φτάνει εδώ. Όταν η συνάρτηση Πρώτος καλεί την άλλη συνάρτηση Πρώτος με τον ίδιο αριθμό , εκείνη (η 2η) καλή ξανά την συνάρτηση Πρώτος και αυτό θα γινόταν για πάντα αν δεν εμφανιζόταν το σφάλμα.
Αυτό δεν συμβαίνει για αριθμούς μικρότερους ή ίσους του 5 επειδή το Ν της συνάρτησης Πρώτος καλείται πάντα με τιμές μικρότερες ή ίσες του ακέραιου μέρους της ρίζας του 5 ( δηλαδή μικρότερες ή ίσες του 2 ) από το Πρώτος(ι) , οπότε η επανάλαβε σταματάει πριν καλέσει ξανά την Πρώτος αφού 2 <= (2-1) είναι ψευδής ( όπως και τα : 2 <= (1-1), 2 <= (0-1), κάτι που δεν ισχύει για το ακέραιο μέρος της ρίζας του 6 και μεγαλύτερους.

(το σφάλμα EStackOverflow σημαίνει ότι έχει ξεπεραστεί ένα όριο που υπάρχει στο πόσες συναρτήσεις/διαδικασίες έχουν καλέσει μια άλλη πριν φτάσει σε αυτό το σημείο, δηλαδή στο πρόγραμμά σου ας πούμε ότι έχουμε :
Κύριο πρόγραμμα καλεί το
Παράγοντες(100) το οποίο καλεί το
Πρώτος(2) (σε αυτό το σημείο έχουν γίνει 2 κλήσεις) (αν το όριο ήταν 2, μόλις αυτή η συνάρτηση καλούσε μια άλλη θα "πέταγε" το σφάλμα) επιστρέφει
(τώρα είναι στην παράγοντες(100) ) η οποία τώρα καλεί την Πρώτος(4)
Πρώτος(4) (σε αυτό το σημείο πάλι έχουν γίνει μόνο 2 κλήσεις)

Ότι δεν κατάλαβες (αν δεν κατάλαβες κάτι) πες να το ξανά εξηγήσω.

_________________
"Δύο πράγματα είναι ατελείωτα (άπειρα), το σύμπαν και η ανθρώπινη βλακεία, για το 1ο δεν είμαι σίγουρος." Einstein
"Τα πάντα ρει" (Τα πάντα ρέουν/αλλάζουν) Ηράκλειτος
"Μη μου τους κύκλους τάραττε" Αρχιμήδης


Κορυφή
 Προφίλ  
 
ΔημοσίευσηΔημοσιεύτηκε: Τετ 12 Μάιος 2010 11:48 am 
Χωρίς σύνδεση

Εγγραφή: Τρί 20 Απρ 2010 04:00 pm
Δημοσιεύσεις: 2
Είχες δίκιο φίλε μου... Σ'ευχαριστώ πολύ... Βέβαια εγώ ήθελα να έχω την εντολή
ΟΣΟ ι<=(Ν-1) ΚΑΙ Πρώτος=ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ
αλλά μου το έβγαζε ως συντακτικό σφάλμα... Τέλος πάντων το διόρθωσα χρησιμοποιώντας μια βοηθητική μεταβλητή και τρέχει πλέον το πρόγραμμα αλλά δεν κάνει αυτά που περίμενα....

Syntax: [ Download ] [ Hide ]
ΠΡΟΓΡΑΜΜΑ Πιθ_Παρ_Αρ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Ν
ΑΡΧΗ
  ΔΙΑΒΑΣΕ Ν
  ΚΑΛΕΣΕ Παράγοντες(Ν)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Πιθ_Παρ_Αρ

ΔΙΑΔΙΚΑΣΙΑ Παράγοντες(Ν)
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Ν,ι,ξ
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ Α_Μ(Ν^(1/2))
    ξ <-- Ν DIV ι
    ΑΝ Ν MOD ι=0 ΤΟΤΕ
      ΑΝ Πρώτος(ξ)= ΑΛΗΘΗΣ ΚΑΙ Πρώτος(ι)= ΑΛΗΘΗΣ ΤΟΤΕ
        ΓΡΑΨΕ ι,ξ
      ΑΛΛΙΩΣ_ΑΝ Πρώτος(ξ)= ΑΛΗΘΗΣ ΤΟΤΕ
        ΚΑΛΕΣΕ Παράγοντες(ι)
        ΓΡΑΨΕ ξ
      ΑΛΛΙΩΣ_ΑΝ Πρώτος(ι)= ΑΛΗΘΗΣ ΤΟΤΕ
        ΓΡΑΨΕ ι
        ΚΑΛΕΣΕ Παράγοντες(ξ)
      ΑΛΛΙΩΣ
        ΚΑΛΕΣΕ Παράγοντες(ι)
        ΚΑΛΕΣΕ Παράγοντες(ξ)
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΣΥΝΑΡΤΗΣΗ Πρώτος(Ν): ΛΟΓΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ:Ν,ι
  ΛΟΓΙΚΕΣ:χ
ΑΡΧΗ
  χ <-- ΑΛΗΘΗΣ
  ι <-- 2
  ΟΣΟ ι<=(Ν-1) ΚΑΙ χ= ΑΛΗΘΗΣ ΕΠΑΝΑΛΑΒΕ
    ΑΝ Ν MOD ι=0 ΤΟΤΕ
      χ <-- ΨΕΥΔΗΣ
    ΤΕΛΟΣ_ΑΝ
    ι <-- ι+1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  Πρώτος <-- χ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


Κορυφή
 Προφίλ  
 
ΔημοσίευσηΔημοσιεύτηκε: Τετ 12 Μάιος 2010 03:55 pm 
Χωρίς σύνδεση

Εγγραφή: Παρ 30 Μάιος 2008 09:46 pm
Δημοσιεύσεις: 49
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 βγάζει. :? Άρα τι συμβαίνει ? Αυτό θα σε αφήσω να το βρεις μόνο σου γιατί εκεί πιστεύω ότι έχει την περισσότερη πλάκα στο να φτιάχνεις προγράμματα :wink: ( ίσως εκτός από το να τα βλέπεις να λειτουργούν σωστά ? ) . Πάλι αν θες και άλλη βοήθεια στο να το λύσεις πες το και θα χαρώ να βοηθήσω… (σημείωση: Το ότι το 2025 είναι το τετράγωνο του 45 δεν σημαίνει ότι πάντα βγάζει τους παράγοντες του τετραγώνου του αριθμού που δίνουμε. Επίσης το 45 μάλλον δεν είναι το καλύτερο παράδειγμα γιατί δεν είναι ένας 100% τυχαίος αριθμός αφού κάθε φορά που καλείται μια παράγοντες από την παράγοντες του 45 επιστρέφει σωστά τους παράγοντες, αλλά κάνει πιο εύκολα παρατηρήσιμο το λάθος επειδή αυτό περιορίζεται).
ΥΓ. ξ <-- Ν DIV ι θα κερδίσεις αρκετή ταχύτητα στο πρόγραμμα αν το βάλεις μέσα στην ΑΝ MOD ι=0 ΤΟΤΕ ειδικά για μεγάλους αριθμούς αλλά αυτό δεν είναι τόσο σημαντικό τώρα.
ΥΓ. συγνώμη για την μακροσκελή απάντηση.

_________________
"Δύο πράγματα είναι ατελείωτα (άπειρα), το σύμπαν και η ανθρώπινη βλακεία, για το 1ο δεν είμαι σίγουρος." Einstein
"Τα πάντα ρει" (Τα πάντα ρέουν/αλλάζουν) Ηράκλειτος
"Μη μου τους κύκλους τάραττε" Αρχιμήδης


Κορυφή
 Προφίλ  
 
Τελευταίες δημοσιεύσεις:  Ταξινόμηση ανά  
Δημιουργία νέου θέματος Απαντήστε στο θέμα  [ 4 Δημοσιεύσεις ] 

Όλοι οι χρόνοι είναι UTC + 2 ώρες [ DST ]


Μέλη σε σύνδεση

Μέλη σε αυτή την Δ. Συζήτηση : Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης


Δεν μπορείτε να δημοσιεύετε νέα θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να απαντάτε σε θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επεξεργάζεστε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να διαγράφετε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επισυνάπτετε αρχεία σε αυτή τη Δ. Συζήτηση

Αναζήτηση για:
Μετάβαση σε:  
cron
Προβολές σελίδων: website counters