Zum Inhalt springen

Prog: Roemische -> dezimale Zahl , mit Prüfung der richtigen Reihenfolge


Empfohlene Beiträge

Geschrieben

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 !

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...