Progetto: Calcolatore di Codice Fiscale in C

Edoardo Midali
Descrizione del Progetto
In questo progetto, realizzerai un calcolatore di codice fiscale in C. Il programma richiederà all’utente di inserire informazioni personali (nome, cognome, data di nascita, sesso e comune di nascita) e calcolerà il codice fiscale italiano basato su queste informazioni.
Requisiti
- Linguaggio di Programmazione: C
- Interfaccia Utente: Interfaccia a riga di comando
- Funzionalità:
- Inserimento di nome, cognome, data di nascita, sesso e comune di nascita
- Calcolo del codice fiscale basato sugli algoritmi ufficiali
Struttura del Progetto
- main.c: Contiene il main del programma e la logica per il calcolo del codice fiscale.
- calcolatore_cf.h: Definisce le funzioni e le strutture necessarie per il calcolo del codice fiscale.
- calcolatore_cf.c: Implementa le funzioni definite in
calcolatore_cf.h.
Passaggi
-
Creare il file
calcolatore_cf.h:- Definire le funzioni e le strutture per il calcolo del codice fiscale.
-
Creare il file
calcolatore_cf.c:- Implementare le funzioni definite in
calcolatore_cf.h.
- Implementare le funzioni definite in
-
Creare il file
main.c:- Gestire l’interazione con l’utente e chiamare le funzioni per il calcolo del codice fiscale.
Codice del Progetto
calcolatore_cf.h
#ifndef CALCOLATORE_CF_H
#define CALCOLATORE_CF_H
void calcola_codice_fiscale(char *nome, char *cognome, char *data_nascita, char sesso, char *comune, char *codice_fiscale);
#endif
calcolatore_cf.c
#include "calcolatore_cf.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Dizionario dei comuni e codici catastali (solo esempi, da completare)
typedef struct {
char nome[50];
char codice[5];
} Comune;
Comune comuni[] = {
{"ROMA", "H501"},
{"MILANO", "F205"},
{"NAPOLI", "F839"},
// Aggiungi altri comuni qui
};
char get_mese_codice(char mese) {
switch (mese) {
case '1': return 'A';
case '2': return 'B';
case '3': return 'C';
case '4': return 'D';
case '5': return 'E';
case '6': return 'H';
case '7': return 'L';
case '8': return 'M';
case '9': return 'P';
case '10': return 'R';
case '11': return 'S';
case '12': return 'T';
default: return ' ';
}
}
void estrai_consonanti(char *input, char *output) {
int j = 0;
for (int i = 0; i < strlen(input); i++) {
if (!strchr("AEIOUaeiou", input[i])) {
output[j++] = toupper(input[i]);
}
}
output[j] = '\0';
}
void estrai_vocali(char *input, char *output) {
int j = 0;
for (int i = 0; i < strlen(input); i++) {
if (strchr("AEIOUaeiou", input[i])) {
output[j++] = toupper(input[i]);
}
}
output[j] = '\0';
}
void compila_nome_cognome(char *input, char *output, int is_nome) {
char consonanti[50], vocali[50];
estrai_consonanti(input, consonanti);
estrai_vocali(input, vocali);
if (is_nome && strlen(consonanti) > 3) {
output[0] = consonanti[0];
output[1] = consonanti[2];
output[2] = consonanti[3];
} else {
snprintf(output, 4, "%-3.3s", strcat(consonanti, vocali));
}
}
void calcola_codice_fiscale(char *nome, char *cognome, char *data_nascita, char sesso, char *comune, char *codice_fiscale) {
char parte_cognome[4] = {0}, parte_nome[4] = {0}, parte_data[6] = {0}, parte_comune[5] = {0};
int giorno, mese, anno;
// Calcolo parte del cognome
compila_nome_cognome(cognome, parte_cognome, 0);
// Calcolo parte del nome
compila_nome_cognome(nome, parte_nome, 1);
// Calcolo parte della data di nascita e sesso
sscanf(data_nascita, "%2d/%2d/%4d", &giorno, &mese, &anno);
parte_data[0] = (anno / 10 % 10) + '0';
parte_data[1] = (anno % 10) + '0';
parte_data[2] = get_mese_codice(mese + '0');
if (sesso == 'F') {
giorno += 40;
}
snprintf(parte_data + 3, 3, "%02d", giorno);
// Calcolo parte del comune
for (int i = 0; i < sizeof(comuni) / sizeof(comuni[0]); i++) {
if (strcmp(comune, comuni[i].nome) == 0) {
strcpy(parte_comune, comuni[i].codice);
break;
}
}
// Concatenazione delle parti
snprintf(codice_fiscale, 17, "%s%s%s%s", parte_cognome, parte_nome, parte_data, parte_comune);
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "calcolatore_cf.h"
int main() {
char nome[50], cognome[50], data_nascita[11], sesso, comune[50], codice_fiscale[17];
printf("Inserisci il nome: ");
scanf("%s", nome);
printf("Inserisci il cognome: ");
scanf("%s", cognome);
printf("Inserisci la data di nascita (gg/mm/aaaa): ");
scanf("%s", data_nascita);
printf("Inserisci il sesso (M/F): ");
scanf(" %c", &sesso);
printf("Inserisci il comune di nascita: ");
scanf("%s", comune);
calcola_codice_fiscale(nome, cognome, data_nascita, sesso, comune, codice_fiscale);
printf("Il codice fiscale calcolato è: %s\n", codice_fiscale);
return 0;
}
Istruzioni per l’Esecuzione
-
Compilare il programma:
gcc -o calcolatore_cf main.c calcolatore_cf.c -
Eseguire il programma:
./calcolatore_cf -
Interazione con l’utente:
- Inserisci il nome.
- Inserisci il cognome.
- Inserisci la data di nascita (formato gg/mm/aaaa).
- Inserisci il sesso (M/F).
- Inserisci il comune di nascita.
- Il programma calcolerà e mostrerà il codice fiscale.
Estensioni Possibili
- Validazione avanzata: Aggiungere controlli per validare l’input dell’utente.
- Database dei comuni: Utilizzare un database completo dei codici catastali per i comuni italiani.
- Interfaccia grafica: Creare una semplice interfaccia grafica per il calcolatore di codice fiscale utilizzando librerie grafiche come GTK o Qt.