|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
[C] conteggio lettere...non standard!
mi faccio risentire dopo lungo tempo!
![]() allora, il programmino stupido in questione conta le lettere contenute in un file di testo, e mette il risultato in un altro. codice: Codice:
#include <stdio.h> #include <string.h> main() { int letto, i; int conta[59]; FILE *pf; for (i = 0; i < 59; i++) conta[i] = 0; pf=fopen("origine.txt","r"); do { letto = getc(pf); switch (letto) { case 'a': conta[0]++; break; case 'b': conta[1]++; break; case 'c': conta[2]++; break; case 'd': conta[3]++; break; case 'e': conta[4]++; break; case 'f': conta[5]++; break; case 'g': conta[6]++; break; case 'h': conta[7]++; break; case 'i': conta[8]++; break; case 'j': conta[9]++; break; case 'k': conta[10]++; break; case 'l': conta[11]++; break; case 'm': conta[12]++; break; case 'n': conta[13]++; break; case 'o': conta[14]++; break; case 'p': conta[15]++; break; case 'q': conta[16]++; break; case 'r': conta[17]++; break; case 's': conta[18]++; break; case 't': conta[19]++; break; case 'u': conta[20]++; break; case 'v': conta[21]++; break; case 'w': conta[22]++; break; case 'x': conta[23]++; break; case 'y': conta[24]++; break; case 'z': conta[25]++; break; case 'A': conta[26]++; break; case 'B': conta[27]++; break; case 'C': conta[28]++; break; case 'D': conta[29]++; break; case 'E': conta[30]++; break; case 'F': conta[31]++; break; case 'G': conta[32]++; break; case 'H': conta[33]++; break; case 'I': conta[34]++; break; case 'J': conta[35]++; break; case 'K': conta[36]++; break; case 'L': conta[37]++; break; case 'M': conta[38]++; break; case 'N': conta[39]++; break; case 'O': conta[40]++; break; case 'P': conta[41]++; break; case 'Q': conta[42]++; break; case 'R': conta[43]++; break; case 'S': conta[44]++; break; case 'T': conta[45]++; break; case 'U': conta[46]++; break; case 'V': conta[47]++; break; case 'W': conta[48]++; break; case 'X': conta[49]++; break; case 'Y': conta[50]++; break; case 'Z': conta[51]++; break; case 'à': conta[52]++; break; case 'è': conta[53]++; break; case 'é': conta[54]++; break; case 'ì': conta[55]++; break; case 'ò': conta[56]++; break; case 'ó': conta[57]++; break; case 'ù': conta[58]++; break; default: break; } } while(letto != EOF); fclose(pf); pf=fopen("conteggio.txt","w"); fprintf(pf, "a=%4d A=%4d à=%4d\n", conta[0], conta[26], conta[52]); fprintf(pf, "b=%4d B=%4d\n", conta[1], conta[27]); fprintf(pf, "c=%4d C=%4d\n", conta[2], conta[28]); fprintf(pf, "d=%4d D=%4d\n", conta[3], conta[29]); fprintf(pf, "e=%4d E=%4d è=%4d é=%4d\n", conta[4], conta[30], conta[53], conta[ 54]); fprintf(pf, "f=%4d F=%4d\n", conta[5], conta[31]); fprintf(pf, "g=%4d G=%4d\n", conta[6], conta[32]); fprintf(pf, "h=%4d H=%4d\n", conta[7], conta[33]); fprintf(pf, "i=%4d I=%4d ì=%4d\n", conta[8], conta[34], conta[55]); fprintf(pf, "j=%4d J=%4d\n", conta[9], conta[35]); fprintf(pf, "k=%4d K=%4d\n", conta[10], conta[36]); fprintf(pf, "l=%4d L=%4d\n", conta[11], conta[37]); fprintf(pf, "m=%4d M=%4d\n", conta[12], conta[38]); fprintf(pf, "n=%4d N=%4d\n", conta[13], conta[39]); fprintf(pf, "o=%4d O=%4d ò=%4d ó=%4d\n", conta[14], conta[40], conta[56], conta [57]); fprintf(pf, "p=%4d P=%4d\n", conta[15], conta[41]); fprintf(pf, "q=%4d Q=%4d\n", conta[16], conta[42]); fprintf(pf, "r=%4d R=%4d\n", conta[17], conta[43]); fprintf(pf, "s=%4d S=%4d\n", conta[18], conta[44]); fprintf(pf, "t=%4d T=%4d\n", conta[19], conta[45]); fprintf(pf, "u=%4d U=%4d ù=%4d\n", conta[20], conta[46], conta[58]); fprintf(pf, "v=%4d V=%4d\n", conta[21], conta[47]); fprintf(pf, "w=%4d W=%4d\n", conta[22], conta[48]); fprintf(pf, "x=%4d X=%4d\n", conta[23], conta[49]); fprintf(pf, "y=%4d Y=%4d\n", conta[24], conta[50]); fprintf(pf, "z=%4d Z=%4d\n", conta[25], conta[51]); fclose(pf); } 1) non legge i caratteri accentati...come faccio a farglielo fare? 2) come faccio, nel caso volessi far inserire all'utente il nome del file col testo da analizzare? (che nel prog sopra è tassativamente origine.txt Gli chiedo il nome del file, ok, e magari lo registro con un gets(nome)...ma come faccio a fargli mettere tale stringa in pf=fopen("???","r"); un'altra cosa...il codice è noiosissimo, vale a dire, tutte quelle righe perché non posso usare solo un array numerico, devo mettere a=, b=, ecc ecc... non c'è proprio altro modo? grazie dei consigli!!! ![]()
__________________
ANGI |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
IMHO:
Fai un vettore di 256 interi...c'è un minimo di spreco, ma non è importante ed il tutto si riduce a: Codice:
do { letto = getc(pf); conta[letto]++; } while(letto != EOF); .... fprintf(pf, "a=%4d A=%4d à=%4d\n", conta['a'], conta['A'], conta['à']); |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E volendo si possono ridurre anche le fprintf (anche se risulterebbe un po' complesso da leggere)...
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
char nomefile[256];
printf("Inserisci il nome del file: "); scanf("%s", nomefile); .... pf=fopen(nomefile,"r"); |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
switch lungo:
considera che i char sono (piccoli?) interi,il loro valore numerico segue l'ordine alfabetico(prima le maiuscole). Se a=1 ,b=2 A=... etc (però non mi ricordo da dove partono ![]() quindi basta un if(char>0 &&char<finealfabeto) faiquellochevuoi(); escludendo tutti i caratteri non stampabili. Mi ricordo che è il primo esempio del Kernighan & Ritchie ![]() Ultima modifica di verloc : 04-02-2004 alle 07:20. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Considera che lei cerca anche i caratteri accentati e che sono intorno a 150 dei codisci ASCII...
Comunque se vuoi risparmiare sul vettore: Codice:
switch(letto) { case 'à': conta[52]++; break; case 'è': conta[53]++; break; case 'é': conta[54]++; break; case 'ì': conta[55]++; break; case 'ò': conta[56]++; break; case 'ó': conta[57]++; break; case 'ù': conta[58]++; break; default: if(letto >= 'a' && letto <= 'z') conta[letto - 'a']++; else if(letto >= 'A' && letto <= 'Z') conta[26 + letto - 'A']++; } |
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
Quote:
![]() passi il puntatore alla stringa, come da funzione fileopen ![]()
__________________
ANGI |
|
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
Quote:
__________________
ANGI Ultima modifica di angelica : 04-02-2004 alle 14:29. |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
nada...
...purtroppo, neppure la soluzione del primo post di cionci mi legge i caratteri accentati...
![]() (ah, perché vettore proprio a 256 caratteri?) ad esempio, se nel file di input c'è: aaaaAAAAAAAAAAAaaAAàààààààààà in conteggio.txt, alla fine, mi scrive: a= 6 A= 13 à=2000 ho visto che mette 2000 in barba al numero delle à presenti... anzi, non è vero...ho provato con questo altro input: aaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAa e mi dà a= 16 A= 23 à= 52 se poi aggiungo "à" in fondo, resta a 52... come mai? ...altre idee, ragazzi? ![]() grazie per il supporto!
__________________
ANGI |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
Quote:
![]() e poi dice "inventare la ruota" ![]() ma vui sit ancora a "inventare la clava" ! ![]() |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
i caratteri sono in totale 256: 128+128 estesi.Quindi il vettore ha 256 elementi.
L'unica cosa che potrebbe spiegare il conteggio a cacchio potrebbe essere il vettore non inizializzato ma non dovrebbe essere così(almeno credo ![]() Tu che dici cionci? Ultima modifica di verloc : 04-02-2004 alle 15:43. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
switch((char)letto) { case 'à': conta[52]++; break; case 'è': conta[53]++; break; case 'é': conta[54]++; break; case 'ì': conta[55]++; break; case 'ò': conta[56]++; break; case 'ó': conta[57]++; break; case 'ù': conta[58]++; break; default: if(letto >= 'a' && letto <= 'z') conta[letto - 'a']++; else if(letto >= 'A' && letto <= 'Z') conta[26 + letto - 'A']++; } getc legge un byte dal file (un vile sempre positivo da 0 a 255)... 'à' è un char (con segno)...i caratteri standard vanno da 0 a 127, mentre quelli estesi da -128 a -1... Essendo le lettere accentate caratteri estesi il valore di 'à' è negativo... Di conseguenza veniva confrontato un valore positivo con uno negativo...e di conseguenza non c'era mai successo... Forzando letto a char i valori maggiori di 127 vengono convertiti in numeri negativi...di conseguenza il confronto ha successo... |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
miezzeca m'ero dimenticato che era signed!
![]() ![]() |
![]() |
![]() |
![]() |
#15 | |
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
@cionci
grazie!
sei stato gentilissimo (la tua bravura è incredibile)! ![]() ora, ti volevo fare un'altra domanda: hai scritto Quote:
![]()
__________________
ANGI |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
for(letto = 0; letto<26; ++letto) { fprintf(pf, "%c=%4d %c=%4d", 'a'+letto, conta[letto], 'A'+letto, conta[26+letto]); switch('a'+letto) { case 'a': fprintf(pf, " à=%4d\n", conta[52]); break; case 'e': fprintf(pf, " è=%4d é=%4d\n", conta[53], conta[54]); break; case 'i': fprintf(pf, " ì=%4d\n", conta[55]); break; case 'o': fprintf(pf, " ò=%4d ó=%4d\n", conta[56], conta[57]); break; case 'u': fprintf(pf, " ù=%4d\n", conta[58]); break; default: fprintf(pf, "\n"); } } |
![]() |
![]() |
![]() |
#17 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Non per fare l'importuno, ma...
Vi siete ricordati di pulire l'array di 256 char prima di eseguire il ciclo do...while?
Che so, cosette tipo: Codice:
for (i=0; i<256; i++) conta[i]=0; |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ecco un'altra cosa che mi ero scordato di correggere:
Codice:
for (i = 0; i < 59; i++) conta = 0; |
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Nov 2003
Messaggi: 42
|
grande!!
grazie ancora, cionci!
![]() ora sono proprio poche righe di codice, come piace a me! ah, per l'inizializzazione dell'array...l'avevo fatta! ![]()
__________________
ANGI |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Re: grande!!
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:00.