Dzieńdobry,
Potrzebuję pomocy od życzliwych ludzi:)
Nie wiem dlaczego nie oblicza mi poprawnie wyników odejmowania pisemnego (potrzebnego do dodawania), kiedy znak dwóch liczb jest rożny od siebie. Czy wiecie co złego jest w algorytmie?
Z góry dziękuje za pomoc i bardzo o nią proszę!
void dodawanie (char *wsk1, char *wsk2, int n, int m)
{
int *liczba1 = new int[n];
int *liczba2 = new int[m];
int *wynik = new int[m+n+ 1];
int x,y,i,k=0,znak=0;
char znakA,znakB;
cout << "\nPodaj dwie maksymalnie stucyfrowe liczby 'A' i 'B' ktore dodam. \n\n";
cout << "Czy liczba A jest ujemna (t)/(n): ";
cin >> znakA;
cout << "Liczba A: ";
cin >> wsk1;
cout << "Czy liczba B jest ujemna (t)/(n): ";
cin >> znakB;
cout << "Liczba B: ";
cin >> wsk2;
x = strlen(wsk1);
y = strlen(wsk2);
//sprawdzam czy oblicza wlasciwe dlugosci liczb
//Odwracamy ciagi liczb.
//Max strlen = 100.
while (k<x){
liczba1[x-k-1]=wsk1[k]-48;
k++;
}
k=0;
while (k<y){
liczba2[y-k-1]=wsk2[k]-48;
k++;
}
//-------------------------------------------------------------------------------
//Przypisanie tablicom liczba1[x+?] oraz liczba2[y+?] wartości '0'
//np. liczba1 = 1234
// liczba2 = 79
//
// liczba1:
//[0][1][2][3][4]
// 4 3 2 1 0
//
// liczba2:
//[0][1][2][3][4]
// 9 7 0 0 0
if (x>=y) {
liczba1[x]=0;
do {
liczba2[y]=0;
y++;
}
while (y<=x);
y--;
}
else {
liczba2[y]=0;
do {
liczba1[x]=0;
x++;
} while (x<=y);
x--;
}
cout<<endl;
/*-------------------------------------------------------------------------------
Mamy odwrocone liczby, sumujemy od poczatku tabel do ich konca.
Nastepnie odwracamy otrzymany wynik
--------------------------------------------------------------------------------*/
i=0;
while (i<(x+1) || i<(y+1)) {
//Sprawdza, po dodaniu 2 poszczegolnych elementow tablicy, czy wynik jest mniejszy od 10
if ((liczba1[i]+liczba2[i])<10)
wynik[i]=liczba1[i]+liczba2[i];
// wynik[?] = 10a+b, gdzie a,b nalezy do N
//Jesli nie, to wynik[?] jest reszta z dzielenia liczby a+b przez 10, czyli wynik[?] = b
else {wynik[i]=(liczba1[i]+liczba2[i])%10;
//Dodaje 1 do liczba1[?+1], np liczba[?+1]=d to po dodaniu 1 liczba[?+1] = d+1
liczba1[i+1]=liczba1[i+1]+1;
}
i++;
}
//Szukamy ostatniej niezerowej cyfry ciagu.
//----gdy znaki sa takie same----
if ((znakA=='n' && znakB=='n') || (znakA=='t' && znakB=='t')) {
k=0;
i=0;
while (k<(x+1) || k<(y+1)) {
if(wynik[k]!=0) i=k;
k++;
}
cout << "Wynik dodawania ten sam znak: ";
if (znakA=='t') {
cout << "-";
}
for (k=0;k<=i;k++) cout << wynik[i-k];
cout << endl;
}
//----gdy znaki sa takie same----/
//----gdy znaki sa rozne----
//----gdy liczby maja taka sama dlugosc----
//Porownujemy liczbe A z liczba B i ustalamy znak wyniku.
else {
if (x==y) {
i=0;
while(i<x){
if (liczba1[x-i]-liczba2[y-i]>0)
break;
if (liczba1[x-i]-liczba2[y-i]<0) {
znak=1;
break;
}
i++;
}
//znak = 1 - od y odejmujemy x
//znak = 0 - od x odejmujemy y
if (znak==1) {
i=0;
//Od drugiej liczby odejmujemy pierwsza
while (i<x) { i=0;
//Sprawdza, czy wynik odejmowania poszczegolnych elementow tablicy jest mniejszy od 0
if ((liczba2[i]-liczba1[i])<0){
//Pozycza 10
wynik[i]=liczba2[i]+10-liczba1[i];
liczba2[i+1]=liczba1[i+1]-1; }
//--------------------------------
else { wynik[i]=liczba2[i]-liczba1[i];
i++; }
}
cout << "Wynik dodawania taka sama dlugosc pierwsza krotsza: ";
if (znakB=='t') cout << "-";
}
else {
i=0;
//Od pierwszej liczby odejmujemy druga
while (i<(y)) {
// Sprawdza, czy wynik odejmowania poszczegolnych elementow tablicy jest mniejszy od 0
if ((liczba1[i]-liczba2[i])<0) {
//Pozycza 10
wynik[i]=liczba1[i]+10-liczba2[i];
liczba1[i+1]=liczba1[i+1]-1;
if (liczba1[i+1]=0) { liczba1[i+2]=liczba1[i+2]-1; }
}
else wynik[i]=liczba1[i]-liczba2[i];
i++;
}
cout << "Wynik dodawania taka sama dlugosc pierwsza dluzsza: ";
if (znakA=='t') cout << "-";
}
//Szukamy ostatniej niezerowej cyfry ciagu.
i=0;
k=0;
while (k<x || k<y) {
if(wynik[k]!=0) i=k;
k++;
}
//Wynik
for (k=0;k<=i;k++)
cout << wynik[i-k];
cout << endl;
k=0;
cout << endl;
}
}
//----gdy liczby maja taka sama dlugosc----/
//----gdy liczby pierwsza jest wieksza----
if ((x>y) && ((znakA=='n' && znakB=='t') || (znakA=='t' && znakB=='n'))) {
i=0;
while (i<y) {
// Sprawdza, czy wynik odejmowania poszczegolnych elementow tablicy jest mniejszy od 0
if ((liczba1[i]-liczba2[i])<0){
//Pozycza 10
wynik[i]=liczba1[i]+10-liczba2[i];
liczba1[i+1]=liczba1[i+1]-1; }
else wynik[i]=liczba1[i]-liczba2[i];
i++;
}
cout << "Wynik dodawania nierowne znaki i dlugosc, pierwsza wieksza";
if (znakA=='t') {
cout << "-";
}
//Szukamy ostatniej niezerowej cyfry ciagu.
i=0;
k=0;
while (k<x || k<y) {
if(wynik[k]!=0) i=k;
k++;
}
//Wynik
for (k=0;k<=i;k++)
cout << wynik[i-k];
cout << endl;
k=0;
cout << endl;
}
//----gdy liczby pierwsza jest wieksza----/
//----gdy liczby druga jest wieksza----
if ((x<y) && ((znakA=='n' && znakB=='t') || (znakA=='t' && znakB=='n'))) {
i=0;
while (i<x) {
// Sprawdza, czy wynik odejmowania poszczegolnych elementow tablicy jest mniejszy od 0
if ((liczba2[i]-liczba1[i])<0){
//Pozycza 10
wynik[i]=liczba2[i]+10-liczba1[i];
liczba2[i+1]=liczba2[i+1]-1; }
else wynik[i]=liczba2[i]-liczba1[i];
i++;
}
cout << "Wynik dodawania nierowne znaki i dlugosc, druga wieksza";
if (znakB=='t') {
cout << "-";
}
//Szukamy ostatniej niezerowej cyfry ciagu.
i=0;
k=0;
while (k<x || k<y) {
if(wynik[k]!=0) i=k;
k++;
}
//Wynik
for (k=0;k<=i;k++)
cout << wynik[i-k];
cout << endl;
k=0;
cout << endl;
}
}
//----gdy liczby druga jest wieksza----/