[C] Převod římských čísel na arabské

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Velous
Příspěvky: 99
Registrován: 12 bře 2010, 01:00

[C] Převod římských čísel na arabské

#1 Příspěvek 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.

Uživatelský avatar
Hill
Administrátor
Administrátor
Příspěvky: 18898
Registrován: 10 zář 2004, 02:00
Bydliště: Jičín, Český ráj

#2 Příspěvek 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.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#3 Příspěvek 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

Uživatelský avatar
Velous
Příspěvky: 99
Registrován: 12 bře 2010, 01:00

#4 Příspěvek 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.
Naposledy upravil(a) Velous dne 13 pro 2012, 16:52, celkem upraveno 1 x.

Uživatelský avatar
Panda38
Příspěvky: 713
Registrován: 21 lis 2012, 01:00
Bydliště: Most, Praha, Lanžhot
Kontaktovat uživatele:

#5 Příspěvek 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++;
	}

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#6 Příspěvek od mtajovsky »

Jinak - na programování existuje specializované fórum, konkrétně pro C/C++:
http://www.builder.cz/cz/forum/1277427/obecna-diskuse/

Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 02:00
Kontaktovat uživatele:

#7 Příspěvek 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;
}

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“