Funzione elimina_spazi

di il
32 risposte

32 Risposte - Pagina 2

  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    fa comunque quello che faceva prima, quindi il programma non funziona correttamente
    Questo è un altro discorso. Intanto quella funzione ora è corretta; poi il problema salterà fuori.
  • Re: Funzione elimina_spazi

    Che ci possano essere mille errori è probabile ma se dici che str e strlen sono la stessa cosa e che non ti va di cambiarlo, allora nessuno ti risponde più.
  • Re: Funzione elimina_spazi

    Io ho scritto in questo forum per far si che il problema salti fuori, ma ancora non è successo. Se sapevo risolvere da me il problema non avrei scritto qui.
  • Re: Funzione elimina_spazi

    Beh, se sei "seccato" da come ti rispondono, risolvi da solo o paga qualcuno per farlo ...
  • Re: Funzione elimina_spazi

    Ma non sono capace di risolvere da solo, chiedo per questo gentilmente se potete sistemarlo voi
  • Re: Funzione elimina_spazi

    oregon ha scritto:


    se dici che str e strlen sono la stessa cosa e che non ti va di cambiarlo, allora nessuno ti risponde più.
    Non ho detto che non mi va di cambiarlo
  • Re: Funzione elimina_spazi

    Quindi come posso fare per risolvere il problema? Rispondete per favore
  • Re: Funzione elimina_spazi

    Dunque... Io, come ho già scritto nell'altro thread, non ci capisco più nulla.
    Forse conviene che tu posti l'intero codice una volta per tutte. Dopodiché non ti resta che attendere che qualche anima pia (sempre ammesso che ci sia) si metta lì a guardarlo...
  • Re: Funzione elimina_spazi

    Ecco il codice completo
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int controllo_spazi (char * str)
    {
        int x=1;
        for (int i=0; i<str[i]; i++) {
            if (str[i]==' ')
                x=0;
        }
        return x;
    }
    
    char * elimina_spazi (char * str)
    {
        int x=0, y=0, i;
        
        /* elimino il carattere "a capo" al termine della riga  */
        i = 0;
        while(str[i] != '\n') i++;
            str[i] = '\0';
        
        for (i=0; i<str[i]; i++) {
            if (str[i]==' ') {
                x=i;
                y=1;
                break;
            }
        }
        // codice che sposta le lettere
        if (y==1) {
            for (int i2=x; i2<str[i2]; i2++)
                str[i2]=str[i2+1];
        }
        
        return str;
    }
    
    int controllo_data (char * mese, char * giorno)
    {
        int x=0;
        if (strcmp(mese, "gennaio")==0 || strcmp(mese, "marzo")==0 || strcmp(mese, "maggio")==0 || strcmp(mese, "luglio")==0 || strcmp(mese, "agosto")==0 || strcmp(mese, "ottobre")==0 || strcmp(mese, "dicembre")==0) {
            if (atoi(giorno)<=31 && atoi(giorno)>=1)
                x=1;
        } else if (strcmp(mese, "aprile")==0 || strcmp(mese, "giugno")==0 || strcmp(mese, "settembre")==0 || strcmp(mese, "novembre")==0) {
            if (atoi(giorno)<=30 && atoi(giorno)>=1)
                x=1;
        } else if (strcmp(mese, "febbraio")==0) {
            if (atoi(giorno)<=28 && atoi(giorno)>=1)
                x=1;
        }
        return x;
    }
    
    int main(int argc, const char * argv[])
    {
        char cognome [30], cognome_cod[4], nome[30], nome_cod[5], anno[4], anno_cod[2], mese[10], mese_cod, giorno[3], sesso[2], conferma[2], luogo[30], luogo_cod[1024], codice[16], dispari[16], pari[16], carattere_controllo;
        int i2=0, giorno_int, val_pari=0, val_dispari=0, somma=0, resto=0;
        int i;
        
        printf("Inserire cognome: ");
        fgets(cognome, sizeof(cognome), stdin);
        strcpy(cognome, elimina_spazi(cognome));
        printf("Inserire nome: ");
        fgets(nome, sizeof(nome), stdin);
        strcpy(nome, elimina_spazi(nome));
        do
        {
        printf("Inserisci anno di nascita(aa): ");
        scanf("%s", anno);
        }
        //anno 1÷2014
        while (atoi(anno)<1 || atoi(anno)>2014 || strlen(anno)!=2);
        do
        {
            printf("Inserisci mese di nascita(lettere): ");
            scanf("%s", mese);
            do
            {
                printf("Inserisci sesso(m/f): ");
                scanf("%s", sesso);
            }
            while ((strcmp(sesso, "m")!=0) && (strcmp(sesso, "f")!=0));
            do
            {
                printf("Inserisci giorno di nascita(gg): ");
                scanf("%s", giorno);
            }
            while (atoi(giorno)<1 || atoi(giorno)>31 || strlen(giorno)==1);
        }
        while (controllo_data(mese, giorno) != 1);
        printf("Sei nato in Italia?(s/n): ");
        scanf("%s", conferma);
        
        //sviluppo calcoli per calcolare le lettere del cognome
        if (strlen(cognome)==2) {
            strcpy(cognome_cod,cognome);
            cognome_cod[2]='x';
        } else {
            for (i=0; i<strlen(cognome); i++) {
                if (cognome[i]!='a' && cognome[i]!='e' && cognome[i]!='i' && cognome[i]!='o' && cognome[i]!='u') {
                    cognome_cod[i2]=cognome[i];
                    i2++;
                }
                if (i2>2)
                    break;
            }
            if (strlen(cognome_cod)<=2) {
                for (i=0; i<strlen(cognome); i++) {
                    if (cognome[i]=='a' || cognome[i]=='e' || cognome[i]=='i' || cognome[i]=='o' || cognome[i]=='u') {
                        cognome_cod[2]=cognome[i];
                        break;
                    }
                }
            }
        }
        
        //sviluppo calcoli per calcolare le lettere del nome
        i2=0;
        if (strlen(nome)==2) {
            strcpy(nome_cod,nome);
            nome_cod[2]='x';
        } else {
            for (i=0; i<strlen(nome); i++) {
                if (nome[i]!='a' && nome[i]!='e' && nome[i]!='i' && nome[i]!='o' && nome[i]!='u') {
                    nome_cod[i2]=nome[i];
                    i2++;
                }
                //spostare le lettere
                if (i2==4) {
                    nome_cod[0]=nome_cod[0];
                    for (i=1; i<4; i++) 
                        nome_cod[i]=nome_cod[i+1];
                }
                if (i2>3)
                    break;
            }
            if (strlen(nome_cod)<=2) {
                for (i=0; i<strlen(nome); i++) {
                    if (nome[i]=='a' || nome[i]=='e' || nome[i]=='i' || nome[i]=='o' || nome[i]=='u') {
                        nome_cod[2]=nome[i];
                        break;
                    }
                }
            }
        }
        
        //sviluppo calcoli per l'anno di nascita
        if (strlen(anno)==2) {
            strcpy(anno_cod, anno);
        } else {
            printf("\nAnno scritto nella forma errata!");
            return 0;
        }
            
        //sviluppo calcoli per il mese di nascita
        if(strcmp(mese,"gennaio")==0)
            mese_cod='a';
        if(strcmp(mese,"febbraio")==0)
            mese_cod='b';
        if(strcmp(mese,"marzo")==0)
            mese_cod='c';
        if(strcmp(mese,"aprile")==0)
            mese_cod='d';
        if(strcmp(mese,"maggio")==0)
            mese_cod='e';
        if(strcmp(mese,"giugno")==0)
            mese_cod='h';
        if(strcmp(mese,"luglio")==0)
            mese_cod='l';
        if(strcmp(mese,"agosto")==0)
            mese_cod='m';
        if(strcmp(mese,"settembre")==0)
            mese_cod='p';
        if(strcmp(mese,"ottobre")==0)
            mese_cod='r';
        if(strcmp(mese,"novembre")==0)
            mese_cod='s';
        if(strcmp(mese,"dicembre")==0)
            mese_cod='t';
        
        //sviluppo calcoli per il giorno di nascita
        //sesso di nascita
        if (strncmp(sesso,"f",2)==0) {
            //convertire giorno da stringa a intero
            giorno_int=atoi(giorno);
            //sommare 40 a giorno
            giorno_int+=40;
            //convertire giorn_int da intero a stringa
            sprintf(giorno,"%d", giorno_int);
        }
        
        //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            do
            {
            printf("Inserisci luogo di nascita (senza lasciare spazi): ");
            fgets(luogo, sizeof(luogo), stdin); //qui non funziona
            }
            while (controllo_spazi(luogo) != 1);
    
            FILE * f = fopen ("prova.txt" , "r");
            if ( !f ) return -1;
            
            char buffer [1024];
            
            int conta_righe, i;
            
            /* inizializzo il contatore */
            conta_righe = 0;
            
            while(fgets (buffer , 1024 , f) != NULL)
            {
                /* ho letto una riga: aumento il contatore */
                conta_righe++;
                
                /* elimino il carattere "a capo" al termine della riga  */
                i = 0;
                while(buffer[i] != '\n') i++;
                    buffer[i] = '\0';
                
                /* confronto la stringa appena letta con il campione */
                if(strcmp(buffer, luogo) == 0)
                    break;
            }
            
            fclose(f);
            
            FILE * pf = fopen ("codici.txt" , "r");
            if ( !pf ) return -1;
            
            char buffer1 [1024];
            
            int riga_da_leggere;
            
            /* voglio leggere la riga corretta */
            riga_da_leggere = conta_righe;
            
            /* inizializzo il contatore */
            i = 0;
            
            while(i != riga_da_leggere)
            {
                if(fgets (buffer1 , 1024 , pf) == NULL)
                {
                    printf("Fine del file raggiunta.\n");
                    return -1;
                }
                i++;
            }
            
            strcpy(luogo_cod, buffer1);
            fclose(pf);
        } else {
            //nato all'estero
            printf("Inserisci stato di nascita: ");
            scanf("%s", luogo);
            if (strcmp(luogo, "albania")==0)
                strcpy(luogo_cod,"z100");
            if (strcmp(luogo, "ucraina")==0)
                strcpy(luogo_cod,"z138");
            if (strcmp(luogo, "grecia")==0)
                strcpy(luogo_cod,"z115");
            if (strcmp(luogo, "polonia")==0)
                strcpy(luogo_cod,"z127");
        }
        
        //copiare i caratteri in una variabile codice fiscale
        i2=0;
        for (i=0; i<3; i++)
            codice[i]=cognome_cod[i];
        for (i=3; i<6; i++) {
            codice[i]=nome_cod[i2];
            i2++;
        }
        i2=0;
        for (i=6; i<8; i++) {
            codice[i]=anno_cod[i2];
            i2++;
        }
        codice[8]=mese_cod;
        i2=0;
        for (i=9; i<11; i++) {
            codice[i]=giorno[i2];
            i2++;
        }
        i2=0;
        for (i=11; i<15; i++) {
            codice[i]=luogo_cod[i2];
            i2++;
        }
    
        //codice per il carattere di controllo
        int i_dispari=0, i_pari=0;
        for (i=0; i<strlen(codice); i++) {
          //dividere i caratteri pari dai caratteri dispari
            if((i%2)==1) {
                //caratteri pari(parte dall'indice 0)
                pari[i_pari]=codice[i];
                i_pari++;
            } else {
                dispari[i_dispari]=codice[i];
                i_dispari++;
            }
        }
        //assegnare il valore ai caratteri pari
        for (i=0; i<strlen(pari); i++) {
            if (pari[i] >= '0' && pari[i] <= '9')
                val_pari += pari[i] - '0';
            
            if (pari[i] >= 'a' && pari[i] <= 'z')
                val_pari += pari[i] - 'a';
        }
        
        //assegnare il valore ai caratteri dispari
        for (int i=0; i<strlen(dispari); i++) {
            if (strncmp(&dispari[i], "0", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "1", 1)==0)
                val_dispari+=0;
            if (dispari[i] >= '2' && dispari[i] <= '4')
                val_dispari+=(dispari[i] - '0') + (dispari[i] - '0' + 1);
            if (dispari[i] >= '5' && dispari[i] <= '9')
                val_dispari+=(dispari[i] - '0') + (dispari[i] - '0' + 3);
            if (strncmp(&dispari[i], "a", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "b", 1)==0)
                val_dispari+=0;
            if (dispari[i] >= 'c' && dispari[i] <= 'e')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' + 1);
            if (dispari[i] >= 'f' && dispari[i] <= 'j')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' + 3);
            if (dispari[i] >= 'k' && dispari[i] <= 'l')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 18);
            if (dispari[i] >= 'm' && dispari[i] <= 'n')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 6);
            if (strncmp(&dispari[i], "o", 1)==0)
                val_dispari+=11;
            if (strncmp(&dispari[i], "p", 1)==0)
                val_dispari+=3;
            if (dispari[i] >= 'q' && dispari[i] <= 'r')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 26);
            if (dispari[i] >= 's' && dispari[i] <= 'u')
                val_dispari+=(dispari[i] - 'a') + (dispari[i] - 'a' - 24 );
            if (strncmp(&dispari[i], "v", 1)==0)
                val_dispari+=10;
            if (strncmp(&dispari[i], "w", 1)==0)
                val_dispari+=22;
            if (strncmp(&dispari[i], "x", 1)==0)
                val_dispari+=25;
            if (strncmp(&dispari[i], "y", 1)==0)
                val_dispari+=24;
            if (strncmp(&dispari[i], "z", 1)==0)
                val_dispari+=23;
            if (strncmp(&dispari[i], "\0", 1)==0)
                val_dispari+=0;
        }
        
        //sommare i valori pari e i valori dispari
        somma=val_pari+val_dispari;
        //calcolare il resto dividendo per 26 il risultato
        resto=somma%26;
        
        //assegnare ad ogni valore da 0 a 25 il carattere corrispondente
        char a='a';
        for (i=0; i<=25; i++) {
            if (resto==i) 
                carattere_controllo=a;
            a++;
        }
        
        codice[15]=carattere_controllo;
        codice[16]='\0';
        
        //caratteri maiuscoli e stampa dell'output
        for (int i=0; i<codice[i]; i++) 
            codice[i]=toupper(codice[i]);
        
        printf("\n%s\n, codice);
        return 0;
    }
    
    Con questa funzione non funziona
    //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            do
            {
            printf("Inserisci luogo di nascita (senza lasciare spazi): ");
            fgets(luogo, sizeof(luogo), stdin); //qui non funziona
            }
            while (controllo_spazi(luogo) != 1);
    
    Se uso questa funzione non va
    fgets(luogo, sizeof(luogo), stdin);
    Se uso scanf va ma non la devo usare
            scanf("%s", luogo);
    
    Grazie
  • Re: Funzione elimina_spazi

    Spero abbiate capito
  • Re: Funzione elimina_spazi

    Attenzione perché la fgets ti restituisce la stringa letta ma comprensiva del carattere di fine linea '\n'. Sta poi a te andarlo a rimuovere manualmente...
    In realtà la cosa è semplice: basta sostituire '\n' con '\0', ma se non ci pensi puoi avere problemi.

    Inoltre dovresti chiarire il significato di "non va"...
  • Re: Funzione elimina_spazi

    Avevo iniziato a guardare il codice, ma mi fermo subito... Riporto le prime righe:
    
    int controllo_spazi (char * str)
    {
        int x=1;
        for (int i=0; i<str[i]; i++) {
            if (str[i]==' ')
                x=0;
        }
        return x;
    }
    
    char * elimina_spazi (char * str)
    {
        int x=0, y=0, i;
        
        /* elimino il carattere "a capo" al termine della riga  */
        i = 0;
        while(str[i] != '\n') i++;
            str[i] = '\0';
        
        for (i=0; i<str[i]; i++) {
            if (str[i]==' ') {
                x=i;
                y=1;
                break;
            }
        }
        // codice che sposta le lettere
        if (y==1) {
            for (int i2=x; i2<str[i2]; i2++)
                str[i2]=str[i2+1];
        }
        
        return str;
    }
    
    Per ben tre volte, nei cicli for, c'è i<str quando io, oregon e altri ti abbiamo detto che non ha senso!

    Così non si va avanti. Vuoi lasciare i<str perché credi che sia equivalente a strlen? Benissimo!
  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    oregon ha scritto:


    se dici che str e strlen sono la stessa cosa e che non ti va di cambiarlo, allora nessuno ti risponde più.
    Non ho detto che non mi va di cambiarlo
    Come vedi ...
  • Re: Funzione elimina_spazi

    Fabio97 ha scritto:


    Spero abbiate capito
    Noi?
  • Re: Funzione elimina_spazi

    Scusate avete ragione voi non mi ero accorto di non aver cambiato con strlen.. ora lo cambio
Devi accedere o registrarti per scrivere nel forum
32 risposte