C Dezimalzahl in Römische Zahl wandeln

_Josef

Cadet 1st Year
Registriert
Nov. 2009
Beiträge
10
Hallo!
Zwecks Schule muss ich ein Programm entwickeln das Dezimalzahlen in Römische Zahlen umwandelt mit Berücksichtigung von IX=9 usw. aber ohne spezielle Regeln wie das nur bestimmte Buchstaben vor einem anderen stehen dürfen usw.

Hab schon Teil fertigen Code der leider überhaupt nicht funktioniert.
Hab schon das Internet durchforstet ohne Erfolg
Hoffentlich kann mir jmd weiterhelfen.
 
Wie soll man das denn ohne Regeln machen ?

Da gibt es doch gewisse "Regeln", also z.B. die römische 9 ist ja 10-1


Als Anfang würde ich erstmal alle Zahlen definieren, also I=1, X=10, M=1000 usw.

Dann baust Du eine Abfrage rein ob die eingegebene Zahl zu einem vorgegeben Wert passt. Ansonsten gucken ob ein Rest überbleibt und dieser wiederrum in eine Zahl passt (Stichwort: modulo)

So halt schrittweise vorgehen. Allerdings wird man die Sonderregelungen nicht mit einen entsprechenden Algorithmus hinbekommen.

EDIT:
grad nochmal überlegt: wenn ohne Algorithmus auskommen muss, dann bleibt ja nur das Schrittweise vergleichen mit vorgegebenen Werten. Also einfach alle römischen Zahlen quasi vordefinieren.
Also:
I, IV V, IX, X, L C, D, M (check welche da noch fehlen, sind nen paar mehr)

Dann einfach per modulo gucken ob die eingegebene Zahl ohne Rest teilbar ist, ansonsten immer weiter prüfen. Solange bis kein Rest überbleibt
 
Zuletzt bearbeitet:
wir lernen C zum beispiel noch an der Dualen Hochschule im rahmen unseres Maschinenbaustudiums...
begeistert bin ich allerdings auch nicht davon
 
Bin wieder da :)
danke auf jeden fall für die bisherige Hilfe

Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>

void dez2roem(int dezzahl, char roemzahl[]);

void main(void)
{
int dezzahl;
char roemzahl[81];

printf("Dezimalzhl: ");
scanf("%d",&dezzahl);
dez2roem(dezzahl,roemzahl);
printf("%s",roemzahl);
getch();
}

void dez2roem(int dezzahl, char roemzahl[])
{
int I=1;
int V=5;
int X=10;
int L=50;
int C=100;
int D=500;
int M=1000;

if(dezzahl%1000==0)
strcpy(roemzahl,"M");
}
jetzt so weitermachen nur mit Schleife ungefähr?

EDIT: @badday
sinnvoller ja aber leider nicht gefragt :(
 
grad nochmal überlegt: wenn ohne Algorithmus auskommen muss, dann bleibt ja nur das Schrittweise vergleichen mit vorgegebenen Werten. Also einfach alle römischen Zahlen quasi vordefinieren.
Also:
I, IV V, IX, X, L C, D, M (check welche da noch fehlen, sind nen paar mehr)

Sind das nicht sehr viele mehr? Ich denke, das muss man anders lösen...

EDIT:

Code:
#include <stdio.h>

#include <string.h>

void dez2roem(int dezzahl, char roemzahl[]);

void main(void)
{
int dezzahl;
char roemzahl[81];

printf("Dezimalzahl: ");
scanf("%d",&dezzahl);
dez2roem(dezzahl,roemzahl);


}

void dez2roem(int dezzahl, char roemzahl[])
{
int I=1;
int V=5;
int X=10;
int L=50;
int C=100;
int D=500;
int M=1000;



while(dezzahl>=M)
{printf("M");
dezzahl -=1000;
}

if(dezzahl>=900)
{

    printf("C");

    printf("M");
    dezzahl-=900;
}



while(dezzahl>=D)
{
printf("D");
dezzahl -=D;
}

if(dezzahl>=600)
{
    printf("C");

    printf("D");
     dezzahl-=600;
}



while(dezzahl>=C)
{
printf("C");
dezzahl -=C;

}

if(dezzahl>=90)
{
    printf("X");
    printf("C");
    dezzahl-=90;

}


while(dezzahl>=L)
{
printf("L");
dezzahl -=L;
}

if(dezzahl>=40)
{
    printf("X");
    printf("L");
    dezzahl-=40;

}


while(dezzahl>=X)
{
printf("X");
dezzahl -=X;
}

if(dezzahl>=9)
{
    printf("I");
    printf("X");
    dezzahl-=9;

}


while(dezzahl>=V)
{
printf("V");
dezzahl -=V;
}

if(dezzahl>=4)
{
    printf("I");
    printf("V");
    dezzahl-=4;

}



while(dezzahl>=I)
{
printf("I");
dezzahl -=I;
}

}

Das muss erst getestet werden, es befinden sich womöglich (wahrscheinlich) noch Bugs darin. Zudem geht es nur bis M (1000). Also testen und verbessern.
Einen deiner Header habe ich auch rausgenommen und eine darin enthaltene Funktion, da das kein Standard-C ist und auf meinem OS nicht läuft.
Also: Diese Programm ist nicht fehlerfrei.
Die genauen Regeln für die römischen Zahlen kenne ich auch nicht, da musst du mal schauen.



Gruß,

badday
 
Zuletzt bearbeitet:
ich kann zwar kein c aber ich würds so machen:
1. variante: am effektivsten aber viel schreibarbeit für das array (40 einträge)

string ist die eingegebene zahl als string, out ist das ausgabestring und
römisch ist ein array of string in dem die strings wie folgt untergebracht sind: (oben der index)

[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |...
I | II |III|IV| V | VI |VII|VIII|IX | X | XX |XXX| XL | L | LX |LXX|LXXX| XC | C | CC |...]

dann lautet die abfrage:

for i=0 to string.length-1 do {
out := römisch[i*10+string.letzteziffer];
string := string - letzteziffer;
}

2. möglichkeit: ein bisschen langsamer aber dafür verhältnismäßig wenig arrayeinträge:
das array römisch sieht dann wie folgt aus:

[1|2|3|4|5|6|7
I|V|X|L|C|D|M]

die abfrage:

for i=1 to string.length do {
s := string.letztes zeichen;
string := string - letztes zeichen;
if s=9 then {
out := römisch[i*2 - 1] + römisch[i*2 + 1] + out;
} elseif s=4 {
out := römisch[i*2 - 1] + römisch[i*2] + out;
} else {
if s>=5 {
out := römisch[i*2];
s := s-5
}
while s > 0 do {
out := römisch[i*2 - 1] + out;
s := s - 1
}
}
}

3. möglichkeit: das ganze mit einer case-abfrage. dürfte performancemäßig besser sein als 2. und imo. auch eleganter - dann ist das array wie bei 2. und die abfrage dann nach dem schema

for i = 1 to string.length do {
case string.letzteziffer of
1: out := römisch[i*2 - 1] + out;
2: out := römisch[i*2 - 1] + römisch[i*2 - 1] + out;
3: out := römisch[i*2 - 1] + römisch[i*2 - 1] + römisch[i*2 - 1] + out;
4: out := römisch[i*2 - 1] + römisch[i*2] + out;
5: out := römisch[i*2];
6: ...
7: ...
8: ...
9: ...
string := string - letzteziffer;
}


sind m M n die 3 grundlegenden arten das zu lösen. lasse mich aber auch gerne eines besseren belehren :-)

achtung das ist keine programmiersprache sonder eine mischung aus delphi, php und was ich sonst mal so ausprobiert habe.
 
@flexlix: Hast du das ausprobiert? Ich kann mir irgendwie nicht vorstellen, dass das funktioniert (lasse mich aber gerne belehren).

Gruß,

badday
 
nö noch nit aber kann ich gerne machen... aber mal konkret wo siehst du denn da ein hindernis das das funktioniert?
 
Ich verstehe größtenteils gar nicht, was du da genau willst. Wenn du Zeit und Lust hast, kannst du es ja mal probieren. Würde mich wirklich interessieren.

Gruß,

badday
 
kk ich probiers mal in C was dann auch meine ersten schritte mit dieser sprache währen ^^
 
hier mal ein einfache Lösung:

Code:
long ul2roman(unsigned long ulValue,char* pszBuffer,unsigned long ccBuffer)
{
	const char szDigits[]="ↂↁMDCLXVI";
	const unsigned long ulDigits[]={10000,5000,1000,500,100,50,10,5,1};
	unsigned long i,k;

	if(!ccBuffer)
		return 0;
	if(!ulValue)
		return (pszBuffer[0]=0,0);

	for(i=0,k=0;ulValue!=0&&i<9;i++)
	{
		while((long)(ulValue-ulDigits[i])>=0)
		{
			if(k == ccBuffer-1)
				return (pszBuffer[k]=0,0);
			ulValue-=ulDigits[i];
			pszBuffer[k]=szDigits[i];
			k++;
		}
	}
	pszBuffer[k]=0;
	return 1;
}
....
char szBuffer[128];
...
ul2roman(1984,&szBuffer[0],128);

für ↂ=10000 und ↁ=5000 müsste man sich halt andere Buchstaben überlegen, oder auf Unicode umstellen.
 
Zuletzt bearbeitet: (Verständlichkeit)
was hältste davon: (habs noch nit ausprobiert...)

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <string.h>

void dez2roem(int dezzahl, char roemzahl[]);

void main(void)
{
int dezzahl;
char roemzahl[81];

printf("Dezimalzahl: ");
scanf("%d",&dezzahl);
dez2roem(dezzahl,roemzahl);


}

void dez2roem(int dezzahl, char roemzahl[])
{
int j = 0;
char n[];
char roem[][]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","v","VI","VII","VIII","IX"};

while(dezzahl>=1000)
{printf("M");
dezzahl -=1000;
}

n = itoa(dezzahl);
if (n<100)
{j=j+1;
}
if (n<10)
{j=j+1;
}

for (i=j; i<3; i=i+1)
{
printf(roem[(atoi(n)+i*10)]);
}

}
 
Zuletzt bearbeitet:
warum?? ich bau erstmal die tausender ab und dann die letzten 3 stellen nacheinander... was macht denn dabei keinen sinn? vll hab ichs ja falsch programmiert dass man nicht erkennt was gemacht werden soll ^^
 
okay hab vergessen das p da weg zu machen... ist schon geändert. jetzt stimmts aber hoffentlich...

okay noch ein fehler mom das haben wir gleich... so. in c kann man das aber nicht so schön ausdrücken weil man iwie nur buchstaben / teilstrings von hinten dranhängen kann und nicht von vorne, bzw. ich weis nit wie das geht. deshalb is das dann da viel hin un herkopiererei. aber funktionieren tuts jetzt oder=?
 
Zuletzt bearbeitet:
wenn die Ziffer null ist, musst du gar nichts Ausgeben. Das atoi(n) kannst du dir auch sparen -> n-0x30. Dann sollte die Sache an sich laufen ^^
 
Zurück
Oben