Έξοδος από την ''Οσο'' σε αναζήτηση...

Ξεκίνησε από nbasd, 07 Ιαν 2010, 09:40:02 ΜΜ

« προηγούμενο - επόμενο »

nbasd

Φίλοι γεια σας

Δείτε το παρακάτω τμήμα σειριακής αναζήτηση και πείτε μου αν κατά την άποψη σας μπορει να δωθεί σαν λύση, στην περίπτωση όπου θέλω να σταματήσω όταν βρεθει το στοιχείο που αναζητώ.

Αν δείτε δεν χρησημοποιώ έξτρα λογική ή κάποια άλλη μεταβλητή στην συνθήκη αλλά την ίδια την i. Στην ''Για'' ξέρουμε ότι δεν είναι σωστό να σταματήσουμε την επανάληψη αλάζοντας το i. Ισχύει το ίδιο και στην'' Όσο''?Ποια είναι η άποψή σας?

i <--1
Διάβασε χ
Όσο i <= 10 επανάλαβε
    Αν Α[ι]  =  x τότε
    θέση <-- i
    i <-- 12
    αλλιώς
    i <-- i + 1
    Τέλος_Αν
Τέλος_Επανάληψης
Αν  i=12 τότε
εμφάνισε θέση
αλλιώς
εμφάνισε ''Δεν βρέθηκε το στοιχείο''
Τέλος_αν





toufeki

#1
...καλό μου φαίνεται.
Χρησιμοποιείς όμως μια παραπάνω μεταβλητή (θέση).
Βέβαια σήμερα έτσι όπως έχουν γίνει τα πράγματα θα ήταν καλύτερα εαν για να τραφούμε χρειαζόμασταν μνήμη RAM παρά ψωμί.

i <--1
Διάβασε χ
Όσο (i <= 10) &  (Αi  <>  x)
επανάλαβε
    i <-- i + 1
Τέλος_Επανάληψης
Aν (i = 10) & (Ai <> x)
    εμφάνισε ''Δεν βρέθηκε το στοιχείο''
αλλιώς
    Αν i = (10 + 1)
         εμφάνισε ''Δεν βρέθηκε το στοιχείο''
    αλλιώς
         εμφάνισε i
    Τέλος_αν
Τέλος_αν


Σημ: Η τροποποίηση που έκανα έχει να κάνει με την κάλυψη της περίπτωσης που ο μετρητής έχει φτάσει στην τελευταία θέση του πίνακα (10) και δεν βρέθηκε το στοιχείο χ.

nbasd


toufeki

Έτσι όπως μας καταντήσατε, μέχρι και τις ανάσες μας θα πρέπει να μετράμε.
Ευχαριστώ :)

evry

Η λύση είναι καλή, υποθέτω ότι όπου Αi εννοείς
Α[i]
, αλλά ο αλγόριθμος δεν ικανοποιεί το κριτήριο της καθοριστικότητας. Αν το i > 10 τότε ο υπολογισμός της έκφρασης
Α[i]
έχει πρόβλημα αφού ξεπερνάει τα όρια του πίνακα. Νομίζω ότι με ένα παραπάνω Αν είναι εντάξει
Από τη στιγμή που δεν ξέρουμε πως γίνεται η αποτίμηση σύνθετων συνθηκών υποθέτουμε ότι υπολογίζονται όλες ταυτόχρονα.

Πάντως προσωπικά δεν συμφωνώ με αυτή τη λύση. Δεν πιστεύω ότι πρέπει να ενθαρρύνουμε τους μαθητές να σκέφτονται έτσι. Δεν είναι καλό από θέμα διδακτικής να χρησιμοποιούμε την ίδια μεταβλητή με 2 διακριτούς ρόλους, δηλαδή του μετρητή και της τιμής-φρουρού. Δεν κοστίζει τίποτα να χρησιμοποιήσουμε μια ακόμα μεταβλητή. Έχουν περάσει οι εποχές που είχαμε 640 ΚΒ μνήμη.
   Δεν λέω ότι είναι λάθος έτσι? απλά το θεωρώ κακή πρακτική. Να υπενθυμίσω ότι είμαι από τους λίγους εδώ μέσα που πιστεύoυν ότι η αλλαγή του μετρητή μέσα στη Για δεν είναι λάθος.

Παράθεση από: toufeki στις 07 Ιαν 2010, 10:00:03 ΜΜ
i <--1
Διάβασε χ
Όσο (i <= 10) &  (Αi  <>  x)
επανάλαβε
    i <-- i + 1
Τέλος_Επανάληψης
Aν (i >= 10) & (Ai <> x)
    εμφάνισε ''Δεν βρέθηκε το στοιχείο''
αλλιώς
    εμφάνισε i
Τέλος_αν

What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

toufeki

Σε πρόλαβα για το πρόβλημα Ευριπίδη.
Όλα είναι ωφέλημα.
Ιδιαίτερα αυτά που μόλις έγραψες.
Δεν χρειάζεται να διαφωνήσω μαζί σου.
Όλα είναι θέμα οπτικής ;)

toufeki

#6
Έχω να προτείνω μια ακόμα καλύτερη λύση η οποία αποφεύγει την περίπτωση εξόδου από τον πίνακα των 10 θέσεων.

i <--0
Διάβασε χ
επανάλαβε
    i <-- i + 1
μέχρι (i = 10) || (Ai = x)
Aν (Ai <> x)
    εμφάνισε ''Δεν βρέθηκε το στοιχείο''
αλλιώς
    εμφάνισε i
Τέλος_αν

Σημ: τροποποίηση ύστερα από την παρατήρηση του ntzios kostas

ntzios kostas

Καλή λύση η τελευταία, απλά νομίζω ότι δεν χρειάζεται στην δομή επιλογής το i=10.
Το μάθημα Ανάπτυξη Εφαρμογών δεν έχει σαν στόχο την εκμάθηση κάποιου συγκεκριμένου προγραμματιστικού περιβάλλοντος ούτε την καλλιέργεια προγραμματιστικών δεξιοτήτων από τη μεριά των μαθητών. Δεν αποσκοπεί στη λεπτομερειακή εξέταση της δομής, του ρεπερτορίου και των συντακτικων κανόνων κάποιας γλώσσας...

toufeki

Έχεις δίκιο kostas, ευχαριστώ για την παρατήρηση.
Η αλήθεια είναι ότι αλλού το είχα το μυαλό μου.
Βλέπεις ήταν και 2 η ώρα το πρωί. >:D
Θα κάνω την τροποποίηση.

dimitrios67

Συναδελφοι, συγχωρεστε με , αλλα θεωρω τη συγκεκριμενη λυση αρκετα λαθος από άποψη διδακτικής.
Αλλα ειναι και κατι άλλο: δεν ειναι κωδικας που θα εγραφε ενας επαγγελματιας προγραμματιστης. Τα παιδια ετσι μαθαινουν "στραβά"....
Σκεφτειτε το κι αυτο: Σε ενα πραγματικό προγραμμα με 100αδες γραμμες, εαν καθε serial search το υλοποιήσουμε έτσι και κανουμε καποιο λάθος, το debugging θα ειναι γολγοθας...
Ναι μεν η αλγοριθμική, αλλά ας "πλησιάζουμε" και τον πραγματικό κοσμο.....Νομιζω οτι ο υπερτονισμος του "δουλευει αρα ειναι οκ!" δεν νομιζω οτι ειναι καλή πρακτική.
Ο σχεδιασμος ενος προγραμματος (και οχι ο "κωδικας" που θα γραψουμε) ειναι πολύ σημαντική ικανοτητα και παραμετρος.

toufeki

Από παιδαγωγικής άποψης πιστεύω ότι και ο πλουραλισμός δεν βλάπτει.
Ίσα ίσα που διευρίνει τους ορίζοντες.
Το παραπάνω κομμάτι κώδικα δεν είχε στόχο να αντικαταστίσει την γνωστή δομή.
Είναι απλά μια βοήθεια που προσφέρουμε σε έναν συνάδελφο που θέλει να δει τα πράγματα λίγο διαφορετικά.
Πιστεύω πως είναι καλύτερα για τους μαθητές να δουν διαφορετικές προσεγγίσεις για ένα θέμα και με την βοήθεια του καθηγητή να επιλέξουν (οι ίδιοι) την ιδανικότερη προσσέγγιση για την περίπτωση.
Όπως έγραψα και παλαιότερα: Όλα είναι οφέλημα, αρκεί να έχουν έναν οφέλημο στόχο.

evry

  Καλό είναι κάθε μεταβλητή στό πρόγραμμα να έχει έναν συγκεκριμένο ρόλο, όπως π.χ. μετρητής, αθροιστής, μεταβλητή-σημαία κλπ. Έτσι είναι πιο εύκολο να εξηγήσεις στους μαθητές σου κάποια πράγματα και να ξεκινήσουν και αυτοί να τα χρησιμοποιούν. Εάν αρχίσεις να συγχέεις τους ρόλους των μεταβλητών θα προκληθεί σύγχυση στους μαθητές. Όπως είπα και προηγουμένως ο συγκεκριμένος τρόπος δεν είναι λάθος, είναι όμως κακή πρακτική και είναι καλό να αποφεύγεται. Αν δώσεις κάτι τέτοιο στους μαθητές και μετά αρχίσουν οι ερωτήσεις
"Γιατί δεν μπορούμε να κάνουμε και το ίδιο στη Για, αφού οι 2 δομές είναι ισοδύναμες για συγκεκριμένο αριθμό επαναλήψεων?"
"Γιατί να χρησιμοποιώ τον τρόπο του βιβλίου αφού αυτός έχει λιγότερο γράψιμο, λιγότερες μεταβλητές και άρα μπορώ να τον μάθω πιο εύκολα απέξω?"

  Όταν δείχνουμε ένα νέο "κόλπο" στους μαθητές μας θα πρέπει να μπορούμε (όσο είναι δυνατό) να προβλέψουμε και τις συνέπειες. Δηλαδή αν αύριο ένας μαθητής το γράψει αυτό στις εξετάσεις, ή με αφορμή αυτό πάει και αλλάξει και τον μετρητή της Για και κάποιος βαθμολογητής του κόψει εμείς τι θα του πούμε?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Καρκαμάνης Γεώργιος

Παράθεση από: nbasd στις 07 Ιαν 2010, 09:40:02 ΜΜ
Φίλοι γεια σας

Δείτε το παρακάτω τμήμα σειριακής αναζήτηση και πείτε μου αν κατά την άποψη σας μπορει να δωθεί σαν λύση, στην περίπτωση όπου θέλω να σταματήσω όταν βρεθει το στοιχείο που αναζητώ.

Αν δείτε δεν χρησημοποιώ έξτρα λογική ή κάποια άλλη μεταβλητή στην συνθήκη αλλά την ίδια την i. Στην ''Για'' ξέρουμε ότι δεν είναι σωστό να σταματήσουμε την επανάληψη αλάζοντας το i. Ισχύει το ίδιο και στην'' Όσο''?Ποια είναι η άποψή σας?

i <--1
Διάβασε χ
Όσο i <= 10 επανάλαβε
    Αν Α[ι]  =  x τότε
    θέση <-- i
    i <-- 12
    αλλιώς
    i <-- i + 1
    Τέλος_Αν
Τέλος_Επανάληψης
Αν  i=12 τότε
εμφάνισε θέση
αλλιώς
εμφάνισε ''Δεν βρέθηκε το στοιχείο''
Τέλος_αν

Προσωπικά προσπαθώ να περάσω το μήνυμα στους μαθητές, να  μην πειράζουν ποτέ τον μετρητή επαναλήψεων για να βγούνε απο ένα βρόχο και νομίζω για τις ανάγκες του μαθηματός μας δεν είναι και απαραίτητο αυτό.
Ετσι και στην αναζήτηση προτιμώ τον αλγόριθμο του σχολείου που χρησιμοποιεί λογικη μεταβλητή,(είναι και ένας λόγος να δουνε και την χρήση τους)

gthal

Συνάδελφοι, σκεφτόμουν κι εγώ να ρωτήσω κάτι σχετικό,
βλέπω με ευχαρίστηση ότι το θέμα έχει ήδη ανοίξει.

Εγώ παρουσίασα πρώτα έναν αλγόριθμο χωρίς λογική μεταβλητή, για να "εξασφαλίσω" όσους "φρικάρουν" με αυτές.
Δεδομένου ότι χρειαζόμαστε μια μεταβλητή θ για τη θέση του ζητούμενου, εξετάζουμε την τιμή της και όταν αλλάξει (από 0) διακόπτουμε:
θ<--0
ι<--1
Οσο ι<=Ν και θ=0 επανάλαβε
   Αν Α[ι]=χ τότε
      θ<-- ι
   τέλος_αν
   ι <-- ι+1
τέλος_επανάληψης
Αν θ>0 τότε
  εμφάνισε 'βρέθηκε στη θέση', θ
Αλλιώς
  εμφάνισε 'δεν βρέθηκε'
τέλος_αν

Στη συνέχεια παρουσίασα τον αλγόριθμο του βιβλίου, που είναι κάπως έτσι (αν δεν απατώμαι):
βρέθηκε<--ψευδής
θ<--0
ι<--1
Οσο ι<=Ν και βρέθηκε=ψευδής επανάλαβε
   Αν Α[ι]=χ τότε
      θ<-- ι
      βρέθηκε<--αληθής
   τέλος_αν
   ι <-- ι+1
τέλος_επανάληψης
Αν βρέθηκε=αληθής τότε
  εμφάνισε 'βρέθηκε στη θέση', θ
Αλλιώς
  εμφάνισε 'δεν βρέθηκε'
τέλος_αν

Σ' αυτό το σημείο οι ίδιοι οι μαθητές παρατήρησαν ότι η χρήση και της θ και της βρέθηκε είναι πλεοναστική.
Είπα ότι ναι, αρκεί να σταματήσουμε το ι όταν βρεθεί το στοιχείο , και έτσι φτιάξαμε τον -κατά τη γνώμη μας- πιο "κομψό" αλγόριθμο:
βρέθηκε<--ψευδής
ι<--1
Οσο ι<=Ν και βρέθηκε=ψευδής επανάλαβε
   Αν Α[ι]=χ τότε
      βρέθηκε<--αληθής
   αλλιώς
      ι <-- ι+1
   τέλος_αν
τέλος_επανάληψης
Αν βρέθηκε=αληθής τότε
  εμφάνισε 'βρέθηκε στη θέση', ι
Αλλιώς
  εμφάνισε 'δεν βρέθηκε'
τέλος_αν

Ποια είναι η γνώμη σας για τους 3 αυτούς αλγόριθμους;
Φιλικά,
Γιώργος Θαλασσινός

andreas_p

Και οι 3 είναι σωστοί.
Απλά στους αλγορ. 1,2 θα μπορούσες να αποφύγεις την περιττή αύξηση του ι .