Römische Zahlen ==> Dezimalzahlen



  • Tach Leute, 😕

    Ich soll ein Programm schreiben welches römische Zahlen in Dezimalzahlen umwandelt.

    Ein Lösungsansatz war dieser:

    do{
    scanf("%1c",&zeichen);
    if(zeichen!=10)
    {
    //Problemlösung
    }
    } while(zeichen!=10);

    Ich hab bisher das hier geschrieben. Als Dezimalzahl kam aber immer 146 raus.

    #include <vcl.h>
    #include <stdio.h>
    #include <conio.h>
    #pragma hdrstop

    //---------------------------------------------------------------------------

    #pragma argsused

    int I, V, X, L, C, D, M, ergebnis1, ergebnis;
    char zeichen;
    int main(int argc, char* argv[])

    {
    printf("\n\n Roemische Zahlen ==> Dezimalzahlen");
    printf("\n Geben Sie eine roemische Zahl mit Hilfe der Symbole I, V, X, L, C, D, M ein");
    printf("\n ==> ");

    do{
    scanf("%1c",&zeichen);
    if(zeichen!=10)
    {
    I=1;
    V=5;
    X=10;
    L=50;
    C=100;
    D=500;
    M=1000;
    ergebnis1=zeichen;
    ergebnis=ergebnis1+zeichen;
    }
    else{}
    }
    while(zeichen!=10);
    printf("\n\n Die Dezimalzahl lautet: %i",ergebnis);

    getch();
    return 0;
    }

    Danke schon mal im vorraus!



  • Verstehe nicht was dein Code bezwecken soll. Bringt dich mein Code hier weiter?

    . 
        #include <cstring> 
        unsigned RomanAtoi(const char* input) 
        { 
            static const unsigned roman[128] = { 
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                0, 0, 0, 100, 500, 0, 0, 0, 0, 1, 0, 0, 50, 1000, 0, 0, 
                0, 0, 0, 0, 0, 0, 5, 0, 10, 0, 0, 0, 0, 0, 0, 0, 
                0, 0, 0, 100, 500, 0, 0, 0, 0, 1, 0, 0, 50, 1000, 0, 0, 
                0, 0, 0, 0, 0, 0, 5, 0, 10, 0, 0, 0, 0, 0, 0, 0 
            }; 
    
            const char* p = input + strlen(input); 
            unsigned rval = 0, prev = 0; 
            while(input != p--) { 
                unsigned curr = roman[*p]; 
                if(curr < prev) 
                    rval -= curr; 
                else { 
                    rval += curr; 
                    prev = curr; 
                } 
            } 
            return rval; 
        }
    


  • Probiers mal hiermit. Hiermit lassen sich alle römischen Zahlen umwandeln, ich hab nämlich die Stellung der Zeichen berücksichtigt 😃 ! Hinzufügen müsstest du noch eine Funktion, die überprüft, ob die Zahl gültig ist.

    #include <iostream>
    #include <string>
    using namespace std;
    
    int I=1, V=5, X=10, L=50, C=100, D=500, M=1000, ergebnis; 
    char zeichen[14];
    int laenge;
    
    int main(int argc, char* argv[]) 
    { 
    	cout << "\n\n Roemische Zahlen ==> Dezimalzahlen" 
    		<< "\n Geben Sie eine roemische Zahl mit Hilfe der Symbole I, V, X, L, C, D, M ein" 
    		<< "\n ==> ";
    	cin >> zeichen;
        laenge=strlen(zeichen);
    
    	for(int i=0; i<=zeichen; i++)
    	{
    		switch(zeichen[i])
    		{
    		case 'I': if(zeichen[i+1]=='V') ergebnis-=I; else ergebnis+=I; break;
    		case 'V': ergebnis+=V; break;
    		case 'X': if(zeichen[i+1]=='L' || zeichen[i+1]=='C') ergebnis-=X; else ergebnis+=X; break;
    		case 'L': ergebnis+=L; break;
    		case 'C': if(zeichen[i+1]=='D' || zeichen[i+1]=='M') ergebnis-=C; else ergebnis+=C; break;
    		case 'D': ergebnis+=D; break;
    		case 'M': ergebnis+=M; break;
    		}
    	}
    	cout << ergebnis;
    	return 0;
    }
    

    zeile ist nur 14 Byte groß, weil die längstmögliche Zahl 13 Zeichen hat (MMMCCCXXXVIII).



  • Wie sind die römischen Zahlen aufgebaut. Es gibt da 2 Unterschiede! Es gibt eine kurze und eine lange Schreibweise.

    kurz:
    3999 = IMMMM
    lang:
    3999 = MMMCMXCIX

    Ich habe dafür 2 Algorithmen hier liegen, glaube zumindest das diese auch in Dezimalzahlen umwandeln können. Aber dabei ist die Schreibweise entscheidend. Also entweder kurz oder 1000er,100er,10er,1er.

    Code-Hacker



  • @Code-Hacker:IMMM ist falsch!!! Nur deine zweite Zahl ist richtig!



  • CME386 schrieb:

    ich hab nämlich die Stellung der Zeichen berücksichtigt 😃 !

    Ich doch auch :p 😉 !



  • IMMMM ist nicht falsch das ist 4000-1=3999
    Ich habe auch noch den Algo der das von Dezimal in römisch genau so umwandelt oder hat der das nur noch für 2999 so gemacht? Eigentlich auch egal. Für 2999 ist sie auf jedenfall richtig (also IMMM). Das ist die kurze, unübersichtliche und unübliche Schreibweise, die andere ist die übliche mit 1000er,100er usw.

    Als wir in der Schule unser letztes Programm Vortragen musste hat ein Team sich extra mit der Zusammensetzung beschäftigt und ebenfalls beide Schreibweisen vorgeführt.

    Code-Hacker





  • Mein Lehrer hat mir das so beigebracht, das IMMM falsch ist. Tja, dann muss ich auch noch die andere Variante einfügen...

    @MaSTaH: Danke für den Link, sonst würd ich jetzt immer noch falsch glauben (Ich hätte auch nicht nachgeguckt, weils mich soviel dann aber nicht interessiert)



  • http://de.wikipedia.org/wiki/R�mische_Zahlen

    Von einem A hab ich noch nie was gehört. Muss wohl erst vor kurzem herausgefunden worden sein. Dann wäre 3999 ja nicht mehr IMMM oder MMMCMXCIX, sondern MAIM bzw. MACMXCIX.

    PS: Was für Zeichen sind den das eine unterm M und die zwei unter A?
    PPS: Weiß einer, welches Volk das erste richtige Zahlensystem hatte (also mit 0)? Würd mich mal interessieren



  • Hätte nich gedacht daß so viele Antworten so schnell kommen. Danke! 🙂

    Gibts auch eine Möglichkeit ohne Arrays oder Felder?

    Was anderes: ist jetzt die Schreibweise cout << oder printf(" ") (und die jeweils unterschiedlichen Schreibweisen) die Bevorzugte??
    Wir lernen das in der Schule mit printf.

    Und Code-Hacker: IMMM ist wohle falsch weil I nur vor V oder X stehen kann.
    weiterhin kann X nur vor L oder C und C nur vor D oder M stehen. :p




Anmelden zum Antworten