Fabio,
aggiungo che di tutto quello che abbiamo detto in tutti i thread, hai fatto tue poche cose, se non niente.
L'errore nel tuo codice, che se mi permetti, non offenderti, io capisco che vuoi imparare e ti ribadisco che non è il modo per farlo, fa schifo.
E' un'unico monoblocco, non c'è una funzione, è impossibile comprendere codice scritto così. Prima di scrivere dovresti fare un minimo di ingegnerizzazione. Dirai io non sono ingegnere, ma puoi provare a ragionare e ti rendi conto che poi gli ingegneri in fondo ragionano prima di mettersi li a scrivere righe di codice, molte volte inutili. Se si è pensato bene al problema, si risparmia tempo, si guadagna in efficienza, ecc...
Per scrivere programmi è importante compiere questi passi, prima di ogni cosa.
Vedila in questi termini con il tuo esempio:
Problema generare il codice fiscale, allora mi documento:
http://it.wikipedia.org/wiki/Codice_fiscal
scoprirai che in realtà il codice fiscale sebbene sarai in grado di generarlo non è detto che è quello che ti attribuisce l'agenzia delle entrate, perchè non puoi gestire i casi di omocodie.
Poi, vedi che cosa ti serve come strutture dati. Tu non ne utilizzi una che è veramente utile per un programma efficiente.
Poi deleghi a funzioni, cioè dividi il progamma in piccoli pezzettini, così il programma risulterà ordinato, il codice risulterà più snello e facilmente manutenibile e debuggabile, anche da chi non lo ha scritto.
Dopo aver pensato così a grandi linee, puoi cominciare su carta a disegnarti i vari pezzi di programma, non vergognarti di fare disegni stupidi, ragionamenti elementari, lo fanno anche gli ingegneri.
Poi cominci a scrivere il codice e, anzitutto cominci dai commenti di massima e solo dopo avere avuto un programma completo di commenti di alto livello, cominci a scrivere le funzioni, che puoi debuggare a parte scrivendo spike ad hoc.
So ce ti sembro un folle, ma così ci perdi molto molto molto meno tempo di quanto tu non possa immaginare.
P.s.
Non pensare che se impari a fare questo puoi chiamarti ingegnere, ma metti solide abitudini per poterlo diventare forse un giorno.
Ciò premesso, ecco quello che tu vuoi sentirti dire:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, const char * argv[])
{
char cognome [30], cognome_cod[4], nome[30], nome_cod[5], anno[4], anno_cod[2];
char mese[10], mese_cod, giorno[3], sesso[2], conferma[2], luogo[30], luogo_cod[5];
char codice[16], dispari[16], pari[16], carattere_controllo;
int i2=0, giorno_int, val_pari=0, val_dispari=0, somma=0, resto=0;
int i;
printf("Inserire cognome: ");
scanf("%s", cognome);
printf("Inserire nome: ");
scanf("%s", nome);
printf("Inserisci anno di nascita(aa): ");
scanf("%s", anno);
printf("Inserisci mese di nascita(lettere): ");
scanf("%s", mese);
printf("Inserisci sesso(m/f): ");
scanf("%s", sesso);
printf("Inserisci giorno di nascita(gg): ");
scanf("%s", giorno);
printf("Sei nato in Italia?(s/n): ");
scanf("%s", conferma);
//sviluppo calcoli per calcolare le lettere del cognome
if (strlen(cognome)==2) {
strcpy(cognome_cod,cognome);
cognome_cod[2]='x';
} else {
for (i=0; i<strlen(cognome); i++) {
if (cognome[i]!='a' && cognome[i]!='e' && cognome[i]!='i' && cognome[i]!='o' && cognome[i]!='u') {
cognome_cod[i2]=cognome[i];
i2++;
}
if (i2>2)
break;
}
if (strlen(cognome_cod)<=2) {
for (i=0; i<strlen(cognome); i++) {
if (cognome[i]=='a' || cognome[i]=='e' || cognome[i]=='i' || cognome[i]=='o' || cognome[i]=='u') {
cognome_cod[2]=cognome[i];
break;
}
}
}
}
//sviluppo calcoli per calcolare le lettere del nome
i2=0;
if (strlen(nome)==2) {
strcpy(nome_cod,nome);
nome_cod[2]='x';
} else {
for (i=0; i<strlen(nome); i++) {
if (nome[i]!='a' && nome[i]!='e' && nome[i]!='i' && nome[i]!='o' && nome[i]!='u') {
nome_cod[i2]=nome[i];
i2++;
}
//spostare le lettere
if (i2==4) {
nome_cod[0]=nome_cod[0];
for (i=1; i<4; i++)
nome_cod[i]=nome_cod[i+1];
}
if (i2>3)
break;
}
if (strlen(nome_cod)<=2) {
for (i=0; i<strlen(nome); i++) {
if (nome[i]=='a' || nome[i]=='e' || nome[i]=='i' || nome[i]=='o' || nome[i]=='u') {
nome_cod[2]=nome[i];
break;
}
}
}
}
//sviluppo calcoli per l'anno di nascita
if (strlen(anno)==2) {
strcpy(anno_cod, anno);
} else {
printf("\nAnno scritto nella forma errata!");
return 0;
}
//sviluppo calcoli per il mese di nascita
if(strcmp(mese,"gennaio")==0)
mese_cod='a';
if(strcmp(mese,"febbraio")==0)
mese_cod='b';
if(strcmp(mese,"marzo")==0)
mese_cod='c';
if(strcmp(mese,"aprile")==0)
mese_cod='d';
if(strcmp(mese,"maggio")==0)
mese_cod='e';
if(strcmp(mese,"giugno")==0)
mese_cod='h';
if(strcmp(mese,"luglio")==0)
mese_cod='l';
if(strcmp(mese,"agosto")==0)
mese_cod='m';
if(strcmp(mese,"settembre")==0)
mese_cod='p';
if(strcmp(mese,"ottobre")==0)
mese_cod='r';
if(strcmp(mese,"novembre")==0)
mese_cod='s';
if(strcmp(mese,"dicembre")==0)
mese_cod='t';
//sviluppo calcoli per il giorno di nascita
//sesso di nascita
if (strncmp(sesso,"f",2)==0) {
//convertire giorno da stringa a intero
giorno_int=atoi(giorno);
//sommare 40 a giorno
giorno_int+=40;
//convertire giorn_int da intero a stringa
sprintf(giorno,"%d", giorno_int);
}
//sviluppo calcoli per il luogo
if (strncmp(conferma, "s", 2)==0) {
printf("Inserisci luogo di nascita: ");
scanf("%s", luogo);
FILE * f = fopen ("prova.txt" , "r");
if ( !f ) return -1;
char buffer [1024];
int conta_righe, i;
/* inizializzo il contatore */
conta_righe = 0;
while(fgets (buffer , 1024 , f) != NULL)
{
/* ho letto una riga: aumento il contatore */
conta_righe++;
/* elimino il carattere "a capo" al termine della riga */
i = 0;
while(buffer[i] != '\n') i++;
buffer[i] = '\0';
/* confronto la stringa appena letta con il campione */
if(strcmp(buffer, luogo) == 0)
{
/* esco dal ciclo while. */
break;
}
}
fclose(f);
FILE * pf = fopen ("codici.txt" , "r");
if ( !pf ) return -1;
char buffer1 [1024];
int riga_da_leggere;
/* voglio leggere la riga in input */
riga_da_leggere = conta_righe;
/* inizializzo il contatore */
i = 0;
while(i != riga_da_leggere)
{
if(fgets (buffer1 , 1024 , pf) == NULL)
{
printf("Fine del file raggiunta.\n");
return -1;
}
buffer1[strlen(buffer1)-1]='\0';
i++;
}
strcpy(luogo_cod, buffer1);
fclose(pf);
} else {
//nato all'estero
printf("Inserisci stato di nascita: ");
scanf("%s", luogo);
if (strcmp(luogo, "albania")==0)
strcpy(luogo_cod,"z100");
if (strcmp(luogo, "ucraina")==0)
strcpy(luogo_cod,"z138");
if (strcmp(luogo, "grecia")==0)
strcpy(luogo_cod,"z115");
if (strcmp(luogo, "polonia")==0)
strcpy(luogo_cod,"z127");
}
//copiare i caratteri in una variabile codice fiscale
i2=0;
for (i=0; i<3; i++)
codice[i]=cognome_cod[i];
for (i=3; i<6; i++) {
codice[i]=nome_cod[i2];
i2++;
}
i2=0;
for (i=6; i<8; i++) {
codice[i]=anno_cod[i2];
i2++;
}
codice[8]=mese_cod;
i2=0;
for (i=9; i<11; i++) {
codice[i]=giorno[i2];
i2++;
}
i2=0;
for (i=11; i<15; i++) {
codice[i]=luogo_cod[i2];
i2++;
}
//codice per il carattere di controllo
int i_dispari=0, i_pari=0;
for (i=0; i<strlen(codice); i++) {
//dividere i caratteri pari dai caratteri dispari
if((i%2)==1) {
//caratteri pari(parte dall'indice 0)
pari[i_pari]=codice[i];
i_pari++;
} else {
dispari[i_dispari]=codice[i];
i_dispari++;
}
}
//assegnare il valore ai caratteri pari
for (i=0; i<strlen(pari); i++) {
if (pari[i] >= '0' && pari[i] <= '9')
val_pari += pari[i] - '0';
if (pari[i] >= 'a' && pari[i] <= 'z')
val_pari += pari[i] - 'a';
}
//assegnare il valore ai caratteri dispari
for (i=0; i<strlen(dispari); i++) {
if (strncmp(&dispari[i], "0", 1)==0)
val_dispari+=1;
if (strncmp(&dispari[i], "1", 1)==0)
val_dispari+=0;
if (strncmp(&dispari[i], "2", 1)==0)
val_dispari+=5;
if (strncmp(&dispari[i], "3", 1)==0)
val_dispari+=7;
if (strncmp(&dispari[i], "4", 1)==0)
val_dispari+=9;
if (strncmp(&dispari[i], "5", 1)==0)
val_dispari+=13;
if (strncmp(&dispari[i], "6", 1)==0)
val_dispari+=15;
if (strncmp(&dispari[i], "7", 1)==0)
val_dispari+=17;
if (strncmp(&dispari[i], "8", 1)==0)
val_dispari+=19;
if (strncmp(&dispari[i], "9", 1)==0)
val_dispari+=21;
if (strncmp(&dispari[i], "a", 1)==0)
val_dispari+=1;
if (strncmp(&dispari[i], "b", 1)==0)
val_dispari+=0;
if (strncmp(&dispari[i], "c", 1)==0)
val_dispari+=5;
if (strncmp(&dispari[i], "d", 1)==0)
val_dispari+=7;
if (strncmp(&dispari[i], "e", 1)==0)
val_dispari+=9;
if (strncmp(&dispari[i], "f", 1)==0)
val_dispari+=13;
if (strncmp(&dispari[i], "g", 1)==0)
val_dispari+=15;
if (strncmp(&dispari[i], "h", 1)==0)
val_dispari+=17;
if (strncmp(&dispari[i], "i", 1)==0)
val_dispari+=19;
if (strncmp(&dispari[i], "j", 1)==0)
val_dispari+=21;
if (strncmp(&dispari[i], "k", 1)==0)
val_dispari+=2;
if (strncmp(&dispari[i], "l", 1)==0)
val_dispari+=4;
if (strncmp(&dispari[i], "m", 1)==0)
val_dispari+=18;
if (strncmp(&dispari[i], "n", 1)==0)
val_dispari+=20;
if (strncmp(&dispari[i], "o", 1)==0)
val_dispari+=11;
if (strncmp(&dispari[i], "p", 1)==0)
val_dispari+=3;
if (strncmp(&dispari[i], "q", 1)==0)
val_dispari+=6;
if (strncmp(&dispari[i], "r", 1)==0)
val_dispari+=8;
if (strncmp(&dispari[i], "s", 1)==0)
val_dispari+=12;
if (strncmp(&dispari[i], "t", 1)==0)
val_dispari+=14;
if (strncmp(&dispari[i], "u", 1)==0)
val_dispari+=16;
if (strncmp(&dispari[i], "v", 1)==0)
val_dispari+=10;
if (strncmp(&dispari[i], "w", 1)==0)
val_dispari+=22;
if (strncmp(&dispari[i], "x", 1)==0)
val_dispari+=25;
if (strncmp(&dispari[i], "y", 1)==0)
val_dispari+=24;
if (strncmp(&dispari[i], "z", 1)==0)
val_dispari+=23;
if (strncmp(&dispari[i], "\0", 1)==0)
val_dispari+=0;
}
//sommare i valori pari e i valori dispari
somma=val_pari+val_dispari;
//calcolare il resto dividendo per 26 il risultato
resto=somma%26;
//assegnare ad ogni valore da 0 a 25 il carattere corrispondente
char a='a';
for (i=0; i<=25; i++) {
if (resto==i)
carattere_controllo=a;
a++;
}
codice[15]=carattere_controllo;
codice[16]='\0';
//caratteri maiuscoli e stampa dell'output
for (i=0; i<codice[i]; i++)
codice[i]=toupper(codice[i]);
printf("\n%s\nProgramma di Fabio", codice);
return 0;
}
Il problema, anche se te l'ho detto diverse volte e non hai capito è, che una stringa va completata sempre con '\0'. Con questi aggiustamenti il programma non fa più quello che dicevi.
Comunque il programma non funziona, per esempio con giorni di nascita da 1 a 9.
Adesso dimmi per curiosità, la tua prima riga di codice è stata questa:
printf("\n%s\nProgramma di Fabio", codice);
E' giusto essere orgogliosi e dire questo l'ho fatto io, ma attento che quello non può essere il tuo primo pensiero.
Adesso, fai vedere a tutti che hai capito la lezione, risistemati il programma, primo che funzioni con tutte le date, poi con tutti i comuni d'italia i codici li trovi su internet, con cognomi e nomi multipli, cognomi senza nome, ecc...
Fai in modo che l'utente, che è mediamente stupido, possa scrivere tutto in maiuscolo, minuscolo, metà e metà, ecc...
Poi ristrutturati il codice come ti ho detto: ma è VIETATO chiedere per ogni cosa. Quando le cose non riuscirai a farle chiedi consigli a noi, ti ripeto tutti hanno voglia di aiutarti. Ma consigli non significa trovami l'errore, non funziona scrivi correttamente, ecc... Devi imparare a capire quello che vuoi fare, quello che hai fatto e cosa c'è che non va! Usa un debug, semina stampe di debug lungo tutto il codice, scrivi spike, inventati cose strane, ma impara a comprendere cosa non funziona.
Adesso al Lavoro!!!