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.

Umrechnungs Proggi von römischen Zahlen in arabische. Komische Reaktion.

Empfohlene Antworten

Veröffentlicht

Moin,

ich wieder. Diesmal aber nicht mit einer kompilierungs Fehlermeldung, sondern mein Proggi kann leider max. 4 römische Ziffern aufnehmen, wenn ich 5 oder mehr nehme, stürtzt das Prog einfach ab. Ich poste einfach mal den Sourcecode dazu.

Ach ja, ich bin c++ noob und dau *g* Verbesseungsvorschläge zum Code werden mit Freude aufgenommen :D

Kann mir jemand sagen wieso das so ist?

#include <iostream>

#include <stdlib.h>

#include <String>

using namespace std;

int main(int argc, char *argv[])

{

int i, ausgabe = 0, dummy; //Variablen werden definiert, dummy und dummy2 sind

string dummy2; //reine zwischenspeicher

cout << "Wie viele roemische Ziffern moechten sie eingeben?\n";

cout << "(Max. 4 keine Ahnung wieso)\n";

cin >> dummy; //Hier wird die größe des Arrays definiert

string eingabe[dummy]; //Array eingabe[] mit der Größe dummy

for(i = 0; i < dummy; i++) // Eine for-Schleife, die das Array füllt

{

cout << "Bitte geben sie eine roemische Ziffer ein!\n";

cin >> eingabe;

cout << "\n";

dummy2 = dummy2+eingabe;

}

for(i = 0; i < dummy; i++)

{

if(eingabe == "i" || eingabe == "I")

{

ausgabe += 1;

}

else if(eingabe == "v" || eingabe == "V")

{

if(eingabe == "v" && eingabe[i-1] == "i" || eingabe == "V" && eingabe[i-1] == "I")

{

ausgabe += 3;

}

else

{

ausgabe += 5;

}

}

else if(eingabe == "x" || eingabe == "X")

{

if(eingabe == "x" && eingabe[i-1] == "i" || eingabe == "X" && eingabe[i-1] == "I")

{

ausgabe += 8;

}

else

{

ausgabe += 10;

}

}

else if(eingabe == "l" || eingabe == "L")

{

if(eingabe == "l" && eingabe[i-1] == "x" || eingabe == "L" && eingabe[i-1] == "x")

{

ausgabe += 30;

}

else

{

ausgabe += 50;

}

}

else if(eingabe == "c" || eingabe == "C")

{

if(eingabe == "c" && eingabe[i-1] == "x" || eingabe == "C" && eingabe[i-1] == "X")

{

ausgabe += 80;

}

else

{

ausgabe += 100;

}

}

else if(eingabe == "d" || eingabe == "D")

{

if(eingabe == "d" && eingabe[i-1] == "c" || eingabe == "D" && eingabe[i-1] == "C")

{

ausgabe += 300;

}

else

{

ausgabe += 500;

}

}

else if(eingabe == "m" || eingabe == "M")

{

if(eingabe == "m" && eingabe[i-1] == "c" || eingabe == "M" && eingabe[i-1] == "C")

{

ausgabe += 800;

}

else

{

ausgabe += 1000;

}

}

}

cout << "Bei Jahreszahl " << dummy2 << " betraegt: " << ausgabe;

cout << "\n\n";

system("PAUSE");

return 0;

}

Ich kann dein Programm nicht kompilieren, weil VC++ 7.1 das hier

    string eingabe[dummy]; //Array eingabe[] mit der Größe dummy
[/CODE]

nicht schluckt. Ist IMHO auch kein gültiges C++, denn die Größe eines Arrays muss eine Compilezeitkonstante sein.

Tritt der Fehler auch auf, wenn du fünfmal i eingibst? Falls nicht, könnte es daran liegen: Du greifst in deinen Abfragen mehrfach auf eingabe[i-1] zu. Was ist, wenn i Null ist?

Nachtrag: Du hattest nach Verbesserungsvorschläge gefragt: Wenn es egal ist, ob du i++ oder ++i schreibst, gewöhne Dir ++i an.

    string eingabe[dummy]; //Array eingabe[] mit der Größe dummy

Ich wuerd auch sagen, dass es funktionieren sollte, wenn dummy ein const int ist.

Du kannst ja alternativ gleich mal ne Zahl fest reinschreiben zum testen.

Loesungsmoeglichkeiten waeren dann entweder ein festes relativ gross dimensioniertes eingabe-Array, oder vielleicht das ausweichen auf einen vector.

Zu Verbesserungsvorschlaegen:

Du brauchst noch eine Uebepruefung was die Reihenfolge der Ziffern angeht.

Bei "IIIVIII" wuerdest du wohl IV = 4 plus 5 mal I = 5 ist zusammen 9 ausgeben. Das gibts aber so nicht als roemische Zahl.

Goos

  • Autor

Zu Verbesserungsvorschlaegen:

Du brauchst noch eine Uebepruefung was die Reihenfolge der Ziffern angeht.

Bei "IIIVIII" wuerdest du wohl IV = 4 plus 5 mal I = 5 ist zusammen 9 ausgeben. Das gibts aber so nicht als roemische Zahl.

Goos

Ja, ist mir auch aufgefallen. Werde es jetzt also nochmal neu schreiben und einfach eine Benutzeingabe fordern, in der die komplette römische Zahl eingegeben wird und dann die länge des Strings auslesen.

Den source poste ich dann nochmal

  • Autor
Ich kann dein Programm nicht kompilieren, weil VC++ 7.1 das hier

    string eingabe[dummy]; //Array eingabe[] mit der Größe dummy

nicht schluckt. Ist IMHO auch kein gültiges C++, denn die Größe eines Arrays muss eine Compilezeitkonstante sein.

Tritt der Fehler auch auf, wenn du fünfmal i eingibst? Falls nicht, könnte es daran liegen: Du greifst in deinen Abfragen mehrfach auf eingabe[i-1] zu. Was ist, wenn i Null ist?

Nachtrag: Du hattest nach Verbesserungsvorschläge gefragt: Wenn es egal ist, ob du i++ oder ++i schreibst, gewöhne Dir ++i an.

ich kann fünfmal i eingeben, ohne probleme. gibt dann die Zahl 5 aus...

ich kann fünfmal i eingeben, ohne probleme. gibt dann die Zahl 5 aus...

*hust* ;)

5 mal i gibts aber doch auch gar nicht.

Jede Ziffer darf maximal 3 mal wiederholt werden, V, L ,D duerfen nur 1 mal vorkommen, M hingegen beliebig oft.

Naeheres ist Google zu entnehmen, ich kann naemlich nicht fuer die Fragmente die ich im Kopf habe garantieren :)

Goos

*hust* ;)

5 mal i gibts aber doch auch gar nicht.

Schon klar, dass das keine grammatisch korrekte römische Zahl es. Es ging mir nur darum, meine Hypothese zu prüfen, denn I ist der einzige Fall, bei dem nicht auf eingabe[i-1] zugegriffen wird.

@Ragdalf:

Was ist mit ivvvv? Geht das?

  • Autor

Ich habe jetzt mal die eingabe umgeschrieben und jetzt kann ich wieder alles mögliche an Zahlen eintippen...

Der anfang sieht jetzt so aus:

int i, ausgabe = 0, laenge;

string rZahl;

cout << "Welche roemische Zahl wollen sie konvertieren?\n";

cin >> rZahl;

laenge = rZahl.length();

string eingabe[laenge];

for(i = 0; i < laenge; ++i)

{

eingabe = rZahl.substr(i,1);

}

Ich habe nur noch keinen Plan, wie ich die korrekte syntax der römischen Zahl prüfe. Ich könnte jedes einzelne char in ASCII umwandeln und dann prüfen, aber auf was? ob der Nachfolger kleiner ist? Geht nicht weil es z.B. ja IV und VI gibt... Da bin ich also auch nicht weiter.

Wir sind auch erst vor 3 Wochen mit c++ angefangen, habe aber etwas Java Erfahrung.

  • Autor
Schon klar, dass das keine grammatisch korrekte römische Zahl es. Es ging mir nur darum, meine Hypothese zu prüfen, denn I ist der einzige Fall, bei dem nicht auf eingabe[i-1] zugegriffen wird.

@Ragdalf:

Was ist mit ivvvv? Geht das?

solange ein i am anfang steht, kann ich beliebig viele Zeichen eingeben...

  • Autor
Na dann nimm dir doch meinen Rat mal zu Herzen: Wenn i Null ist, solltest du nicht auf eingabe[i-1] zugreifen. ;)

Mit dem "neuen" Anfang geht das. Die For-Schleife zur Überprüfung ist gleich geblieben, nur habe ich jetzt ++i geschrieben.

Ich habe nur noch keinen Plan, wie ich die korrekte syntax der römischen Zahl prüfe. Ich könnte jedes einzelne char in ASCII umwandeln und dann prüfen, aber auf was? ob der Nachfolger kleiner ist? Geht nicht weil es z.B. ja IV und VI gibt... Da bin ich also auch nicht weiter.

Hier vielleicht als kleine Hilfe erstmal eine Seite auf der die syntaktischen Regeln recht schoen erklaert sind.

http://www.diaware.de/html/roemzahl.html?dec=2004&roe=&roe1=&bem=#links

Du kannst uebrigens schon pruefen, ob der Nachfolger kleiner ist.

Ist er kleiner, so kannst die aktuelle Ziffer zur Gesamtsumme addieren, im anderen Fall musst du die aktuelle Ziffer subtrahieren.

Goos

  • Autor

Danke für die Links.

Ich denke aber, dass ich es so lassen werde. Unser Lehrer meinte nur, wer es bis Dienstag hinbekommt, bekommt ne 1 und da ich mit 95% Sicherheit der Einzige sein werde, ist sie mir so gut wie sicher *g*

Wenn ich noch etwas langeweile habe stricke ich es noch um. Ich habe aber noch ein sehr schönes kurzes Proggi gefunden,das ich euch nicht vorenthalten wollte, in einem anderen Forum.

#include <iostream>

#include <string>

using namespace std;

int main(int argc, char* argv[])

{

int I=1, V=5, X=10, L=50, C=100, D=500, M=1000, ergebnis;

char zeichen[14];

int laenge;

cout << "\n\n Roemische Zahlen ==> Dezimalzahlen"

<< "\n Geben Sie eine roemische Zahl mit Hilfe der Symbole I, V, X, L, C, D, M ein"

<< "\n ==> ";

cin >> zeichen;

laenge=strlen(zeichen);

for(int i=0; i<laenge; i++)

{

switch(zeichen)

{

case 'I': if(zeichen[i+1]=='V') ergebnis-=I; else ergebnis+=I; break;

case 'V': ergebnis+=V; break;

case 'X': if(zeichen[i+1]=='L' || zeichen[i+1]=='C') ergebnis-=X; else ergebnis+=X; break;

case 'L': ergebnis+=L; break;

case 'C': if(zeichen[i+1]=='D' || zeichen[i+1]=='M') ergebnis-=C; else ergebnis+=C; break;

case 'D': ergebnis+=D; break;

case 'M': ergebnis+=M; break;

}

}

cout << ergebnis;

system("PAUSE");

return 0;

}

Irgendwie viel übersichtlicher *g*

Hallo,

Irgendwie viel übersichtlicher *g*

Nur leider stimmen die Ergebnisse nicht, da "ergebnis" nicht initialisiert wird. Man sollte nicht davon ausgehen, dass Variablen per Default mit 0 initialisiert werden!

Nic

  • Autor
Hallo,

Nur leider stimmen die Ergebnisse nicht, da "ergebnis" nicht initialisiert wird. Man sollte nicht davon ausgehen, dass Variablen per Default mit 0 initialisiert werden!

Nic

Hmm, gestern gings noch... habe ich ausversehen was verändert?

[EDIT] Habe ich nicht, habs nochmal kopiert und geht immer noch nicht... komisch habe ich gestern gar nicht bemerkt... *slap*[/EDIT]

Aber was ich gesehen habe, er hat die Kombination 'IX' vergessen...

Hmm, gestern gings noch... habe ich ausversehen was verändert?

So hat er das auch nicht gemeint :)

Es kann schon funktionieren und richtig rechnen (wird wahrscheinlich auch meistens so sein), aber es kann nicht als sicher angesehen werden, dass das Ergebnis richtig ist, wenn du es nicht zuvor initialisiert hast.

Goos

  • 2 Wochen später...

Servus 8)

habe da ein Problemchen, sicher nur eine kleinigkeit aber bin schon ziemlich am verzeifeln. :confused:

ich suche ein Prog. womit man text(z.B name,adresse mit plz usw...) in eine zahlencode umwandeln kann. brache den zahlencode für einen barcode generator. oder kennt einer von euch ein barcode generator(freeware) der auch text in zahlen generiert?

cu

----------------------------------------------------------------------------

Durch den Euro ist nichts teurer geworden? Und wieso nimmt der Kaugummiautomat dann nur noch Scheine?

Ich wuerd auch sagen, dass es funktionieren sollte, wenn dummy ein const int ist.

Selbst das muss nicht funktionieren.

Bei einem #define dummy wäre es sichergestellt, dass es jeder Compiler frisst.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

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.