migf1 Δημοσ. 28 Οκτωβρίου 2011 Δημοσ. 28 Οκτωβρίου 2011 Είναι λίγο νωρίς νομίζω για να ασχοληθεί με debugger! Η getchar() διαβάζει κι επιστρέφει έναν χαρακτήρα από την κύρια είσοδο (πληκτρολόγιο) Η isalpha(ch) επιστρέφει TRUE αν ο χαρακτήρας ch είναι γράμμα. To s = ch; βάζει τον χαρακτήρα ch στην i-οστή θέση του πίνακα s ΥΓ, Στη C ο τύπος δεδομένων char είναι υποσύνολο του τύπου δεδομένων int (οπότε ένας char μπορεί με ασφάλεια να διαχειριστεί ως int) για IDE σε windows καλο ειναι το visual studio γιατι εχει ευχριστο debugger Και το Code::Blocks και η Pelles C (και αρκετά άλλα IDE) έχουν εύχρηστους debuggers Εννοώ, δεν είναι κάτι που αποτελεί προνόμιο του VS. H getchar διαβάζει χαρακτήρες μόνο όταν αυτοί συνοδευονται από το enter σωστά; δηλαδή στο τέλος πρεπει να πατηθεί το εντερ αλλιώς δεν διαβάζωνται από την συνάρτηση...σωστά κατάλαβα;; Εδώ υπάρχει ένα θέμα με τη C. Όλα τα input είναι line-buffered, που σημαίνει πως διαβάζονται μόλις πατήσει ENTER ο χρήστης. Οπότε, η getchar() για παράδειγμα θα διαβάζει μονάχα τον 1ο χαρακτήρα από όσους έχει πληκτρολογήσει ο χρήστης πριν πατήσει το ENTER. Μέχρι εδώ καλά, το πρόβλημα είναι πως αν κατόπιν έχεις κι άλλη συνάρτηση διαβάσματος από την κύρια είσοδο, οι έξτρα χαρακτήρες που έχουν μείνει στο buffer θα περαστούν αυτόματα στην νέα αυτή συνάρτηση διαβάσματος. Π.χ. αν έχεις στον κώδικα 2 συνεχόμενα getchar() και πληκτρολογήσεις 2 χαρακτήρες και ENTER, τότε ο 1ος θα διαβαστεί από το 1ο getchar() και ο 2ος από το 2ο... αυτό αποτελεί πρόβλημα. Φαντάσου π.χ. τον παρακάτω κώδικα: > ... char c; int n; c = getchar(); scanf("%d", &n); ... Αν εσύ λοιπόν πληκτρολογήσεις π.χ 7 συνεχόμενους χαρακτήρες και πατήσεις ENTER, o 1ος θα διαβαστεί ως char στο c, και οι υπόλοιποι αν δεν περιέχουν κενό θα περαστούν αυτόματα στη scanf() που θα επιχειρήσει να τους διαβάσει ως int (όλους μαζί) και να τους αναθέσει στο n. Όλα αυτά αποφεύγονται, αν διαβάζεις εξαρχής από μόνος σου όλη τη γραμμή ως ένα string με την π.χ fgets() και κατόπιν διαχειρίζεσαι μόνος σου τα επιμέρους της τμήματα, με συναρτήσεις όπως οι sscanf(), atoi(), atof(), atol(), strtok() κλπ... γκοουγκλαρέ τες ή αναζήτησέ τες στα βιβλία σου. Ένα παράδειγμα που κάνει ότι ο παραπάνω κώδικας χωρίς να υποφέρει από τυχόν έξτρα "σκουπίδια" στην κύρια είσοδο είναι το εξής: > ... char line[ 1024+1] = {'\0'}; char c; int n; if ( fgets(line, 1024+1, stdin) ) sscanf(line, "%c %d", &c, &n); ... Ένα άλλο, παραπλήσιο παράδειγμα είναι... > ... char line[ 1024+1] = {'\0'}; char c; int n; if ( fgets(line, 1024+1, stdin) ) { c = line[0]; n = atoi( &line[1] ); } ...
nik324 Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Πιστεύω ότι κατάλαβα αρκετά καλά αυτα που μου είπες...Δεν μπορώ όμως να καταλάβω που κολλάει η άρνηση != μαζί με το ''\n''... Ευχαριστώ πολύ πάντως
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Προφανώς αναφέρεσαι στο post του timonkaipumpa. Το != είναι το σύμβολο ανισότητας στη C, και ο '\n' είναι ο χαρακτήρας που αντιστοιχεί στο ENTER.
nik324 Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 while ((ch = getchar()) != '\n') Αρα όλη η παραπάνω εκφραση διαβάζει ενα γραμμα από το πληκτρολόγιο το αποθηκεύει σε μια μεταβλητή τύπου int και στη συνέχεια αν δεν πατηθεί το έντερ ξανά διαβάζει ένα γράμμα κοκ...σωστά;; στο τέλος καταλήγουμε να έχουμε έναν πίνακα από χαρακτήρες
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Όχι πίνακα χαρακτήρων, μέσα στο ch αποθηκεύεται το κάθε γράμμα, ένα τη φορά σε κάθε επανάληψη του while-loop (μέχρι να πατηθεί ENTER) > while ( (ch = getchar()) != '\n ') putchar( ch ); Το παραπάνω θα σου τυπώσει τους χαρακτήρες που διάβασε πριν το ENTER.
nik324 Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Φίλε migf1 σε ευχαριστώ πολύ πιστεύω ότι κατάλαβα σωστά
nik324 Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Αν ένα πρόγραμμα ήθελε να διαβάζει ν λέξεις και να βρίσκει την πιο συχνή λέξη,δλδ αυτή που εμφανίζεται περισσότερες φορές θα μπορούσε να υλοποιηθεί ως εξής: Για αρχή μπαίνουν όλες οι λέξεις σε έναν πίνακα χαρακτήρων N Θέσεων Στη συνέχεια διαβάζεται το περιεχόμενο κάθε κελιού και συγκρίνεται με τις υπόλοιπες λέξεις και κάθε φορά που είναι ίδιο με το κελί(με το αρχικό κελί που συγκρίνουμε)αυξάνεται μια μεταβλητή.Μόλις τελειώσει η σύγκριση του πρώτου κελιού με τα υπόλοιπα αρχίζει η σύκγριση του δεύτερου κελιού με όλα τα άλλα κοκ...Μετά την σύκριση του κάθε κελιού με όλα τα υπόλοιπα γίνεται και σύγκριση της μεταβλητής... Τώρα που ξανα διαβάζω την σκέψη μου μου φαίνεται βλακεία... Αλλα χωρίς να το θέλω σκεύτομαι όπως όταν εγραφα προγράμματα στην τρίτη Λυκείου με την ΓΛΩΣΣΑ, δεν ξερω αν αυτό πρέπει να γίνεται...
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Αυτό το πρόβλημα λύνεται πολύ πιο εύκολα με δομές δεδομένων (π.χ. trie tree) ή με hash-tables.
nik324 Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Δεν έχουμε κάνει δομές δεδομένων...Η πρώτη σειρά ασκήσεων είναι αυτή...Η άσκηση λέει Το πρόγραμμα θα διαβάζει από το πληκτρολόγιο έναν αριθμό N και N λέξεις, θα υπολογίζει την λέξη που εμφανίζεται περισσότερες φορές ανάμεσα στις N και θα την τυπώνει. Δηλαδή να μην κάτσω νε την λύσω έτσι όπως ανέφερα παραπάνω;
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Δεν ξέρω τι έχετε μάθει και τι όχι. Επίσης δεν ξέρω αν λέγοντας "πίνακα χαρακτήρων" εννοείς "string" (που είναι η σωστή ερμηνεία) ή αν εννοείς "πίνακα από strings" (που είναι αυτό που χρειάζεσαι)
nik324 Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Ενα πίνακα από strings...Kαι το κάθε string θα είναι η κάθε μία από τις λέξεις που θα έχουν πληκτρολογηθεί
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Γιατί δεν δοκιμάζεις να λύσεις την άσκηση έτσι όπως το έχεις σκεφτεί, να δεις αν δουλεύει ή όχι;
nik324 Δημοσ. 30 Οκτωβρίου 2011 Μέλος Δημοσ. 30 Οκτωβρίου 2011 Αυτό θα κάνω μόλις τελειώσω μια άλλη.....Μου έπεσαν μαζεμένεις βλέπεις... :) εάν έχεις ενα array N έστω int A[N] τότε εάν A[j] != 0 , j = (j+2) mod N , οπου j o ετοιμοθάνατος αλλιώς μπορείς να αυξάνεις το j κατα 1 αυτά μέσα σε ένα loop που θα κοιτά εάν έχουν πεθάνει όλοι -> πόσοι πέθαναν (i) και πόσοι μένουν (N) code: [Πριν δείς την απάντηση προσπάθησε να το λύσεις μόνος σου] > #include <stdio.h> #define N 100 int main(void){ int A[N],i,j=0; for(i=0;i<100;++i) A[i] = i+1; i = 0; while(j < N){ if(A[i]){ printf("%3d died..\n",A[i]); A[i] = 0; i = (i+2) % N; ++j; } else ++i; } return 0; } δεν λέει όμως ποιος μένει ζωντανόςςς..... pfffff....
nik324 Δημοσ. 30 Οκτωβρίου 2011 Μέλος Δημοσ. 30 Οκτωβρίου 2011 δεν μπορώ να καταλάβω πως ενώ θα πρέπει να χρησιμοποιήσω πίνακα, θα πρέπει να διαβάζεται από το πληκτρολόγιο ο αριθμός n των λέξεων... Με δομές δεν μπορώ να το λύσω γιατί δεν έχουμε κάνει Μήπως η άσκηση μπορεί να λύθεί χωρίς πίνακα;;;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα