|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Programma "conteggio parole"
Dev-C++ Editor e Compilatore
Programmazione in c. Questo programma deve memorizzare le parole contenute in un file di testo (in cui le parole del testo sono incolonnate come una lista) in un'array di struct di 20 elementi (struct che contiene "parola" e "numero di volte che compare nel testo") e poi deve stampare tale tabella. Questa è la mia idea: /* Esame*/ #include <stdio.h> #include <string.h> #define SIZE 20 struct count { char nome[14]; int n; }; typedef struct count lista; int RicercaEsaustiva(lista *,char *); main(){ lista persone[SIZE]; char parola[14]; FILE *fPtr; int resp; int i=0; if ((fPtr=fopen("testo.h", "r")) == NULL) printf("Non posso aprire il file\n"); else{ while (!feof(fPtr)){ fscanf(fPtr, "%s", &parola); if((resp=RicercaEsaustiva(persone, parola)) != -1) persone[resp].n=persone[resp].n + 1; else{ strcpy(parola,persone[i].nome); persone[i].n=1; } } for(i=0; i<=SIZE-1;i++) printf("%-14s%10d\n", persone[i].nome, persone[i].n); } system("pause"); return 0; } int RicercaEsaustiva(lista *p, char *str){ int u=0; for (u=0; u<SIZE-1; u++){ if (!strncmp(p[u].nome,str, sizeof(str) )) return u; } return -1; } Il programma viene compilato tranquillamente ma quando lo eseguo mi restituisce una tabella dove ho una lista di parole inverosimili in caratteri ASCII e a destra numeri esagerati o negativi. Sapete trovare il problema? I file del progetto sono esame.c e testo.h (perchè il Dev-c++ non riconosce i file *.dat e *.txt) Help |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Non ho ancora visto il sorgente, ma mi incuriosisce questa cosa:
Quote:
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Quando si crea il progetto si aggiungono i file tra cui il vero e proprio programma (che ho chiamato Esame.c) e il file testo a cui il programma deve fare riferimento (che ho chiamato testo.h perchè il Dev non mi riconosce i files .dat e .txt). Diciamo che se gli do testo.dat o .txt mi da "No rule to make the target".
|
|
|
|
|
|
#4 | |||||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Il tuo programma però contiene svariati errori concettuali e di applicazione delle funzioni di libreria standard, tanto che mi sento obbligato a segnalarteli --- e a suggerirti di rivedere seriamente la tua preparazione. Quote:
Lo specificatore "%s" dice già a fscanf di aspettarsi un puntatore a char. Quindi ciò che devi passarle non è &parola, che è un puntatore a puntatore a char. Quote:
Inoltre, senza un'inizializzazione opportuna dei campi degli elementi di persone, il conteggio potrebbe risultare sbagliato a causa di possibili falsi positivi di RicercaEsaustiva. Quote:
Inoltre, str è un argomento di una funzione, quindi è un puntatore e non un array: di conseguenza, sizeof(str) ha lo stesso valore di sizeof(void *), che in genere non è la lunghezza della stringa allocata a partire da str. Quote:
P.S.: Solo per curiosità: che libro usi?
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||||
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Grazie mille!!
Non mi torna molto la considerazione su SIZE-1 in quanto il puntatore punta ad un array e il primo elemento di un array di SIZE 20 è [0] quindi se faccio un ciclo da 0 a SIZE mi fa un ciclo di 21 e non di 20. No?! Comunque studio su "C corso completo di programmazione" Deitel&Deitel. Grazie faccio subito le correzioni |
|
|
|
|
|
#6 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Se includi sia 0 che SIZE lo fai su 21; se includi 0 ma non SIZE, lo fai su 20. Devi stare un po' attento all'uso delle disuguaglianze strette o larghe. Quote:
Uniscigli l'Appendice B del Kernighan&Ritchie (è meno del 15% del libro, quindi puoi fotocopiarla per uso personale) come guida di riferimento alla libreria standard, e diventerai invincibile
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Allora.... fatte le correzioni questo è il programma: (non ho fatto l'indicizzazione dei str perchè non so cosa intendevi ma non penso che sia necessario.... forse....)
/* Esame*/ #include <stdio.h> #include <string.h> #define SIZE 20 struct count { char nome[14]; int n; }; typedef struct count lista; int RicercaEsaustiva(lista *,char *); main(){ lista persone[SIZE]; char parola[14]; FILE *fPtr; int resp; int i=0; if ((fPtr=fopen("testo.h", "r")) == NULL) printf("Non posso aprire il file\n"); else{ while (!feof(fPtr)){ fscanf(fPtr, "%s", parola); if((resp=RicercaEsaustiva(persone, parola)) != -1) persone[resp].n=persone[resp].n + 1; else{ strcpy(persone[i].nome,parola); persone[i].n=1; } } for(i=0; i<=SIZE-1;i++) printf("%-14s%10d\n", persone[i].nome, persone[i].n); } system("pause"); return 0; } int RicercaEsaustiva(lista *p, char *str){ int u=0; for (u=0; u<SIZE-1; u++){ if (!strncmp(p[u].nome,str, 14 )) return u; } return -1; } ........................... e questa è l'esecuzione............... stato 2 ☺ 2371712 ÿ 13 ♫ 0 ╚♣Æ|X$= 3999464 m♣Æ| 2293672 ©♦= -2142189085 dk§º 12708 ☻ 6 16 h$= 4007016 ► 3997696 0 2293536 ↑¯☺ 2293564 ↑¯æ|p♣Æ| m♣Æ|Ì┬┐w2009055966 4006969 `#$ 2009056206 ↑ " 2008948848 Ò┬┐w¶©└w`$= 4006960 2293672 Premere un tasto per continuare . .. ..........................................Boh?!?!?.......................... |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Codice:
else{
strcpy(persone[i].nome,parola);
persone[i++].n=1;
}
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
aggiungi amche un ciclo che inizializza l'array persone con stringhe vuote in nome e 0 in n
|
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Quote:
Mah!? |
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Mi rispieghi?
Che array devo inizializzare? Grazie per la disponibilità |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Codice:
for(i=0;i<SIZE;i++){
strcpy(persone[i].nome,"");
persone[i].n=0;
}
i=0;
Con l'istruzione Codice:
lista persone[SIZE]; |
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Grazie mille.
Ho fatto la correzione (hai pienamente ragione) ma ora mi da il problema che quando compilo e eseguo la finestra di esecuzione mi si apre e chiude in un istante... eppure ho messo anche system("pause")?? Sono fuso |
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
io l'ho provato e funziona
|
|
|
|
|
|
#15 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Mi potresti mandare l'intero codice che lo confronto?
Poi non ti rompo + Grazie |
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Codice:
#include <stdio.h>
#include <string.h>
#define SIZE 20
struct count {
char nome[14];
int n;
};
typedef struct count lista;
int RicercaEsaustiva(lista *,char *);
main(){
lista persone[SIZE];
char parola[14];
FILE *fPtr;
int resp;
int i=0;
for(i=0;i<SIZE;i++){
strcpy(persone[i].nome,"");
persone[i].n=0;
}
i=0;
if ((fPtr=fopen("testo.txt", "r")) == NULL)
printf("Non posso aprire il file\n");
else{
while (!feof(fPtr)){
fscanf(fPtr, "%s", parola);
if((resp=RicercaEsaustiva(persone, parola)) != -1)
persone[resp].n=persone[resp].n + 1;
else{
strcpy(persone[i].nome,parola);
persone[i++].n=1;
}
}
for(i=0; i<=SIZE-1;i++)
printf("%-14s%10d\n", &(persone[i].nome), persone[i].n);
}
system("pause");
return 0;
}
int RicercaEsaustiva(lista *p, char *str){
int u=0;
for (u=0; u<SIZE; u++){
if (!strncmp(p[u].nome,str,14))
return u;
}
return -1;
}
oggi non ho proprio voglia di studiare |
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 15
|
Tragica situazione!!
Identici (a parte l'ultimo prinf in cui stampi l'indirizzo del nome .. mmm) ma mi da questo problema solo se scelgo di incrementare l'i ( persone[i++].n=1). Mistero della fede #include <stdio.h> #include <string.h> #define SIZE 20 struct count { char nome[14]; int n; }; typedef struct count lista; int RicercaEsaustiva(lista *,char *); main(){ lista persone[SIZE]; int i; for(i=0; i<=SIZE-1; i++){ strcpy(persone[i].nome,""); persone[i].n=0; } char parola[14]; FILE *fPtr; int resp=0; i=0; if ((fPtr=fopen("testo.h", "r")) == NULL) printf("Non posso aprire il file\n"); else{ while (!feof(fPtr)){ fscanf(fPtr, "%s", parola); if((resp=RicercaEsaustiva(persone, parola)) != -1) persone[resp].n=persone[resp].n + 1; else{ strcpy(persone[i].nome,parola); persone[i++].n=1; } } for(i=0; i<=SIZE-1;i++) printf("%-14s%10d\n", persone[i].nome, persone[i].n); } system("pause"); return 0; } int RicercaEsaustiva(lista *p, char *str){ int u=0; for (u=0; u<=SIZE-1; u++){ if (!strncmp(p[u].nome,str, 14 )) return u; } return -1; } |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
ho provato anche il tuo codice e va tutto bene
io uso code blocks con mingw |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:11.











io l'ho provato e funziona







