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