vaiosgtr Δημοσ. 9 Νοεμβρίου 2013 Δημοσ. 9 Νοεμβρίου 2013 λοιπον εδω ειναι ενα κομματι κωδικα που εγραψα εγω: program m; var x:real; y:char; begin read(x); read(y); end. εχω δηλωσει μια μεταβλητη x τυπου πραγματικού αριθμού και την y τυπου χαρακτηρα. γιατι οταν δινω για παραδειγμα "5k" μου βγαζει runtime error ? εαν δωσω τις τιμες ξεχωριστα δεν υπαρχει προβλημα. δηλαδη πρωτα το 5. μετα εντερ και μετα το k. γιατι ομως στο πλαι εχει πρόβλημα ?
Demon Lord Δημοσ. 9 Νοεμβρίου 2013 Δημοσ. 9 Νοεμβρίου 2013 Νομίζω πως γίνεται γιατί αν δεν πατήσεις το enter "νομίζει" πως θες να βάλεις και το k μέσα στην real μεταβλητή
imitheos Δημοσ. 9 Νοεμβρίου 2013 Δημοσ. 9 Νοεμβρίου 2013 Από την μάνα της, η είσοδος είναι σχεδόν παντού line buffered δηλαδή οι συναρτήσεις εισόδου επιστρέφουν όταν πατηθεί enter. Έτσι μπορείς να κάνεις διορθώσεις εύκολα χωρίς δικό σου κώδικα. πχ γράφεις "5k<backspace>40<enter>" και ο αριθμός θα είναι το 540. Όταν εσύ λοιπόν γράψεις 5k και πατήσεις enter, επιστρέφει η πρώτη read και θα πάρεις error γιατί δεν υπάρχει πραγματικός αριθμός με τιμή "5k". Για να μπουν οι τιμές σωστά στις μεταβλητές ένας τρόπος είναι αυτός που είπες δηλαδή "5<enter>k<enter>". Επίσης δοκίμασε να γράψεις με τη μία read(x, y) και να εισάγεις "5<space>k<enter>". Λόγω του κενού, οι τιμές θα πάνε σωστά στις μεταβλητές.
vaiosgtr Δημοσ. 9 Νοεμβρίου 2013 Μέλος Δημοσ. 9 Νοεμβρίου 2013 δοκίμασε να γράψεις με τη μία read(x, y) και να εισάγεις "5<space>k<enter>" ναι ετσι γινεται. αλλα γιατι το κενο δεν το ποιανει σαν χαρακτηρα? και δηλαδη δεν υπαρχει τροπος να γινει χωρις κενο ?
imitheos Δημοσ. 9 Νοεμβρίου 2013 Δημοσ. 9 Νοεμβρίου 2013 ναι ετσι γινεται. αλλα γιατι το κενο δεν το ποιανει σαν χαρακτηρα? και δηλαδη δεν υπαρχει τροπος να γινει χωρις κενο ? Η συνάρτηση υποστηρίζει είσοδο πολλών μεταβλητών ταυτόχρονα. Εσωτερικά λοιπόν πρέπει να έχει κάποιο τρόπο να ξεχωρίζει την είσοδο σε τμήματα. Εσύ στο μυαλό σου πως θα χώριζες αυτά τα τμήματα ? Αν στην read(x,y) δώσεις "321<enter>" τι σημαίνει ? x=3 και y=21 ? x=32 y=1 ? x=321 y= ? Πως θα το ξεχωρίσει αυτό η συνάρτηση ? Όπως τώρα που γράφουμε χρησιμοποιούμε το κενό για να ξεχωρίσουμε τις λέξεις, έτσι και σε αυτή τη περίπτωση το κενό χρησιμοποιείται ως διαχωριστικό (Όταν ζητάς ένα αριθμό αυτός μπορεί να έχει αριθμητικά ψηφία, τελεία αλλά όχι κενό οπότε εφόσον δ εν μπορεί να είναι μέρος ενός αριθμού είναι μια καλή λύση για διαχωριστικό)
vaiosgtr Δημοσ. 9 Νοεμβρίου 2013 Μέλος Δημοσ. 9 Νοεμβρίου 2013 Η συνάρτηση υποστηρίζει είσοδο πολλών μεταβλητών ταυτόχρονα. Εσωτερικά λοιπόν πρέπει να έχει κάποιο τρόπο να ξεχωρίζει την είσοδο σε τμήματα. Εσύ στο μυαλό σου πως θα χώριζες αυτά τα τμήματα ? Αν στην read(x,y) δώσεις "321<enter>" τι σημαίνει ? x=3 και y=21 ? x=32 y=1 ? x=321 y= ? Πως θα το ξεχωρίσει αυτό η συνάρτηση ? Όπως τώρα που γράφουμε χρησιμοποιούμε το κενό για να ξεχωρίσουμε τις λέξεις, έτσι και σε αυτή τη περίπτωση το κενό χρησιμοποιείται ως διαχωριστικό (Όταν ζητάς ένα αριθμό αυτός μπορεί να έχει αριθμητικά ψηφία, τελεία αλλά όχι κενό οπότε εφόσον δ εν μπορεί να είναι μέρος ενός αριθμού είναι μια καλή λύση για διαχωριστικό) ωραια τα λες αλλα υπαρχει τροπος να γινει χωρις το κενο ανάμεσα ?
migf1 Δημοσ. 10 Νοεμβρίου 2013 Δημοσ. 10 Νοεμβρίου 2013 ωραια τα λες αλλα υπαρχει τροπος να γινει χωρις το κενο ανάμεσα ? Υπάρχει, αλλά δεν νομίζω πως θα σου... αρέσει . Διαβάζεις τη γραμμή εισόδου μονοκόμματα και δυναμικά σε ένα string και κατόπιν κάνεις parse το string χειροκίνητα με δικούς σου κανόνες διαχωρισμού. Ή αν είσαι ακόμα πιο hardcore, κλείνεις και το line buffering της κονσόλας και διαχείριζεσαι χειροκίνητα τον κάθε χαρακτήρα που σου πληκτρολογεί ο χρήστης.
imitheos Δημοσ. 10 Νοεμβρίου 2013 Δημοσ. 10 Νοεμβρίου 2013 ωραια τα λες αλλα υπαρχει τροπος να γινει χωρις το κενο ανάμεσα ?Όχι. Τουλάχιστον στο σημείο που βρίσκεστε τώρα. Με άλλες συναρτήσεις ή όπως περιέγραψε ο migf1, αλλά αργεί ακόμη. Ή αν είσαι ακόμα πιο hardcore, κλείνεις και το line buffering της κονσόλας και διαχείριζεσαι χειροκίνητα τον κάθε χαρακτήρα που σου πληκτρολογεί ο χρήστης. Ίσως να μην είναι πρότυπη συνάρτηση αλλά το ίδιο αποτέλεσμα χωρίς να χρειάζεται να πειράξεις τίποτα είχε και η ReadKey. Επέστρεφε το πλήκτρο που πατήθηκε (το scan code νομίζω, δεν θυμάμαι). Πλήκτρα F, βελάκια, κτλ επέστρεφαν δύο φορές την πρώτη φορά 0 για "ειδικό πλήκτρο" και την επόμενη το πλήκτρο. Σε DOS ήταν πολύ της μόδας. Μια χρήση που κάναμε συχνά ήταν για μενού επιλογών με τα βελάκια
vaiosgtr Δημοσ. 10 Νοεμβρίου 2013 Μέλος Δημοσ. 10 Νοεμβρίου 2013 ξεφυγατε λιγο αρχισα να μην καταλαβαινω τι λετε βασικα εγω ηθελα ενα προγραμμα που να δουλευει σαν κουμπιουτερακι. π.χ να δινω 7+2 και να μου κανει το αποτελεσμα
migf1 Δημοσ. 10 Νοεμβρίου 2013 Δημοσ. 10 Νοεμβρίου 2013 ξεφυγατε λιγο αρχισα να μην καταλαβαινω τι λετε βασικα εγω ηθελα ενα προγραμμα που να δουλευει σαν κουμπιουτερακι. π.χ να δινω 7+2 και να μου κανει το αποτελεσμα Ο συνηθέστερος τρόπος είναι αυτός που σου έγραψα και χτες. Διαβάζεις την είσοδο μονοκόμματα σε ένα string, και κατόπιν το κάνεις parse με χαρακτήρες διαχωρισμού τα σύμβολα των αριθμητικών πράξεων, για να πάρεις τους όρους της πράξης. Στην πραξη είναι πιο πολύπλοκο από τη θεωρία, γιατί πρέπει να διαχειριστείς και τυχόν bad input, π.χ κάτι του στυλ: 45js++g5. Πρέπει επίσης να μπορείς να διαχειριστείς και περιπτώσεις του στυλ: -5+4 (δηλαδή τα προθεματικά πρόσημα). Γενικώς, εφόσον όπως γράφεις είστε ακόμα στην αρχή, δεν νομίζω πως πρέπει να σε απασχολούν ακόμα τέτοιου είδους θέματα. Διάβαζε το input σου όπως σας έχουν μάθει, με τις έτοιμες ρουτίνες και προς το παρόν συμβιβάσου με τα χαρακτηριστικά τους
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα