Problema esercizio somma tramite stringhe

di il
3 risposte

Problema esercizio somma tramite stringhe

Ciao a tutti, questa è la consegna: 

Un file di testo contiene una sequenza (di lunghezza ignota) di operazioni di somma tra coppie di numeri interi positivi. Tali operazioni vanno completate con il risultato corretto e stampate sul monitor. Per esempio, se il file di ingresso contiene le seguenti righe:

123 + 456 = 
9 + 1 = 
1000 + 100 = 

La difficoltà dell’esercizio consiste nel fatto che i numeri possono essere scritti con un numero di cifre massimo pari a 1000 (mille). È quindi evidente che non è possibile utilizzare la normale codifica dei numeri interi su 32 o 64 bit. Per esempio:

1234567890123456789012345678901234567890 + 888888888888888888888888888 = 

 Una strategia semplice ed efficace consiste nel codificare i numeri in normali stringhe di testo e scrivere un’apposita funzione supersomma (char a[], char b[], char c[]) che calcola la somma c = a + b implementando il normale algoritmo di somma per colonne (quello che si usa quando si lavora con carta e penna), ovviamente gestendo correttamente anche i riporti. La funzione tratterà i singoli caratteri delle stringhe come cifre decimali il cui valore rappresentato andrà calcolato in base alle note proprietà della tabella ASCII.

 Un esempio di esecuzione del programma è riportato nel seguito.

 Contenuto del file somme.txt:

123 + 456 = 
9 + 1 = 
1000 + 100 = 
1234567890123456789012345678901234567890 + 888888888888888888888888888 = 

Esecuzione: 

# ./supersomme
nome del file di input: somme.txt
123 + 456 = 579
9 + 1 = 10
1000 + 100 = 1100
1234567890123456789012345678901234567890 + 888888888888888888888888888 = 1234567890124345677901234567790123456778

Mentre questo è il mio codice, che non funziona. Non capisco se l'errore è durante il calcolo o è profondamente errata l'idea di base. Grazie per tutti i consigli in anticipo.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LMAX 1000

void supersomma (char a[], char b[], char c[]);
void somma (char a[], char b[], char c[]);

int main ()
{
    char a[LMAX], b[LMAX], c[LMAX + 1];
    
    supersomma (a, b, c);

    return EXIT_SUCCESS;
}

void supersomma (char a[], char b[], char c[])
{
    FILE *fp;
    char nfile[64];

    printf ("nome del file di input: \n");
    scanf ("%s", nfile);

    if ((fp = fopen (nfile, "r")) == NULL)
    {
        printf ("errore di caricamento del file %s\n", nfile);
        exit (EXIT_FAILURE);
    }

    while ((fscanf (fp, "%s %*c %s %*c", a, b)) != EOF)
    {
        printf("a %s, b %s\n", a, b);
        somma (a, b, c);

        printf ("%s + %s = %s\n", a, b, c);
    }

    fclose (fp);

    return;
}

void somma (char a[], char b[], char c[])
{
    int len1, len2, max, min;
    int i, j, rip, ris, s1, s2;
    rip = 0;

    len1 = strlen (a);
    len2 = strlen (b);

    printf ("a : len %d\n", len1);
    printf ("b : len %d\n", len2);

    i = 0;
    j = 0;

    /*ciclo finche' non finisce s1
        finche' non finisce s2
            somma l'ultima cifra + riporto
            se eccedono il 9
                ris = ris - 10
                rip = 1
            else
                rip = 0
    */

    if (len1 == len2)
    {
        max = len1;

        for (i = len1 - 1; i > 0; i--)
        {
            s1 = a[i] - '0';
            s2 = b[i] - '0';
            printf ("s1 : %d\n", s1);
            printf ("s2 : %d\n", s2);
            ris = s1 + s2 + rip;

            if (ris > 9)
            {
                ris = ris - 10;
                rip = 1;
            }
            else
                rip = 0;

            c[i] = ris + '0';
        }
    }
    else if (len1 > len2)
    {
        len1 = max;
        len2 = min;

        for (i = max - 1; i > 0; i--)
        {
            for (j = min - 1; j > 0; j--)
            {
                s1 = a[i] - '0';
                s2 = b[j] - '0';
                printf ("s1 : %d\n", s1);
                printf ("s2 : %d\n", s2);
                ris = s1 + s2 + rip;

                if (ris > 9)
                {
                    ris = ris - 10;
                    rip = 1;
                }
                else
                    rip = 0;

                c[i] = ris + '0';
            }

            if (j < 0)
            {
                s1 = a[i] - '0';
                s2 = 0;
                printf ("s1 : %d\n", s1);
                printf ("s2 : %d\n", s2);
                ris = s1 + s2 + rip;

                if (ris > 9)
                {
                    ris = ris - 10;
                    rip = 1;
                }
                else
                    rip = 0;

                c[i] = ris + '0';
            }
        }
    }
    else if (len1 < len2)
    {
        len1 = min;
        len2 = max;

        for (i = max - 1; i > 0; i--)
        {
            for (j = min - 1; j > 0; j--)
            {
                s1 = b[i] - '0';
                s2 = a[j] - '0';
                printf ("s1 : %d\n", s1);
                printf ("s2 : %d\n", s2);
                ris = s1 + s2 + rip;

                if (ris > 9)
                {
                    ris = ris - 10;
                    rip = 1;
                }
                else
                    rip = 0;

                c[i] = ris + '0';
            }

            if (j < 0)
            {
                s1 = b[i] - '0';
                s2 = 0;
                printf ("s1 : %d\n", s1);
                printf ("s2 : %d\n", s2);
                ris = s1 + s2 + rip;

                if (ris > 9)
                {
                    ris = ris - 10;
                    rip = 1;
                }
                else
                    rip = 0;

                c[i] = ris + '0';
            }
        }
    }

    c[max] = '\0';
    if (rip == 1) //riporto finale
    {
        strcat ("1", c);
    }

    return;
}

3 Risposte

  • Re: Problema esercizio somma tramite stringhe

    Separa la parte di lettura dei file e fai prima delle somme di test con a = "…" eccetera 

    In cosa non ti funziona in particolare? “9”+"9" quanto fa ad esempio?

  • Re: Problema esercizio somma tramite stringhe

    Ho riguardato completamente il programma e ho provato a suddividerlo meglio in funzioni più piccole, ora funziona perfettamente. Grazie comunque per la risposta

    29/12/2022 - Weierstrass ha scritto:


    Separa la parte di lettura dei file e fai prima delle somme di test con a = "…" eccetera 

    In cosa non ti funziona in particolare? “9”+"9" quanto fa ad esempio?

  • Re: Problema esercizio somma tramite stringhe

    Per la somma, volendo essere più concisi, farei qualcosa del genere:

    #include <stdio.h>
    #include <string.h>
    
    #define LMAX 1000
    
    void scambia(char *a, char *b)
    {
        char temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void inverti(char *s, unsigned int dim)
    {
        for(unsigned int i_sx = 0, i_dx = dim - 1; i_sx < i_dx; scambia(s + i_sx++, s + i_dx--));
    }
    
    void somma(char *a, char *b, char *c)
    {
        unsigned int i = 0;
        unsigned int r = 0;
        for(unsigned int len_a = strlen(a), len_b = strlen(b); i < len_a || i < len_b; r = r > 9)
        {
            r += (i < len_a ? a[len_a - i - 1] - '0' : 0) + (i < len_b ? b[len_b - i - 1] - '0' : 0);
            c[i++] = (r > 9 ? r - 10 : r) + '0';
        }
        if(r)
        {
            c[i++] = '1';
        }
        inverti(c, i);
        c[i] = '\0';
    }
    
    int main()
    {
        char c[LMAX + 1];
        somma("1234567890123456789012345678901234567890", "888888888888888888888888888", c);
        printf("%s\n", c);
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte