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

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

Δημοσ.

λοιπον εδω ειναι ενα κομματι κωδικα που εγραψα εγω:

program m;
var
x:real;
y:char;
begin
read(x);
read(y);
end.

εχω δηλωσει μια μεταβλητη x τυπου πραγματικού αριθμού και την y τυπου χαρακτηρα.

γιατι οταν δινω για παραδειγμα "5k" μου βγαζει runtime error ? εαν δωσω τις τιμες ξεχωριστα δεν υπαρχει προβλημα. δηλαδη πρωτα το 5. μετα εντερ και μετα το k. γιατι ομως στο πλαι εχει πρόβλημα ?

Δημοσ.

Νομίζω πως γίνεται γιατί αν δεν πατήσεις το enter "νομίζει" πως θες να βάλεις και το k μέσα στην real μεταβλητή

Δημοσ.

Από την μάνα της, η είσοδος είναι σχεδόν παντού line buffered δηλαδή οι συναρτήσεις εισόδου επιστρέφουν όταν πατηθεί enter. Έτσι μπορείς να κάνεις διορθώσεις εύκολα χωρίς δικό σου κώδικα. πχ γράφεις "5k<backspace>40<enter>" και ο αριθμός θα είναι το 540.

 

Όταν εσύ λοιπόν γράψεις 5k και πατήσεις enter, επιστρέφει η πρώτη read και θα πάρεις error γιατί δεν υπάρχει πραγματικός αριθμός με τιμή "5k". Για να μπουν οι τιμές σωστά στις μεταβλητές ένας τρόπος είναι αυτός που είπες δηλαδή "5<enter>k<enter>". Επίσης δοκίμασε να γράψεις με τη μία read(x, y) και να εισάγεις "5<space>k<enter>". Λόγω του κενού, οι τιμές θα πάνε σωστά στις μεταβλητές.

Δημοσ.

δοκίμασε να γράψεις με τη μία read(x, y) και να εισάγεις "5<space>k<enter>"

ναι ετσι γινεται. αλλα γιατι το κενο δεν το ποιανει σαν χαρακτηρα? 

και δηλαδη δεν υπαρχει τροπος να γινει χωρις κενο ?

Δημοσ.

ναι ετσι γινεται. αλλα γιατι το κενο δεν το ποιανει σαν χαρακτηρα? 

και δηλαδη δεν υπαρχει τροπος να γινει χωρις κενο ?

Η συνάρτηση υποστηρίζει είσοδο πολλών μεταβλητών ταυτόχρονα. Εσωτερικά λοιπόν πρέπει να έχει κάποιο τρόπο να ξεχωρίζει την είσοδο σε τμήματα. Εσύ στο μυαλό σου πως θα χώριζες αυτά τα τμήματα ? Αν στην read(x,y) δώσεις "321<enter>" τι σημαίνει ? x=3 και y=21 ? x=32 y=1 ? x=321 y= ? Πως θα το ξεχωρίσει αυτό η συνάρτηση ? Όπως τώρα που γράφουμε χρησιμοποιούμε το κενό για να ξεχωρίσουμε τις λέξεις, έτσι και σε αυτή τη περίπτωση το κενό χρησιμοποιείται ως διαχωριστικό (Όταν ζητάς ένα αριθμό αυτός μπορεί να έχει αριθμητικά ψηφία, τελεία αλλά όχι κενό οπότε εφόσον δ εν μπορεί να είναι μέρος ενός αριθμού είναι μια καλή λύση για διαχωριστικό)

Δημοσ.

Η συνάρτηση υποστηρίζει είσοδο πολλών μεταβλητών ταυτόχρονα. Εσωτερικά λοιπόν πρέπει να έχει κάποιο τρόπο να ξεχωρίζει την είσοδο σε τμήματα. Εσύ στο μυαλό σου πως θα χώριζες αυτά τα τμήματα ? Αν στην read(x,y) δώσεις "321<enter>" τι σημαίνει ? x=3 και y=21 ? x=32 y=1 ? x=321 y= ? Πως θα το ξεχωρίσει αυτό η συνάρτηση ? Όπως τώρα που γράφουμε χρησιμοποιούμε το κενό για να ξεχωρίσουμε τις λέξεις, έτσι και σε αυτή τη περίπτωση το κενό χρησιμοποιείται ως διαχωριστικό (Όταν ζητάς ένα αριθμό αυτός μπορεί να έχει αριθμητικά ψηφία, τελεία αλλά όχι κενό οπότε εφόσον δ εν μπορεί να είναι μέρος ενός αριθμού είναι μια καλή λύση για διαχωριστικό)

 

ωραια τα λες αλλα υπαρχει τροπος να γινει χωρις το κενο ανάμεσα ?

Δημοσ.

ωραια τα λες αλλα υπαρχει τροπος να γινει χωρις το κενο ανάμεσα ?

 

Υπάρχει, αλλά δεν νομίζω πως θα σου... αρέσει :P. Διαβάζεις τη γραμμή εισόδου μονοκόμματα και δυναμικά σε ένα string και κατόπιν κάνεις parse το string χειροκίνητα με δικούς σου κανόνες διαχωρισμού.

 

Ή αν είσαι ακόμα πιο hardcore, κλείνεις και το line buffering της κονσόλας και διαχείριζεσαι χειροκίνητα τον κάθε χαρακτήρα που σου πληκτρολογεί ο χρήστης.

Δημοσ.

ωραια τα λες αλλα υπαρχει τροπος να γινει χωρις το κενο ανάμεσα ?

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

 

Ή αν είσαι ακόμα πιο hardcore, κλείνεις και το line buffering της κονσόλας και διαχείριζεσαι χειροκίνητα τον κάθε χαρακτήρα που σου πληκτρολογεί ο χρήστης.

Ίσως να μην είναι πρότυπη συνάρτηση αλλά το ίδιο αποτέλεσμα χωρίς να χρειάζεται να πειράξεις τίποτα είχε και η ReadKey. Επέστρεφε το πλήκτρο που πατήθηκε (το scan code νομίζω, δεν θυμάμαι). Πλήκτρα F, βελάκια, κτλ επέστρεφαν δύο φορές την πρώτη φορά 0 για "ειδικό πλήκτρο" και την επόμενη το πλήκτρο. Σε DOS ήταν πολύ της μόδας. Μια χρήση που κάναμε συχνά ήταν για μενού επιλογών με τα βελάκια :)

Δημοσ.

ξεφυγατε λιγο :P αρχισα να μην καταλαβαινω τι λετε

 

βασικα εγω ηθελα ενα προγραμμα που να δουλευει σαν κουμπιουτερακι. π.χ να δινω 7+2 και να μου κανει το αποτελεσμα

Δημοσ.

ξεφυγατε λιγο :P αρχισα να μην καταλαβαινω τι λετε

 

βασικα εγω ηθελα ενα προγραμμα που να δουλευει σαν κουμπιουτερακι. π.χ να δινω 7+2 και να μου κανει το αποτελεσμα

 

Ο συνηθέστερος τρόπος είναι αυτός που σου έγραψα και χτες. Διαβάζεις την είσοδο μονοκόμματα σε ένα string, και κατόπιν το κάνεις parse με χαρακτήρες διαχωρισμού τα σύμβολα των αριθμητικών πράξεων, για να πάρεις τους όρους της πράξης.

 

Στην πραξη είναι πιο πολύπλοκο από τη θεωρία,  γιατί πρέπει να διαχειριστείς και τυχόν bad input, π.χ κάτι του στυλ: 45js++g5. Πρέπει επίσης να μπορείς να διαχειριστείς και περιπτώσεις του στυλ: -5+4 (δηλαδή τα προθεματικά πρόσημα).

 

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

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

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

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

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

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

Σύνδεση

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

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