stefxam Δημοσ. 4 Δεκεμβρίου 2016 Δημοσ. 4 Δεκεμβρίου 2016 Εκφωνηση εργασιας: Να υλοποιήσετε ένα πρόγραμμα σε C το οποίο θα διαβάζει χαρακτήρες από την είσοδό του μέχρι το τέλος του αρχείου (EOF). Στη συνέχεια θα εμφανίζει στην οθόνη ένα ραβδόγραμμα από αστεράκια για κάθε έναν από τους εμφανιζόμενους χαρακτήρες. Υποθέστε ότι οι χαρακτήρες που θα υπάρχουν στο κείμενο θα είναι αυτοί που βρίσκονται στον πίνακα ASCII (βλ. σημειώσεις, σύγγραμα, ή http://www.asciitable.com).Με τον τρόπο αυτό, θα μπορέσετε να φτιάξετε έναν πίνακα 128 θέσεων όπου θα αποθηκεύεται η συχνότητα κάθε χαρακτήρα με δείκτη τον ίδιο τον χαρακτήρα (ουσιαστικά την δεκαδική ASCII αναπαράστασή του). Στο τέλος το πρόγραμμα να εμφανίζει τον χαρακτήρα που εμφανίστηκε τις περισσότερες φορές και τις ελάχιστες φορές καθώς και τον φορών που εμφανίστηκαν αντίστοιχα. Παράδειγμα στην εμφάνιση: a ****** d *** e *********** y * Most frequent: e, 12 time(s). Least frequent: y, 1 time(s). εχω δημιουργησει τον παρακατω κωδικα #include <stdio.h> #include<stdlib.h> int main(){ FILE *fp; char c; fp= fopen("ascii.txt","r"); if (fp == NULL) printf("File doesn't exist\n"); else { do { c = getc(fp); putchar©; } while (c != EOF); } fclose(fp); } Ως εδω το προγραμμα λειτουργει και οταν το κανω run εμφανιζει ολα τα στοιχεια που υπαρχουν στο txt.. το θεμα ειναι το πως θα εκχωρησω καθε γραμμη σε εναν πινακα και δοκιμαζω κατι τετοιο αλλα δυστυχως δεν εμφανιζει τιποτα #include <stdio.h> #include<stdlib.h> int main(){ FILE *fp; char c; fp = fopen("ascii.txt","r"); if (fp == NULL) printf("File doesn't exist\n"); else { do { c = getc(fp); putchar©; } while (c != EOF); } fclose(fp); } Καμια βοηθεια??
NickSym Δημοσ. 4 Δεκεμβρίου 2016 Δημοσ. 4 Δεκεμβρίου 2016 Κάθε ascii χαρακτηρας αντιστοιχει σε εναν αριθμο. Αν οι χαρακτηρες που σε ενδιαφερουν ειναι με την σειρα( ειναι 256 και αναφερεις τους μισους), βρες τον μικροτερο αριθμο που αντιστοιχει στους χαρακτηρες σου, κανε εναν πινακα 128 θεσεων και αυξησε τον πινακα στην θεση: Table[(int)c - min]++;
_Gikoskos_ Δημοσ. 4 Δεκεμβρίου 2016 Δημοσ. 4 Δεκεμβρίου 2016 Αυτη η ασκηση βασιζεται στην παραδοχη πως μπορεις να χρησιμοποιησεις τους χαρακτηρες ASCII για να κανεις ενα πολυ απλο hash table (στην C τουλαχιστον, οπου οι χαρακτηρες ASCII αντιστοιχουν σε αριθμητικες τιμες). Με αλλα λογια θα κανεις τον πινακα που σου λεει, ο οποιος θα περιεχει εναν μετρητη για καθε χαρακτηρα, θα τον μηδενισεις (ολοι οι μετρητες πρεπει να ξεκινανε απο το 0) και μετα θα loopαρεις στους χαρακτηρες του αρχειου και θα προσθετεις + 1 στην αντιστοιχη θεση του πινακα. Άκολουθωντας τον δικο σου κωδικα αυτο θα γινοταν καπως ετσι δηλαδη: unsigned long int counters[128] = {0}; do { c = getc(fp); counters[c]++; } while (c != EOF); Τελος θα κλεισεις το αρχειο, και θα loopareiς μεσα στον πινακα counters. Σε οποια θεση i του πινακα συναντησεις μη μηδενικο αριθμο (οπου και θα σημαινει πως αυτος ο χαρακτηρας υπηρχε τουλαχιστον μια φορα μεσα στο αρχειο) θα εκτυπωνεις counters φορες τον χαρακτηρα '*'. Ολα τα υπολοιπα ειναι ευκολα να γινουν. Βρισκεις και το max και το min του πινακα, στο ιδιο loop και ξεμπερδεψες.
stefxam Δημοσ. 4 Δεκεμβρίου 2016 Μέλος Δημοσ. 4 Δεκεμβρίου 2016 Αυτη η ασκηση βασιζεται στην παραδοχη πως μπορεις να χρησιμοποιησεις τους χαρακτηρες ASCII για να κανεις ενα πολυ απλο hash table (στην C τουλαχιστον, οπου οι χαρακτηρες ASCII αντιστοιχουν σε αριθμητικες τιμες). Με αλλα λογια θα κανεις τον πινακα που σου λεει, ο οποιος θα περιεχει εναν μετρητη για καθε χαρακτηρα, θα τον μηδενισεις (ολοι οι μετρητες πρεπει να ξεκινανε απο το 0) και μετα θα loopαρεις στους χαρακτηρες του αρχειου και θα προσθετεις + 1 στην αντιστοιχη θεση του πινακα. Άκολουθωντας τον δικο σου κωδικα αυτο θα γινοταν καπως ετσι δηλαδη: unsigned long int counters[128] = {0}; do { c = getc(fp); counters[c]++; } while (c != EOF); Τελος θα κλεισεις το αρχειο, και θα loopareiς μεσα στον πινακα counters. Σε οποια θεση i του πινακα συναντησεις μη μηδενικο αριθμο (οπου και θα σημαινει πως αυτος ο χαρακτηρας υπηρχε τουλαχιστον μια φορα μεσα στο αρχειο) θα εκτυπωνεις counters φορες τον χαρακτηρα '*'. Ολα τα υπολοιπα ειναι ευκολα να γινουν. Βρισκεις και το max και το min του πινακα, στο ιδιο loop και ξεμπερδεψες. Εμφανιζω κανονικα τις τιμες οι οποιες δεν ειναι μηδεν αλλα πως θα εμφανισω και το αναλογο γραμμα? Most frequent: e, 12 time(s). Least frequent: y, 1 time(s). #include <stdio.h> #include<stdlib.h> int main(){ FILE *fp; unsigned long int counters[128] = {0}; char c; int i=0; fp= fopen("dokimh.txt","r"); if (fp == NULL) printf("File doesn't exist\n"); else { do { c = getc(fp); counters[c]++; } while (c != EOF); } fclose(fp); for(i=0;i<128;i++) if(counters!=0) printf("%d\n",counters); } πρέπει να δημιουργησω αλλον εναν πινακα με τα στοιχεια του ascii και αναλογα το i για το εκτυπωνω?
_Gikoskos_ Δημοσ. 4 Δεκεμβρίου 2016 Δημοσ. 4 Δεκεμβρίου 2016 Οταν γραφεις τον χαρακτηρα 'A' στην C εννοεις τον αριθμο της θεσης του στον πινακα ascii. Έτσι η παρακατω προταση int c = 'A'; ισοδυναμεί με αυτήν int c = 65; Αν εκτυπωσεις το c ετσι printf("c = %d\n", c); θα παρεις πισω την ακεραια τιμη του, αλλα αν το εκτυπωσεις ετσι printf("c = %c\n", (char)c); θα παρεις την ερμηνεια αυτης της τιμης, ως χαρακτηρα ASCII. Δηλαδη θα μπορουσες να εκτυπωσεις ολους τους χαρακτηρες ascii κανοντας κατι τετοιο char i; for (i = 0; i < 128; i++) putchar(i); αλλα και κατι τετοιο int i; for (i = 0; i < 128; i++) putchar(i); Ελπιζω αυτο να σε βοηθησε να καταλαβεις τι πρεπει να κανεις. Μην ξεχασεις να βαλεις και ενα δευτερο loop μεσα στο loop που περνας ολα τα στοιχεια του πινακα, για να εκτυπωσεις τα αστερακια για το ραβδογραμμα σου.
hh12 Δημοσ. 4 Δεκεμβρίου 2016 Δημοσ. 4 Δεκεμβρίου 2016 Για να το παιξω και καλα εξυπνος στον Gikoskos να προσθεσω οτι μπορουμε να γραψουμε και αυτο printf("%c\n",65); και να τυπωσει 'Α'
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα