Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)
vhma = (input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό: "))
while not vhma[1].isdigit():
    vhma = input("Έδωσες λάθος επιλογή, το δεύτερο ψηφίο πρέπει να είναι ακέραιος αριθμός: ")
    break

Ο χρήστης εισάγει 2 χαρακτήρες που ο 2ος πρέπει να είναι αριθμός. 

Καμία ιδέα γιατί δεν λειτουργεί αυτό που έχω κάνει και καμιά υπόδειξη προς το σωστό;

 

Bασικά τώρα που το σκέφτομαι δεν είναι και σωστό σαν λογική, γιατί δεν πρέπει απαραίτητα να είναι 2 χαρακτήρες. Απαραίτητα πρέπει να ελέγξω από το 2ο ψηφίο και όσα μπουν να είναι ψηφία. Οπότε θα το σκεφτώ και θα επανέρθω. Κάτι με την for φαντάζομαι πρέπει να κάνω ε;

Επεξ/σία από [email protected]
Δημοσ. (επεξεργασμένο)

βγάλε το break...

και αν και δεν πειράζει τις παρενθέσεις στο 1ο input

 

Επεξ/σία από masteripper
Δημοσ.
43 λεπτά πριν, masteripper είπε

βγάλε το break...

και αν και δεν πειράζει τις παρενθέσεις στο 1ο input

 

noted.

# έλεγχος αν οι επόμενοι χαρακτήρες είναι ψηφία
for i in range(1,len(vhma)):
    if not vhma[i].isdigit():
        vhma = input("Έδωσες λάθος επιλογή, το δεύτερο σκέλος πρέπει να είναι ακέραιος αριθμός: ")
    break

αυτό έχει καθόλου λογική; πρέπει να ελέγξω από το 2ο ψηφίο και μετά όσα μπουν να είναι ψηφία.

Δημοσ. (επεξεργασμένο)
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 [== ο βρόχος μας σπάει, και δεν ξαναμπαίνουμε. Το τρίτο ψηφίο δεν θα ελεγχθεί]

 

Επεξ/σία από Orestis_G
Δημοσ.

Δεν έχω καταλάβει τελικά πότε πρέπει να βάζω break. Μήπως μέχρι να καταλάβω καλύτερα να μη βάζω break? 

4 λεπτά πριν, Orestis_G είπε

Αυτό έχει μεν λογική, αλλά:

Το break σου στο σημείο που είναι θα επενεργήσει κατευθείαν στο βρόχο, χωρίς να ασχοληθεί με το τι γίνεται στην if. Αυτό τι σημαίνει ακριβώς;
Έστω η αρχική μου είσοδος είναι το (λανθασμένο) n2r

Tότε:

i = 1
if not vhma[1].isdigit():  [== το 2  είναι ψηφίο, οπότε δεν μπαίνουμε στο if]
break [== ο βρόχος μας σπάει, και δεν ξαναμπαίνουμε. Το τρίτο ψηφίο δεν θα ελεγχθεί]

 

Α πρέπει να βάλω το break στοιχισμένο με την for η καθόλου; 

Δημοσ. (επεξεργασμένο)

To break κάνει κάτι πολύ απλό. Σπάει το βρόχο, οπότε οι επαναλήψεις παύουν. Εσύ θέλεις να ελέγξεις όλο το βρόχο, εκτός αν βρεις κάτι που δεν είναι ψηφίο κάπου στο δρόμο, οπότε ξέρεις ότι η είσοδος που πήρες είναι λάθος, άρα δεν έχει νόημα να συνεχίζεις να ψάχνεις.

Πότε λοιπόν πρέπει να σπάσεις τις επαναλήψεις; Όταν βρεις το πρόβλημα, δηλαδή μέσα στο if.

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

@[email protected] Μία λύση είναι να χρησιμοποιήσεις ένα while για να ζητάς την σωστή απάντηση όσο παίρνεις λάθος, ενώ μέσα σε αυτό θα έχεις ένα for που θα τσεκάρει τα ψηφία. Δεν θέλω να στο δώσω έτοιμο, γιατί καλό είναι να πιάσεις το μηχανισμό, αλλά αν έχεις κολλήσει τελείως μπορώ να σου εξηγήσω τι παίζει.

Επεξ/σία από Orestis_G
Δημοσ. (επεξεργασμένο)
 while True:
    vhma = input("Δώστε αριθμό βημάτων και κίνηση πάνω, κάτω, αριστερά, δεξία. Πχ. r7, ή κενό χαρακτήρα για τερματισμό:")
    if vhma == "":
        print("ΕΞΟΔΟΣ")
        break

    elif bhma[0] in #την μεταβλητή σου για το κάτω# and bhma[1:].isdigit():
        #οι ενέργειες που πρέπει να κάνει

 

#Αυτό επανέλαβε το για όλες τις περιπτώσεις ...

 

 

Επεξ/σία από Donacgreece
  • Like 1
Δημοσ. (επεξεργασμένο)
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 είμαι εξάλλου.

Σε ευχαριστώ πάντως.

Επεξ/σία από [email protected]
Δημοσ.
1 ώρα πριν, [email protected] είπε

A τι ωραίος και συμπτυγμένος κώδικας. Εγώ αυτό το έγραψα σε 30 σειρές while after while after while και το ιδιο με if 😛 Tεσπα, πεδεύτηκα αρκετά για να το αλλάξω τώρα και αφού λειτουργεί έστω και γραμμένο σαν noob θα τον αφήσω. noob είμαι εξάλλου.

Σε ευχαριστώ πάντως.

ναι, αν λειτουργεί μη πειράζεις τίποτα. Την ίδια εργασία κάναμε...

:-D

Δημοσ. (επεξεργασμένο)

@[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()

Επεξ/σία από Orestis_G
Δημοσ.
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 που έχεις βάλει ποιο από όλα είναι ώστε να κάνει πρόσθεση η αφαίρεση στο Χ η το ψ ...

Δημοσ.

Αυτό που γίνεται εδώ είναι ο έλεγχος της εισόδου. Στο κυρίως πρόγραμμα θα μπει 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

 

Δημοσ.
36 λεπτά πριν, Donacgreece είπε

ναι, αν λειτουργεί μη πειράζεις τίποτα. Την ίδια εργασία κάναμε...

:-D

Kατι είχα καταλάβει! Θα σε έχω απο κοντά για την ομαδική τότε, να με κουβαλήσεις :P

Αν κάνει κάποιος μια αναζήτηση νομίζω του λύσαμε την άσκηση 😛 

Toυς υπόλοιπους ελέγχους γενικά τους είχα κάνει εκτός αυτού που επικόλλησα, αλλά με πέδευε το πως θα ελέγξω από το 2ο ψηφίο και μετά το να είναι όλα τα υπόλοια ψηφία. 

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

Σας ευχαριστώ πάντως! Νομίζω αυτή η τριβή με βοήθησε, όχι τόσο για την εργασία...κλαιν μαιν, αλλά για να ασχολούμαι λίγο παραπάνω με python.

ΥΓ. πως αλλάζει το όνομα στο forum? :P

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...