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;
}