Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

...IDE, compilers, κλπ

Συντονιστής: konnn

Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό stamatiou » 15 Ιουν 2011, 20:51

Παιδιά,
σε ένα πρόγραμμα C:
Κώδικας: Επιλογή όλων
#include <stdio.h>

/* count characters in input; 1st version */
main()
{
long nc;

nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}

Μπορεί να μου το εξηγήσει κάποιος κάπως το πρόγραμμα;
Αφού κανονικά οι εντολή getchar() απλά παίρνει input, πώς το μετρά κιόλας;
Επίσης μπορείτε να μου πείτε τι σημαίνει αυτό το EOF και γιατί υπάρχει εκεί;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό sv1jsb » 15 Ιουν 2011, 21:09

Η getchar() παίρνει το input, αλλά δεν είναι αυτή που μετράει τους χαρακτήρες.
Η getchar παίρνει έναν χαρακτήρα την φορά. Όσο πληκτρολογεί ο χρήστης, και ο χαρακτήρας που πληκτρολόγησε δεν είναι ο EOF,
εκτελείται η επόμενη από το while εντολή, η ++nc.
Αυτή αυξάνει κάθε φορά (σε κάθε χαρακτήρα δηλαδή) την τιμή της nc (η οποία ξεκινά από μηδεν) κατά ένα.
Όταν ο χρήστης πατήσει EOF το while είναι FALSE και βγαίνει από το loop (χωρίς να εκτελέσει μια τελευταία φορά το ++nc).
Μετά το loop του while η printf εμφανίζει την τιμή της nc, η οποία έχει τιμή ίση με τους χαρακτήρες που πληκτρολογησε ο χρήστης.
Το EOF σημαίνει End Of File. Έχει διαφορετική τιμή σε διαφορετικά λειτουργικά. Στο Linux είναι η τιμή που δίνει αν πατήσει ο χρήστης
Control+D.
Το πρόγραμμα σου δεν θα τελειώσει δηλαδή αν δεν πατήσεις Control+D και θα σου μετράει και τα return (αν πατάς).
Φιλικά,
Ανδρέας
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Re: Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό stamatiou » 15 Ιουν 2011, 21:26

sv1jsb έγραψε:Η getchar() παίρνει το input, αλλά δεν είναι αυτή που μετράει τους χαρακτήρες.
Η getchar παίρνει έναν χαρακτήρα την φορά. Όσο πληκτρολογεί ο χρήστης, και ο χαρακτήρας που πληκτρολόγησε δεν είναι ο EOF,
εκτελείται η επόμενη από το while εντολή, η ++nc.
Αυτή αυξάνει κάθε φορά (σε κάθε χαρακτήρα δηλαδή) την τιμή της nc (η οποία ξεκινά από μηδεν) κατά ένα.
Όταν ο χρήστης πατήσει EOF το while είναι FALSE και βγαίνει από το loop (χωρίς να εκτελέσει μια τελευταία φορά το ++nc).
Μετά το loop του while η printf εμφανίζει την τιμή της nc, η οποία έχει τιμή ίση με τους χαρακτήρες που πληκτρολογησε ο χρήστης.
Το EOF σημαίνει End Of File. Έχει διαφορετική τιμή σε διαφορετικά λειτουργικά. Στο Linux είναι η τιμή που δίνει αν πατήσει ο χρήστης
Control+D.
Το πρόγραμμα σου δεν θα τελειώσει δηλαδή αν δεν πατήσεις Control+D και θα σου μετράει και τα return (αν πατάς).
Φιλικά,
Ανδρέας

Ευχαριστώ, αλλα μπορείς να μου λύσεις και τις παρακάτω απορρίες:
1.Πώς γίνεται να το κάνω να σταματά όταν πείμια συγκεκρυμένη λέξη;
2.Γιατί όταν αντικαθιστώ το %ld με %d τρέχει πάλι σωστά;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό sv1jsb » 15 Ιουν 2011, 22:00

Ξεκινώντας από το δεύτερο:
Η διαφορά στο %ld από το %d είναι ότι το πρώτο δείχνει έναν long integer ενώ το δεύτερο έναν integer.
Αναλόγως το τι παραμέτρους περνάς στην εντολή που κάνεις compile το πρόγραμμα μπορεί να λειτουργεί ή όχι.
(Και τι σύστημα έχεις και άλλα που δεν μας ενδιαφέρον τώρα)
Αφού είναι long integer η μεταβλητή nc καλό είναι να χρησιμοποιείς %ld.
Στο δικό μου computer αν αλλάξω το %ld με %d δεν το κάνει compile. Χτυπάει λάθος. (gcc -o test test.c)
Όσον αφορά στο πρώτο:
Θα πρέπει να μάθεις τι σημαίνει string για την C. Πώς ορίζουμε ένα. Και πως μπορούμε να το επεξεργαστούμε.
Θα χρειαστείς και μερικές ακόμα γνώσεις για συναρτήσεις (ίσως, καλό θα ήταν).
Δεν θα σου γράψω την λύση (για να το προσπαθήσεις μόνος σου), θα σου πω όμως αυτά.
Τώρα σταματάει με το που βρει EOF.
H getchar επιστρέφει μόνο χαρακτήρες.
Θέλουμε έναν μηχανισμό (συνάρτηση;) να αποθηκεύει προσωρινά όλους τους χαρακτήρες μέχρι ο χρήστης πληκτρολογήσει κενό.
Αν η λέξη που έχουμε είναι ίδια με αυτήν που έχουμε βάλει για stop τότε να φεύγει από το loop, αλλιώς συνεχίζει να δέχεται χαρακτήρες.

Ελπίζω να βοήθησα
Ανδρέας
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Re: Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό stamatiou » 15 Ιουν 2011, 22:05

sv1jsb έγραψε:Ξεκινώντας από το δεύτερο:
Η διαφορά στο %ld από το %d είναι ότι το πρώτο δείχνει έναν long integer ενώ το δεύτερο έναν integer.
Αναλόγως το τι παραμέτρους περνάς στην εντολή που κάνεις compile το πρόγραμμα μπορεί να λειτουργεί ή όχι.
(Και τι σύστημα έχεις και άλλα που δεν μας ενδιαφέρον τώρα)
Αφού είναι long integer η μεταβλητή nc καλό είναι να χρησιμοποιείς %ld.
Στο δικό μου computer αν αλλάξω το %ld με %d δεν το κάνει compile. Χτυπάει λάθος. (gcc -o test test.c)
Όσον αφορά στο πρώτο:
Θα πρέπει να μάθεις τι σημαίνει string για την C. Πώς ορίζουμε ένα. Και πως μπορούμε να το επεξεργαστούμε.
Θα χρειαστείς και μερικές ακόμα γνώσεις για συναρτήσεις (ίσως, καλό θα ήταν).
Δεν θα σου γράψω την λύση (για να το προσπαθήσεις μόνος σου), θα σου πω όμως αυτά.
Τώρα σταματάει με το που βρει EOF.
H getchar επιστρέφει μόνο χαρακτήρες.
Θέλουμε έναν μηχανισμό (συνάρτηση;) να αποθηκεύει προσωρινά όλους τους χαρακτήρες μέχρι ο χρήστης πληκτρολογήσει κενό.
Αν η λέξη που έχουμε είναι ίδια με αυτήν που έχουμε βάλει για stop τότε να φεύγει από το loop, αλλιώς συνεχίζει να δέχεται χαρακτήρες.

Ελπίζω να βοήθησα
Ανδρέας

Ευχαριστώ πολύ Ανδρέα,
μια τελευταία απορρία έχω, αφού χρησιμοποιούμε string, γιατί φτιάχνουμε int;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό simosx » 15 Ιουν 2011, 22:07

Γιατί όταν γράφω a λέει μέγεθος 2
όταν γράφω α λέει μέγεθος 3 ;

(Μάθημα Git στο IRC, αύριο Πέμπτη, viewtopic.php?f=34&t=19022 )
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Πρόβλημα με πρόγραμμα μέτρησης χαρακτηρών σε C

Δημοσίευσηαπό sv1jsb » 15 Ιουν 2011, 23:02

@simosx Χωρίς να είμαι σίγουρος, είναι το utf που κάνει την διαφορά. Το a έχει τιμή και σε ASCII οπότε η stdio χρησιμοποιεί αυτό. Το α όμως δεν έχει και χρησιμοποιεί το utf-8 ισοδύναμο του που είναι δύο χαρακτήρες. (Αυτό το λέω γιατί θα έπρεπε να χρησιμοποιεί και για το a το utf-8 οπότε να μην έχει διαφορά, αφού χρησιμοποιούμε utf γραμματοσειρά στο τερματικό, αλλά από ότι φαίνεται δεν λειτουργεί έτσι).

@stamatiou Όσον αφορά στο παραπάνω πρόγραμμα int χρησιμοποιούμε μόνο στην μεταβλητή που μετράει τους χαρακτήρες. Τους χαρακτήρες αυτούς καθ' αυτούς δεν τους σώζει πουθενά το πρόγραμμα. Το μόνο που κάνει είναι να τσεκάρει αν πάτησε ο χρήστης EOF, μετά τους "ξεχνάει". Το ότι τους βλέπεις στην οθόνη σου καθώς τους πληκτρολογείς δεν οφείλετε στο πρόγραμμά αλλά στο λειτουργικό.
Εκτός από αυτό η C δεν έχει τύπο string (αν δεν χρησιμοποιήσεις μια συγκεκριμένη βιβλιοθήκη). Το string αναπαριστάται με έναν πίνακα από χαρακτήρες (char). O τύπος char είναι υποσύνολο του int. Παίρνει ακέραιες τιμές μέχρι το 255 μόνο.
Οπότε μπορείς να πεις ότι η "λέξη" για την C είναι είναι ένας πίνακας ακεραίων.
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού

cron