Jump to content



ποσοτο γραμματων σε ενα αρχειο(solved)


giannis-21

Recommended Posts

παιδες γεια σας! εχω μια ασκηση παλι και θελει ο τυπας να βρουμε το ποσοστο των γραμματων μεσα σε ενα αρχειο.τι πρωτο που μου ηρθε στο μυαλο ηταν με 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;

}

Link to comment
Share on other sites

φωρτωσε το αρχειο στη μνημη σου ( σε τι γλωσσα το θες? ) για να μη κανεις πολλες προσπελασεις στο δισκο και μετα με μια switch case αυξανε τον καταληλο μετριτη αναλογως του γραμματος.

Link to comment
Share on other sites

Αυτό ακριβώς. Θα φτιάξεις έναν πίνακα με 26 στοιχεία (για αγγλικό αλφάβητο) και θα σκανάρεις όλο το αρχείο ανά χαρακτήρα και θα ανεβάζεις τον μετρητή κατά ένα κάθε φορά. Θα χρειαστείς και έναν μετρητή που θα μετρά όλους τους χαρακτήρες του αρχείου.

Link to comment
Share on other sites

φωρτωσε το αρχειο στη μνημη σου ( σε τι γλωσσα το θες? ) για να μη κανεις πολλες προσπελασεις στο δισκο και μετα με μια switch case αυξανε τον καταληλο μετριτη αναλογως του γραμματος.

σε c θα εινια.. εχω φτασεο μεχρι το σημειο να διαβασω το αρχειο και να το περασω σε πινακα. λογικα θα μπει μια ιφ αν τυχον υπαρχουν κενα και ειδικοι χαρακτηρες αλλα θα αυξανεται ο αριθμοσ του συνολου σωστα?

Link to comment
Share on other sites

Η ταχύτερη μέθοδος είναι με ένα array[256]...

Διαβάζεις από την αρχή του αρχείου ως το τέλος 1-1 τους χαρακτήρες σε binary δεκαδική μορφή και χρησιμοποιείς την δεκαδική τιμή του χαρακτήρα για index στο array...: array[index] += 1;

Ούτε 10 γραμμές κώδικας δεν θα βγει...

Link to comment
Share on other sites

Το μέγεθος του πίνακα γιατί είναι 256;

Για να αθροίζεις όλους τους δυνατούς ascii χαρακτήρες (και πάνω από 127, δηλαδή 0->255)...

Στο τέλος φιλτράρεις αυτά που θες, οπότε διαβάζεις το αρχείο σε dt στην μνήμη σου και έχεις συνολική πληροφορία για το αρχείο, ακόμα και για τα κενά (#20), newlines (#10, #13), σημεία στίξης κτλ, κτλ...

Οπότε έχεις οποιαδήποτε πληροφορία που μπορεί να χρειαστείς από το αρχείο, έτσι αρχίζεις το φιλτράρισμα και κρατάς τους χαρακτήρες που θες.... με τον τρόπο αυτό μειώνεις το execution time και είσαι πιο ευέλικτος, αν θελήσεις στο μέλλον να βλέπεις συχνότητες και από χαρακτήρες που δεν είχες υπολογίζει ότι θέλεις να διαβάσεις...

Link to comment
Share on other sites

Μια λογική προγραμματισμού....

Πρώτα ορίζεις τι εννοείς γράμματα.

Ένα κείμενο μπορεί να έχει ότι αλφαριθμητικά σε όποια γλώσσα ή συνδυασμό μπορείς να φανταστείς.

Αν δεν το ξέρεις, το πρόγραμμα πρέπει να σκανάρει ένα ένα χαρακτήρα και να τους βάλει ως μεταβλητές.

Μετράς το σύνολο των μεταβλητών, έστω 150 χαρακτήρες.

Μετά για κάθε μεταβλητή μετράς το σύνολο.

πχ

for i=1 to 150

while a(i) b(i)=b(i)+1

next i

Σύνολο γραμμάτων

Σ= 0

for i=1 to 150

Σ= Σ+b(i)

next i

Μετά με πράξεις βγάζεις το ποσοστό κάθε μεταβλητής

Link to comment
Share on other sites

Όταν λες ότι πέρασες το αρχείο σε πίνακα, τι εννοείς; Μέτρησες την συχνότητα των γραμμάτων;

οχι απλα με την fscanf βαζω τα περιεχομενα ου αρχειου σε πινακα. δεν ξερω κατα πσοσο ειναι αφικτο να κανω ολη την διαδικασια με αλλο τροπο

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.