Bibliotheken einfügen
-
Hallo zusammen
Ich habe gerade den Auftrag erhalten, eine römische Zahl in eine Arabische und eine arabische in eine römische Zahl umzuwandeln. Das machen wir so, dass wir die Funktion der römischen in arabischen Zahl und das umgekehrte in zwei einzelnen Dateien speichern und dann vergleichen und ausgeben. Leider funktioniert es bei mir noch nicht richtig
Hier ist das Hauptprogramm :
//Eingabe der In/out Bibliothek #include <iostream> #include "rom.h" #include "arab.h" //Angabe welchen Namensraum man verwenden will (hier standard) using namespace std; //Hauptfunktion int main() { int ausgabe; char eingabe[200]; int eingabe2; cin >> eingabe; cin >> eingabe2; ausgabe = rom(eingabe[200]); arab(eingabe2); cin.get(); system ("pause"); return 0; }Die Funktion des römischen:
//Hauptfunktion void rom(char text[200]) { int zaehler = 0; int zahl = 0; //hier kommt ein definiertes Char-Array // das ist eigentlich kein Array sondern ein einzelnes Zeichen; //cin.getline(text,sizeof(text)); for (int i =0; i <= strlen (text); /* er wird nur die den gewünschten Text befürworten */ i++) { //das vergleicht den Text mit dem Zeichen dazu brauche ich aber noch einen Zähler, der jedesmal ausgegeben wird wenn der Buchstabe vorkommt if(text[i] == 'C' && text[i+1] == 'M') {zahl += 900; i += 2;} if(text[i] == 'C' && text[i+1] == 'D') {zahl += 400; i += 2;} if(text[i] == 'X' && text[i+1] == 'C') {zahl += 90; i += 2;} if(text[i] == 'X' && text[i+1] == 'L') {zahl += 40;i += 2;} if(text[i] == 'I' && text[i+1] == 'X') {zahl += 9; i += 2;} if(text[i] == 'I' && text[i+1] == 'V') {zahl += 4; i += 2;} if(text[i] == 'D' ) zahl += 500; if(text[i] == 'C') zahl += 100; if(text[i] == 'L') zahl += 50; if(text[i] == 'X') zahl += 10; if(text[i] == 'V') zahl += 5; if(text[i] == 'I') zahl += 1; } cout << zahl; }Und die des arabischen
//Hauptfunktion int arab(int arabisch) { char arabischzeichen[9] = {'I','M','C','D','L','X','V'}; while(arabisch >=1000) { return arabischzeichen[1]; arabisch -= 1000; } /*while(arabisch >=900) { cout << "CM"; arabisch -= 900; } while(arabisch >=500) { cout << "D"; arabisch -= 500; } while(arabisch >=400) { cout << "CD"; arabisch -= 400; } while(arabisch >=100) { cout << "C"; arabisch -= 100; } while(arabisch >=50) { cout << "L"; arabisch -= 50; } while(arabisch >=40) { cout << "XL"; arabisch -= 40; } while(arabisch >=10) { cout << "X"; arabisch -= 10; } while(arabisch >=5) { cout << "V"; arabisch -= 5; } while(arabisch >=4) { cout << "IV"; arabisch -= 4; } */ while(arabisch >=1) { return arabischzeichen[0]; arabisch -= 1; } }Ich hoffe, Ihr könnt mir helfen

-
picoG schrieb:
Leider funktioniert es bei mir noch nicht richtig...
Könntest du bitte genauer sagen was nicht funktioniert? Die wenigsten werden sich deinen Code in Gänze anschauen (zumal teilweise zum Lesen schlecht formatiert...). Zudem verwende bitte die "C/C++"-Tags, nicht die "Code"-Tags um eben solchen im Forum hervorzuheben.
-
Ja^^, dass ist ja das Problem^^ also den römischen Teil ist überhaupt nich compilierbar... wenn ich es über void mit einem cout probiere kommt "cout undecleared". Wenn ich es über einen int mache mit einem return kommt "invalid conversation from *char to int". Der arabische Teil ist wenigstens kompilierbar, aber es kommt nach der Eingabe keine Ausgabe
ich hoffe das konnte weiterhelfen und bitte helft mir stehe kurz vor der verzweiflung
!
-
Du greifst in Zeile 16 und 21 auf einen ungültigen Arrayindex zu und dann fliegt dir dein Programm um die Ohren. Am besten unterteilst du dein Programm in zwei Abschnitte: römisch -> arabisch und arabisch -> römisch. Abhängig davon liest du die Benutzereingabe in den passenden Datentyp ein, für arabish -> römisch wäre das ein Integer und für römisch -> arabisch ein std::string (kein char[200] !).
Die Aufgabe sieht mir nach Hausaufgabe aus, gut möglich, dass ihr std::string noch nicht benutzt habt. Erkundige dich dann, ob du string mit all seinen Vorteilen benutzen darfst oder ob der Aufgabensteller auf char[200] beharrt.
-
Nein std::string dürfen wir nicht benutzen.
-
Ein kleiner Tipp:
Du kannst die Lösung mit Hilfe von passenden Arrays und Schleifen sehr übersichtlich gestalten. Zum Beispiel die Ausgabe der römischen Zahl:
typedef struct {const char* s;unsigned int val;} RomanValues; const RomanValues romanValues[]={ // höchster Wert zuerst, wie nutzen aus, dass die Zeichen in ihrem Wert absteigend von links nach rechts innerhalb der Zeichenkette angeordnet sind. {"M", 1000}, {"CM", 900}, {"D", 500}, {"CD", 400}, {"C", 100}, {"XC", 90}, {"L", 50}, {"XL", 40}, {"X", 10}, {"IX", 9}, {"V", 5}, {"IV", 4}, {"I", 1} }; // Pseudocode: pos = 0; // Solange wie val>0 wenn val>=romanValues[pos].val Ausgabe von romanValues[pos].s val-=romanValues[pos].val ansonsten pos um 1 erhöhen, nächsten Wert im nächsten Schleifendurchlauf überprüfenAnders herum geht es genau so, jedoch müssen in dem Falle erst die zweistelligen römischen Zahlen geprüft werden. Beim Auffinden einer Ziffer wird die Position innerhalb der Zeichenkette um eben diese Länge verschoben.
-
picoG schrieb:
Nein std::string dürfen wir nicht benutzen.
<ironie>
Aber <iostream>? Was lernt ihr eigentlich? C mit Klassen?(Ich hoffe irgendwann kommt in den Klassenräumen mal an, das std::string zum C++ Standard gehört, und Funktionen wie strlen wiederum sind klassisches C [und in den C-Kompatibilitätsheadern zu finden]).
</ironie>
-
Ich habe das Problem gelöst aber jetzt habe ich noch eine andere Frage:
Wie kann ich überprüfen, ob ein Char eine Zahl ist?
Also eine Abfrage, wenn der Char eine Zahl ist in eine römische umschreiben und wenn der char keine Nummer ist in eine arabische umschreiben
-
An deiner Stelle würde ich es mit std::string machen, und falls dein Lehrer es nicht akzeptiert, diesen totschlagen.