Sprawdzenie poprawności liczby

0

Miałem za zadanie napisanie programu, który w podanej w linii polecenia odpowiedniej liczby arabskiej zapisze jak ta liczba będzie zapisana w systemie rzymskim i odwrotnie.

Dla prostych przykładów program działa, lecz gdy spróbuję wpisać specyficzne liczby zapisane systemem rzymskim jak np. IXI VVV lub kilka innych podobnych kompilacji zamiast wyskoczenia błędu, że taka liczba nie istnieje program wypisuje dla IXI=10, a dla VVV=15, ma ktoś jakiś pomysł jak to usprawnić żeby program dla tak podanych liczb wypisywał je poprawnie tzn. kiedy jest liczba rzymska niewłaściwa to wypisze błąd, a kiedy jest poprawna to zostawia i wypisuje jej odpowiednik w systemie arabskim?

0

Ty musisz sprawdzać czy dane wejściowe są poprawne i odpowiednio reagować. Chyba, że korzystasz z gotowej biblioteki, wtedy postudiuj jej dokumentacje.

0

rozumiem, że w kodzie trzeba porównać czy liczba zmieniona z arabskiego na rzymską będzie równa w drugą stronę, jeśli tak to podana liczba jest prawdziwa, jeśli nie to będzie błąd.
jakiej konstrukcji można tu użyć?

0

Przykłady które podałeś jakoby nieprawidłowe były jak najbardziej poprawnymi liczbami w systemie rzymskim (dało się je poprawnie odczytać, więc były poprawne). System był wyłącznie addytywny, a odejmowanie zostało wykombinowane dopiero w średniowieczu. Także w podobnym czasie dodano zasadę aby nie dodawać takich samych czterech znaków. Konwerter z liczb arabskich na rzymskie powinien produkować kody ze współczesnymi zasadami, ale parser powinien przyjmować każdą rzymską kombinację (a nie ma liczby niepoprawnej - są tylko nieoptymalne pod względem długości zapisu).
Czy w ogóle masz w zadaniu jakieś konkretne reguły, które muszą spełniać liczby w zapisie rzymskim? Jeżeli nie, to nie ma co zawracać sobie głowy.

0

Tzn, te liczby zapisane w systemie rzymskim mają dobrze obsługiwać wyjątki tzn. kiedy wpiszę X ma wyskoczyć 10, ale kiedy wpiszę IXI ma wyskoczyć wyjątek a niestety dla tego pojawia mi się, że jest to też 10, więc chciałbym się jakoś dowiedzieć jak zmienić zapis w kodzie by dla IXI był obsługiwany odpowiedni wyjątek.

tutaj wkleiłem mój aktualny kod, w którym trzeba właśnie to dodać

http://4programmers.net/Pastebin/1377

0

Musisz sprawdzać czy w tekście liczby rzymskiej poszczególne cyfry o niższym indeksie (tu w zmiennej "liczby") nie poprzedzają cyfr o indeksie wyższym. Aby to zrobić prawdopodobnie będziesz musiał odwrócić zagnieżdżenie obu pętli.
Dodatkowo w tekstach do wyjątków powinieneś pokazywać na której części parsowanego tekstu liczby rzymskiej, program się wykrzaczył.

ps. W metodzie arab2rzym() warunek if(iloraz > 0) możesz wraz z blokiem wyrzucić i pozostawić samą pętlę for - ona i tak się nie uruchomi kiedy iloraz będzie <= 0 bo nie pozwoli na to zerowa wartość k. Dodatkowo końcówkę możesz uprościć do: arab = reszta > 0 ? reszta : 0;

0

a nie można było by dopisać nowego warunku sprawdzającego, czy dla odpowiednich rzymskich "stringów" liczby arabskie są poprawne?
zamiast przekształcania kodu

0

a jeszcze takiego jedno pytanie nie odnoszące się do sprawdzenia powyższego warunku, co trzeba dopisać by program w lini polcenia, po sprawdzeniu, że podana liczba/string jest wyjątkiem zgłosił odpowiedni komunikat z błędem (działa poprawnie) lecz jeszcze żeby program wypisywał kolejne liczby/stringi, gdyż na razie jeśli wpiszę w linii polecenia nie prawidłową liczbę/string a następnie po spacji napisze prawidłowe to program wypisuje mi tylko błąd + komunikat, lecz kolejne liczby/stringi nie są wypisywane, a muszę tak to przerobić, żeby były wypisywane.

0

Musisz przechwycić wyjątek przez try/catch i ewentualnie doczytać znaki, które mogły być częścią złej liczby rzymskiej (czyli odczytujesz kolejne znaki, aż do napotkania spacji). Nie umieszczaj kodu odczytującego w bloku catch, a jedynie ustaw tam jakiś boolean sterujący, który to wymusi. Jeżeli pojawi się nowy wyjątek w bloku catch, to poprzedni wyjątek zostanie zgubiony, a każdy dokładniejszy analizator kodu uzna to za poważny błąd (w catch umieszczaj wyłącznie kod, który nie ma możliwości spowodowania kolejnego wyjątku - takim kodem jest np. zwykłe przypisanie zmiennej). Po odczytaniu zbędnych znaków sterowanie powinno wrócić do miejsca gdzie odczytywane są kolejne liczby rzymskie. Dość często bloki try/catch dla wyjątków naprawialnych umieszcza się w pętli do-while.

0

a mógłbyś podać chociaż początek kodu, bym dalej mógł sobie dopisać, bo nie wiem jak zacząć

0

Jest takie twierdzenie, że każdy wklejony link staje się kiedyś 404 - dlatego zawsze lepiej wbijać kod w posta. W Twoim wypadku zadziałało to bardzo szybko. :)
Dlatego pokażę na pseudokodzie, który jest luźno powiązany z kodem, którego już nie pamiętam zbyt dobrze:

public rzym2arab(String liczbaRzymska)
{
	String wynikRzym2arab;
	//parsowanie argumentu liczbaRzymska i umieszczenie wyniku w wynikRzym2arab
	//...
	if(!wynikRzym2arab.equals(arab2rzym(wynikRzym2arab;)))
		throw new ArabRzymException("Niepoprawna postać liczby rzymskiej");
	//...
}

//Odczytywanie kolejnych liczb.
//Metoda odczytLiczby() wczytuje liczbę rzymską lub arabską i sprawdza jej poprawność
//Wywołuje metody odczytujące znaki oraz arab2rzym() lub rzym2Arab()
//Metoda odczytZnakuZeStrumienia() to dowolna metoda dająca kolejny znak z tekstowego źródła liczb

	//...
	boolean poprawnieWczytanaLiczba = false;
	do
	{
		try { liczba = odczytLiczby(input) }
		catch(ArabRzymException ex) { poprawnieWczytanaLiczba = false; }
		if(poprawnieWczytanaLiczba)
		{
			//Twój kod robiący cokolwiek z wczytaną liczbą
			//...
		}
		else
		{
			while((znak = odczytZnakuZeStrumienia(input)) != ' ')
				if(koniecPliku(input))
					break;
			//tu strumień jest już na pozycji za wadliwą liczbą i oczekuje na następną
		}
	}
	while(poprawnieWczytanaLiczba);
	//...
0

a mógłbyś mi dopisać w kodzie twój pseudokod jaki wyżej napisałeś, dla ciebie to będzie kilka chwil, a ja muszę się trochę z tym pomęczyć.

http://4programmers.net/Pastebin/1387

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