odd! Geschrieben 11. Dezember 2005 Geschrieben 11. Dezember 2005 Hallo! Bin bei der Suche nach einer Lösung für folgende Aufgabe: http://www.fh-augsburg.de/~fhau/HauPro1-Dateien/2005WS/i1ws05_7.pdf auf eurer Seite gelandet , aber keine wirkliche Lösung gefunden. Weiter Angaben zur Aufgabe hier: http://www.fh-augsburg.de/~fhau/HauPro1Pr.htm Meine Lösung des Augabenteils , ohne Prüfung , wie auch schon in einem anderen Thread gesucht: // Umwandlung ohne Prüfen auf richtige Reihenfolge #include <iostream> #include <cctype> #include <iomanip> using namespace std; int toupper(int[]); // prototyp für wandeln von klein in groß unsigned romwert(char*); // prototyp unterprogramm berechnen dezimal int main() { char text[100]={'\0'}; // textfeld deklarieren und mit "0" belegen cout << "Geben Sie Ihre roemische Zahl ein: \t"; cin >> text; // eingabe roemische zahlen for(int i = 0; text!='\0';i++) { // Schleife die, bis "\0" im feld kommt,durchläuft switch(text) { case 'i': case 'I': case 'v': case 'V': case 'x': case 'X': case 'l': case 'L': case 'c': case 'C': case 'd': case 'D': // abfrage der möglichen buchstaben und wenn notwendig case 'm': // umwandeln in großbuchstaben case 'M':text = toupper(text); break; default : cout << "Fehler" << endl; return 0; } } cout << text << '\n'; // Ausgabe der eingabe in großbuchstaben char *ptext = text; // pointer auf text int ergebnis = romwert(ptext); // aufruf unterprogramm roem in dez cout << ergebnis << endl; // ausgabe der dezimalzahl return 0; } unsigned romwert( char *proem) // unterprogramm roem in dez { int wert,wertfeld[100]={0}; // deklarieren des wertfeldes int dezimal = 0, laenge = strlen(proem); for(int i=0; i != laenge;i++) // schleife durchlaufen, bis laenge erreicht { switch(proem) { case 'I': wert = 1; break; // zuordnung des dezimalen wertes case 'V': wert = 5; break; case 'X': wert = 10; break; case 'L': wert = 50; break; case 'C': wert = 100; break; case 'D': wert = 500; break; case 'M': wert = 1000; break; default : wert = 0; } wertfeld = wert; // wert wird in wertfeld geschrieben } for(int a=0; a != laenge ;a++) // aufaddieren der werte { if(wertfeld[a] < wertfeld[a+1]) dezimal = dezimal - wertfeld[a]; else dezimal = dezimal + wertfeld[a]; } return dezimal; // rueckgabe der summe } Allerdings ist diese Lösung nur für richtige Eingabe der Zahl anwendbar. Mein Problem sind nun die Aufgabenteile "checkin" und "checkout" . Folgende Regeln sind zu beachten: I: -> kommt max. als "III" vor - wenn 1mal: IV // IX - wenn 2mal: II ( als letzte Stelle in der Reihe ) - wenn 3mal: III ( - " -) V: -> kommt max. als "V" vor - wenn 1mal: IV // V // VI // VII // VIII X: -> kommt max. als "XXXIX" 4mal vor - wenn 1mal: vor einem größeren // kleineren - wenn 2mal: vor einem gleichen // kleineren - wenn 3mal: nach einem größeren // am Anfang der Reihe L: -> kommt max. als "L" vor - wenn 1mal: vor einem kleineren C: -> kommt max. als "CCCXC" 4mal vor - wenn 1mal: vor einem größeren ( D, M ) // kleineren // allein // XC - wenn 2mal: CC // CXC // CDXC - wenn 3mal: CCC // CCXC D: -> kommt max. als "D" vor - wenn 1mal: vor einem kleineren M: -> kommt max. als "MMMCM" 4mal vor - wenn 1mal: vor einem kleineren // allein // CM - wenn 2mal: MCM // MM // am Anfang einer Reihe - wenn 3mal: MMCM // MMM // am Anfang einer Reihe Hier mein erster Ansatz: /* * unterprogramm zum pruefen der roemischen zahl */ #include <iostream> #include <cctype> #include <cstring> #include <iomanip> using namespace std; char *strchr(char, int); // prototyp für suche char text[100]="MMIVIIXI"; // text, der eingegeben wurde ( annahme vorerst ) char *ptext = text; // zeiger auf text char *p = {0}; // zeiger p für suche int zaehl[7]={0}; // feld, in dem anzahl abgelegt wird int a,i,wert; int wertfeld[100]={0}; // feld, in dem dezimalwerte abgelegt werden int main() { for(i=0;ptext != '\0';i++) { switch(ptext) { case 'I': wert = 1; zaehl[0]++; break; // zuordnung des dezimalen wertes case 'V': wert = 5; zaehl[1]++; break; // und zaehlen case 'X': wert = 10; zaehl[2]++; break; case 'L': wert = 50; zaehl[3]++; break; case 'C': wert = 100; zaehl[4]++; break; case 'D': wert = 500; zaehl[5]++; break; case 'M': wert = 1000; zaehl[6]++; break; default : wert = 0; } wertfeld = wert; // wert wird in wertfeld geschrieben } cout << zaehl[0] << endl; // zur kontrolle, was programm macht if(zaehl[0]>3) p = strchr( ptext, 'I' ); // suchen nach 'I' cout << p << endl; // ausgabe aller zeichen, die nach 'I' kommen, inkl. cout << p[0] << endl; // ausgabe des ersten 'I' , was auftritt return 0; } Ich bin mir nicht sicher , ob dies der richtige Weg ist, sich durch die vielen Regeln zu arbeiten . Könnte mir vorstellen, dass sich jemand anderes schon über diese Regeln und ihr Prüfen gedanken gemacht hat. Noch besser wäre, wenn es ein Programm mit Ansatz gäbe. Mir läuft langsam die Zeit davon. Am Dienstag ist Abgabetermin und ich sitze schon ca. 10 Stunden drüber. Bin Neuling auf dem Gebiet C++ !!! Vielen Dank schon mal im Voraus! Ich werde in Abständen mein Vorankommen posten und hoffe auf Unterstützung ! Zitieren
Manfred.Becker Geschrieben 12. Dezember 2005 Geschrieben 12. Dezember 2005 Hi odd! zu Deinem Thema hab ich bereits ein Artikel verfasst. Schau dir das mal an. Vielleicht hilft es dir ja weiter: Ein Projekt zur Wandlung von römische Zahlen in Dezimalzahlen Ein Projekt zur Wandlung von Dezimalzahlen in römische Zahlen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.