Demora Δημοσ. 7 Νοεμβρίου 2022 Δημοσ. 7 Νοεμβρίου 2022 (επεξεργασμένο) vhma = (input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό: ")) while not vhma[1].isdigit(): vhma = input("Έδωσες λάθος επιλογή, το δεύτερο ψηφίο πρέπει να είναι ακέραιος αριθμός: ") break Ο χρήστης εισάγει 2 χαρακτήρες που ο 2ος πρέπει να είναι αριθμός. Καμία ιδέα γιατί δεν λειτουργεί αυτό που έχω κάνει και καμιά υπόδειξη προς το σωστό; Bασικά τώρα που το σκέφτομαι δεν είναι και σωστό σαν λογική, γιατί δεν πρέπει απαραίτητα να είναι 2 χαρακτήρες. Απαραίτητα πρέπει να ελέγξω από το 2ο ψηφίο και όσα μπουν να είναι ψηφία. Οπότε θα το σκεφτώ και θα επανέρθω. Κάτι με την for φαντάζομαι πρέπει να κάνω ε; Επεξ/σία 7 Νοεμβρίου 2022 από [email protected]
masteripper Δημοσ. 7 Νοεμβρίου 2022 Δημοσ. 7 Νοεμβρίου 2022 (επεξεργασμένο) βγάλε το break... και αν και δεν πειράζει τις παρενθέσεις στο 1ο input Επεξ/σία 7 Νοεμβρίου 2022 από masteripper
Demora Δημοσ. 7 Νοεμβρίου 2022 Μέλος Δημοσ. 7 Νοεμβρίου 2022 43 λεπτά πριν, masteripper είπε βγάλε το break... και αν και δεν πειράζει τις παρενθέσεις στο 1ο input noted. # έλεγχος αν οι επόμενοι χαρακτήρες είναι ψηφία for i in range(1,len(vhma)): if not vhma[i].isdigit(): vhma = input("Έδωσες λάθος επιλογή, το δεύτερο σκέλος πρέπει να είναι ακέραιος αριθμός: ") break αυτό έχει καθόλου λογική; πρέπει να ελέγξω από το 2ο ψηφίο και μετά όσα μπουν να είναι ψηφία.
Επισκέπτης Δημοσ. 7 Νοεμβρίου 2022 Δημοσ. 7 Νοεμβρίου 2022 (επεξεργασμένο) 41 λεπτά πριν, [email protected] είπε noted. # έλεγχος αν οι επόμενοι χαρακτήρες είναι ψηφία for i in range(1,len(vhma)): if not vhma[i].isdigit(): vhma = input("Έδωσες λάθος επιλογή, το δεύτερο σκέλος πρέπει να είναι ακέραιος αριθμός: ") break αυτό έχει καθόλου λογική; πρέπει να ελέγξω από το 2ο ψηφίο και μετά όσα μπουν να είναι ψηφία. Αυτό έχει μεν λογική, αλλά: Το break σου στο σημείο που είναι θα επενεργήσει κατευθείαν στο βρόχο, χωρίς να ασχοληθεί με το τι γίνεται στην if. Αυτό τι σημαίνει ακριβώς; Έστω η αρχική μου είσοδος είναι το (λανθασμένο) n2r Tότε: i = 1 if not vhma[1].isdigit(): [== το 2 είναι ψηφίο, οπότε δεν μπαίνουμε στο if] break [== ο βρόχος μας σπάει, και δεν ξαναμπαίνουμε. Το τρίτο ψηφίο δεν θα ελεγχθεί] Επεξ/σία 7 Νοεμβρίου 2022 από Orestis_G
Demora Δημοσ. 7 Νοεμβρίου 2022 Μέλος Δημοσ. 7 Νοεμβρίου 2022 Δεν έχω καταλάβει τελικά πότε πρέπει να βάζω break. Μήπως μέχρι να καταλάβω καλύτερα να μη βάζω break? 4 λεπτά πριν, Orestis_G είπε Αυτό έχει μεν λογική, αλλά: Το break σου στο σημείο που είναι θα επενεργήσει κατευθείαν στο βρόχο, χωρίς να ασχοληθεί με το τι γίνεται στην if. Αυτό τι σημαίνει ακριβώς; Έστω η αρχική μου είσοδος είναι το (λανθασμένο) n2r Tότε: i = 1 if not vhma[1].isdigit(): [== το 2 είναι ψηφίο, οπότε δεν μπαίνουμε στο if] break [== ο βρόχος μας σπάει, και δεν ξαναμπαίνουμε. Το τρίτο ψηφίο δεν θα ελεγχθεί] Α πρέπει να βάλω το break στοιχισμένο με την for η καθόλου;
Επισκέπτης Δημοσ. 7 Νοεμβρίου 2022 Δημοσ. 7 Νοεμβρίου 2022 (επεξεργασμένο) To break κάνει κάτι πολύ απλό. Σπάει το βρόχο, οπότε οι επαναλήψεις παύουν. Εσύ θέλεις να ελέγξεις όλο το βρόχο, εκτός αν βρεις κάτι που δεν είναι ψηφίο κάπου στο δρόμο, οπότε ξέρεις ότι η είσοδος που πήρες είναι λάθος, άρα δεν έχει νόημα να συνεχίζεις να ψάχνεις. Πότε λοιπόν πρέπει να σπάσεις τις επαναλήψεις; Όταν βρεις το πρόβλημα, δηλαδή μέσα στο if. Το δεύτερο πρόβλημα στο πρόγραμμα, είναι ότι αν βρεις πρόβλημα, τότε παίρνεις άλλη είσοδο, την οποία όμως δεν ελέγχεις κάπου. Με άλλα λόγια, ό,τι και να γίνει έχεις δεχτεί ό,τι σου δίνουν. Ο έλεγχος θα πρέπει να επαναλαμβάνεται μέχρι να πάρεις εντελώς σωστή είσοδο. @[email protected] Μία λύση είναι να χρησιμοποιήσεις ένα while για να ζητάς την σωστή απάντηση όσο παίρνεις λάθος, ενώ μέσα σε αυτό θα έχεις ένα for που θα τσεκάρει τα ψηφία. Δεν θέλω να στο δώσω έτοιμο, γιατί καλό είναι να πιάσεις το μηχανισμό, αλλά αν έχεις κολλήσει τελείως μπορώ να σου εξηγήσω τι παίζει. Επεξ/σία 7 Νοεμβρίου 2022 από Orestis_G
virxen75 Δημοσ. 7 Νοεμβρίου 2022 Δημοσ. 7 Νοεμβρίου 2022 μπορείς να χρησιμοποιήσεις την isnumeric() >>> a="r55555" >>> b="r555g555" >>> a[1:] '55555' >>> b[1:] '555g555' >>> a[1:].isnumeric() True >>> b[1:].isnumeric() False >>> 1
Donacgreece Δημοσ. 7 Νοεμβρίου 2022 Δημοσ. 7 Νοεμβρίου 2022 (επεξεργασμένο) while True: vhma = input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό:") if vhma == "": print("ΕΞΟΔΟΣ") break elif bhma[0] in #την μεταβλητή σου για το κάτω# and bhma[1:].isdigit(): #οι ενέργειες που πρέπει να κάνει #Αυτό επανέλαβε το για όλες τις περιπτώσεις ... Επεξ/σία 7 Νοεμβρίου 2022 από Donacgreece 1
Demora Δημοσ. 8 Νοεμβρίου 2022 Μέλος Δημοσ. 8 Νοεμβρίου 2022 (επεξεργασμένο) 11 ώρες πριν, Donacgreece είπε while True: vhma = input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό:") if vhma == "": print("ΕΞΟΔΟΣ") break elif bhma[0] in #την μεταβλητή σου για το κάτω# and bhma[1:].isdigit(): #οι ενέργειες που πρέπει να κάνει #Αυτό επανέλαβε το για όλες τις περιπτώσεις ... A τι ωραίος και συμπτυγμένος κώδικας. Εγώ αυτό το έγραψα σε 30 σειρές while after while after while και το ιδιο με if 😛 Tεσπα, πεδεύτηκα αρκετά για να το αλλάξω τώρα και αφού λειτουργεί έστω και γραμμένο σαν noob θα τον αφήσω. noob είμαι εξάλλου. Σε ευχαριστώ πάντως. Επεξ/σία 8 Νοεμβρίου 2022 από [email protected]
Donacgreece Δημοσ. 8 Νοεμβρίου 2022 Δημοσ. 8 Νοεμβρίου 2022 1 ώρα πριν, [email protected] είπε A τι ωραίος και συμπτυγμένος κώδικας. Εγώ αυτό το έγραψα σε 30 σειρές while after while after while και το ιδιο με if 😛 Tεσπα, πεδεύτηκα αρκετά για να το αλλάξω τώρα και αφού λειτουργεί έστω και γραμμένο σαν noob θα τον αφήσω. noob είμαι εξάλλου. Σε ευχαριστώ πάντως. ναι, αν λειτουργεί μη πειράζεις τίποτα. Την ίδια εργασία κάναμε...
Επισκέπτης Δημοσ. 8 Νοεμβρίου 2022 Δημοσ. 8 Νοεμβρίου 2022 (επεξεργασμένο) @[email protected] Μιας και λειτούργησε πλέον, ας δοκιμάσω να δώσω μία ανάλυση, έτσι, για λόγους πληρότητας. Σχόλια ευπρόσδεκτα! Κατ' αρχάς βλέπουμε ήδη 2 συναρτήσεις που ψάχνουν για ψηφία: isdigit() και isnumeric(). Υπάρχει όμως και τρίτη, η isdecimal(). Οι διαφορές είναι στο ότι οι 2 πρώτες δέχονται και κάποιους επιπλέον χαρακτήρες (π.χ. εκθέτες, ρωμαϊκά ψηφία κ.λπ). Στο δικό σου σενάριο δεν θα έχεις θέμα, εν τούτοις η πιο "αυστηρή" (δέχεται μόνο αριθμούς με βάση το 10) είναι η isdecimal(). directions = ["u","d","l","r"] while True: vhma = input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό:") if vhma == "": print("Τερματισμός από χρήστη") quit() if vhma[0] in directions and vhma[1:].isdecimal(): break # Από εδώ και κάτω προχωράς με ό,τι άλλο θέλεις να κάνει το πρόγραμμα. Τι γίνεται εδώ, και που διαφοροποιούμαι από τους προλαλήσαντεςγράψαντες: Κρατάω τον while True βρόχο του @Donacgreece, o οποίος απλά μεταφράζεται ως "Επανάλαβε για πάντα". Παίρνοντας την είσοδο, ελέγχουμε αν είναι κενή, οπότε τερματίζουμε με την quit(). Δεδομένου ότι το πρόγραμμα θα τερματιστεί εκεί, δεν χρειάζεται else στην επόμενη γραμμή. Κατόπιν ελέγχουμε 2 πράγματα: 1) Ο πρώτος χαρακτήρας δείχνει κατεύθυνση; 2) Οι επόμενοι είναι αριθμοί; Αν όλα είναι καλά, σπάμε το βρόχο και προχωράμε στο κύριο μέρος του προγράμματος. Προτιμώ να μην κρατώ το κυρίως πρόγραμμα μέσα στον while True βρόχο Πάμε τώρα σε κάτι ενδιαφέρον. Ερώτηση: Τι γίνεται αν δώσεις έναν χαρακτήρα σαν είσοδο; Δεν θα πρέπει να ελέγξεις το μήκος αν είναι από 2 και επάνω; Δεν θα κρασάρει όταν ελέγχονται οι επόμενοι χαρακτήρες (που δεν υπάρχουν); Δηλαδή αν π.χ. vhma == "a" τότε το vhma[1:] είναι εκτός του string. Αν ας πούμε γράψεις vhma[1] θα πάρεις ένα ωραιότατο IndexError: string index out of range Απάντηση: Η λειτουργία του slicing είναι έτσι σχεδιασμένη, ώστε αν το slice που ζητηθεί βρίσκεται εκτός ορίων, θα επιστρέψει κενό string, το οποίο θα απορριφθεί από την isdecimal() Επεξ/σία 8 Νοεμβρίου 2022 από Orestis_G
Donacgreece Δημοσ. 8 Νοεμβρίου 2022 Δημοσ. 8 Νοεμβρίου 2022 7 λεπτά πριν, Orestis_G είπε @[email protected] Μιας και λειτούργησε πλέον, ας δοκιμάσω να δώσω μία ανάλυση, έτσι, για λόγους πληρότητας. Σχόλια ευπρόσδεκτα! Κατ' αρχάς βλέπουμε ήδη 2 συναρτήσεις που ψάχνουν για ψηφία: isdigit() και isnumeric(). Υπάρχει όμως και τρίτη, η isdecimal(). Οι διαφορές είναι στο ότι οι 2 πρώτες δέχονται και κάποιους επιπλέον χαρακτήρες (π.χ. εκθέτες, ρωμαϊκά ψηφία κ.λπ). Στο δικό σου σενάριο δεν θα έχεις θέμα, εν τούτοις η πιο "αυστηρή" (δέχεται μόνο αριθμούς με βάση το 10) είναι η isdecimal(). directions = ["u","d","l","r"] while True: vhma = input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό:") if vhma == "": print("Τερματισμός από χρήστη") quit() if vhma[0] in directions and vhma[1:].isdecimal(): break # Από εδώ και κάτω προχωράς με ό,τι άλλο θέλεις να κάνει το πρόγραμμα. Τι γίνεται εδώ, και που διαφοροποιούμαι από τους προλαλήσαντεςγράψαντες: Κρατάω τον while True βρόχο του @Donacgreece, o οποίος απλά μεταφράζεται ως "Επανάλαβε για πάντα". Παίρνοντας την είσοδο, ελέγχουμε αν είναι κενή, οπότε τερματίζουμε με την quit(). Δεδομένου ότι το πρόγραμμα θα τερματιστεί εκεί, δεν χρειάζεται else στην επόμενη γραμμή. Κατόπιν ελέγχουμε 2 πράγματα: 1) Ο πρώτος χαρακτήρας δείχνει κατεύθυνση; 2) Οι επόμενοι είναι αριθμοί; Αν όλα είναι καλά, σπάμε το βρόχο και προχωράμε στο κύριο μέρος του προγράμματος. Προτιμώ να μην κρατώ το κυρίως πρόγραμμα μέσα στον while True βρόχο Πάμε τώρα σε κάτι ενδιαφέρον. Ερώτηση: Τι γίνεται αν δώσεις έναν χαρακτήρα σαν είσοδο; Δεν θα πρέπει να ελέγξεις το μήκος αν είναι από 2 και επάνω; Δεν θα κρασάρει όταν ελέγχονται οι επόμενοι χαρακτήρες (που δεν υπάρχουν); Δηλαδή αν π.χ. vhma == "a" τότε το vhma[1:] είναι εκτός του string. Αν ας πούμε γράψεις vhma[1] θα πάρεις ένα ωραιότατο IndexError: string index out of range Απάντηση: Η λειτουργία του slicing είναι έτσι σχεδιασμένη, ώστε αν το slice που ζητηθεί βρίσκεται εκτός ορίων, θα επιστρέψει κενό string, το οποίο θα απορριφθεί από την isdecimal() Το έχω κάνει με εντελώς άλλη φιλοσοφία αλλά φαντάζομαι πως λειτουργεί και αυτό. Μια ερώτηση μόνο. Πώς θα καταλάβει με το if in directions που έχεις βάλει ποιο από όλα είναι ώστε να κάνει πρόσθεση η αφαίρεση στο Χ η το ψ ...
Επισκέπτης Δημοσ. 8 Νοεμβρίου 2022 Δημοσ. 8 Νοεμβρίου 2022 Αυτό που γίνεται εδώ είναι ο έλεγχος της εισόδου. Στο κυρίως πρόγραμμα θα μπει o έλεγχος του τι είναι στην πραγματικότητα. π.χ. direction, steps = vhma[0], int(vhma[1:]) if direction == "u": y -= steps elif direction == "d": y += steps elif direction == "l": x -= steps else: x += steps
Demora Δημοσ. 8 Νοεμβρίου 2022 Μέλος Δημοσ. 8 Νοεμβρίου 2022 36 λεπτά πριν, Donacgreece είπε ναι, αν λειτουργεί μη πειράζεις τίποτα. Την ίδια εργασία κάναμε... Kατι είχα καταλάβει! Θα σε έχω απο κοντά για την ομαδική τότε, να με κουβαλήσεις Αν κάνει κάποιος μια αναζήτηση νομίζω του λύσαμε την άσκηση 😛 Toυς υπόλοιπους ελέγχους γενικά τους είχα κάνει εκτός αυτού που επικόλλησα, αλλά με πέδευε το πως θα ελέγξω από το 2ο ψηφίο και μετά το να είναι όλα τα υπόλοια ψηφία. Είμαι πολύ νέα σε αυτό και προσπαθώ να αντιληφθώ πως λειτουργεί το θέμα των βρόγχων, ειδικά στο πότε τερματίζονται και πότε πρέπει να δώσω νέα εντολή εκχώρησης. Φαντάζομαι με την εξάσκηση θα μπω στο κλίμα, αλλά με έχουν φάει παράλληλα και οι διανυσματικοί χώροι 😛 και το μυαλό μου έχει γίνει κομμάτια. Σας ευχαριστώ πάντως! Νομίζω αυτή η τριβή με βοήθησε, όχι τόσο για την εργασία...κλαιν μαιν, αλλά για να ασχολούμαι λίγο παραπάνω με python. ΥΓ. πως αλλάζει το όνομα στο forum?
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα