Ragdalfius Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 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 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; } Zitieren
Klotzkopp Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 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. Zitieren
Goos Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 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 Zitieren
Ragdalfius Geschrieben 19. Mai 2004 Autor Geschrieben 19. Mai 2004 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 Zitieren
Ragdalfius Geschrieben 19. Mai 2004 Autor Geschrieben 19. Mai 2004 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... Zitieren
Goos Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 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 Zitieren
Klotzkopp Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 *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? Zitieren
Ragdalfius Geschrieben 19. Mai 2004 Autor Geschrieben 19. Mai 2004 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. Zitieren
Ragdalfius Geschrieben 19. Mai 2004 Autor Geschrieben 19. Mai 2004 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... Zitieren
Klotzkopp Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 solange ein i am anfang steht, kann ich beliebig viele Zeichen eingeben...Na dann nimm dir doch meinen Rat mal zu Herzen: Wenn i Null ist, solltest du nicht auf eingabe[i-1] zugreifen. Zitieren
Ragdalfius Geschrieben 19. Mai 2004 Autor Geschrieben 19. Mai 2004 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. Zitieren
Goos Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 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 Zitieren
Guybrush Threepwood Geschrieben 19. Mai 2004 Geschrieben 19. Mai 2004 Guck dir auch mal folgedne Links an: http://www.fun-soft.de/showtopic.php?threadid=4293 http://www.fun-soft.de/showtopic.php?threadid=4299 Zitieren
Ragdalfius Geschrieben 21. Mai 2004 Autor Geschrieben 21. Mai 2004 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* Zitieren
nic_power Geschrieben 21. Mai 2004 Geschrieben 21. Mai 2004 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 Zitieren
Goos Geschrieben 21. Mai 2004 Geschrieben 21. Mai 2004 Irgendwie viel übersichtlicher *g* Ueberprueft aber auch laengst nicht alle notwendigen Regeln Goos Zitieren
Ragdalfius Geschrieben 21. Mai 2004 Autor Geschrieben 21. Mai 2004 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... Zitieren
Goos Geschrieben 21. Mai 2004 Geschrieben 21. Mai 2004 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 Zitieren
Imago Geschrieben 2. Juni 2004 Geschrieben 2. Juni 2004 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? Zitieren
Timon Geschrieben 3. Juni 2004 Geschrieben 3. Juni 2004 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. Zitieren
nic_power Geschrieben 3. Juni 2004 Geschrieben 3. Juni 2004 Hallo, Selbst das muss nicht funktionieren. Doch, das ist so im Standard definiert. Konstrukte der Art: const int size=5; int array; Müssen vom Compiler korrekt übersetzt werden. Näheres hier: http://forum.fachinformatiker.de/showthread.php?t=34906&highlight=stack Nic 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.