Problem z wyświetlaniem wyniku sumowania dwóch liczb.

0

Witam. Mam problem z programem, który dodaje dwie liczby. Nie wiem dokładnie gdzie jest błąd. Na końcu gdy wyświetla wynik i jest zawsze równe 1, a powinno być równe większej liczbie_cyrfr l1 lub l2.

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

struct Liczba
{
    bool dodatnia; //bool
    int cyfry[80]; // pod indeksem 0 jest najbardziej znaczaca cyfra
    int liczba_cyfr;
};

bool wczytajLiczbe( struct Liczba *liczba);
void wyswietlLiczbe( struct Liczba *l1);
bool dodajModulyLiczb( struct Liczba * l1, struct Liczba * l2, struct Liczba * wynik);
void wyswietlWynik(struct Liczba *liczba);
int main()
{
    struct Liczba l1, l2, wynik;

    wczytajLiczbe( & l1 );
    wczytajLiczbe( & l2 );
    wyswietlLiczbe( & l1);
    wyswietlLiczbe( & l2);
    dodajModulyLiczb( &l1, &l2, &wynik);
    wyswietlWynik( &wynik );




}


bool wczytajLiczbe( struct Liczba *liczba)
{

    char s[100];
    puts("Podaj liczbe i nacisnij enter:\n");
    gets( s );


    int index_s = 0;
    int index_cyfry = 0;

    // pomin biale znaki
    while( index_s < strlen(s) && s[index_s] == ' ')
    {
        index_s ++;
    }

    // zaakcepuj znak liczby
    liczba->dodatnia = true;
    if( s[index_s] == '-')
    {
        liczba->dodatnia = false;
        index_s ++;
    }
    else
        if( s[index_s] == '+')
        {
            index_s ++;
        }

    // pomoin zera nieznaczace
    while( index_s < strlen(s) && s[index_s] == '0')
    {
        index_s ++;
    }


    // wczytuj cyfry

     while( index_s < strlen(s) && isdigit( s[index_s]  ))
     {
         liczba->cyfry[index_cyfry] = s[ index_s ] - '0';
         index_s ++;
         index_cyfry++;
     }

    liczba->liczba_cyfr = index_cyfry;

    return true;

}
void wyswietlLiczbe(struct Liczba *liczba)
{

    if( !liczba->dodatnia)
        printf( "-");

    for(int i =0; i< liczba->liczba_cyfr; ++i)
        printf( "%c", liczba->cyfry[i]+'0');


}

bool dodajModulyLiczb( struct Liczba * l1, struct Liczba * l2, struct Liczba * wynik)
{
    int przeniesienie = 0;
    int i = 0;
    while( i < l1->liczba_cyfr && i < l2->liczba_cyfr)
    {
        wynik->cyfry[i] = l1->cyfry[i] + l2->cyfry[i] + przeniesienie;
        if( wynik->cyfry[i] > 9)
        {
            przeniesienie = 1;
            wynik->cyfry[i] -= 10;
        }
        else
            przeniesienie = 0;
        ++i;

        }
    struct Liczba * l;
    if( l1->liczba_cyfr > i)
        l2 = l1;
    else
        l = l2;
    while( i < l->liczba_cyfr)
    {
        wynik->cyfry[i] = l->cyfry[i] + przeniesienie;
        if( wynik->cyfry[i] > 9)
        {
            przeniesienie = 1;
            wynik->cyfry[i] -= 10;
        }
        else
            przeniesienie = 0;
        ++i;

    }

    return true;
}
void wyswietlWynik(struct Liczba *liczba)
{

    if( !liczba->dodatnia)
        printf( "=");

    for(int i =0; i< liczba->liczba_cyfr; ++i)
        printf( "%c", liczba->cyfry[i]+'0');


}



1

nigdzie nie widzę wynik->liczba_cyfr w dodajModulyLiczb
Dziwne, że wybrałeś bigendian, to komplikuje dodawanie (masz więcej błędów), zakładam, że komentarz nie kłamie: // pod indeksem 0 jest najbardziej znaczaca cyfra

Zwróć uwagę, że jeśli l1->liczba_cyfr != l2->liczba_cyfr to indeksy cyfry w takim przypadku nie pasują do siebie.
Na dodatek przeniesienie dodaje się do starszej a nie młodszej cyfry (chyba jednak komentarz kłamie).

0

Uruchamiając program krok po kroku debuggerem wszystko jest ok poza tym, że na koncu wyswietla wynik jedynie z [0] indexu tablicy

0

Więc jak zrobić zeby nie dodawło liczb od początku tylko od konca? z wyświetlaniem wyniku się uporałem, lecz gdy dodanie np 4321+321 dodaje mi od początku i wychodzi 7642 zamiast przepisac pierwszą cyfrę i zacząć liczyć dalej

1

to jest dokładnie to co ci opisałem w drugim akapicie. Implementujesz dodawanie pisemne, którego uczyli cię w podstawówce.
Przypomnij sobie jak to się robi i porównaj z kodem który napisałeś.
To naprawdę jest bardzo proste.
Masz dwa wyjścia

  • zachować obecną kolejność cyfr (drukowanie bez zmian), a dodawanie robić zaczynając od końca tablicy.
  • albo odwrócić kolejność cyfr w tablicy(wtedy drukujesz w odwrotnej kolejności) i dodawać cyfry od początku tablicy

Tak czy siak przy dodawaniu musisz zacząć dodawanie od jedności.

0
    int przeniesienie = 0;
    int i = 0;

    while( i < l1->liczba_cyfr && i < l2->liczba_cyfr)
    {

        wynik->cyfry[i] = l1->cyfry[i] + l2->cyfry[i] + przeniesienie;
        if( wynik->cyfry[i] > 9)
        {
            przeniesienie = 1;
            wynik->cyfry[i] -= 10;
        }
        else
            przeniesienie = 0;

         ++i;

Co mam zmienić żeby dodawało od tyłu?

2

Ty chcesz sam to zrobić, czy żeby zrobić za ciebie?
Możliwości jest kilka, np:

l1->cyfry[l1->liczba_cyfr - i - 1]

albo dwa indeks idące od tyłu
albo dwa wskaźniki idące od tyłu

0

Wszystko idzie dobrze, lecz gdy dodaje np 54321+21 to nie wyświetla 54342 tylko 12342, zamiast przepisywać początkowe liczy to wstawia po kolei 123...

0

Uporałem się z tym, lecz gdy dodaje liczby np 54321+54321 to nie wyswietla na początku 10 tylko 0, ucina 1?

0

No to o tyle dobrze, że dotarłeś do kolejnego problemu.
Jak po wykonaniu dodawania zostało ci przeniesienie, to w wyniku musisz zrobić miejsce dla nowej dodatkowej cyfry i wstawić tam to przeniesienie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1