ΔΙΑΒΑΣΕ σε λογικες μεταβλητες

Ξεκίνησε από otinanai, 14 Νοε 2008, 09:47:07 ΠΜ

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

otinanai

Γειά σας,

Ήθελα να ρωτήσω γιατί δεν επιτρέπεται το διάβασμα λογικής μεταβλητής στον διερμηνευτή. Απο που αντλείται αυτή η πληροφορία;
Το λέει κάπου στο βιβλίο;

Ευχαριστώ.

P.Tsiotakis

Δεν το λέει κάπου το βιβλίο απ΄όσο θυμάμαι).
Πάντως και γω το αποφεύγω μιας και δεν χρησιμοποιούνται για είσοδο δεδομένων οι μεταβλητές αυτές, αλλά σε ελέγχους.

Μπορεί να υπάρχει μια λογική μεταβλητή στην εντολή εισόδου Δεδομένα (αλλά όχι στον διερμηνευτή)

alkisg

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

Στη Διάβασε, είτε σε ψευδογλώσσα είτε σε ΓΛΩΣΣΑ (αλλά και σε πολλές γλώσσες προγραμματισμού), προσωπική μου γνώμη είναι ότι δεν επιτρέπεται. Ο λόγος γι' αυτό είναι ο εξής:

Τι θα πρέπει να γράψει ο χρήστης για να θεωρηθεί ότι έδωσε "ΑΛΗΘΗΣ";

Ας πούμε ότι ο χρήστης θα πρέπει να δώσει "ΑΛΗΘΗΣ" ή "ΨΕΥΔΗΣ" αντίστοιχα.
=> πρώτη αυθαιρεσία.

Έστω ότι το δεχόμαστε αυτό. Αν όμως ο χρήστης δώσει "Αληθής" ή "Αλήθεια" ή "Α" ή "1" ή "ΝΑΙ" ή "ΟΚ"; Τι θα θεωρηθεί τότε ότι έδωσε;
=> ότι και να απαντήσουμε, δεύτερη αυθαιρεσία.

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

evry


Νομίζω ότι σε ψευδογλώσσα το λογικό θα ήταν να δεχτούμε ότι ο χρήστης μπορεί να δώσει Αληθής ή ΑΛΗΘΗΣ για λογική μεταβλητή από τη στιγμή που στο βιβλίο ορίζεται ξεκάθαρα ότι μια λογική μεταβλητή παίρνει αυτές τις 2 τιμές. Φυσικά σε τεχνικό επίπεδο τα πράγματα μπερδεύονται.   Τώρα αν ο χρήστης δώσει '1' ή 'α' ή οτιδήποτε άλλο από αληθής ή ψευδής σε μια λογική μεταβλητή αυτό ισοδυναμεί με το να δώσει ένα χαρακτήρα σε μια ακέραια μεταβλητή που είναι λάθος κατά την είσοδο των δεδομένων.
   Σίγουρα πάντως δεν έχει νόημα να διαβάζει κάποιος μια λογική μεταβλητή.
   
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

nikolasmer

Παράθεση από: alkisg στις 14 Νοε 2008, 03:16:32 ΜΜ
...δεν βρήκα τίποτα απολύτως οπότε ακολούθησα την πεπατημένη των γλωσσών προγραμματισμού.
Πιστεύω όμως ότι δεν ενδείκνυται η χρήση του εκτός κι αν βρεθεί παράγραφος του βιβλίου που να το υποστηρίζει καθώς και να ξεδιαλύνει όλα τα σχετικά προβλήματα. :)

Τί ισχύει στις άλλες γλώσσες προγραμματισμού;

Και μια μεγάλη χαζαμάρα...
Να υποθέσω πως και το παρακάτω πρόγραμμα δεν κάνει έλεγχο εγκυρότητας της τιμής εισόδου. Ή (γενικότερα) δεν μπορούμε να κάνουμε ποτέ τέτοιο έλεγχο διότι πάντα η συνθήκη είναι Αληθής...
ΠΡΟΓΡΑΜΜΑ τεστ
ΜΕΤΑΒΛΗΤΕΣ
  ΛΟΓΙΚΕΣ: χ
ΑΡΧΗ
  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΔΙΑΒΑΣΕ χ
  ΜΕΧΡΙΣ_ΟΤΟΥ χ Η ΟΧΙ χ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Οπότε ο μοναδικός τύπος στη ΓΛΩΣΣΑ στον οποίο δεν μπορώ να κάνω έλεγχο εγκυρότητας είναι ο Λογικός;
Μερεντίτης Νικόλαος
Πληροφορικός

apoldem

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

itt

#6
Παράθεση από: nikolasmer στις 01 Μαρ 2014, 07:35:42 ΜΜ
Τί ισχύει στις άλλες γλώσσες προγραμματισμού;

Στην C++ ας πούμε, μπορείς να κάνεις τον έλεγχο εγκυρότητας που θες. Ο τελεστής << για τύπο bool διαβάζει είτε 0 ή 1 οπότε μπορείς να ελέγχεις το state του stream μετά την είσοδο. Κάτι του στυλ:

bool in;
while(true) {
        if(!(std::cin >> in)) {
            std::cerr << "Wrong format\n";
            std::cin.clear(); //Καθαρίζει τα error flags
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); //Ξεφορτώνεται τους bad χαρακτήρες
        } else {
           /* do stuff */
          /* or break maybe */
        }


Αν και δεν μπορώ να σκεφτώ κάποιο use case αυτή τη στιγμή.