Μετρητής Λέξεων στη C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

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

Μετρητής Λέξεων στη C

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

Παιδιά,
ξεκίνησα να προσπαθώ να φτιάξω ένα πρόγραμμα στη C, αλλά κάπου έχω ένα λάθος, μπορείτε να με βοηθήσετε;
Κώδικας: Επιλογή όλων
#include <stdio.h>

main()
{
int c,nl;
while ((c = getchar()) != 'EOF') {
if (c = getchar() = " " || (c = getchar()) = "\n" || (c = getchar() = "\t"))
{
nl++;
}
}
printf("%d Words",nl);
}

stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Μετρητής Λέξεων στη C

Δημοσίευσηαπό vasster » 16 Ιουν 2011, 20:38

Ο παρακάτω κώδικας δουλεύει αλλά αφήνω κάποιο λογικό bug να το βρεις
Κώδικας: Επιλογή όλων

#include <stdio.h>
main(void)
{
int c,nl;
while ( ( c = getchar() ) != EOF) {
if ((c == ' ') || (c == '\n') || (c == '\t'))
nl++;
}
printf("%d words\n",nl);
}
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Re: Μετρητής Λέξεων στη C

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

vasster έγραψε:#include <stdio.h>
main(void)
{
int c,nl;
while ( ( c = getchar() ) != EOF) {
if ((c == ' ') || (c == '\n') || (c == '\t'))
nl++;
}
printf("%d words\n",nl);
}

Όλα τρέχουν οκ, αλλά μου βγάζει λάθος λέξεις, τι έγινε;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Μετρητής Λέξεων στη C

Δημοσίευσηαπό vasster » 16 Ιουν 2011, 21:07

Δεν βγάζει λάθος σαν πρόγραμμα, αλλά η λογική μέτρησης που έγραψες έχει πρόβλημα.

Σημαντικότερο είναι το αν βρήκες τα σηματικότερα λάθη σου που ήταν π.χ. το ότι καλούσες συνεχώς την getchar ή ότι δεν σύγκρινες με το == ή το τι διαφέρει το " από το '
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Re: Μετρητής Λέξεων στη C

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

vasster έγραψε:Δεν βγάζει λάθος σαν πρόγραμμα, αλλά η λογική μέτρησης που έγραψες έχει πρόβλημα.

Σημαντικότερο είναι το αν βρήκες τα σηματικότερα λάθη σου που ήταν π.χ. το ότι καλούσες συνεχώς την getchar ή ότι δεν σύγκρινες με το == ή το τι διαφέρει το " από το '

Απλά προσπαθούσα να βρωτρόπο να βρω το ένα bug σε αυτόν το κώδικα από το βιβλιο "The C Programming Language" και απλά προσπάθησα να το ξαναγράψω πιο απλά...
Κώδικας: Επιλογή όλων
#include <stdio.h>

#define IN 1
#define OUT 0

main()
{
int c,nl,nw,nc,state;

state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl
if (c == ' ' || c = '\n' || c = '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
printf("%d %d %d\n", nl, nw, nc);
}

αλλά δεν καταλαβαίνω αυτά τα state και τα IN και OUT....
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Μετρητής Λέξεων στη C

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

Μη σε μπερδεύουν, είναι για να μαρκάρει το πρόγραμμα πότε αλλάζει γραμμή ή λέξη. Προσπάθησε να τρέξεις το πρόγραμμα στο χαρτί με το μυαλό σου και θα καταλάβεις τι λέω.
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Re: Μετρητής Λέξεων στη C

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

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

Πάλι δεν καταλαβαίνω, είναι για κάποιον συγκεκρυμένο λόγο 1 και 0;
Επίσης εάν δεν υπήρχαν τα IN και τα OUT δεν θα έτρεχε σωστά, ακόμα δεν καταλαβαίνω τι ρόλο βαράν...
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Μετρητής Λέξεων στη C

Δημοσίευσηαπό vasster » 16 Ιουν 2011, 23:00

Οχι, το 1 και το 0 είναι απλά κάποιες τιμές οι οποίες δεν παίζουν άλλο ρόλο παρά μόνο για να δείχνουν πότε το πρόγραμμα είναι μέσα σε λέξη και πότε σε ειδικό χαρακτήρα (δηλ. αλλαγή γραμμής, στηλοθέτη κλπ). Οταν το πρόγραμμα λοιπόν μπαίνει σε μία λέξη, αυξάνει ο αθροιστής nw. Ο αθροιστής nc μετράει συνεχώς κάθε νέο χαρακτήρα ενώ όταν ανιχνεύεται αλλαγή γραμμής αυξάνει ο αθροιστής γραμμών nl.
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Re: Μετρητής Λέξεων στη C

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

vasster έγραψε:Οχι, το 1 και το 0 είναι απλά κάποιες τιμές οι οποίες δεν παίζουν άλλο ρόλο παρά μόνο για να δείχνουν πότε το πρόγραμμα είναι μέσα σε λέξη και πότε σε ειδικό χαρακτήρα (δηλ. αλλαγή γραμμής, στηλοθέτη κλπ). Οταν το πρόγραμμα λοιπόν μπαίνει σε μία λέξη, αυξάνει ο αθροιστής nw. Ο αθροιστής nc μετράει συνεχώς κάθε νέο χαρακτήρα ενώ όταν ανιχνεύεται αλλαγή γραμμής αυξάνει ο αθροιστής γραμμών nl.

και γιατί έχουν τιμές 0 και 1;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Μετρητής Λέξεων στη C

Δημοσίευσηαπό clepto » 16 Ιουν 2011, 23:24

Κώδικας: Επιλογή όλων
#define IN 1
#define OUT 0



γιατι οριστικαν στην αρχη
γιατι οριστικαν με αυτα τα νουμερα, δεν ξερω
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Επόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι