Zum Inhalt springen

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


Ragdalfius

Empfohlene Beiträge

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

    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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...