Repository 32bit  Forum
Repository 64bit  Wiki

contatore lettere in c[SOLVED]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

contatore lettere in c[SOLVED]

Messaggioda Blallo » mar giu 30, 2009 22:20

devo fare un semplice programma che calcoli quante parole che iniziano per una data lettera e stampare a video per ogni lettera il risultato, ma quando eseguo mi da segmentation fault
Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
#define MAXSTR 80
#define ALPHA 26

int main()
{
   FILE *fp;
   int i, c, b, a[ALPHA]={0};
   char str1[MAXSTR];

   printf("Inserire nome file:");
   scanf("%s", &str1);

   if((fp=fopen(str1,"r"))==NULL)
   {
      fprintf(stderr,"Errore apertura file");
      return EXIT_FAILURE;
   }

   c=' ';
   while((b=fgetc(fp))!=EOF)
   {
      if(isalpha(b) && !isalpha(c))
         a[toupper(b)-'A']++;
      c=b;
   }

   for(i=0; i<ALPHA; i++)
      printf("Parole che iniziano con %s, %d\n", i+'A', a[i]);

   fclose(fp);
   return EXIT_SUCCESS;
}   
Ultima modifica di Blallo il lun lug 06, 2009 20:08, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: contatore lettere in c

Messaggioda Blallo » mar giu 30, 2009 22:27

chiedo scusa a tutti, semplice errore di scrittura :D
Codice: Seleziona tutto
   for(i=0; i<ALPHA; i++)
      printf("Parole che iniziano con %c, %d\n", i+'A', a[i]);

ora funziona...(bastava sostituire %s con %c
al massimo mi sapete dire un algoritmo più efficiente?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: contatore lettere in c

Messaggioda Vito » mer lug 01, 2009 8:13

Ho fatto queste cose a gennaio ed in questo momento non mi ricordo proprio niente.... :lol: :lol: :lol: (sarà perchè sono immerso in un altro esame...)
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Avatar utente
Vito
Staff
Staff
 
Messaggi: 4123
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: contatore lettere in c

Messaggioda ulisse89 » mer lug 01, 2009 8:18

Anchio le ho fatte a gennaio e in effetti stanno cominciando a passare di mente. Comunque io ti proporrei: all'inizio dichiari un vettore di stringhe, (ovvero di vettori di caratteri), poi l'unica cosa che ti posso dire è usare la fscanf che direttamente mangia una stringa fino all primo spazio che incontra, guardi se il primo carattere è la lettera, e se lo è, la metti nel vettore di stringhe.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: contatore lettere in c

Messaggioda GioPower » mer lug 01, 2009 10:09

Non ricordo bene quali funzioni il C metta a disposizione per lavorare su stringhe, ma idealmente si potrebbe fare cosi':
1) Apri il file con fopen.
2) Vai alla fine del file con fseek, ricavi la dimensione del file con ftell, e torni all'inizio del file con fseek.
3) Fai una malloc della dimensione del file e leggi tutto il file (non carattere per carattere) con fread (credo) usando lo spazio appena allocato.
4) Chiudi il file con fclose.
5) Analizzi la stringa letta al passo 3. Idealmente devi trovare tutte le ricorrenze della lettera in questione che sia preceduta da uno spazio o un "a capo" (/n) o e' la prima lettera della stringa. E' possibile che ci siano altri caratteri da controllare oltre agli spazi o \n, come le parentisi.
6) Fine. Magari fai una free sullo spazio allocato al passo 3.

Devi stare attento ad allocare la giusta quantita' di memoria al passo 3 e a non uscire dalle dimensioni del vettore con l'indice del ciclo al passo 5 (per esempio richiedere il carattere in posizione -1 oppure oltre alla dimensione della malloc fatta).
Inoltre, se del codice uno funziona, ti consiglio di inserire dei puts("UNASTRINGAATUASCELTA") in mezzo al codice per capire dove il programma si ferma e individuare meglio il problema. Oppure usa una debugger, ma non mi pare il caso.

Ciao e buona fortuna.
Avatar utente
GioPower
Packager
Packager
 
Messaggi: 46
Iscritto il: lun ott 13, 2008 13:26
Nome Cognome: Luca Giona
Slackware: 13 x86_64
Kernel: 2.6.29
Desktop: xfce

Re: contatore lettere in c

Messaggioda Blallo » mer lug 01, 2009 21:43

GioPower ha scritto:Non ricordo bene quali funzioni il C metta a disposizione per lavorare su stringhe, ma idealmente si potrebbe fare cosi':
1) Apri il file con fopen.
2) Vai alla fine del file con fseek, ricavi la dimensione del file con ftell, e torni all'inizio del file con fseek.
3) Fai una malloc della dimensione del file e leggi tutto il file (non carattere per carattere) con fread (credo) usando lo spazio appena allocato.
4) Chiudi il file con fclose.
5) Analizzi la stringa letta al passo 3. Idealmente devi trovare tutte le ricorrenze della lettera in questione che sia preceduta da uno spazio o un "a capo" (/n) o e' la prima lettera della stringa. E' possibile che ci siano altri caratteri da controllare oltre agli spazi o \n, come le parentisi.
6) Fine. Magari fai una free sullo spazio allocato al passo 3.

Devi stare attento ad allocare la giusta quantita' di memoria al passo 3 e a non uscire dalle dimensioni del vettore con l'indice del ciclo al passo 5 (per esempio richiedere il carattere in posizione -1 oppure oltre alla dimensione della malloc fatta).
Inoltre, se del codice uno funziona, ti consiglio di inserire dei puts("UNASTRINGAATUASCELTA") in mezzo al codice per capire dove il programma si ferma e individuare meglio il problema. Oppure usa una debugger, ma non mi pare il caso.

Ciao e buona fortuna.

wow...lo proverò tra un po..appena capirò che hai scritto :D (devo studiarmi le operazioni che si muovono sul file ancora)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: contatore lettere in c

Messaggioda targzeta » mer lug 01, 2009 22:07

Lascia perdere, non è una gran bella soluzione:
  • perchè aprire il file, poi spostarsi in fondo e poi fare un ftell per sapere quanto è grande? c'è la funzione stat che ritorna le informazioni sul file, tra cui anche la dimensione in byte.
  • perchè leggersi un intero file in memoria per scandirlo carattere per carattere solo una volta? E se il file è grande 1GB, ci allochiamo 1GB di memoria?
Tutto questo è solo una mia opinione, ovviamente,
Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6149
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: contatore lettere in c

Messaggioda GioPower » gio lug 02, 2009 9:16

spina ha scritto:perchè aprire il file, poi spostarsi in fondo e poi fare un ftell per sapere quanto è grande? c'è la funzione stat che ritorna le informazioni sul file, tra cui anche la dimensione in byte.


Non mi ricordo molto le funzioni del C per maneggiare i file. Forse usare ftell e fseek per ricavare le dimensioni di un file era l'esercizio per imparare ad usare le funzioni. :-k

spina ha scritto:perchè leggersi un intero file in memoria per scandirlo carattere per carattere solo una volta? E se il file è grande 1GB, ci allochiamo 1GB di memoria?


Ma qui si puo fare un po' come si vuole, se ti fidi di come gestisce il disco il tuo disco e il tuo s.o. si puo' leggere carattere per carattere.
Altriementi puoi leggere tutto il file in un botto (se serve e si puo', anche un 1GB), naturalemente se ti aspetti file da 4GB, lo si puo leggere a blocchi magari dei MB a volta ed elaborarli, ma non mi sembrava il caso di complicare troppo le cose in questo contesto.
Ma forse non ha neache senso fare questa cosa per un file piccolo e per quello che jimmy ha da fare. :-k
Avatar utente
GioPower
Packager
Packager
 
Messaggi: 46
Iscritto il: lun ott 13, 2008 13:26
Nome Cognome: Luca Giona
Slackware: 13 x86_64
Kernel: 2.6.29
Desktop: xfce


Torna a Programmazione

Chi c’è in linea

Visitano il forum: TurnitinBot [Bot] e 1 ospite