[C] Převod římských čísel na arabské
Moderátor: Moderátoři
[C] Převod římských čísel na arabské
Zdar, vytvořil jsem program v jazyku C na převod římských čísel na arabské. Ale nefunguje mi odečítání menšího čísla od většího například XL tj. 40, mi program počítá jako LX, tj. 60. Jak mám zapsat, aby program rozlišoval pořadí písmen římských číslic a počítal správně? Díky moc za radu.
http://www.cplusplus.com/forum/general/27629/
a mnoho daších odkazů k poučení na Google, heslo
romanian numbers converter in C
a mnoho daších odkazů k poučení na Google, heslo
romanian numbers converter in C
Stále mi to nejde. Půlka kódu, která převádí arabské číslice na římské funguje. U této druhé půlky mi zbývá dořešit to odčítání. O něco jsem jsem pokusil, ale nejde to.
Naposledy upravil(a) Velous dne 13 pro 2012, 16:52, celkem upraveno 1 x.
- Panda38
- Příspěvky: 713
- Registrován: 21 lis 2012, 01:00
- Bydliště: Most, Praha, Lanžhot
- Kontaktovat uživatele:
No ale tam porovnáváš mezi sebou písmena, tedy ASCII hodnoty znaků, a ta nemají stejné pořadí jako jejich číselné hodnoty. ![Smile :-)](./images/smilies/icon_smile.gif)
Jestli to chceš dělat tímto způsobem, tak si nejdříve převeď písmena na čísla do pomocné tabulky a ta pak už můžeš takto porovnávat.
Např.:
Nebo použít funkci, která převede jeden římský znak na číslo a používat tuto funkci jak ve výpočtu, tak v porovnání 2 znaků.
![Smile :-)](./images/smilies/icon_smile.gif)
Jestli to chceš dělat tímto způsobem, tak si nejdříve převeď písmena na čísla do pomocné tabulky a ta pak už můžeš takto porovnávat.
Např.:
Kód: Vybrat vše
short cislo2[255];
while(cislo[a] != '\0')
{
switch (cislo[a])
{
case 'i':
case 'I': cislo2[a] = 1; break;
case 'v':
case 'V': cislo2[a] = 5; break;
case 'x':
case 'X': cislo2[a] = 10; break;
case 'l':
case 'L': cislo2[a] = 50; break;
case 'c':
case 'C': cislo2[a] = 100; break;
case 'd':
case 'D': cislo2[a] = 500; break;
case 'm':
case 'M': cislo2[a] = 1000; break;
default:
printf("Zadany text %s neni rimske cislo.\n", cislo);
indikace = 1;
}
if (indikace) break;
a++;
}
cislo2[a] = 0;
if (!indikace)
{
a = 0;
while(cislo2[a] != 0)
{ ....
Kód: Vybrat vše
short RimskeCislo(char znak)
{
switch (znak)
{
case 'i':
case 'I': return 1;
case 'v':
case 'V': return 5;
case 'x':
case 'X': return 10;
case 'l':
case 'L': return 50;
case 'c':
case 'C': return 100;
case 'd':
case 'D': return 500;
case 'm':
case 'M': return 1000;
}
return 0;
}
.....
while(cislo[a] != '\0')
{
if (RimskeCislo(cislo[a]) == 0)
{
indikace = 1;
printf("Zadany text %s neni rimske cislo.\n", cislo);
break;
}
if (RimskeCislo(cislo[a]) < RimskeCislo(cislo[a+1]))
b -= RimskeCislo(cislo[a]);
else
b += RimskeCislo(cislo[a]);
a++;
}
Jinak - na programování existuje specializované fórum, konkrétně pro C/C++:
http://www.builder.cz/cz/forum/1277427/obecna-diskuse/
http://www.builder.cz/cz/forum/1277427/obecna-diskuse/
Takhle mi to docela funguje:
Kód: Vybrat vše
#include <stdio.h>
#include <stdlib.h>
static int hodnotaCislice(char znak)
{
switch( znak )
{
case 'i':
case 'I':
return 1;
case 'v':
case 'V':
return 5;
case 'x':
case 'X':
return 10;
case 'l':
case 'L':
return 50;
case 'c':
case 'C':
return 100;
case 'd':
case 'D':
return 500;
case 'm':
case 'M':
return 1000;
default:
fprintf(stderr, "Znak '%c' neni rimska cislice.\n", znak);
exit(1);
return 0;
}
}
static int hodnotaCisla(const char *text)
{
int aktualni;
int posledni;
int ostatni;
posledni = ostatni = 0;
for ( ; *text; text++ )
{
aktualni = hodnotaCislice(*text);
if ( posledni && posledni < aktualni )
{
ostatni += aktualni - posledni;
posledni = 0;
}
else
{
ostatni += posledni;
posledni = aktualni;
}
}
return ostatni + posledni;
}
int main(int argc, const char **argv)
{
if ( argc != 2 )
{
fprintf(stderr, "Jako parametr zadej rimske cislo.\n");
exit(1);
}
printf("Hodnota: %d\n", hodnotaCisla(argv[1]));
return 0;
}