A komponens használata
A komponens két függvénnyel rendelkezik. A Convert2Roman metódus konvertálja át egész számainkat római számokká. A metódus a paraméterében várja az egész számot, és visszatérési értéke lesz a generált római szám.
public string Convert2Roman(int dec)
Ez a metódus csak a 3999-nél kisebb számokat konvertálja át.
A Convert2Decimal metódus végzi el a visszafelé konverziót, visszatérési értékre adja meg az egész számot.
public int Convert2Decimal(string roman)
A komponens elkészítése
A római számrendszer additív számrendszer, amely azt jelenti, hogy egy szám értékét a számrendszer jeleinek összevonásából lehet létrehozni. Szabály, hogy a számjegyeknek csökkenő sorrendben kell követniük egymást.
A római számrendszer jelei:
| Decimális érték |
1 |
5 |
10 |
50 |
100 |
500 |
1000 |
| Római szám |
I |
V |
X |
L |
C |
D |
M |
A logikai helyesség érdekében készítettünk két – 13 elemű - konstans tömböt.
| decimals |
1 |
4 |
5 |
9 |
10 |
40 |
50 |
90 |
100 |
500 |
900 |
1000 |
| romans |
I |
IV |
V |
IX |
X |
XL |
L |
XC |
C |
D |
CM |
M |
Ha a decimals vagy romans tömbök bármelyikében megtalálunk egy értéket, akkor a másik tömb ugyanazon indexű eleménél megtalálható a másik számrendszerbeli megfelelő érték.
Egész szám konvertálása római számmá
A Convert2Roman metódus elve, hogy a kapott számból kivonjuk az egész számokat tartalmazó tömb elemeit a tömbben visszafelé haladva. Tesszük ezt addig, míg a szám nagyobb, mint a soron következő elem. Mindeközben a visszaadandó karakterlánchoz fűzzük a római számokat tartalmazó tömb adott indexű elemét.
for(int i=12;i>=0;i--)
{
while (dec >= decimals[i])
{
dec -= decimals[i];
result += romans[i];
}
}
Római szám konvertálása egész számmá
A műveletben ellenőriznünk kell az alábbiakat:
- A számok csak csökkenő sorrendben követhetik egymást.
- Nem lehet kettőnél több karakter csak az I, X, C és M-ből.
- Nem lehet háromnál több karakter semmiből.
- Nem lehet idegen karakter a szövegben.
A metódusban a fő ciklus addig tart, amíg a kapott karakterlánc mérete nagyobb, mint 0. A ciklus elején beolvassuk a karakterlánc első, vagy első két karakterét, majd megkeressük a római számokat tartalmazó tömbben az egyező értéket. Amennyiben van egyezés, akkor a karaktereket levágjuk a láncból, majd ismét indulhat a keresés.
for(int i=0;i<=12;i++)
{
if (help == romans[i] && romans[i].Length == 2)
{
...
Amennyiben nincs egyezés, akkor az első karaktert keressük a tömbben, és találat esetén a következő ciklusban úgy folytatjuk a keresést, hogy a karakterlánc első elemét levágjuk.
for(int i=0;i<=12;i++)
{
if (romans[i].ToString() == help[0].ToString())
{
result += decimals[i];
...
Ha valami hiba lépne fel, akkor befejezzük a feldolgozást és -1-et adunk eredményül.
if (Count > 2 && (Index != 0 && Index != 4 && Index != 8 && Index != 12))
{
badChar = true;
}
if (badChar || Count > 3 || badOrder)
{
roman = "";
result = -1;
}