Domanda aiutatemi a correggere il mio codice c++ per il codice fiscale

Andreii

Utente Iron
21 Maggio 2023
2
1
0
4
Ultima modifica da un moderatore:
ciao ho un compito scolastico, scrivere il codice per la scrittura del codice fiscale, solo che sto avendo dei problemi con i vari casi dei nomi e dei cognomi, mi potete dare una mano a correggere il mio codice ?

C++:
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <algorithm>
#include <string>
#include <cctype>

using namespace std;

struct codice{
    char nome[255];
    char cognome[255];
    char nascita[10];
    char sesso[2];
};

void inserimento(codice &cod){
    cout<<"inserisci il nome"<<endl;
    cin>>cod.nome;
    cout<<"inserisci il cognome"<<endl;
    cin>>cod.cognome;
    cout<<"inserisci la data di nascita gg/mm/aaaa"<<endl;
    cin>>cod.nascita;
    cout<<"inserisci il sesso"<<endl;
    cin>>cod.sesso;
}

void costruzioneNome(char nome[3],codice &cod){
    int c=0;
    int v=0;
    char consonanti[255];
    char vocali[255];
    string nom;
    for(int i=0;cod.nome[i]!='\0';i++){
         if(cod.nome[i]!='A'&&cod.nome[i]!='a'&&cod.nome[i]!='E'&&cod.nome[i]!='e'&&cod.nome[i]!='i'&&cod.nome[i]!='I'&&cod.nome[i]!='O'&&cod.nome[i]!='o'&&cod.nome[i]!='U'&&cod.nome[i]!='u'&&cod.nome[i]!=' '){
             consonanti[c]=cod.nome[i];
             if(consonanti[c]==cod.nome[i]){
                 c++;
             }
         }
    }
    for(int i=0;cod.nome[i]!='\0';i++){ 
        if(cod.nome[i]=='A'||cod.nome[i]=='a'||cod.nome[i]=='E'||cod.nome[i]=='e'||cod.nome[i]=='I'||cod.nome[i]=='i'||cod.nome[i]=='O'||cod.nome[i]=='o'||cod.nome[i]=='U'||cod.nome[i]=='u'){
            vocali[v]=cod.nome[i];
            if(vocali[v]==cod.nome[i]){
                v++;
            }        
        }
    }
    
    cout<<"la c: "<<c<<" "<<consonanti<<endl;
    cout<<"la v: "<<v<<" "<<vocali<<endl;
    if(c>=4){ //caso 4 consonanti prende solo il primo il terzo e i quaroto (FUNZiONA)
        nome[0]=consonanti[0];
        nome[1]=consonanti[2];
        nome[2]=consonanti[3];
    }else if(c==3){ //caso tre consonanti primo secondo e terzo (FUNZiONA
        nome[0]=consonanti[0];
        nome[1]=consonanti[1];
        nome[2]=consonanti[2];        
    }else if(c==2){//caso due consonanti piu prima vocale 
        nome[0]=consonanti[0];
        nome[1]=consonanti[1];
        nome[2]=vocali[0];
    }else if(c==1){//caso una consonante 
        if(v>=2){ //una consonante e due vocali (FUNZiONA)
        nome[0]=consonanti[0];
        nome[1]=vocali[0];
        nome[2]=vocali[1];
        }else if(v==1){ //una consonante una vocale e la x 
        nome[0]=consonanti[0];
        nome[1]=vocali[0];
        nome[2]='X';
        }
    }else if(c==0){ //caso due vocali e la x
        nome[0]=vocali[0];
        nome[1]=vocali[1];
        nome[2]='X';
    }
}

void costruzioneCognome(char cog[3],codice &cod){
    int c=0;
    int v=0;
    char consonanti[10];
    char vocali[10];
    for(int i=0;cod.nome[i]!='\0';i++){ //ricerca delle consonanti 
         if(cod.cognome[i]!='A'&&cod.cognome[i]!='a'&&cod.cognome[i]!='E'&&cod.cognome[i]!='e'&&cod.cognome[i]!='i'&&cod.cognome[i]!='I'&&cod.cognome[i]!='O'&&cod.cognome[i]!='o'&&cod.cognome[i]!='U'&&cod.cognome[i]!='u'&&cod.cognome[i]!=' '){
             consonanti[c]=cod.cognome[i];
             if(consonanti[c]==cod.cognome[i]){
                 c++;
             }
         }
    }
    for(int i=0;cod.nome[i]!='\0';i++){ //ricerca delle vocali
        if(cod.cognome[i]=='A'||cod.cognome[i]=='a'||cod.cognome[i]=='E'||cod.cognome[i]=='e'||cod.cognome[i]=='i'||cod.cognome[i]=='I'||cod.cognome[i]=='O'||cod.cognome[i]=='o'||cod.cognome[i]=='U'||cod.cognome[i]=='u'&&cod.cognome[i]!=' '){
            vocali[v]=cod.cognome[i];    
            if(vocali[v]==cod.cognome[i]){
                v++;
            }    
            }
    }
    
    cout<<"cognome consonanti "<<c<<" "<<consonanti<<endl;
    cout<<"cognome vocali "<<v<<" "<<vocali<<endl;
    if(c>=3){ //caso tre consonanti
        cog[0]=consonanti[0];
        cog[1]=consonanti[1];
        cog[2]=consonanti[2];    
    }else if(c==2){ //caso due consonanti e una vocale 
        cog[0]=consonanti[0];
        cog[1]=consonanti[1];
        cog[2]=vocali[0];
    }else if(c==1){ //caso una consonante
        if(v>=2){ //una consonante e due vocali
        cog[0]=consonanti[0];
        cog[1]=vocali[0];    
        cog[2]=vocali[1];
    }else if(v==1){//una consonante una vocale e la x
        cog[0]=consonanti[0];
        cog[1]=vocali[0];    
        cog[2]='X';
    }            
    }else if(c==0){//due vocali e una x
        cog[0]=vocali[0];
        cog[1]=vocali[1];    
        cog[2]='X';
    }
}

void caratteriNascita(char nascita[5],codice &cod){ //nella funzione inseriamo in un array i caratteri necessari per la nascita e il sesso 
    nascita[0]=cod.nascita[8];//due caratteri per l'anno
    nascita[1]=cod.nascita[9];
    if(cod.nascita[3]=='0'&&cod.nascita[4]=='1'){//i caratteri per il mese
        nascita[2]='A';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='2'){
        nascita[2]='B';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='3'){
        nascita[2]='C';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='4'){
        nascita[2]='D';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='5'){
        nascita[2]='E';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='6'){
        nascita[2]='H';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='7'){
        nascita[2]='L';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='8'){
        nascita[2]='M';
    }if(cod.nascita[3]=='0'&&cod.nascita[4]=='9'){
        nascita[2]='P';
    }if(cod.nascita[3]=='1'&&cod.nascita[4]=='0'){
        nascita[2]='R';
    }if(cod.nascita[3]=='1'&&cod.nascita[4]=='1'){
        nascita[2]='S';
    }if(cod.nascita[3]=='1'&&cod.nascita[4]=='2'){
        nascita[2]='T';
    }
    if(cod.sesso[0]=='M'||cod.sesso[0]=='M'){
        nascita[3]=cod.nascita[0];    
        nascita[4]=cod.nascita[1];    
    }else if(cod.sesso[0]=='F'||cod.sesso[0]=='f'){
        int n=(cod.nascita[0]);
        nascita[3]=n+4;
        nascita[4]=cod.nascita[1];
    }
}

void costruzioneComuni(string &luog){
    string luogo; 

    cout<<"inserisci il luogo di nascita: "; 
 
    cin>>luogo;
    string cc,nc; 

    transform(luogo.begin(), luogo.end(), luogo.begin(), ::toupper); 
    ifstream file("citta.txt"); 

    while(!file.eof()){ 
        file>>cc; 
        file>>nc; 
        if(luogo.compare(nc)==0){ 
            luog=cc; 
            file.close(); 
            break; 
        } 
    }
}

void costruzioneCcarattereverificatore(){
}

int main(){
    char nome[3];
    char cognome[3];
    char nascita[5];
    string luogo;
    codice cod;
    inserimento(cod);
    
    costruzioneNome(nome,cod);
    costruzioneCognome(cognome,cod);
    caratteriNascita(nascita,cod);
    
    cout<<"il codice del nome: "<<nome<<endl;
    cout<<"il codice del cognome: "<<cognome<<endl;
    cout<<"il codice del giorno: "<<nascita<<endl;
}
 
devo aggiungere questi tag o c’è una sezione con questi tag, se è così dove la trovo

Ti ho aggiunto il tag CODE modificando il post. Qui trovi la spiegazione su come va utilizzato il tag -> info bbcode.

A colpo d'occhio comunque ci sono già un paio di errori visibili: nella costruzioneNome dentro all'if fai questa operazione:
C++:
      consonanti[c]=cod.nome[i];
             if(consonanti[c]==cod.nome[i]){
                 c++;
             }

stai già assegnando la lettera, non ha senso fare il confronto, saranno uguali per forza di cose.

Non capisco nemmeno la creazione di questi array di caratteri:
C++:
 char consonanti[255];
char vocali[255];

(255 sono tantini...).

Cosa che andrei però a modificare subito, è l'utilizzo degli array di caratteri per le stringhe: ve l'ha detto il prof o è stata una tua scelta? Stai usando C++, sarebbe meglio utilizzare string. Se non puoi, allora ok, ma nel for non serve che scorri sino a che trovi il carattere \0, dovresti scorrere sino al termine della lunghezza dell'array (usando strlen).

Potresti provare ad ottimizzare un pò il codice: per esempio, dopo la lettura di nome e cognome, trasformi tutto in maiuscolo. Puoi anche crearti una funzione 'is_vocale' per evitare tutto quel codice, una cosa come:

C++:
int is_vocale(char ch) {    
    return 'A' == ch || 'E' == ch || 'I' == ch || 'O' == ch || 'U' == ch;
}

Per fare un esempio ulteriore:
C++:
    int v = 0, c=0;
    
    char vocali[strlen(cod.nome)];
    char consonanti[strlen(cod.nome)];

    for(int i=0; i < strlen(cod.nome); i++) {
        char ch = cod.nome[i];
        if(is_vocale(ch)) vocali[v++] = ch;
        else consonanti[c++] = ch;
    }


Ad ogni modo, a parte questi consigli (ci sarebbero altre cose da sistemare un pò, ma si può sorvolare ora), ci sono un paio di errori.

Nella funzione caratteriNascita il controllo lo fai 2 volte sulla lettera 'M' invece che 'm' e 'M'.

La dimensione degli array nel main è errata: non stai allocando spazio per il carattere terminatore; dovresti dichiararli di 1byte più grandi:
C++:
char nome[4];
char cognome[4];
char nascita[6];

Sarebbe meglio anche inizializzarli per accertarsi che sia tutto a \0.

C++:
char nome[4] = {'\0'};
char cognome[4] = {'\0'};
char nascita[6] = {'\0'};