giannis-21 Δημοσιεύτηκε Μάρτιος 22, 2009 #1 Δημοσιεύτηκε Μάρτιος 22, 2009 παιδες γεια σας! εχω μια ασκηση παλι και θελει ο τυπας να βρουμε το ποσοστο των γραμματων μεσα σε ενα αρχειο.τι πρωτο που μου ηρθε στο μυαλο ηταν με counters αλλα ειναι πολυ απλο νομιζω. καμια αλλη ιδεα μηπος?αυτο δουλευει για οποιον το θελει.θα αναιβασω αργοτερα και μια αλλη υλοποιηση.#include <stdio.h>#include <string.h>#include <ctype.h>void mikra_grammata(char string[]){//onoma sinartisis pou kaloume meta gia na kanei mikra ta grammata.stin parenthesi int i=0; //einai ta orismata tis.edo einai enas pinakas.einai void giati den epistrefei tipota while ( string ) { string = tolower(string); i++; }}int main(){ int i,j,arithmos=-1,stixia[512],counter=0,array[26];//dilosi metabliton char xaraktiras,keimeno[512];//dilosi metabliton FILE *fp; /* orizoume enan FILE pointer */ printf("ginete i anagnosi tou arxeiou.\n"); fp=fopen("data.txt", "r"); /*anoigei to arxeio gia anagnosi */ if(fp==NULL) {//tsekarei an iparxei to arxeio printf("Error: can't open file.\n"); /* fclose(fp); DON'T PASS A NULL POINTER TO fclose !! */ return 1; } else { while(!feof(fp))//i feof dinei 1 otan ftasei sto telos tou arxeiou. { xaraktiras=fgetc(fp);//diabazei enan enan xaraktira apo to arxeio arithmos++;//auksanei o metritis kata ena gia na deiw posoi einai oi xaraktires se plithos } fseek(fp,0,0);//pigainei ton kersora se sigkekrimeno simio.to proto 0 einai i arxi(1 gia to telos).kai to deutero poses theseis meta tin arxi i telos antistixa printf("%d\n",arithmos); for(i=0;i<26;i++){ array=0;//arxikopoioume ton pinaka me midenika stoixeia giati mporei na exei oti nanai mesa. }for ( i = 0; i < 512 && fscanf(fp, "%c", &keimeno) == 1; i++ )//antegrafoume ta periexomena tou arxeio ston pinaka keimeno mikra_grammata(keimeno);//kaloume tin sinartisi poou kanei mikra ta grammata.an eiani eidi mikra den ta kanei tipota printf("to pososto ton grammaton einai to eksis:\n\n"); //printf("%c",keimeno);i=0; while ( keimeno ) { keimeno = keimeno-97;//afairoume to 97 ggia na exoume emsa ston pinaka stoixeia apo 0-25 i++; } for(i=0;i<arithmos;i++)//edo leme pos an to periexomeno tou pinaka keimeno(0-25) einai idia me ton dikti tou pinaka array auksanei tin antistixi timi kata 1.etsi exoume antistixia ton periexomenon tou pinaka keimenou me tis theseis tou array.kathe thesi tou array simbolizei ena gramma.0=a,1=b klp { for (j=0;j<=26;j++){ if (keimeno==j){ array[j]=array[j]+1; counter++; //printf("%d ",array); } } } for(i=0;i<26;i++){ if(array>0) printf("%c: %d me pososto %.2f\n",(char)(i+97),array,(float)array/counter*100);//oi parentheseis einai gia to casting. } } system("PAUSE"); fclose(fp);//kleinei to arxeio return 0;}
tolis861416003225 Μάρτιος 22, 2009 #2 Μάρτιος 22, 2009 φωρτωσε το αρχειο στη μνημη σου ( σε τι γλωσσα το θες? ) για να μη κανεις πολλες προσπελασεις στο δισκο και μετα με μια switch case αυξανε τον καταληλο μετριτη αναλογως του γραμματος.
darien Μάρτιος 22, 2009 #3 Μάρτιος 22, 2009 Αυτό ακριβώς. Θα φτιάξεις έναν πίνακα με 26 στοιχεία (για αγγλικό αλφάβητο) και θα σκανάρεις όλο το αρχείο ανά χαρακτήρα και θα ανεβάζεις τον μετρητή κατά ένα κάθε φορά. Θα χρειαστείς και έναν μετρητή που θα μετρά όλους τους χαρακτήρες του αρχείου.
giannis-21 Μάρτιος 22, 2009 Author #4 Μάρτιος 22, 2009 φωρτωσε το αρχειο στη μνημη σου ( σε τι γλωσσα το θες? ) για να μη κανεις πολλες προσπελασεις στο δισκο και μετα με μια switch case αυξανε τον καταληλο μετριτη αναλογως του γραμματος.σε c θα εινια.. εχω φτασεο μεχρι το σημειο να διαβασω το αρχειο και να το περασω σε πινακα. λογικα θα μπει μια ιφ αν τυχον υπαρχουν κενα και ειδικοι χαρακτηρες αλλα θα αυξανεται ο αριθμοσ του συνολου σωστα?
darien Μάρτιος 22, 2009 #5 Μάρτιος 22, 2009 Όταν λες ότι πέρασες το αρχείο σε πίνακα, τι εννοείς; Μέτρησες την συχνότητα των γραμμάτων;
Jaco Μάρτιος 22, 2009 #6 Μάρτιος 22, 2009 Η ταχύτερη μέθοδος είναι με ένα array[256]...Διαβάζεις από την αρχή του αρχείου ως το τέλος 1-1 τους χαρακτήρες σε binary δεκαδική μορφή και χρησιμοποιείς την δεκαδική τιμή του χαρακτήρα για index στο array...: array[index] += 1;Ούτε 10 γραμμές κώδικας δεν θα βγει...
JaguarOne Μάρτιος 22, 2009 #8 Μάρτιος 22, 2009 jesus, είμαι ο μόνος που βρίσκω την ερώτηση υπερβολικά εύκολη για να ρωτάει κάποιος? άμα ρωτάμε σε αυτά, στα πραγματικά δύσκολα τι θα κάνουμε δηλαδή?
Jaco Μάρτιος 22, 2009 #9 Μάρτιος 22, 2009 Το μέγεθος του πίνακα γιατί είναι 256;Για να αθροίζεις όλους τους δυνατούς ascii χαρακτήρες (και πάνω από 127, δηλαδή 0->255)...Στο τέλος φιλτράρεις αυτά που θες, οπότε διαβάζεις το αρχείο σε dt στην μνήμη σου και έχεις συνολική πληροφορία για το αρχείο, ακόμα και για τα κενά (#20), newlines (#10, #13), σημεία στίξης κτλ, κτλ... Οπότε έχεις οποιαδήποτε πληροφορία που μπορεί να χρειαστείς από το αρχείο, έτσι αρχίζεις το φιλτράρισμα και κρατάς τους χαρακτήρες που θες.... με τον τρόπο αυτό μειώνεις το execution time και είσαι πιο ευέλικτος, αν θελήσεις στο μέλλον να βλέπεις συχνότητες και από χαρακτήρες που δεν είχες υπολογίζει ότι θέλεις να διαβάσεις...
mariosalice Μάρτιος 22, 2009 #10 Μάρτιος 22, 2009 Μια λογική προγραμματισμού....Πρώτα ορίζεις τι εννοείς γράμματα.Ένα κείμενο μπορεί να έχει ότι αλφαριθμητικά σε όποια γλώσσα ή συνδυασμό μπορείς να φανταστείς.Αν δεν το ξέρεις, το πρόγραμμα πρέπει να σκανάρει ένα ένα χαρακτήρα και να τους βάλει ως μεταβλητές.Μετράς το σύνολο των μεταβλητών, έστω 150 χαρακτήρες.Μετά για κάθε μεταβλητή μετράς το σύνολο.πχ for i=1 to 150while a(i) b(i)=b(i)+1next iΣύνολο γραμμάτωνΣ= 0for i=1 to 150Σ= Σ+b(i)next iΜετά με πράξεις βγάζεις το ποσοστό κάθε μεταβλητής
giannis-21 Μάρτιος 22, 2009 Author #11 Μάρτιος 22, 2009 ωψραια παιδες μεχρι την παρασκευη θα ποσταρω τον τελικο κωδικα(κατα την πεμπτη θα τον αρχισω) ευχαριστω για τις απαντησεις
giannis-21 Μάρτιος 22, 2009 Author #12 Μάρτιος 22, 2009 Όταν λες ότι πέρασες το αρχείο σε πίνακα, τι εννοείς; Μέτρησες την συχνότητα των γραμμάτων;οχι απλα με την fscanf βαζω τα περιεχομενα ου αρχειου σε πινακα. δεν ξερω κατα πσοσο ειναι αφικτο να κανω ολη την διαδικασια με αλλο τροπο
Recommended Posts
Archived
This topic is now archived and is closed to further replies.