Odejmowanie pisemne

0

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----/
 
0

Twoja funkcja ma 4 ekrany długości. Nie łatwiej byłoby podzielić ją na mniejsze fragmenty? Nie łatwiej jest stosować konsekwentnie jakiś styl formatowania?
Nie łatwiej stworzyć jakąś klasę? Ja na Twoim miejscu rozdzieliłbym samą logikę dodawania / odejmowania w osobnej funkcji, a do funkcji dodawanie / odejmowanie wysyłał już konkretne przypadki tak żeby one zajmowały się tylko dodawaniem odejmowaniem, a nie zastanawianiem się co należy dodać / odjąć od czego. Czy to ma być kalkulator dużych liczb?

0

Zarejestrowałem się. Przepraszam za styl, ale próbowałem robić to wczoraj i się zbytnio nie zastanawiałem.
Niestety muszę zrobić to w takiej formie, bo nie znam klas. Musi być tak łopatologicznie, jestem w programowaniu zielony.
Tak ma być to kalkulator długich liczb.

Czemu nie działa ten algorytm odejmowania?
Dla 654+(-273) wychodzi 881...
Dla 273+(-654) program się zawiesza...

---------dodane----------
Teraz działa:

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 {

i=0;
while( i<x+y ) {
		if (liczba1[x+y-i]-liczba2[y+x-i]>0)  
			break;
		if (liczba1[x+y-i]-liczba2[y+x-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+1) ) { 
//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 taka sama dlugosc dluzsza druga: ";
	if ( znakB=='t' ) cout << "-"; 
	}
	else { 
	i=0;    
//Od pierwszej liczby odejmujemy druga
	while (i<(y+1)) {
// 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 taka sama dlugosc dluzsza pierwsza: ";
	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;

	}

}

 

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