Αποστολέας Θέμα: Επανάλαβε....Μέχρις_ότου  (Αναγνώστηκε 1453 φορές)

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 475
  • There can be only one...may it be AEPP.
Επανάλαβε....Μέχρις_ότου
« στις: 22 Ιούν 2015, 01:06:44 μμ »
Κώδικας: [Επιλογή]
Επανάλαβε
 Διάβασε χ
Μέχρις_ότου χ > = 0

Η παραπάνω σύνταξη της αντίστοιχης δομής επανάληψης αναφέρεται στο βιβλίο "Εισαγωγή στις Αρχές τηε Επιστήμης των Η/Υ".
Μήπως στο ρεπερτόριο των εντολών του Διερμηνευτή να προστεθεί και αυτή η δυνατότητα;

Επίσης πάντα είχα αυτή την απορία και θα την αναφέρω εδώ.

Στη γλώσσα C η αντίστοιχη δομή επανάληψης Do...While τερματίζει με τιμή ψευδής. Δηλαδή είναι μια αλλαγή στη θέση της συνθήκης με την While και οτι εκτελείται σίγουρα μια φορά αλλά δεν υπάρχει κάποια άλλη αλλαγή.
Σε ποιές άλλες γλώσσες (γνωστές στο ευρύ κοινό) η αντίστοιχη δομή έχει ίδια λειτουργία; πχ Python τι ισχύει;

2η απορία.  :P
Για ποιό λόγω στη C η αρίθμηση των κελιών σε έναν πίνακα ξεκινάει το ρημάδι από 0; Έχει κάποια πλεονεκτήματα αυτό σε σχέση με την Pascal που ξεκινάει από 1 όπως και στη Γλώσσα;
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 412
  • Real stupidity beats ΑΙ any time
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #1 στις: 22 Ιούν 2015, 06:35:25 μμ »
Eπειδή υπάρχει ένα άμεσoς παραλληλισμός μεταξύ pointers και arrays στη C, αφού είναι πολύ εύκολο να θεωρήσεις ότι η θέση μηδέν είναι ουσιαστικό μηδενικό offset από το base address του πίνακα. Επειδή δηλαδή, το indexing στους πίνακες είναι ισοδύναμο με την αριθμητική των pointers.

Katsadouros_Dhm

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 370
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #2 στις: 22 Ιούν 2015, 06:58:50 μμ »
Νίκο, αν δεν κάνω λάθος στην python η δομή επανάληψης while εξετάζει τη συνθἠκη μόνο στην αρχή και εκτελείται φυσικά όσο είναι αληθής. Αυτό που υπάρχει στην python είναι ότι μπορείς να προσθέσεις (προαιρετικά) στο τέλος της while ένα else το οποίο θα εκτελεστεί όταν η συνθήκη γίνει ψευδής. Επίσης στην python η αρχή και το τέλος μιας δομής δηλώνεται αποκλειστικά με στοίχιση.
π.χ.
flag=True
while flag:
     print('ok')
     flag=false
else:
     print(' The loop is over')

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2910
  • to Iterate is human to Recurse divine
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #3 στις: 22 Ιούν 2015, 10:09:37 μμ »
Δεν μπορώ να καταλάβω γιατί πρέπει να έχουμε 4-5 διαφορετικές δομές επανάληψης. Σε τι εξυπηρετεί?
Μια δομή επανάληψης είναι αρκετή, π.χ. στη C++ αν χρησιμοποιήσεις τη for δεν υπάρχει λόγος να χρησιμοποιήσεις άλλη δομή.
Επίσης μπορείς να χρησιμοποιείς το break όταν χρειάζεται και αυτό δεν είναι κακή πρακτική.
Σχετικά με την python το else εκτελείται όταν τερματίσει η επανάληψη επειδή η συνθήκη θα γίνει false και όχι αν βγούμε από την επανάληψη με break. Σε αυτή την περίπτωση δεν εκτελείται (σημαντική λεπτομέρεια).
Νομίζω ότι μια for και μια while είναι υπεραρκετές ως δομές επανάληψης, δεν χρειάζεται κάποια άλλη.

Επίσης αυτό που λέει ο itt για το zero-indexing έχει δίκιο, έτσι ακριβώς είναι, έχει σχέση με το pointer arithmetic/addressing

Μια ωραία εξήγηση από τον Dijkstra είναι η παρακάτω:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

όπως και αυτό
http://www.quora.com/Why-do-array-indices-start-with-0-zero-in-many-programming-languages

Δηλαδή μια εξήγηση που θα μπορούσε να δοθεί σε μαθητή με χρήση των παραπάνω παραδειγμάτων είναι ότι η έναρξη του δείκτη από 0 είναι πολύ πιο χρηστική.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Katsadouros_Dhm

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 370
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #4 στις: 22 Ιούν 2015, 11:46:08 μμ »
evry, δεν έγραψα κάτι διαφορετικό. Το else εκτελείται όταν η συνθήκη γίνει ψευδής.
Μάλλον παρεξηγήθηκε το 'The loop is over' ...  :)

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 475
  • There can be only one...may it be AEPP.
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #5 στις: 23 Ιούν 2015, 12:28:19 πμ »
Eπειδή υπάρχει ένα άμεσoς παραλληλισμός μεταξύ pointers και arrays στη C
Από αυτό κρατάω το γεγονός πως είναι θέμα δεικτών!

Απο εδώ
Νίκο, αν δεν κάνω λάθος στην python η δομή επανάληψης while εξετάζει τη συνθἠκη μόνο στην αρχή και εκτελείται φυσικά όσο είναι αληθής.
π.χ.
flag=True
while flag:
     print('ok')
     flag=false
else:
     print(' The loop is over')
Δημήτρη, δηλαδή στην Python υπάρχουν μόνο 2 δομές επανάληψης; Η for που τα κάνει όλα και η while που διαθέτει τιμή φρουρό;
Η Do...While στη C απλά χρησιμοποιείται όταν είμαι σίγουρος πως έχω μια δορά επανάληψη. (Η repeat...until στην Pascal δε θυμάμαι αν τερματίζει με Αληθής)

Από εδώ
Δεν μπορώ να καταλάβω γιατί πρέπει να έχουμε 4-5 διαφορετικές δομές επανάληψης. Σε τι εξυπηρετεί?
Μια δομή επανάληψης είναι αρκετή, π.χ. στη C++ αν χρησιμοποιήσεις τη for δεν υπάρχει λόγος να χρησιμοποιήσεις άλλη δομή.
Επίσης μπορείς να χρησιμοποιείς το break όταν χρειάζεται και αυτό δεν είναι κακή πρακτική.
Σχετικά με την python το else εκτελείται όταν τερματίσει η επανάληψη επειδή η συνθήκη θα γίνει false και όχι αν βγούμε από την επανάληψη με break. Σε αυτή την περίπτωση δεν εκτελείται (σημαντική λεπτομέρεια).
Νομίζω ότι μια for και μια while είναι υπεραρκετές ως δομές επανάληψης, δεν χρειάζεται κάποια άλλη.
συμφωνώ με όλα. Για παράδειγμα ο κώδικας για την ταξινόμηση φυσαλίδας με συνάρτηση στην C όπως φαίνεται στην συνημμένη εικόνα. (ανεβάζω και όλο το pdf , έχει και άλλους τρόππους ταξινόμησης).

Σχετικά με το παρακάτω

Μια ωραία εξήγηση από τον Dijkstra είναι η παρακάτω:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
όπως και αυτό
http://www.quora.com/Why-do-array-indices-start-with-0-zero-in-many-programming-languages
Δηλαδή μια εξήγηση που θα μπορούσε να δοθεί σε μαθητή με χρήση των παραπάνω παραδειγμάτων είναι ότι η έναρξη του δείκτη από 0 είναι πολύ πιο χρηστική.
Δεν μπορώ να πώ οτι σε ασκήσεις με παραλληλία πινάκων, θέσεις min και max και άλλα παρόμοια θα μπορούσαμε να μεταδώσουμε εύκολα σε μαθητές. Σαν να το βλέπω μπροστά μου. "Κύρις αυτό το pos - 1 τί είναι;"  >:(
Άποψή μου πάντα.

Υπάρχει περίπτωση να υλοποιηθεί δομή for με τιμή φρουρό κατα παρόμοιο τρόπο όπως στην συνημμένη εικόνα σε κάποια άλλη γλώσσα προγραμματισμού;

Κύριοι σας ευχαριστώ για τις απαντήσεις.

Υ.γ. Συμφωνώ με την άποψη να υπάρχουν μόνο 2 δομές επανάληψης για όλες τις περιπτώσεις.
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 475
  • There can be only one...may it be AEPP.
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #6 στις: 23 Ιούν 2015, 01:53:18 πμ »
Μμμ....
Και στη σελίδα 2 του παρακάτω link
http://www.corelab.ece.ntua.gr/courses/algorithms/slides/09_Binary_Search.pdf
ενα άλλο παράδειγμα Γραμμικής Αναζήτησης με for η οποία όπως ανέφερε και ο evry πιο πάνω θα μπορούσε να διαθέτει και μια ακόμη εντολή τύπου break και να τερματίζει η επανάληψη χωρίς να έχουμε πρόβλημα με το μέγεθος του πίνακα. :P

Αν κάποιος μαθητής το γράψει ΟΧΙ σύμφωνα με το συντακτικό του σχολικού...αλλά όπως στο link που αναφέρεται, τότε έχουμε και έχει πρόβλημα ή όλα καλά;
Θέλω να πώ μέχρι σήμερα θα είχαμε πρόβλημα, αλλά δεν αναβαθμιζουμε το μάθημα, δεν δίνουμε καινούριες οδηγίες, αλλαγές όπως αυτή
http://alkisg.mysch.gr/steki/index.php?topic=6223.msg73557#msg73557

Μήπως θα έπρεπε - μέσα σε λογικά πλαίσια πάντα - να αφήσουμε την προγραμματιστική φαντασία όσων παιδιών έχουν απομείνει να συναρπάσει.... Άλλωστε για να ακολουθήσουν την παρούσα κατεύθυνση ορισμένοι θα είναι εν δυνάμει συνάδελφοι.,

(χε  ;D... μου θυμίζει παλιά διαφήμιση...
Python....Και αφήστε τη γοητεία(του προγραμματισμού) να συναρπάσει....)
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2910
  • to Iterate is human to Recurse divine
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #7 στις: 23 Ιούν 2015, 10:49:56 πμ »
Δημήτρη, συμπληρωματικά το έγραψα σε αυτά που είπες, μάλλον δεν το διατύπωσα καλά
 
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2392
  • I 'm not young enough to know everything
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #8 στις: 23 Ιούν 2015, 12:58:15 μμ »
2η απορία.  :P
Για ποιό λόγω στη C η αρίθμηση των κελιών σε έναν πίνακα ξεκινάει το ρημάδι από 0; Έχει κάποια πλεονεκτήματα αυτό σε σχέση με την Pascal που ξεκινάει από 1 όπως και στη Γλώσσα;

Χωρίς να διαφωνώ σε τίποτα με τους άλλους, δίνω και ένα παράδειγμα που εμφανίστηκε μέσα στα πλαίσια της ΑΕΠΠ, που δείχνει πόσο πιο εύκολο είναι να λυθεί ένα πρόβλημα με την αρίθμηση να αρχίζει από το 0 αντί για το 1. Στο πρώτο μήνυμα είναι η εκφώνηση και αμέσως από κάτω γράφω μια λύση. Δες το σκεπτικό. Φαίνεται καθαρά ότι το πρόβλημα είναι η αρχική τιμή. Τα div/mod ξεκινούν από 0 ενώ στο πρόβλημα η αρίθμηση ξεκινάει από 1.

http://alkisg.mysch.gr/steki/index.php?topic=194.msg1210#msg1210

Το φαινόμενο αυτό περιγράφεται  στο link του Ευριπίδη (είναι στο δεύτερο link η πρώτη κουκίδα).
Γιώργος Παπαργύρης (gpapargi@hotmail.com)

Katsadouros_Dhm

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 370
Απ: Επανάλαβε....Μέχρις_ότου
« Απάντηση #9 στις: 23 Ιούν 2015, 01:57:40 μμ »
Ευριπίδη, σε όσα συμπλήρωσες έχεις δίκιο, το μήνυμα μέσα στην else ότι τελειώνει εκεί το loop δεν είναι σωστό, αφού δεν καλύπτει όλες τις περιπτώσεις.

Για να προχωρήσω λίγο την κουβέντα, νομίζω ότι το επόμενο βήμα της ΑΕΠΠ θα πρέπει να είναι η Python.
Έχει όλα τα ... προσόντα για να αγαπηθεί από μαθητές και καθηγητές.
Μια -προσωπική - μικρή ένσταση έχω, τη μη χρήση άγκιστρων ή ερωτηματικών για να δηλωθεί η αρχή και το τέλος μιας πρότασης και η αντικατάστασή τους από εσοχές.
Αυτό μπορεί να κάνει τη γλώσσα εξαιρετικά απλή για τον προγραμματιστή, αλλά δεν ξέρω σε επίπεδο τάξης πόσο θα είναι εύχρηστο από τους μαθητές. Θα πρέπει οι ασκήσεις στο τετράδιο να λύνονται με ... χάρακα.