🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Progetto: Calcolatore di Codice Fiscale in C

Codegrind Team•Jul 12 2024

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.