Newsgroup: it.comp.lang.c
Titolo: Aiuto

Ragazzi chiedo scusa per la mia totale ignoranza.
Ho postato anche via email ad alcuni di voi e chiedo ancora venia per averlo
fatto, ma ho un bisogno urgente di aiuto.
Devo risolvere un programma in c che dati due numeri interi a max 20 cifre
mi faccia la somma degli stessi.
Un aiuto?

 Un aiuto?
divide, summa et riporta
in pratica ne consideri un pezzo alla volta (9 cifre intere ci stanno 
tutte in un long di 32 bit, compreso il riporto) se c'e' riporto lo 
aggiungi al prossimo pezzo.
per 20 cifre in questa maniera ti servono 3 long a 32 bit
struct big_int {
long pos[3];
}
io li memorizzerei in una stringa di 20 char, e per la conversione, si 
usa 3 volte atol, e per l'inverso, 3 sprintf
per sommarne 2, considerando pos[0] la parte piu' piccola
(code not tested)
big_int somma_big_int(const big_int& a, const big_int& b) {
  long tmp;
  int riporto = 0;
  big_int c;
  for (int i = 0; i <3; ++i)
    tmp = a.pos[i] + b.pos[i] + riporto;
    if (tmp > 999999999L) {
      if (i == 2) {
        /* overflow, vedi cosa e' piu' giusto */
      }
      tmp -= 1000000000L;
      riporto = 1;
    }
    else {
      riporto = 0;
    }
    c.pos[i] = tmp;
  }
  return c;
}

Guarda non so proprio come ringraziarti... anche se il mio programmino deve
essere molto meno "complesso"... devo infatti gestirlo solo tramite array.
Saresti cosi' gentile da darmi qualche info in merito? :))


Scusa ma, visto che fai l'Università, non credi che sarebbe meglio prima
studiare qualcosa? anche perchè altrimenti, se non sai proprio nulla di
C, non puoi capire quello che ti viene eventualmente consigliato (a meno
che tu non ti aspetti che ti venga fornito il codice completo).
Comunque, cosa vuol dire che devi gestirlo tramite array? E soprattutto,
array di che tipo? Se sono array di char, cioè in pratica stringhe di
testo, allora devi fare quello che ti ha già detto Super, altrimenti non
so a cosa possano servire. Il problema non è così immediato, se devi
gestire numeri interi fino a venti cifre.
Ciao, 
Cecco

essere molto meno "complesso"... devo infatti gestirlo solo tramite array.
Spero ci siano pochi errori :)
(compilato in console mode con C++ Builder).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUMDIGITS  20
int CharToDigit(char c) { return c - '0'; }
int SumChars(char A, char B, int *rem)
{
    int s = CharToDigit(A) + CharToDigit(B) + *rem;
    *rem = s / 10;
    return s % 10;
}
void SumNumbers(char *result,
                const char *a, const char *b,
                const int max)
{
     int i, r = 0;
     for (i = 20; i >= 1; i--)
     {
         result[i] = '0' + SumChars(a[i-1], b[i-1], &r);
     }
     result[i] = '0' + r;
}
void PutLeadingZeroes(char *src, int max)
{
     int len = strlen(src);
     if (len < max)
     {
        int i, j;
        char *p = malloc(len+1);
        strcpy(p, src);
        for (i = 0, j = 0; i < max; i++)
        {
            if (i < max - len)
              src[i] = '0';
            else
              src[i] = p[j++];
        }
        free(p);
     }
}
void DeleteTrailingNewLine(char *s)
{
     s[strlen(s)-1] = '\0';
}
int IsANumber(char *s)
{
    int i;
    for (i = 0; s[i]; i++)
    {
        if ((s[i] < '0') || (s[i] > '9'))
          return 0;
    }
    return 1;
}
void AcceptNumber(char *s, int max)
{
     char str[128] = {0};
     int len, NotANumber;
     do
     {
        printf("Insert a number (max %d digits): ", max);
        fgets(str, 128, stdin);
        DeleteTrailingNewLine(str);
        len = strlen(str);
        NotANumber = !IsANumber(str);
        if (NotANumber)
        {
           printf("I said a number !\n");
        }
        else
        {
           if (len > max)
           {
              printf("I said max %d digits !\n", max);
           }
           else
           {
              strcpy(s, str);
           }
        }
     } while ((len > max) || NotANumber);
}
int main()
{
    char FirstNumber[MAXNUMDIGITS+1] = {0};
    char SecondNumber[MAXNUMDIGITS+1] = {0};
    char Result[MAXNUMDIGITS+2] = {0};
    AcceptNumber(FirstNumber, MAXNUMDIGITS);
    AcceptNumber(SecondNumber, MAXNUMDIGITS);
    PutLeadingZeroes(FirstNumber, MAXNUMDIGITS);
    PutLeadingZeroes(SecondNumber, MAXNUMDIGITS);
    SumNumbers(Result,
               FirstNumber,
               SecondNumber,
               MAXNUMDIGITS);
    printf( "\n\n %s +\n %s =\n%s\n", FirstNumber,
                                      SecondNumber,
                                      Result);
    getchar();
    return 0;
}
-- 
The Follet

  for (int i = 0; i <3; ++i)
        ^^^
<...>
Siamo in un ng sul C ;)
-- 
The Follet

 Siamo in un ng sul C ;)
Deformazione professionale :)