Progetto: Calcolatore di Codice Fiscale in C

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

  1. Linguaggio di Programmazione: C
  2. Interfaccia Utente: Interfaccia a riga di comando
  3. Funzionalità:
    • Inserimento di nome, cognome, data di nascita, sesso e comune di nascita
    • Calcolo del codice fiscale basato sugli algoritmi ufficiali

Struttura del Progetto

  1. main.c: Contiene il main del programma e la logica per il calcolo del codice fiscale.
  2. calcolatore_cf.h: Definisce le funzioni e le strutture necessarie per il calcolo del codice fiscale.
  3. calcolatore_cf.c: Implementa le funzioni definite in calcolatore_cf.h.

Passaggi

  1. Creare il file calcolatore_cf.h:

    • Definire le funzioni e le strutture per il calcolo del codice fiscale.
  2. Creare il file calcolatore_cf.c:

    • Implementare le funzioni definite in calcolatore_cf.h.
  3. 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

  1. Compilare il programma:

    gcc -o calcolatore_cf main.c calcolatore_cf.c
    
  2. Eseguire il programma:

    ./calcolatore_cf
    
  3. 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

  1. Validazione avanzata: Aggiungere controlli per validare l’input dell’utente.
  2. Database dei comuni: Utilizzare un database completo dei codici catastali per i comuni italiani.
  3. Interfaccia grafica: Creare una semplice interfaccia grafica per il calcolatore di codice fiscale utilizzando librerie grafiche come GTK o Qt.