Stránka 1 z 1
[C] Převod římských čísel na arabské
Napsal: 11 pro 2012, 18:19
od Velous
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.
Napsal: 11 pro 2012, 18:43
od Hill
Princip je v tom, že se čísla sčítají jen v případě, že za nižší číslicí nenásleduje vyšší.
Když je nižší římská číslovka před vyšší, tak se hodnota té nižší odečítá.
Teď si to přelož do céčka.
Napsal: 11 pro 2012, 20:45
od mtajovsky
http://www.cplusplus.com/forum/general/27629/
a mnoho daších odkazů k poučení na Google, heslo
romanian numbers converter in C
Napsal: 12 pro 2012, 20:10
od Velous
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.
Napsal: 12 pro 2012, 21:20
od Panda38
No ale tam porovnáváš mezi sebou písmena, tedy ASCII hodnoty znaků, a ta nemají stejné pořadí jako jejich číselné hodnoty.
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)
{ ....
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ů.
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++;
}
Napsal: 12 pro 2012, 21:42
od mtajovsky
Jinak - na programování existuje specializované fórum, konkrétně pro C/C++:
http://www.builder.cz/cz/forum/1277427/obecna-diskuse/
Napsal: 13 pro 2012, 08:18
od piitr
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;
}