Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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 !

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.