Hilfe: Arabische Zahl in römische Zahl umwandeln



  • es geht darum das die professorin das checkt das ich das nicht gemacht hab...
    deswegen kann ich das so nicht schreiben....
    deswegen auch die ganzen fragen... ich muss es nämlich irgendwie anders schreiben
    nur ich weiß nich wie...



  • du bist aber auch experimentierfreudig...

    probier mal so ich hab noch ne ausgabezeile reingepackt die dir zwsichenergebnisse ausgibt dann solltest du den algo auch von hand mal nachvollziehen können...

    #include <iostream>
    #include <string>
    
    std::string arab2roman(int x) {
     if(x < 1 || x > 3999) throw(x); //nicht darstellbar
    
      static const char *rom_strings[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
      static const int rom_values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
      std::string ret;
      for(int i = 0; x != 0; ++i) 
        while(x >= rom_values[i]) {
          x -= rom_values[i];
          ret += rom_strings[i];
    	  std::cout<<"Bisher ermittelter String: "<<ret<<"\tRestwert:"<<x<<std::endl;
    	}
    
      return ret;
    }
    
    int main(){
    
    	std::cout<<arab2roman(3918)<<std::endl;
    }
    


  • #include <iostream>
    #include <string>
    
    std::string arab2roman(int x) {
     if(x < 1 || x > 3999) throw(x); //nicht darstellbar
    
      static const char *rom_strings[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
      static const int rom_values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
      std::string ret;
      for(int i = 0; x != 0; ++i) 
        while(x >= rom_values[i]) {
          x -= rom_values[i];
          ret += rom_strings[i];
    	  std::cout<<"Bisher ermittelter String: "<<ret<<"\tRestwert:"<<x<<std::endl;
    	}
    
      return ret;
    }
    
    int main(){
    
    	std::cout<<arab2roman(3918)<<std::endl;
    }
    

    muss ich da nichts eintippen ? sollte da nicht irgendwo cin>> stehen ?



  • Sagtest du nicht was von schule und dann prof. ?

    schule ist bei mir FH. und wir haben Semesterferien

    dann hattest du ja anscheinend 1 Semester Programmieren. Und da habt ihr anscheinend nicht mal ein array durchgenommen? ne, oder?
    oder mal ne funktion????

    Also du hast da ja dein main programm

    int main(){
    
        std::cout<<arab2roman(3918)<<std::endl;    // hier gibts du ja deinen wert ein z.b. die 3918. In der art reicht das den profs schon
    }
    

    oder du gibts dir "mühe" und machst dein cin davor

    int eingabe;
    
    cout << "Liebe Proffesorin, bitte fragen Sie mich nicht! wie das Prog. fkt.!! Einfach ne zahl kleiner 4000 eingeben, danke! ";
    cin >> eingabe;
    cout << endl;
    
    //endtweder
    std::cout<<arab2roman(eingabe)<<std::endl;
    
    // oder besser
    cout<<arab2roman(eingabe)<<endl;  // musst dann halt meistens "using namespace std;" oben eingeben nach include 
    //sonst frägt die dich warum du immer std:: davorschreibst, und dann wirds peinlich ;)
    

    PS: entweder schau dir tutorials an und/oder bücher oder hör auf zu studieren! die aufgaben werden nicht leichter. waa studierst du? programmieren als nebenfach oder hauptfach?

    immer hausaufgaben posten is nicht 👎
    next time frage luigi, der weiss es maybe



  • ähm ich wohne in österreich und gehe jetzt hmm wie läuft das noch mal in deutschland, 10te klasse glaub ich...

    ich studiere noch lange nicht und wenn dann sicher nicht informatik 🙂

    stimmt wir haben kein array durchgenommen...

    prof hat mir gesagt ich soll es mit for oder mit vielen whiles etc machen kein plan, sie hat gemeint es ist lang aber nicht schwer, naja ich checks nich



  • -Mario- schrieb:

    - wieso muss ich include string machen und nicht wie ich immer gemacht habe iclude iostream.h ?

    iostream.h ist sowieso schon mal falsch. Der ISO-C++98-Standard definiert keinen Header iostream.h, der heißt iostream. iostream.h war vor dem Standard üblich, inzwischen ist es aber Bogus.
    #include <string> bewirkt, dass der Header "string" eingebunden wird, in dem die Klasse string definiert wird. Du brauchst es, um std::string zu benutzen.

    -Mario- schrieb:

    - was bedeutet diese zeile : " std::string arab2roman(int x) { "

    Das ist die Funktionssignatur. Die Funktion nimmt einen integer entgegen und gibt einen String zurück, außerdem heißt sie arab2roman. Was ne Funktion ist, weißt du aber schon, oder?

    -Mario- schrieb:

    - was bedeutet " throw(x) "

    Im Fall eines Fehlers schmeiß ich den Integer raus, der den Fehler verursacht hat. Wenns dir nicht gefällt, du kannst auch nen speziellen Wert zurückgeben, um auf Fehler zu prüfen. Zum Beispiel könntest du return ""; statt throw(x); schreiben oder so.

    -Mario- schrieb:

    -static const vor char und int muss man das machen ?!

    Prinzipiell nicht, aber es spart Rechenzeit und Speicher, wenns static ist. Außerdem sind die Werte im Array konstant, also macht es Sinn, sie auch const zu deklarieren.

    -Mario- schrieb:

    - was bedeuten diese zwei ausdrücke : " *rom_strings[] rom_values[] "

    static char const *rom_strings[] = { ... }; definiert ein statisches Array mit Namen rom_strings, das Zeiger auf konstante chars enthält. In C war das der übliche Weg, Strings zu behandeln, in C++ benutzt man eigentlich eher std::string, aber an dieser Stelle war das nicht nötig, und rohe Pointer sind halt etwas performanter. Statisch bedeutet, dass das Array nur einmal zu Programmbeginn angelegt wird, und nicht bei jedem Funktionsaufruf wieder neu auf dem Stack. (btw, mir fällt grad auf, dass hier static char const *const rom_strings[] { ... }; richtiger wäre, dann wärs ein Array von konstanten Pointern auf konstante chars).
    static int const rom_values[] = { ... }; definiert dementsprechend ein statisches Array von konstanten Integern.

    -Mario- schrieb:

    - was bedeutet " ret " und am ende das " return ret" .. ?

    ret wird am Anfang der Funktion als std::string deklariert, das ist eine Variable. return ret; bedeutet, dass der Wert dieser Variable von der Funktion zurückgegeben wird. Die Funktion endet damit.

    Das sind alles Grundlagen. Ich schlage vor, dass du dir mal ein C++-Tutorial deines Vertrauens suchst und den Kram nachschlägst, sonst wirst du nachher bei kompliziertem Code einfach eingehen.



  • @beefy
    wurde ja auch zeit das du deine funktion selber erklärst...
    wo warst du so lange? 😃



  • Hallo Leute,

    glaubt ihr tatsächlich, dass die, die die aufgaben stellen, nicht auch hier reingucken? Vor einiger Zeit war ein Beitrag hier, da hat ein anderer Teilenehmer haargenau gesagt, an welcher FH die Aufgabe gestellt wurde.

    Übrigens: Selbst ist der Mann.

    Das ist wohl zu bequem, die Arbeit anderen hinzulegen und auf Ergebnisse zu warten - mit grosser Ahnungslosigkeit.

    Nix für ungut.
    🕶 😋



  • Hallo Leute,

    glaubt ihr tatsächlich, dass die, die die aufgaben stellen, nicht auch hier reingucken? Vor einiger Zeit war ein Beitrag hier, da hat ein anderer Teilenehmer haargenau gesagt, an welcher FH die Aufgabe gestellt wurde.

    Übrigens: Selbst ist der Mann.

    Das ist wohl zu bequem, die Arbeit anderen hinzulegen und auf Ergebnisse zu warten - mit grosser Ahnungslosigkeit.

    Nix für ungut.
    🕶 😋



  • Hallo Leute,

    glaubt ihr tatsächlich, dass die, die die aufgaben stellen, nicht auch hier reingucken? Vor einiger Zeit war ein Beitrag hier, da hat ein anderer Teilenehmer haargenau gesagt, an welcher FH die Aufgabe gestellt wurde.

    Übrigens: Selbst ist der Mann.

    Das ist wohl zu bequem, die Arbeit anderen hinzulegen und auf Ergebnisse zu warten - mit grosser Ahnungslosigkeit.

    Nix für ungut.
    🕶 😋



  • 10te Klasse und dann so ne Aufgabe, kann ich einfach nicht glauben!

    So eine Aufgabe sollten wir mal an der Uni in Scheme schreiben.



  • ich lüge euch nicht an 1988 jahrgang bin ich...



  • ich hab nen kleinen ansatz.. hier:

    void main()
    {int Zahl,a;

    cout<<"Zahl eingeben:";
    cin>>Zahl;
    a=Zahl/1000;
    ...

    so und jetzt wenn ich für Zahl 1000 zum Beispiel eingetippt hätte
    würde a = 1 sein... dann könnte ich 1 M ausgeben(da ja M für 1000 steht)

    ...if (a=1)
    cout<<"M"; ...

    aber da mann ja auch z.B 4000 eintippen kann muss ich das ja irgendwie zählen
    also kann dieser ansatz nicht ganz stimmen...

    könnt ihr mir vll bissl weiterhelfen ? wär nett



  • wie es geht steht doch schon im thread musst du dir nur mal angucken...

    also erstes guckst du wieviele M's du schreiben musst...

    also zahl/1000 mal ein M ausgeben...

    dann rechnest du mit zahl%1000 weiter

    danach guckst du ob du ein CM schreiben musst (also wenn die zahl grösser gleich 900 ist) wenn ja 900 abziehen

    dann guckst du ob du eine D schreiben musst (wenn die zahl grösser also 500 ist) wenn ja 500 abziehen...

    dann das spiel nochmal mit CD

    dann zahl/100 mal C schreiben und weiter gehts... das ganze hat 0xdeadbeef mittels eines lookuptables in eine schleife gepackt aber wenn du das nicht willst kann du das auch einzeln durchackern...



  • Windalf schrieb:

    wie es geht steht doch schon im thread musst du dir nur mal angucken...

    also erstes guckst du wieviele M's du schreiben musst...

    also zahl/1000 mal ein M ausgeben...

    ja das ist es ja
    nur wie macht ich das?

    wie schreib ich das so das so und so viel mal das M kommt ?



  • windalf noch da ?:)

    kann mir sonst noch vielleicht jemand meine frage über dem post hier beantworten ?



  • wie schreib ich das so das so und so viel mal das M kommt ?

    int i;
    for(i=0;i<zahl/1000;++i)putchar("M");
    


  • Windalf schrieb:

    wie schreib ich das so das so und so viel mal das M kommt ?

    int i;
    for(i=0;i<zahl/1000;++i)putchar("M");
    

    danke windalf noch ne kleine frage und zwar kann ich das auch so machen :

    for(i=0;i<zahl/1000;++i)
    cout<<"M";
    denn putchar... haben wir nicht durchgenommen die prof wird wieder rumheulen wenn ich was benutze was wir nicht durchgenommen haben das hat sie
    nämlich auch getan als ich versucht habe arrays zu benutzen 😞



  • Teste doch mal beides... was merkst du? Es macht keinen Unterschied, oder? putchar('M'); ist "C-Style". Soweit ich weiß heißt die C++-Funktion cout.put('M'); cout.put('M'); ist jedoch aquivalent zu cout << 'M'; wenn keine Manipulatoren verwendet wurden.
    D.h wenn dann cout.put('M'); oder cout << 'M';

    Caipi



  • Caipi schrieb:

    Teste doch mal beides... was merkst du?

    Caipi

    genau das ist ja das problem :D:(

    ich hab zu hause kein c++ und kann nicht probieren...

    danke für eure hilfe ist echt sehr nett von euch!


Anmelden zum Antworten