Ecco un esempio su come calcolare il codice fiscale, per ovvi motivi e per non fornirti codice completo ho tralasciato volutamente la funzione che calcola il codice catastale, tale codice lo dovrai scrivere tu.
In caso di errore verrà inserito nel codice fiscale il carattere '?'.
Naturalmente ho cercato di scrivere il piu umanamente possibile.
Manca anche una buona dose di programmazione difensiva, anche se dubito che tu conosca cosa sia.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char* my_gets(char* d,int max)
{
char* st = d;
int c;
while ( (c = getchar()) != EOF && c != '\n' && --max > 0 ) *d++ = c;
*d = '\0';
return st;
}
int isvoc(char c)
{
static char voc[5] = {'a','e','i','o','u'};
int i;
for ( i = 0; i < 5; ++i)
if (voc[i] == c) return 1;
return 0;
}
void cf_trel(char* cf, char* cn)
{
int tre = 3;
char* frst = cn;
while ( *cn && tre )
{
if ( isvoc(*cn) )
{
++cn;
continue;
}
*cf++ = toupper(*cn++);
--tre;
}
cn = frst;
while ( *cn && tre )
{
if ( !isvoc(*cn) )
{
++cn;
continue;
}
*cf++ = toupper(*cn++);
--tre;
}
while (tre--)
*cf++ = 'X';
}
void cf_anno(char* cf, char* aa)
{
int l = strlen(aa);
switch (l)
{
case 2:
cf[6] = aa[0];
cf[7] = aa[1];
break;
case 4:
cf[6] = aa[2];
cf[7] = aa[3];
break;
default:
cf[6] = '?';
cf[7] = '?';
break;
}
}
void cf_mese(char* cf, char* mm)
{
static char mmap[12] = {'A','B','C','D','E','H','L','M','P','R','S','T'};
int m = atoi(mm);
if ( m <= 0 || m > 12 )
{
cf[8] = '?';
return;
}
cf[8] = mmap[--m];
}
void cf_ggsex(char* cf, char* gg, char* s)
{
int g = atoi(gg);
if ( g <= 0 || g > 31 )
{
cf[9] = '?';
cf[10] = '?';
return;
}
int onlyf = 0;
if ( *s != 'M' && *s != 'm')
{
if ( *s == 'F' || *s == 'f' )
onlyf = 40;
else
{
cf[9] = '?';
cf[10] = '?';
return;
}
}
g += onlyf;
if ( g < 10 )
{
cf[9] = '0';
sprintf(&cf[10],"%d",g);
}
else
sprintf(&cf[9],"%d",g);
}
void cf_catasto(char* cf, char* ita, char* cit, char* pro)
{
if ( *ita != 's' && *ita != 'S' )
{
//is very BIG
cf[11] = 'Z';
cf[12] = '?';
cf[13] = '?';
cf[14] = '?';
}
else
{
//is very BIG
cf[11] = '?';
cf[12] = '?';
cf[13] = '?';
cf[14] = '?';
}
}
void cf_cin(char* cf)
{
static int dmap[256];
static int pmap[256];
static char cmap[26];
static int init = 0;
if ( !init)
{
init = !init;
memset(dmap,0,256);
memset(pmap,0,256);
memset(cmap,0,26);
char* al = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
dmap['0'] = 1;
dmap['1'] = 0;
dmap['2'] = 5;
dmap['3'] = 7;
dmap['4'] = 9;
dmap['5'] = 13;
dmap['6'] = 15;
dmap['7'] = 17;
dmap['8'] = 19;
dmap['9'] = 21;
dmap['A'] = 1;
dmap['B'] = 0;
dmap['C'] = 5;
dmap['D'] = 7;
dmap['E'] = 9;
dmap['F'] = 13;
dmap['G'] = 15;
dmap['H'] = 17;
dmap['I'] = 19;
dmap['J'] = 21;
dmap['K'] = 2;
dmap['L'] = 4;
dmap['M'] = 18;
dmap['N'] = 20;
dmap['O'] = 11;
dmap['P'] = 3;
dmap['Q'] = 6;
dmap['R'] = 8;
dmap['S'] = 12;
dmap['T'] = 14;
dmap['U'] = 16;
dmap['V'] = 10;
dmap['W'] = 22;
dmap['X'] = 25;
dmap['Y'] = 24;
dmap['Z'] = 23;
dmap['?'] = 0; //for internal error
int i;
for ( i = 0; i < 10; ++i);
pmap['0' + i ] = i;
char* k = al;
for ( i = 0; *k; ++k, ++i)
pmap[(unsigned)*k] = i;
pmap['?'] = 0; //for internal error
k = al;
for ( i = 0; *k; ++k, ++i)
cmap[i] = *k;
}
char dis[9];
char* pd = dis;
char par[9];
char* pp = par;
//13579135
//2468024
int i;
for (i = 0; i < 16; ++i)
{
if ( (i +1) & 0x1 )
*pd++ = cf[i];
else
*pp++ = cf[i];
}
*pd = '\0';
*pp = '\0';
int cin = 0;
for (i = 0; i < 7; ++i)
{
cin += dmap[(unsigned)dis[i]];
cin += pmap[(unsigned)par[i]];
}
cin += dmap[(unsigned)dis[7]];
cf[15] = cmap[ cin % 26 ];
}
int main(int argc,char* argv[])
{
char codf[17];
codf[16] = '\0';
char inp[80];
char ex[80];
char eex[80];
printf("Inserisci cognome:");
fflush(stdout);
my_gets(inp,80);
cf_trel(codf,inp);
printf("Inserisci nome:");
fflush(stdout);
my_gets(inp,80);
cf_trel(&codf[3],inp);
printf("Inserisci Anno di nascita:");
fflush(stdout);
my_gets(inp,80);
cf_anno(codf,inp);
printf("Inserisci mese di nascita numericamente 1/12:");
fflush(stdout);
my_gets(inp,80);
cf_mese(codf,inp);
printf("Inserisci giorno di nascita numericamente 1/31:");
fflush(stdout);
my_gets(inp,80);
printf("Inserisci sesso M/F:");
fflush(stdout);
my_gets(ex,80);
cf_ggsex(codf,inp,ex);
printf("Inserisci sei Italiano S/N:");
fflush(stdout);
my_gets(inp,80);
printf("Inserisci Citta di nascita:");
fflush(stdout);
my_gets(ex,80);
printf("Inserisci Provincia di nascita:");
fflush(stdout);
my_gets(eex,80);
cf_catasto(codf,inp,ex,eex);
cf_cin(codf);
printf("\n\nIl tuo codice fiscale:%s\n",codf);
return 0;
}