C Dezimalzahl in Römische Zahl wandeln

so noch die nulldurchläufe vermieden. wenn jemand von euch einen compiler hat kann er ja mal durchschicken und mir dann rückmeldung geben obs funzt oder nit (gibts da bei den fehlermeldungen wie bei php un delphi auch immer die zeilenangaben mit?)
 
Ok ihr tollen Programmierer, wie wäre es, wenn ihr nicht irgendwelche Code-Snippets hier postet, sondern entweder mit handfesten Lösungen kommt oder dem TE helft zu einer zu kommen?

Als nächstes sind wir hier kein Hausaufgaben-Lösungs-Forum, sondern wollen, dass der TE besonders hier im Forum Programmieren entweder selbst auf die Lösung kommt, oder bei der Hand genommen wird, um eine zu finden.
Also sind auch keine Musterlösungen für Hausaufgaben erwünscht.

Jetzt hab ich glaub genug rumgekotzt ;-)

Zurück zum Thema:
@TE:
Der Ansatz mit Modulo klingt gut, jedoch muss du da den Rest genauer auf sein Vorzeichen untersuchen.

Allerdings ist der Ansatz von badday besser, da du ja auch noch prüfen musst, ob z.B. eine "9" auftritt für die du "IX" schreiben musst...

Daraus ergibt sich z.B. für die Zahlen "5-9":
Code:
while(input >= 5)
{	if (input >= 9)
	{	cout << "IX";
			input = input - 9;
	}else{
		cout << "V";
		input = input - 5;
	}
}

Noch zu bedenken wäre:
Die Subtraktionsregel besagt, dass die Zahlzeichen für die Zehnerpotenzen (I, X, C, M) einem ihrer beiden jeweils nächstgrößeren Zahlzeichen vorangestellt werden dürfen und dann in ihrem Zahlwert von dessen Wert abzuziehen sind.
Und:
Hierbei ist es nicht zulässig, mehr als ein einziges Zeichen subtraktiv zu verwenden, oder ein Zeichen auch seinem dritt- oder viertgrößeren Zeichen subtraktiv voranzustellen

Somit sind das wirklich alle Sonderfälle die auftreten können:
IV = 4 (statt IIII)
IX = 9 (statt VIIII)
XL = 40 (statt XXXX)
XC = 90 (statt LXXXX)
CD = 400 (statt CCCC)
CM = 900 (statt DCCCC)
Mↁ = 4000 (statt MMMM)
Mↂ = 9000 (statt ↁMMMM)


So und bevor jetzt der nächste Tipp gegeben wird, will ich erst einen neuen Ansatz vom TE sehen ;)
 
@flexlix: Habs mal kurzerhand versucht zu kompilieren, liefert aber einige Fehler. Hab gerade aber keine Zeit, mir das genauer anzuschauen.

Und: Man Kann den Code extra einschließen für die Leserlichkeit, das solltest du auch machen.

Gruß,

badday
 
Nochmal zum Verständniss hier soll das Programm in C oder C++ sein?

meine Lösung für das Problem in C++ würde folgendermaßen aussehen

Code:
#include <cstdlib>
#include <iostream>

using namespace std;

int umrechnung ( int dezimal );

int main(void)
{
    int dezimal;
    cout << "Hallo bitte geben sie die Zahl ein " << endl;
    if (!(cin >> dezimal)) {
              cout << "Falsche Eingabe! " << endl;
              system("pause");
              return 0;
              }
    umrechnung ( dezimal );
    system("pause");
    return 0;
}

int umrechnung( int dezimal ) {
    int var1=0;
    int array1[16] = {5000, 4000, 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
    char array2[16][3] = { "A", "MA", "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };     
    for (int i=0;dezimal>0;) {
        if ( !((dezimal-array1[i])>-1) ) {
             i++;
             continue;
             }
        cout << array2[i];  
        dezimal = dezimal-array1[i];
        var1++;
        }
    cout << endl;
    return 0;
    }

ist zwar nicht die beste Lösung sollte aber funktionieren ist aber in c++
 
Zuletzt bearbeitet:
Es handelt sich um C (wurde in der ersten Seite auch angesprochen).

Gruß,

badday
 
hey...
hab eine version in C

meine aufgabenstellung ist, dass der rechner ohne str Funktionen und nur mit char felder realisiert werden soll

ist ziemlich lang aber funktioniert

Code:
void rom2dez(char erg[],int dez)
{
	char roem[80]={'I','V','X','L','C','D','M'};
	int i, wert=10,count=0;

	for(i=0;dez>0;i+=2)
	{
		if(i>=6)
		{
			wert=dez%10;
			for(wert;wert>0;wert--,count++)
				erg[count]=roem[i];					
		}
		else
		{
		wert=dez%10;
		
		switch(wert)
		{
			case 1:	erg[count]=roem[i];
					count++;
					break;
			case 2:	erg[count]=roem[i];
					count++;
					erg[count]=roem[i];
					count++;
					break;
			case 3:	erg[count]=roem[i];
					count++;
					erg[count]=roem[i];
					count++;
					erg[count]=roem[i];
					count++;
					break;
			case 4: erg[count]=roem[i+1];
					count++;
					erg[count]=roem[i];
					count++;
					break;
			case 5: erg[count]=roem[i+1];
					count++;
					break;
			case 6: erg[count]=roem[i];
					count++;
					erg[count]=roem[i+1];
					count++;
					break;
			case 7: erg[count]=roem[i];
					count++;
					erg[count]=roem[i];
					count++;
					erg[count]=roem[i+1];
					count++;
					break;
			case 8: erg[count]=roem[i];
					count++;
					erg[count]=roem[i];
					count++;
					erg[count]=roem[i];
					count++;
					erg[count]=roem[i+1];
					count++;
					break;
			case 9: erg[count]=roem[i+2];
					count++;
					erg[count]=roem[i];
					count++;
					break;
			case 0: break;
		}
		}
		dez/=10;
	}

	erg[count]=0;

}

void main (void)
{
	char erg[80];
	int dez=29,i;
	
	do
	{
	scanf("%d",&dez);
	rom2dez(erg,dez);

	for(i=0;erg[i]!='\0';i++)
		;

	for(i;i>=0;i--)
		printf("%c",erg[i]);
	
	printf("\n\n\n");
	}while(1);
}

hoffe ich hab das jez richtig eingefügt :confused_alt:
 
Zurück
Oben