Witam.
Mam problem postaci:
Przepisywałem program z Javy na C++, który konwertuje liczby arabskie na rzymskie i odwrotnie. Możliwe, ze coś zrobiłem nie tak i dlatego ten błąd się wyświetla.
Proszę o pomoc co się mogło stać lub co zrobiłem nie tak :)
Z góry dziękuję
#include <iostream>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <sstream>
using namespace std;
class RzymArab {
void Konwersja(string liczba, bool czyArabska) {
int a = 0, i = 30;
int dl = 0, wynik = 0;
int j, d, s, t;
char znak;
int tab[50];
string wzor = "", zapis = "";
stringstream out;
string liczbyRzymskie[31] = { "M", "MM", "MMM", "C", "CC", "CCC", "CD",
"D", "DC", "DCC", "DCCC", "CM", "X", "XX", "XXX", "XL", "L",
"LX", "LXX", "LXXX", "XC", "I", "II", "III", "IV", "V", "VI",
"VII", "VIII", "IX", "" };
// KONWERSJA Z LICZBY rzymskiej NA arabsk¹
if (czyArabska == false) {
dl = liczba.length();
for (int k = 0; k < dl; k++) {
znak = liczba.at(k);
znak = toupper(znak);
tab[k] = 0;
switch (znak) {
case 'I':
tab[k] = 1;
break;
case 'V':
tab[k] = 5;
break;
case 'X':
tab[k] = 10;
break;
case 'L':
tab[k] = 50;
break;
case 'C':
tab[k] = 100;
break;
case 'D':
tab[k] = 500;
break;
case 'M':
tab[k] = 1000;
break;
}
}
int k = 0;
do {
if (tab[k] < tab[k + 1])
tab[k] = -tab[k];
k++;
} while (tab[k] != 0);
k = 0;
do {
wynik += tab[k];
k++;
} while (tab[k] != 0);
wzor = liczba;
out << wynik;
liczba = out.str();
for (k = 0; k < 50; k++)
tab[k] = 0;
}
;
// KONWERSJA Z LICZBY arabskiej NA rzymsk¹
if ((czyArabska == true) || (czyArabska == false)) {
a = atoi(liczba.c_str());
if ((a < 1) || (a > 3999))
cout << "Liczba " << a
<< " nie miesci sie w przedziale 1 - 3999\n";
else {
j = a % 10;
d = (a % 100 - j) / 10;
s = (a % 1000 - j - d) / 100;
t = (a % 10000 - j - d - s) / 1000;
switch (t) {
case 0:
break;
case 1:
i = 0;
break;
case 2:
i = 1;
break;
case 3:
i = 2;
break;
}
zapis += liczbyRzymskie[i];
i = 30;
switch (s) {
case 0:
break;
case 1:
i = 3;
break;
case 2:
i = 4;
break;
case 3:
i = 5;
break;
case 4:
i = 6;
break;
case 5:
i = 7;
break;
case 6:
i = 8;
break;
case 7:
i = 9;
break;
case 8:
i = 10;
break;
case 9:
i = 11;
break;
}
zapis += liczbyRzymskie[i];
i = 30;
switch (d) {
case 0:
break;
case 1:
i = 12;
break;
case 2:
i = 13;
break;
case 3:
i = 14;
break;
case 4:
i = 15;
break;
case 5:
i = 16;
break;
case 6:
i = 17;
break;
case 7:
i = 18;
break;
case 8:
i = 19;
break;
case 9:
i = 20;
break;
}
zapis += liczbyRzymskie[i];
i = 30;
switch (j) {
case 0:
break;
case 1:
i = 21;
break;
case 2:
i = 22;
break;
case 3:
i = 23;
break;
case 4:
i = 24;
break;
case 5:
i = 25;
break;
case 6:
i = 26;
break;
case 7:
i = 27;
break;
case 8:
i = 28;
break;
case 9:
i = 29;
break;
}
zapis += liczbyRzymskie[i];
i = 30;
if (czyArabska == false) {
if (wzor == zapis)
cout << "Liczba " << zapis << " w zapisie arabskim to: " << wynik;
else
cout << wzor << " - Niepoprawny zapis! Prawdopodobnie chodzilo Ci o: " << zapis << " (" << wynik << ")";
} else
cout << "Liczba " << a << " w zapisie rzymskim to: " << zapis;
}
}
}
int main(int argc, char* argv[]) {
char z;
bool czyArabska = false;
string s;
stringstream out;
int i = 0, dl = 0, j = 0, n = 0, k = 0;
for (i = 0; i < sizeof(argv); i++) {
dl = 0;
j = 0;
s = argv[i];
z = s.at(0);
z = toupper(z);
dl = s.length();
if (dl > 15) { // obcinamy dlugosc liczby do 15 znakow jesli jest
// wieksza, bo najdluzsza liczba rzymska ma 15
// znakow
s = s.substr(0, 15);
dl = s.length();
}
if (isdigit(z)) {
if (dl > 4) {
s = s.substr(0, 4);
dl = s.length();
}
do {
j++;
z = s.at(j);
if (!isdigit(z))
s = s.substr(0, j); // ucinamy argument tak by
// pozostala tylko liczba
} while ((isdigit(z)) && (j + 1 < dl));
n = atoi(s.c_str());
if ((n > 3999) || (n < 1)) {
cout << "Liczba " << n << " miesci sie poza zakresem (1-3999). Nie mozna jej przekonwertowac na zapis rzymski!";
continue;
}
czyArabska = true;
Konwersja(s, czyArabska);
}
else if ((z == 'I') || (z == 'X') || (z == 'V') || (z == 'L')
|| (z == 'C') || (z == 'D') || (z == 'M')) {
do {
j++;
z = s.at(j - 1);
z = toupper(z);
if ((z == 'I') || (z == 'X') || (z == 'V') || (z == 'L')
|| (z == 'C') || (z == 'D') || (z == 'M'))
;
else {
s = s.substr(0, j - 1);
k++;
}
;
} while ((j + 1 <= dl) && (k == 0));
czyArabska = false;
Konwersja(s, czyArabska);
} else
cout << "\"" << s << "\" nie jest poprawnie zapisana liczba w zadnym z systemow: rzymski lub arabski!";
}
return 0;
}
};