Dodawanie liczb w stringach

0

Witam. Stworzyłem program do dodawania 2 stringów. Niby wszystko spoko, dev c++ nie zgłasza błędów ale po wpisaniu liczb wywala mi program. Po sprawdzeniu kodu w visual c++ wyskakuje mi "error C2057: expected constant expression" "error C2466: cannot allocate an array of constant size 0" oraz "error C2133: 'tab1' : unknown size". Nie wiem gdzie leży błąd ani jak go interpretować. Oto i kod źródłowy:

#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>

using namespace std;

int dointa(char wliczba){ //zamienia chr na int
	int zliczba = wliczba - '0';
	return zliczba;
}

char dochar(int wliczba){ //zmienia int na char
	char znak = wliczba + '0';
	return znak;
}

string rev(string a){ //odwraca stringa
	reverse( a.begin(), a.end() );
	return a;
}

void natabl(string liczba, int tab[] , int wielkosc){ //"wrzuca" stringa do tablicy int
		liczba = rev(liczba);
		for(int i = 0; i < wielkosc; i++){
			tab[i] = dointa(liczba[i]);
		}
}

string nastr(int tab[], int wielkosc){ //zamienia tablice int na stringa
	string suma;
	for(int i = 0; i < wielkosc; i++){
		suma[i] = dochar(tab[i]);
	}
	suma = rev(suma);
	return suma;
}

int dodaj(int tab1[], int tab2[], int suma[], int wielkosc1, int wielkosc2, int licznik){ //dodaje tablice do siebie
	for(int i = 0; i < licznik; i++){
		if (wielkosc1 < i - 1) tab1[i] = 0;
		if (wielkosc2 < i - 1) tab2[i] = 0;
		suma[i] = tab1[i] + tab2[i];
	}
}

int cowieksz(int l1, int l2){ //sprawdza co wieksze
	if(l1 > l2) return l1 + 1;
	if(l2 > l1) return l2 + 1;
}

int porzad(int sum[], int licznik){ //porzadkuje tablice int "usuwajac" liczby wieksze od 9
	int tmp = 0;
	for(int i = 0; i < licznik; i++){
		if(sum[i] >= 10){
			sum[i] = (sum[i] % 10) + tmp; //
			tmp = 1;
		}
		else{
			sum[i] = sum[i] + tmp;
			tmp = 0;
			if(sum[i] = 10){
				tmp = 1;
				sum[i] = 0;
			}
		}
	}
	if(sum[licznik - 1] = 0) return(licznik - 1); // sprawdza czy jest jedynka na początku tablicy czy zero (w celach kosmetycznych)
	else{
		return licznik;
	}
}

string dodawanie(string liczba1, string liczba2){
	string suma;
	int tab1[liczba1.size()];
	int tab2[liczba2.size()];
	int licznik = cowieksz(liczba1.size(),liczba2.size());
	int sum[licznik];
	natabl(liczba1, tab1, liczba1.size());
	natabl(liczba2, tab2, liczba2.size());
	dodaj(tab1, tab2, sum, liczba1.size(), liczba2.size(), licznik);
	licznik = porzad(sum, licznik);
	cout << "Wynik to: " << nastr(sum, licznik);
}

int main(){
    string liczba1;
    string liczba2;
    cout << "Podaj liczbe 1: ";
    cin >> liczba1;
    cout << "Podaj liczbe 2: ";
    cin >> liczba2;
    dodawanie(liczba1,liczba2);
    
    return 0;
}
 

Byłbym wdzięczny za pomoc początkującemu programiście :)

0

To sprawdź w którym miejscu się wywala :P

1

Ten kod to jakieś bzdury.
Nie czytam tego całego ale próbujesz zaalokować tablice o wielkości 0, przyczyną są kombinacje jak kuń pod góre ze stringami.
Quickfix - dodaj wszędzie gdzie kombinujesz z tablicami i stringami warunek sprawdzający czy size == 0.
Nie wiem czy wiesz ale najprosciej dodać 2 stringi możesz tak

using namespace std;
int main()
{
 string a = "22";
 string b = "666";
 int c = stoi(a) + stoi(b);
}
0

Tablice statyczne dynamicznie typowane o dynamicznie ustalaniej wielkości są w standardzie C, a nie C++ (chyba, że ostatecznie weszło to do standardu C++11, ale głowy nie dam, bo wiem,że byli przeciwnicy takiego rozwiązania, a samego standardu nie studiowałem dokładnie na razie). Więc, to że się kompiluje w devc++ to zasługa rozszeżeń gcc. A jeśli chodzi o operacje na dużych liczbach, to albo bignuma uzyj, albo http://www.tc.umn.edu/~ringx004/mapm-main.html - kod jest okropny, ale opis co i jak może duzo wyjaśnić :)

0

Ogólnie teraz widzę, że moje kombinowanie było bez sensu, bo po napisaniu kodu od nowa starym pomysłem poszło mi lepiej, ale moim celem było używanie bibliotek standardowych, gdyż przygotowuję się do matury z informatyki i w ramach powtórki chciałem powtórzyć niektóre rzeczy.

Czy istnieje inny sposób na pomieszczenie olbrzymich liczb i operacje na nich niż stringi?

0

Sensownym pomysłem jest utworzenie klasy jak np. BigDecimal, a czego użyjesz w środku - to już mniej interesujące; Możliwe pozycje:
dobra pod względem prędkości operacji: na dynamicznym kontenerze z cyframi, np. stringu lub wektorze
dobra pod względem kosztów pamięci: na dynamicznym kontenerze przy jednoczesnym żonglowaniu cyframi skupiając się na ograniczeniu ilości bitów na cyfrę do minimum

0

Na stringach tez się da zrobić, ale jeśli będzie to w czystej postaci, to

  1. trzeba zrobić troszkę inaczej niż to zrobiłeś
  2. o ile dodawanie i odejmowanie to proste operacje, to mnożenie już trochę się komplikuje, a jeszcze bardziej skomplikuje się przy innych operacjach...

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