Λογική συνθήκη για τερματισμό επανάληψης

Ξεκίνησε από nikolasmer, Χθες στις 10:10:08 ΠΜ

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

nikolasmer

Θα ήθελα να ρωτήσω αν είναι παιδαγωγικά πιο εύπεπτο στους μαθητές η χρήση λογικής μεταβλητής για τερματισμό επανάληψης. Και σε περιπτώσεις με τιμή φρουρό και σε περιπτώσεις με όριο και γενικότερα. 
Μερεντίτης Νικόλαος
Πληροφορικός

pgrontas

Εννοείς αντί να γράψουν π.χ. ΜΕΧΡΙΣ_ΟΤΟΥ βρεθηκε=ΑΛΗΘΗΣ να γράψουν ΜΕΧΡΙΣ_ΟΤΟΥ βρεθηκε σκέτο;

Δεν τους είναι πιο εύπεπτο. Προσωπικά αν και τους εξηγώ τον πλεονασμό, δεν φαίνεται να τους κάθεται καλά. Ίσως το συνηθίζουν από τα φροντιστήρια και μετά πρέπει να το ξεσυνηθίσουν.
Φέτος, μάλιστα ένας καλός μαθητής που έχω, όταν τους το ανέφερα, είχε μια στιγμή 'ίδωμεν το φώς το αληθινο' :angel: :angel: :angel: .
Ίσως πρέπει να μπει κάποιο θέμα πανελληνίων σχετικό  >:D >:D >:D

Πάντως γενικά οι μαθητές δεν συμπαθούν τις λογικές μεταβλητές. Προτιμούν πλήθος = 0 κτλ.
Αν κατάλαβα καλά τι εννοείς.


Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

George Eco

Παράθεση από: pgrontas στις Χθες στις 10:37:27 ΠΜΔεν τους είναι πιο εύπεπτο. Προσωπικά αν και τους εξηγώ τον πλεονασμό, δεν φαίνεται να τους κάθεται καλά. Ίσως το συνηθίζουν από τα φροντιστήρια και μετά πρέπει να το ξεσυνηθίσουν.

Πάντως γενικά οι μαθητές δεν συμπαθούν τις λογικές μεταβλητές. Προτιμούν πλήθος = 0 κτλ.
Αν κατάλαβα καλά τι εννοείς.

Όλα έχουν να κάνουν εδώ με το διδάσκοντα. Θα πρέπει, κατά τη γνώμη μου πάντα, να εξηγεί το πλεονασμό ΜΕΧΡΙΣ_ΟΤΟΥ χ = ΑΛΗΘΗΣ ( ο οποίος είναι safe ) κι επίσης θα πρέπει να δείχνει και τις εναλλακτικές δυνατές λύσεις ώστε τα παιδιά να βλέπουν διάφορες προσεγγίσεις. Δε ξέρουν τι θα αντικρύσουν στις Πανελλήνιες και δε ξέρουν τι θα απαιτείται. Όσο πιο ευρύ το φάσμα των λύσεων που συζητείται τόσο το καλύτερο.
Όντως οι μαθητές αποφεύγουν τις λογικές μεταβλητές.
Στην αναζήτηση το κάνω εγώ αυτό.
Μπορείς να βάλεις μια λογική μεταβλητή found.
Εναλλακτικά όμως, επειδή τη θέση που βρέθηκε τη θέλουμε συνήθως ( i βρεθηκε το συμβολίζω ιβ)  κάνω και το εξής:
Αρχικοποιώ τη ιβ  <-  -1 που είναι απαράδεκτη τιμή για δείκτη πίνακα.
Αν το ιβ  <>  -1 σημαίνει πως βρέθηκε και δε χρησιμοποιούν λογική μεταβλητή. Είναι πλεονασμός λογική μεταβλητή. ΑΛΛΑ ΣΤΟ ΒΙΒΛΙΟ ΕΤΣΙ ΤΟ ΥΛΟΠΟΙΕΙ.
Άρα; Κάνω και τα δύο.
 
Καθένα παιδί, αν ΞΕΡΕΙ και τα δύο, ας κάνει ό,τι θέλει.



pgrontas

Για μένα είναι πολύ σημαντικά τα ονόματα των μεταβλητών.
Όπως λέει και το quote μου 'Οι αλγόριθμοι πρέπει να μπορούν να διαβάζονται'.

Με αυτή την έννοια δεν μου αρέσει καθόλου η πρακτική του βιβλίου που στην αναζήτηση αλλά και σε άλλα σημεία (found, flag, top κλπ.) κάνει ανάμιξη εντολών στα ελληνικά, μεταβλητών στα αγγλικά κλπ.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

petrosp13

Παράθεση από: pgrontas στις Χθες στις 10:37:27 ΠΜ Ίσως το συνηθίζουν από τα φροντιστήρια και μετά πρέπει να το ξεσυνηθίσουν.

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

Όντως τους χαλάει η χρήση λογικής μεταβλητής και προτιμούν λύση με πλήθος
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

nikolasmer

Δεν εννοούσα το παραπάνω. (Το αν θα βάλουμε και σχεσιακό τελεστή εννοώ).

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

pgrontas

Δηλαδή αυτό;

ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
                ...
                ΑΝ ... τότε
                      ΒΓΕΣ<- ΑΛΗΘΗΣ
                ΤΕΛΟΣ_ΑΝ
                ... 
ΜΕΧΡΙΣ_ΟΤΟΥ ΒΓΕΣ(=ΑΛΗΘΗΣ)

Αν και μου φαίνεται ότι είναι γενικά και υπό προϋποθέσεις καλύτερη πρακτική, λόγω της αρχής της τοπικότητας (αποφασίζω να βγω όταν παραβιάζεται η συνθήκη και όχι πιο κάτω), νομίζω ότι όχι δεν θα το καταλάβαιναν καλύτερα τα παιδιά, λόγω αφενός της αποστροφής τους προς τις λογικές μεταβλητές και αφετέρου του καθιερωμένου τρόπου διδασκαλίας (συνήθεια).
Βέβαια αυτά μπορούν να αλλάξουν - μιλάω για την παρούσα κατάσταση.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

nikolasmer

Για το δεύτερο που λες Παναγιώτη με ενδιαφέρει . Αξίζει να το προσπαθήσουμε ή διδακτικά θα δυσκολέψει το μαθητή. Έχουμε κάτι σχετικό καμία έρευνα κάτι , που να θέλει αυτό τον τρόπο να είναι καλύτερος ;
Μερεντίτης Νικόλαος
Πληροφορικός

pgrontas

Νικο, δεν ξέρω κάτι.
Αυτό που με προβληματίζει είναι ότι δε σε πετάει κατευθείαν έξω όπως η break, αλλά περιμένεις να φτάσεις στη συνθήκη. Ανάλογα με τις ενδιάμεσες εντολές ενδεχομένως να υπάρχει κίνδυνος να εκτεθείς σε λογικά λάθη.
Αυτό που θα πρέπει να καλλιεργήσουμε είναι το να γράφουν τις εντολές που επηρεάζουν τη συνθήκη, όσο πιο κοντά σε αυτή γίνεται. Και τότε δε θα έχει τόσο σημασία η χρήση της λογικής μεταβλητής.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

petrosp13

Ποιος είναι ο λόγος να ελέγξεις κάτι εντός επανάληψης και να χρησιμοποιήσεις λογική μεταβλητή αντί να γράψεις κατευθείαν την συνθήκη τερματισμού/επανάληψης;
Η μικρότερη συνθήκη;
Έτσι προστίθενται αχρείαστες εντολές εντός επανάληψης
Αν και γενικά όλα αυτά είναι υποκειμενικά όπως τα περισσότερα στον προγραμματισμό
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

nikolasmer

Αντιγράφω απο GPT
LIMIT = 10.30   # όριο πρόκρισης
MAX_TRIES = 5   # μέγιστες προσπάθειες

students = []   # λίστα με στοιχεία (όνομα, καλύτερη επίδοση, προσπάθειες, προκρίθηκε)

while True:
    name = input("Δώσε όνομα μαθητή (ή ΤΕΛΟΣ): ")
    if name.upper() == "ΤΕΛΟΣ":
        break

    best_throw = 0
    qualified = False
    tries_used = 0

    # Διαβάζουμε μέχρι 5 προσπάθειες
    for i in range(1, MAX_TRIES + 1):
        distance = float(input(f"Προσπάθεια {i} σε μέτρα: "))
        tries_used += 1
        if distance > best_throw:
            best_throw = distance

        if distance >= LIMIT:
            qualified = True
            break   # σταματάει όταν περάσει το όριο

    students.append((name, best_throw, tries_used, qualified))


# --- Αποτελέσματα για κάθε μαθητή ---
print("\n--- ΑΠΟΤΕΛΕΣΜΑΤΑ ΜΑΘΗΤΩΝ ---")
for name, best, tries, qualified in students:
    if qualified:
        print(f"{name}: ΠΡΟΚΡΙΝΕΤΑΙ με {best} μέτρα σε {tries} προσπάθειες.")
    else:
        print(f"{name}: ΔΕΝ ΠΡΟΚΡΙΝΕΤΑΙ. Καλύτερη επίδοση: {best} μέτρα.")


# --- Δύο καλύτερες επιδόσεις ---
print("\n--- ΔΥΟ ΚΑΛΥΤΕΡΕΣ ΕΠΙΔΟΣΕΙΣ ---")

# ταξινόμηση κατά επίδοση (φθίνουσα)
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)

top2 = sorted_students[:2]

for s in top2:
    print(f"{s
}: {s[1]} μέτρα")
# --- Ποσοστό προκριθέντων ---
total = len(students)
qualified_count = sum(1 for s in students if s[3] == True)
if total > 0:
    percentage = (qualified_count / total) * 100
else:
    percentage = 0
print(f"\nΠοσοστό μαθητών που προκρίθηκαν: {percentage:.2f}%")

Αυτή είναι η λύση για το θέμα Γ 2025
Μερεντίτης Νικόλαος
Πληροφορικός

nikolasmer

και χωρίς λίστες
LIMIT = 10.30
MAX_TRIES = 5

total_students = 0          # σύνολο μαθητών
qualified_students = 0      # πόσοι προκρίθηκαν

best1_name = ""
best2_name = ""
best1_score = -1
best2_score = -1

while True:
    name = input("Δώσε όνομα μαθητή (ή ΤΕΛΟΣ): ")

    if name.upper() == "ΤΕΛΟΣ":
        break

    total_students += 1

    best_throw = 0
    qualified = False
    tries_used = 0

    # έως 5 προσπάθειες
    for i in range(1, MAX_TRIES + 1):
        distance = float(input(f"Προσπάθεια {i} σε μέτρα: "))
        tries_used += 1

        if distance > best_throw:
            best_throw = distance

        if distance >= LIMIT:
            qualified = True
            break

    # --- Αποτελέσματα για τον μαθητή ---
    if qualified:
        print(f"{name}: ΠΡΟΚΡΙΝΕΤΑΙ με {best_throw} μέτρα σε {tries_used} προσπάθειες.")
        qualified_students += 1
    else:
        print(f"{name}: ΔΕΝ ΠΡΟΚΡΙΝΕΤΑΙ. Καλύτερη επίδοση: {best_throw} μέτρα.")

    # --- Ενημέρωση δύο καλύτερων επιδόσεων ---
    if best_throw > best1_score:
        best2_score = best1_score
        best2_name = best1_name
        best1_score = best_throw
        best1_name = name
    elif best_throw > best2_score:
        best2_score = best_throw
        best2_name = name


# --- Δύο καλύτερες επιδόσεις ---
print("\n--- ΔΥΟ ΚΑΛΥΤΕΡΕΣ ΕΠΙΔΟΣΕΙΣ ---")
if best1_score >= 0:
    print(f"1η καλύτερη: {best1_name} με {best1_score} μέτρα")
if best2_score >= 0:
    print(f"2η καλύτερη: {best2_name} με {best2_score} μέτρα")

# --- Ποσοστό προκριθέντων ---
if total_students > 0:
    percentage = qualified_students * 100 / total_students
else:
    percentage = 0

print(f"\nΠοσοστό μαθητών που προκρίθηκαν: {percentage:.2f}%")
Μερεντίτης Νικόλαος
Πληροφορικός

nikolasmer

Δεν έχω εξετάσει την ορθότητα της λύσης απλά αναρωτιέμαι γιατί το LLM προτείνει αυτό σαν λύση. Οι προτροπές που του έδωσε δεν ήταν προς αυτή την κατεύθυνση . Μάλλον ήταν "λύσε μου αυτό το θέμα" και μόνο αυτό και μετά του ζήτησα χωρίς λίστες. Αυτό το γιατί με τρώει. Γιατί έχει μάθει σε αυτό τον τρόπο λύσης; Είναι πιο αποδοτικός; Ακολουθείται και εφαρμόζεται από προγραμματιστές ανα την υφήλιο;
Just that.



Στη συνομιλία όταν του ζήτησα να κάνει μετατροπή σε ΓΛΩΣΣΑ μου είπε: "... Σε ΓΛΩΣΣΑ ΔΕΝ υπάρχει
while True
, οπότε η ακριβής ισοδύναμη μεταφορά γίνεται με ατέρμονη επανάληψη και έλεγχο διακοπής με flag/έλεγχο στο τέλος......"
Μερεντίτης Νικόλαος
Πληροφορικός

pgrontas

Δεν μπορούμε να ξέρουμε Νίκο, γιατί έβγαλε αυτή τη λύση.

Μία θεωρία είναι αυτό που είπες, ότι εμφανίζεται πιο πολύ στα δεδομένα μάθησης.
Μία άλλη θεωρία ότι είναι ο κώδικας που σου έβγαλε είναι πιο κοντά στην εκφώνηση λεκτικά π.χ.  το "θα ολοκληρώνεται όταν δοθεί για όνομα του μαθητή η λέξη 'ΤΕΛΟΣ' " ταιριάζει πιο πολύ με το "if  == ΤΕΛΟΣ και break"  παρά με το "while !="
Μία άλλη θεωρία είναι ότι είναι πιο απλό, άρα πιο εύκολο (φθηνό) να παραχθεί.

Τα LLMs είναι από τη φύση τους black boxes και τα διάφορα optimizations που τους βάζουν περιπλέκουν την κατάσταση ακόμα περισσότερο.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

nikolasmer

Παράθεση από: pgrontas στις Χθες στις 06:57:00 ΜΜΔεν μπορούμε να ξέρουμε Νίκο, γιατί έβγαλε αυτή τη λύση.

Μία θεωρία είναι αυτό που είπες, ότι εμφανίζεται πιο πολύ στα δεδομένα μάθησης.
Μία άλλη θεωρία ότι είναι ο κώδικας που σου έβγαλε είναι πιο κοντά στην εκφώνηση λεκτικά π.χ.  το "θα ολοκληρώνεται όταν δοθεί για όνομα του μαθητή η λέξη 'ΤΕΛΟΣ' " ταιριάζει πιο πολύ με το "if  == ΤΕΛΟΣ και break"  παρά με το "while !="
Μία άλλη θεωρία είναι ότι είναι πιο απλό, άρα πιο εύκολο (φθηνό) να παραχθεί.

Τα LLMs είναι από τη φύση τους black boxes και τα διάφορα optimizations που τους βάζουν περιπλέκουν την κατάσταση ακόμα περισσότερο.
Ευχαριστώ για την κατατοπιστικότατη απάντηση φίλε. 
Μερεντίτης Νικόλαος
Πληροφορικός