Konwersja liczb – wyskakuje error błąd, jeśli wpiszę liczbę rzymską

0

Witam, mam problem z programem konwertującym liczby rzymskie na arabskie i odwrotnie. W szczególności wyskakuje error (zrzut pamięci) jeśli spróbuję wpisać jakąś liczbę rzymską. Przeanalizowałem swój kod i nie bardzo widzę błąd. W mainie jeszcze nie dokończyłem pracy, najpierw chcę żeby zamieniało dla prostych przypadków. Czy byłby ktoś w stanie pomóc?```

#include <iostream>
#include <string>
#include <cstring>
using namespace std;


	const char *rzymskie[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
	int arabskie[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};

	
 	bool isInt(string line)
   	{
      		bool isInt=true;
      		try
      		{
         		stoi(line);
      		}
      		catch(bad_exception ex)
      		{
         		isInt=false;
      		}
   		return isInt;
   	} 

	static string arab2rzym (int arab) 
	{
		
		string parametr;
		for(int i=0; i<13; ++i)
		{
			while(arab>=arabskie[i])
			{
				parametr.append(rzymskie[i]);
				arab=arab-arabskie[i];
			}
		}	

		return parametr;
		
	}
	
	static int rzym2arab (string rzym) 
	{
		int index=0;
		

		for(int i=1; i<rzym.length(); i++)
		{
			for(int a=0; a<13; a++)
			{	
				if(rzym.at(i)==*rzymskie[a])
				{
					index=index+arabskie[a];
				}
			}
		}

		return index; 	

		if( rzym!=arab2rzym(index) || index>3999 )
		{
			return 0;
		}
		
	
		
	}
	

	int main(int argc, char *argv[])
	{
		
			for(int i=1; i<argc; i++)
			{
				if(isInt(argv[i]))
				{
					if(atoi(argv[i])<1 || atoi(argv[i])>3999)
					{	
						cout << argv[i] << " --> " << "Nieprawidłowa dana \n";
					}
					else
					{			
					cout << argv[i] << " --> " << arab2rzym(atoi(argv[i])) << "\n";
					}
				}
				else 
				{
					if(rzym2arab(argv[i])!=0)
					{
						cout << argv[i] << " --> " << rzym2arab(argv[i]) << "\n";
					}
					
				}
			}
	}
1
bool isInt(string line)
{
    bool isInt=true;
    
    // ...

Zmienna lokalna ma taką samą nazwę jak nazwa funkcji – nie rób takich rzeczy, bo się pogubisz i nie odnajdziesz.


Masz funkcję IsInt, która sprawdza, czy wejściowy ciąg znaków zawiera liczbę arabską, ale nie masz odpowiednika dla liczby rzymskiej. Dlatego też, jeśli ciąg nie zawiera liczby arabskiej, Twój kod przeprowadzi konwersję dla liczby rzymskiej, nie wiedząc nawet, czy faktycznie zawiera liczbę. Nie używaj polskich nazw – napisz funkcje isArabic i isRoman.

Kolejna rzecz – wiele razy konwertujesz dokładnie ten sam ciąg znaków, zamiast zrobić to raz i wynik przechować w zmiennej. No sam zobacz:

if(isInt(argv[i]))
{
    if(atoi(argv[i])<1 || atoi(argv[i])>3999)
    {   
        cout << argv[i] << " --> " << "Nieprawidłowa dana \n";
    }
    else
    {           
    cout << argv[i] << " --> " << arab2rzym(atoi(argv[i])) << "\n";
    }

Funkcję atoi wołasz trzy razy, dla tego samego argumentu.

Po trzecie – jeśli nie wiesz w którym momencie występuje błąd i która instrukcja za nią odpowiada, to odpal program pod debuggerem i linijka po linijce analizuj jego wykonanie. W ten sposób znajdziesz wszystkie błędy.

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