T
TC
I'm not a C programmer.
This is a good C?
how check the return value of getch or scanf?
and how check for the \n at the end of the text read?
FEOF do not return true if the file (text file) is finish?
if no what use?
/*Inclusione librerie*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*Definizione della strutura Elemento*/
typedef struct
{
char *parola;
unsigned int freq;
}Elem;
/*Definizione della lista delle parole trovate*/
struct Albero
{
Elem Elemento;
struct Albero *s;
struct Albero *d;
};
/*Definizione variabili*/
/*Albero ordinato per alfabeto*/
struct Albero *treeA = NULL;
/*Albero ordinato per frequenze*/
struct Albero *treeF = NULL;
unsigned int count = 0;
/*Definizione funzioni*/
/*Funzione di scansione del file costruzione delle parole e chiamata
della funzione di inseriento nell'albero ordinato per alfabeto*/
void Scansione(FILE *pf);
/*Aggiungi nodo all'albero ordinato per alfabeto*/
struct Albero *AggNodo_TreeA(struct Albero *nodo, char *parola);
/*Stampa albero*/
void Print(struct Albero *nodo);
/*Crea un nuovo albero ordinato per frequenza utilizzando come sorgente
l'albero
ordinato per alfabeto*/
void CreaAlberoF(struct Albero *sorg);
/*Aggiunge un nuovo nodo all'albero ordinato pre frequenze copiando i
valori dal
nodo passato come sorgente*/
struct Albero * AggNodo_TreeF(struct Albero *sorg, struct Albero *dest);
main (void)
{
char scelta;
int fOK;
int g;
/*Nome del file di testo*/
char nf[50];
/*Puntatore al file*/
FILE *pf;
/*MAIN*/
printf("\n Avvio del programma \n");
do
{
fOK = 0;
printf("\nInserire il nome del file di testo che si desidera
utilizzare (Esempio: Testo.txt) \n");
g = fscanf(stdin,"%s",nf); /*Lettura del nome del file */
pf=fopen(nf,"r"); /*Apertura del file in modalità di lettura*/
/*Controllo apertura del file*/
if (pf==NULL)
{
/*Restituzione del messaggio di errore in caso di mancata apertura*/
perror("ERRORE nell'apertura del file");
fOK = 1;
}
}while(fOK != 0);
printf("\n\n");
do
{
scelta = 0;
/*Menù*/
printf("\n 1- Scansione del file di testo \n");
printf("\n 2- Creazione del file delle parole ordinato per frequenza \n");
printf("\n 3- Stampa a video del file delle parole ordinato per
frequenza \n");
printf("\n 4- Stampa a video del file delle parole ordinato per ordine
alfabetico \n");
printf("\n 5- Esci \n");
do
{
scelta = getchar();
}while(scelta!= '1' && scelta!= '2' && scelta!= '3' && scelta!= '4' &&
scelta!= '5');
count=0;
/*Blocco di scelta*/
switch(scelta)
{
case ('1'):
Scansione(pf);
printf("\n Scansione EFFETTUATA! \n");
break;
case ('2'):
CreaAlberoF(treeA);
printf("\n Lista delle parole ordinata per frequenza creata! \n");
break;
case ('3'):
Print(treeF);
break;
case('4'):
Print(treeA) ;
break;
default:
exit(0);
}
}while(scelta!=5);
}
/*Funzione che effettua la scansione del file per individuare le parole
e richiama la funzione di aggiunta di un nuovo elemento all'albero
alfabeto*/
void Scansione (FILE *pf)
{
char *ptr;
char *parola;
char *allocazione;
char c; /*Variabile per la letura dei caratteri dal file di testo*/
char *carattere; /*Variabile utilizzatata per la concatenazione*/
int lung; /*Lunghezza della parola*/
/*Istanziazione e inizializzazione della variabile carattere*/
carattere = malloc(2*sizeof(carattere));
carattere[0]='\0';
/*Istanziazione e inizializzazione della variabile parola*/
parola = malloc(1*sizeof(parola));
parola[0]='\0';
while(!feof(pf)) /*Ripete fino alla fine del file*/
{
c = fgetc(pf);/*Lettura del carattere */
/*Controllo se il carattere è presente nell'alfabeto*/
if (isalpha(c))
{
/*Calcolo della lunghezza della parola */
lung=strlen(parola);
/*Assgnamento del valore alla variabile carattere*/
carattere[0]=c;
carattere[1]='\0';
if(!(allocazione = realloc(parola,(lung+1)*sizeof(parola))))
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
else
{
parola = allocazione;
}
/*lowercase*/
*carattere = tolower(*carattere);
/*Concatenzazione dei caratteri per formare la parola*/
parola = strcat(parola,carattere);
}
else
{
/*Inserimento della parola*/
if ((parola[0]!='\0'))
{
/*Richiamo della funzione che aggiunge le parole nell'albero
ordinato per alfabeto*/
if (treeA == NULL)
{
/*Aggionamemto della radice */
treeA = AggNodo_TreeA(treeA,parola);
}
else
{
AggNodo_TreeA(treeA,parola);
}
/*Reinizializzazione della variabile parola*/
parola= realloc(parola,sizeof(char));
parola[0]='\0';
}
}
}
/*Chiusura file*/
fclose(pf);
}
/*Funzione di aggiunta di un nodo all'albero*/
struct Albero *AggNodo_TreeA(struct Albero *nodo, char *parola)
{
if (nodo == NULL)
{
/*Creazione nuovo nodo dell'albero*/
if(!(nodo = (struct Albero*) malloc(sizeof(struct Albero))))
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
/*Imposto il valore dei puntatori ai nodi figli*/
nodo->d = NULL;
nodo->s = NULL;
/*Impostazione della frequenza*/
nodo->Elemento.freq = 1;
/*Allocazione della memoria per la stringa contenete la parola*/
nodo->Elemento.parola =
malloc(strlen(parola)*sizeof(nodo->Elemento.parola));
if(nodo->Elemento.parola == NULL)
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
/*Copia della stringa*/
strcpy(nodo->Elemento.parola,parola);
}
else
{
/*Variabile che restituisce il valore della comparazione parola*/
int conf;
/*Comparazione della parola*/
conf = strcmp(nodo->Elemento.parola,parola);
switch(conf)
{
case (1):
nodo->s = AggNodo_TreeA(nodo->s,parola);
break;
case (-1):
nodo->d = AggNodo_TreeA(nodo->d,parola);
break;
default:
/*Se le parole sono uguali incremento il valore della frequenza*/
nodo->Elemento.freq = nodo->Elemento.freq + 1 ;
break;
}
}
return nodo;
}
/*Funzione di stampa dell'albero passato in input*/
void Print(struct Albero *nodo)
{
if (nodo != NULL)
{
/*Richiamo della funzione sul ramo sinistro*/
Print(nodo->s);
if (count == 10 )
{
printf("\n Premere un tasto per continuare...\n");
getchar();
count = 0;
}
else
{
count++;
}
/*Stampa della parola*/
printf("\n PAROLA: %s ", nodo->Elemento.parola);
printf(" FREQUENZA: %d ", nodo->Elemento.freq);
/*Richiamo della funzione sul ramo destro*/
Print(nodo->d);
}
}
struct Albero * AggNodo_TreeF(struct Albero *sorg, struct Albero *dest)
{
if (dest == NULL)
{
/*Creazione nuovo nodo dell'albero*/
dest = (struct Albero*) malloc(sizeof(struct Albero));
/*Imposto il valore dei puntatori ai nodi figli*/
dest->d = NULL;
dest->s = NULL;
/*Impostazione della frequenza*/
dest->Elemento.freq = sorg->Elemento.freq;
/*Allocazione della memoria per la stringa contenete la parola*/
dest->Elemento.parola =
malloc(strlen(sorg->Elemento.parola)*sizeof(dest->Elemento.parola));
if(dest->Elemento.parola == NULL)
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
/*Copia della stringa*/
strcpy(dest->Elemento.parola,sorg->Elemento.parola);
}
else
{
/*Comparazione Frequenza*/
if ( dest->Elemento.freq < sorg->Elemento.freq)
{
dest->s = AggNodo_TreeF(sorg,dest->s);
}
else
{
dest->d = AggNodo_TreeF(sorg,dest->d);
}
}
return dest;
}
/*Funzione che crea l'abero delle frequenze partendo dall'abero ordinato
per
alfabeto passato in input*/
void CreaAlberoF(struct Albero *sorg)
{
if (sorg != NULL)
{
CreaAlberoF(sorg->s);
if (treeF == NULL)
{
treeF = AggNodo_TreeF(sorg, treeF);
}
else
{
AggNodo_TreeF(sorg, treeF);
}
CreaAlberoF(sorg->d);
}
}
This is a good C?
how check the return value of getch or scanf?
and how check for the \n at the end of the text read?
FEOF do not return true if the file (text file) is finish?
if no what use?
/*Inclusione librerie*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*Definizione della strutura Elemento*/
typedef struct
{
char *parola;
unsigned int freq;
}Elem;
/*Definizione della lista delle parole trovate*/
struct Albero
{
Elem Elemento;
struct Albero *s;
struct Albero *d;
};
/*Definizione variabili*/
/*Albero ordinato per alfabeto*/
struct Albero *treeA = NULL;
/*Albero ordinato per frequenze*/
struct Albero *treeF = NULL;
unsigned int count = 0;
/*Definizione funzioni*/
/*Funzione di scansione del file costruzione delle parole e chiamata
della funzione di inseriento nell'albero ordinato per alfabeto*/
void Scansione(FILE *pf);
/*Aggiungi nodo all'albero ordinato per alfabeto*/
struct Albero *AggNodo_TreeA(struct Albero *nodo, char *parola);
/*Stampa albero*/
void Print(struct Albero *nodo);
/*Crea un nuovo albero ordinato per frequenza utilizzando come sorgente
l'albero
ordinato per alfabeto*/
void CreaAlberoF(struct Albero *sorg);
/*Aggiunge un nuovo nodo all'albero ordinato pre frequenze copiando i
valori dal
nodo passato come sorgente*/
struct Albero * AggNodo_TreeF(struct Albero *sorg, struct Albero *dest);
main (void)
{
char scelta;
int fOK;
int g;
/*Nome del file di testo*/
char nf[50];
/*Puntatore al file*/
FILE *pf;
/*MAIN*/
printf("\n Avvio del programma \n");
do
{
fOK = 0;
printf("\nInserire il nome del file di testo che si desidera
utilizzare (Esempio: Testo.txt) \n");
g = fscanf(stdin,"%s",nf); /*Lettura del nome del file */
pf=fopen(nf,"r"); /*Apertura del file in modalità di lettura*/
/*Controllo apertura del file*/
if (pf==NULL)
{
/*Restituzione del messaggio di errore in caso di mancata apertura*/
perror("ERRORE nell'apertura del file");
fOK = 1;
}
}while(fOK != 0);
printf("\n\n");
do
{
scelta = 0;
/*Menù*/
printf("\n 1- Scansione del file di testo \n");
printf("\n 2- Creazione del file delle parole ordinato per frequenza \n");
printf("\n 3- Stampa a video del file delle parole ordinato per
frequenza \n");
printf("\n 4- Stampa a video del file delle parole ordinato per ordine
alfabetico \n");
printf("\n 5- Esci \n");
do
{
scelta = getchar();
}while(scelta!= '1' && scelta!= '2' && scelta!= '3' && scelta!= '4' &&
scelta!= '5');
count=0;
/*Blocco di scelta*/
switch(scelta)
{
case ('1'):
Scansione(pf);
printf("\n Scansione EFFETTUATA! \n");
break;
case ('2'):
CreaAlberoF(treeA);
printf("\n Lista delle parole ordinata per frequenza creata! \n");
break;
case ('3'):
Print(treeF);
break;
case('4'):
Print(treeA) ;
break;
default:
exit(0);
}
}while(scelta!=5);
}
/*Funzione che effettua la scansione del file per individuare le parole
e richiama la funzione di aggiunta di un nuovo elemento all'albero
alfabeto*/
void Scansione (FILE *pf)
{
char *ptr;
char *parola;
char *allocazione;
char c; /*Variabile per la letura dei caratteri dal file di testo*/
char *carattere; /*Variabile utilizzatata per la concatenazione*/
int lung; /*Lunghezza della parola*/
/*Istanziazione e inizializzazione della variabile carattere*/
carattere = malloc(2*sizeof(carattere));
carattere[0]='\0';
/*Istanziazione e inizializzazione della variabile parola*/
parola = malloc(1*sizeof(parola));
parola[0]='\0';
while(!feof(pf)) /*Ripete fino alla fine del file*/
{
c = fgetc(pf);/*Lettura del carattere */
/*Controllo se il carattere è presente nell'alfabeto*/
if (isalpha(c))
{
/*Calcolo della lunghezza della parola */
lung=strlen(parola);
/*Assgnamento del valore alla variabile carattere*/
carattere[0]=c;
carattere[1]='\0';
if(!(allocazione = realloc(parola,(lung+1)*sizeof(parola))))
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
else
{
parola = allocazione;
}
/*lowercase*/
*carattere = tolower(*carattere);
/*Concatenzazione dei caratteri per formare la parola*/
parola = strcat(parola,carattere);
}
else
{
/*Inserimento della parola*/
if ((parola[0]!='\0'))
{
/*Richiamo della funzione che aggiunge le parole nell'albero
ordinato per alfabeto*/
if (treeA == NULL)
{
/*Aggionamemto della radice */
treeA = AggNodo_TreeA(treeA,parola);
}
else
{
AggNodo_TreeA(treeA,parola);
}
/*Reinizializzazione della variabile parola*/
parola= realloc(parola,sizeof(char));
parola[0]='\0';
}
}
}
/*Chiusura file*/
fclose(pf);
}
/*Funzione di aggiunta di un nodo all'albero*/
struct Albero *AggNodo_TreeA(struct Albero *nodo, char *parola)
{
if (nodo == NULL)
{
/*Creazione nuovo nodo dell'albero*/
if(!(nodo = (struct Albero*) malloc(sizeof(struct Albero))))
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
/*Imposto il valore dei puntatori ai nodi figli*/
nodo->d = NULL;
nodo->s = NULL;
/*Impostazione della frequenza*/
nodo->Elemento.freq = 1;
/*Allocazione della memoria per la stringa contenete la parola*/
nodo->Elemento.parola =
malloc(strlen(parola)*sizeof(nodo->Elemento.parola));
if(nodo->Elemento.parola == NULL)
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
/*Copia della stringa*/
strcpy(nodo->Elemento.parola,parola);
}
else
{
/*Variabile che restituisce il valore della comparazione parola*/
int conf;
/*Comparazione della parola*/
conf = strcmp(nodo->Elemento.parola,parola);
switch(conf)
{
case (1):
nodo->s = AggNodo_TreeA(nodo->s,parola);
break;
case (-1):
nodo->d = AggNodo_TreeA(nodo->d,parola);
break;
default:
/*Se le parole sono uguali incremento il valore della frequenza*/
nodo->Elemento.freq = nodo->Elemento.freq + 1 ;
break;
}
}
return nodo;
}
/*Funzione di stampa dell'albero passato in input*/
void Print(struct Albero *nodo)
{
if (nodo != NULL)
{
/*Richiamo della funzione sul ramo sinistro*/
Print(nodo->s);
if (count == 10 )
{
printf("\n Premere un tasto per continuare...\n");
getchar();
count = 0;
}
else
{
count++;
}
/*Stampa della parola*/
printf("\n PAROLA: %s ", nodo->Elemento.parola);
printf(" FREQUENZA: %d ", nodo->Elemento.freq);
/*Richiamo della funzione sul ramo destro*/
Print(nodo->d);
}
}
struct Albero * AggNodo_TreeF(struct Albero *sorg, struct Albero *dest)
{
if (dest == NULL)
{
/*Creazione nuovo nodo dell'albero*/
dest = (struct Albero*) malloc(sizeof(struct Albero));
/*Imposto il valore dei puntatori ai nodi figli*/
dest->d = NULL;
dest->s = NULL;
/*Impostazione della frequenza*/
dest->Elemento.freq = sorg->Elemento.freq;
/*Allocazione della memoria per la stringa contenete la parola*/
dest->Elemento.parola =
malloc(strlen(sorg->Elemento.parola)*sizeof(dest->Elemento.parola));
if(dest->Elemento.parola == NULL)
{
printf("\n Errore di allocazione della memoria.\n");
exit(0);
}
/*Copia della stringa*/
strcpy(dest->Elemento.parola,sorg->Elemento.parola);
}
else
{
/*Comparazione Frequenza*/
if ( dest->Elemento.freq < sorg->Elemento.freq)
{
dest->s = AggNodo_TreeF(sorg,dest->s);
}
else
{
dest->d = AggNodo_TreeF(sorg,dest->d);
}
}
return dest;
}
/*Funzione che crea l'abero delle frequenze partendo dall'abero ordinato
per
alfabeto passato in input*/
void CreaAlberoF(struct Albero *sorg)
{
if (sorg != NULL)
{
CreaAlberoF(sorg->s);
if (treeF == NULL)
{
treeF = AggNodo_TreeF(sorg, treeF);
}
else
{
AggNodo_TreeF(sorg, treeF);
}
CreaAlberoF(sorg->d);
}
}