Ciao io ho qst programma che vorrei modificare:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//Questo programma memorizza un file in memoria dinamica, ma non memorizza la stessa parola due volte
#define MAX_PAROLE 400000
typedef struct {
char *parola;
int num;
}parole;
void ordina(parole *a[], int n);
void attendi ();
int main(int argc, char* argv[])
{
char frase[100];
parole *libro[MAX_PAROLE];
int i=0, dimensione_totale=0;
int j;
char trovato;
clock_t t1,t2;
float tm;
FILE * pf;
pf=fopen(argv[1],"r");
if (pf==NULL) {
printf("Impossibile aprire il file\n");
return 1;
}
for (i=0;i<MAX_PAROLE;i++) libro=NULL;
i=0;
do {
fscanf (pf,"%s",frase);
if (feof(pf)) break;
for (j=0,trovato=0;libro[j];j++)
if (strcmp(libro[j]->parola,frase)==0){
trovato=1;
libro[j]->num+=1;
break;
}
if (!trovato) {
libro=malloc(sizeof(parole));
libro->parola=malloc(strlen(frase)+1);
dimensione_totale+=strlen(frase)+1;
strcpy (libro->parola,frase);
libro->num=1;
//printf ("%s %d\n",frase,i);
i++;
if (i == MAX_PAROLE-1) {
printf ("Troppe parole. devo fermarmi qui\n");
attendi();
break;
}
}
}while (1);
printf ("\n\nAdesso ristampo il libro\n\n");
attendi();
for (j=0;libro[j];j++)
printf ("%4d %-25s presente %d volte\n",j,libro[j]->parola,libro[j]->num);
attendi();
printf ("Adesso metto tutto in ordine\n");
t1=clock();
ordina (libro, i);
t2=clock();
tm=((float)(t2-t1))/(CLOCKS_PER_SEC);
printf("\ntempo di ordinamento: %f s\n",tm);
printf ("\n\nAdesso ristampo il libro\n\n");
attendi();
for (i=0;libro;i++)
printf ("%4d %-25s presente %d volte\n",i,libro->parola,libro->num);
return 0;
}
Però vorrei modificarlo in modo che mi stampi solo le 20 parole più usate e scrivere accanto quante volte sono presenti nel testo solo x qll 20 parole e in base a qnt volte compare far stampare a lato un determinato numero di cancelletti per esempio cosi:
ciao (2) ####
buongiorno (3) #####
salve (4) ######
come potrei modificare qll programma?
grazie ciao
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//Questo programma memorizza un file in memoria dinamica, ma non memorizza la stessa parola due volte
#define MAX_PAROLE 400000
typedef struct {
char *parola;
int num;
}parole;
void ordina(parole *a[], int n);
void attendi ();
int main(int argc, char* argv[])
{
char frase[100];
parole *libro[MAX_PAROLE];
int i=0, dimensione_totale=0;
int j;
char trovato;
clock_t t1,t2;
float tm;
FILE * pf;
pf=fopen(argv[1],"r");
if (pf==NULL) {
printf("Impossibile aprire il file\n");
return 1;
}
for (i=0;i<MAX_PAROLE;i++) libro=NULL;
i=0;
do {
fscanf (pf,"%s",frase);
if (feof(pf)) break;
for (j=0,trovato=0;libro[j];j++)
if (strcmp(libro[j]->parola,frase)==0){
trovato=1;
libro[j]->num+=1;
break;
}
if (!trovato) {
libro=malloc(sizeof(parole));
libro->parola=malloc(strlen(frase)+1);
dimensione_totale+=strlen(frase)+1;
strcpy (libro->parola,frase);
libro->num=1;
//printf ("%s %d\n",frase,i);
i++;
if (i == MAX_PAROLE-1) {
printf ("Troppe parole. devo fermarmi qui\n");
attendi();
break;
}
}
}while (1);
printf ("\n\nAdesso ristampo il libro\n\n");
attendi();
for (j=0;libro[j];j++)
printf ("%4d %-25s presente %d volte\n",j,libro[j]->parola,libro[j]->num);
attendi();
printf ("Adesso metto tutto in ordine\n");
t1=clock();
ordina (libro, i);
t2=clock();
tm=((float)(t2-t1))/(CLOCKS_PER_SEC);
printf("\ntempo di ordinamento: %f s\n",tm);
printf ("\n\nAdesso ristampo il libro\n\n");
attendi();
for (i=0;libro;i++)
printf ("%4d %-25s presente %d volte\n",i,libro->parola,libro->num);
return 0;
}
Però vorrei modificarlo in modo che mi stampi solo le 20 parole più usate e scrivere accanto quante volte sono presenti nel testo solo x qll 20 parole e in base a qnt volte compare far stampare a lato un determinato numero di cancelletti per esempio cosi:
ciao (2) ####
buongiorno (3) #####
salve (4) ######
come potrei modificare qll programma?
grazie ciao