seto Geschrieben 30. November 2007 Geschrieben 30. November 2007 Ich hab hier was programmiert und der funktioniert nicht... ich würde gerne mal wissen wo der Fehler liegt..... bitte makiere was ich in dieser Programm geschrieben auf text DICK und in () rein was richtig wären würde.... #include <string> #include <iostream> using namespace std void zahlen(short z, string zt); int main() { string zahlentext; short zahl; while(l) cout << "Zahl = ? "; cin >> zahl; zahlen(zahl, zahlentext); cout << zahl << " = " << zahlentext << endl; return 0; } void zahlen(short z, string zt) { string einer[8] = {"ein", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"}; string zehner [1] = {"zwanzig", "dreissig"}; if(z = 20) zt = zehner[O]; else if(z=30) zt = zehner[1]; else if(z>=12 && z<=39) zt = einer[(z%10)-1] + "und" + zehner[z/10-2]; else if(z<20 && z>39) zt = 'unbekannt'; return zt; }[/PHP] Ich weiß nicht wo ich die "Endlos"-schleife einsetzen sollen. Im Programm musste normale Weise so Ausehen wenn der gestartet hat: [font=Lucida Console][b] Zahl = ? 10 10 = unbekannt Zahl = ? 20 20 = zwanzig Zahl = ? 24 24 = vierundzwanzig Zahl = ? 29 29 = neunundzwanzig Zahl = ? 30 30 = dreissig Zahl = ? 37 37 = siebenunddreissig Zahl = ? 40 40 = unbekannt Zahl = ?[/b][/font] Zitieren
Amstelchen Geschrieben 30. November 2007 Geschrieben 30. November 2007 du musst nach while(1) und vor return(0) geschweifte klammern setzen, wenn ich mich nicht völlig irre. s'Amstel Zitieren
seto Geschrieben 2. Dezember 2007 Autor Geschrieben 2. Dezember 2007 komisch.......es funktioniert immer noch nicht :-( Zitieren
seto Geschrieben 2. Dezember 2007 Autor Geschrieben 2. Dezember 2007 #include <string> #include <iostream> using namespace std ; void zahlen(short z, string zt) { string einer[12] = {"ein", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"}; string zehner [1] = {"zwanzig", "dreissig"}; if(z = 20) { zt = zehner[0]; } else if(z=30) { zt = zehner[1]; } else if(z>=12 && z<=39) { zt = einer[(z%10)-1] + "und" + zehner[z/10-2]; } else if(z<20 && z>39) { zt = 'unbekannt'; } return zt; } int main(void) { string zahlentext; short zahl; while(l) { cout << "Zahl = ? "; cin >> zahl; zahlen(zahl, zahlentext); cout << zahl << " = " << zahlentext<<"\n"; return ; } [/PHP] So ich hab ein bisschen Ordnung gemacht......aber trotzdem funktioniert es nicht....komisch Zitieren
Pointerman Geschrieben 2. Dezember 2007 Geschrieben 2. Dezember 2007 Moin! Mhh, Amstelchen hatte recht mit den Geschweiften Klammern in der main(). Du hast zwar die Klammer nach while(1) geöffnet, aber nicht wieder geschlossen (vor return). Außerdem sollte das return in der main() vielleicht auch etwas zurück geben. Vielleicht solltest Du a) Dich mal mit dem Aufbau von funktionen und Schleifen vertraut machen. Genau schreiben, was nicht funktioniert. Deinem zweiten Code-Posting nach solltest Du ja durchaus Compilerfehler bekommen haben. Zitieren
BlackDragon83m Geschrieben 2. Dezember 2007 Geschrieben 2. Dezember 2007 Ich würd mal sagen du musst bei den ersten beiden IF-Abfragen == nehmen denn mit = weisst du nur die Werte zu. Also if(z == 20) und if(z == 30) Also sollte der Code so aussehen: #include <string> #include <iostream> using namespace std ; void zahlen(short z, string zt) { string einer[12] = {"ein", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"}; string zehner [1] = {"zwanzig", "dreissig"}; if(z == 20) { zt = zehner[0]; } else if(z == 30) { zt = zehner[1]; } else if(z>=12 && z<=39) { zt = einer[(z%10)-1] + "und" + zehner[z/10-2]; } else if(z<20 && z>39) { zt = 'unbekannt'; } return zt; } int main(void) { string zahlentext; short zahl; while(l) { cout << "Zahl = ? "; cin >> zahl; zahlen(zahl, zahlentext); cout << zahl << " = " << zahlentext<<"\n"; return ; } [/PHP] Ist aber ungetestet Zitieren
seto Geschrieben 2. Dezember 2007 Autor Geschrieben 2. Dezember 2007 Ist es auch sinnvoll den Debugger zu benutzen um den Zustand des Programms zur Laufzeit zu kontrollieren?? ich würde gern dieses C++ Programm in eine Endlosschleife ganze Zahlen Zwischen 20 und 39 von der Tastatur einlesen und in Worten auf dem Bildschirm ausgeben sollen....... und außerdem hab ich mein Programm in der Funktion gesuchte Wort aus den Einer- und Zehnerstellen der Zahlen generiert. Die Funktion hab ich auch keinen Rückgabewert........ aber irgendwie geht es nicht....... Zitieren
Amstelchen Geschrieben 2. Dezember 2007 Geschrieben 2. Dezember 2007 wie es auch pointerman teilweise bereits auf den punkt gebracht hat, rollst du dein problem meiner meinung nach von der völlig falschen seite auf bzw. verwendest du den falschen ansatz an die aufgabenstellung. - ein punkt, der es dir jetzt und auch zukünftig leichter machen wird: verwende eine sinnvolle einrückung. - versuche eine aussagekräftige aussage zu finden anstelle von "geht nicht" und "funktioniert nicht". - die funktion zahlen als void zu definieren und dann mittels return zt zu enden, kann nichts zurückliefern - stichwort call-by-value und call-by-reference. s'Amstel Zitieren
qat Geschrieben 3. Dezember 2007 Geschrieben 3. Dezember 2007 Ich hab es mal überarbeitet und hoffe du kannst mit dem (bei mir) funktionierenden Quellcode was anfangen..., und versuche dir noch ein paar Tipps zu geben (les dir bitte die Kommentare durch ). Warum du eine Endlosschleife haben möchtest ist mir nicht ganz klar, aber bitte. Hab noch eine kleine Fehlerabfrage eingebaut, falls du ausversehen keine Zahlen eintippst. Besser: Von Anfang an einen String einlesen (evt. auf "exit" prüfen), und dann auf eine Zahl casten. Achja und deine if/else if - Konstruktion ist ein wenig unübersichtlich, ich benutze da lieber switch, aber das ist Ansichtssache. Zumal dieses Programm ja möglicherweise noch ausgebaut wird, oder? Der Rest wurde schon von meinen Vorrednern angesprochen. #include <string> #include <iostream> using namespace std; //zt wird hier zum Zeiger auf einen String, //sodass man zahlentext dann verändern kann. void zahlen(short z, string* zt) { //hier hattest du erst einer[8], dann einer[12].. //8 war zu wenig, 12 zuviel. //du möchtest 9 Einträge also benutz auch die 9, //indexiert wird dann aber von 0 bis 8! string einer[9] = { "ein", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"}; //hier genau das gleiche, 2 Einträge //.. indexiert von 0 bis 1. string zehner[2] = {"zwanzig", "dreissig"}; if(z == 20) { *zt = zehner[0]; } else if(z == 30) { *zt = zehner[1]; } //hier hattest du einen Zahlendreher (12 statt 21) else if(z>=21 && z<=39) { *zt = einer[(z%10)-1] + "und" + zehner[z/10-2]; } else if(z<20 || z>39) { *zt = "unbekannt"; } return; } int _tmain(void) { //in der while-bedingung stand ein kleines L anstatt einer 1, //sollte das Absicht sein??? while(1) { //Variablen immer initialisieren wenn möglich. string zahlentext = ""; short zahl=0; cout << "Zahl = ? "; cin >> zahl; if(cin.fail()){ //Bei Fehleingabe clearen und puffer leeren cout << "Fehleingabe\n"; cin.clear(); string st=""; cin >> st; continue; } //Hier wird eine Referenz auf die Variable zahlentext übergeben! zahlen(zahl, &zahlentext); cout << zahl << " = " << zahlentext<<"\n"; } return (0); } [/PHP] Zitieren
seto Geschrieben 3. Dezember 2007 Autor Geschrieben 3. Dezember 2007 Ich hab meine Fehler gefunden und hab es alles korregiert und läuft jetzt einwandfrei: #include <string> #include <iostream> using namespace std; void zahlen(short z, string zt); int main(void) { string zahlentext; short zahl; while(1) { cout << "Zahl = ? "; cin >> zahl; zahlen(zahl, zahlentext); } return 0; } void zahlen(short z, string zt) { string einer[9] = {"ein","zwei","drei","vier","fuenf","sechs","sieben","acht","neun"}; string zehner [2] = {"zwanzig","dreissig"}; if(z == 20) { zt = zehner[0]; } else if(z == 30) { zt = zehner[1]; } else if(z>=20 && z<=39) { zt = einer[(z%10)-1] + "und" + zehner[z/10-2]; } else if(z<20 || z>39) { zt = "unbekannt"; } cout << z << " = " << zt << endl; return ; } [/PHP] Zitieren
madjakk Geschrieben 3. Dezember 2007 Geschrieben 3. Dezember 2007 du studierst nicht zufällig in aachen seto? das kommt mir alles bis ins kleinste detail vertraut vor =P naja... will dir mal helfen weil ich eigentlich nicht glaube dass es so laufen kann wie du es da auch im letzten post stehen hast. und dazu als tip: lerne unbedingt mit call by reference, pointern und addressplätzen umzugehen sonst bist du da verloren. meine überarbeitung sieht so aus (alle zahlen von 20-39 getestet und ca 10 zufällige zahlen außerhalb des bereichs getestet): #include <iostream> #include <string> using namespace std; void zahlen(short z, string* zt); int main() { string zahlentext; short zahl; while(true) { cout << "Zahl = ? "; cin >> zahl; zahlen(zahl, &zahlentext); cout << zahl << " = " << zahlentext << endl; } return 0; } void zahlen(short z, string* zt) { string einer[9] = {"ein", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"}; string zehner[2] = {"zwanzig","dreissig"}; if(z == 20) { *zt = zehner[0]; } else if(z == 30) { *zt = zehner[1]; } else if(z>20 && z<=39) { *zt = einer[(z%10)-1] + "und" + zehner[(z/10)-2]; } else if(z<20 || z>39) { *zt = "unbekannt"; } } sollte die einfachste art sein denke ich... man kann natürlich die funktion im kopf machen aber aus irgendeinem grund mag das unser prof nicht (welcher mir extrem schleierhaft ist da ich nicht wirklich eine sinnvolle optimierung darin erkennen kann). Zitieren
Klotzkopp Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 seto, wenn deine zahlen-Funktion den String sowieso nicht zurückgibt, sondern selbst ausgibt, brauchst du keinen string-Parameter. Dann tut es eine lokale Variable auch. Ich würde den String einfach in den Rückgabewert stecken. Aber wenn man schon einen Parameter draus macht, dann doch bitte als Referenz, nicht als Zeiger. Bei einem Zeiger besteht immer die Gefahr, dass man die Funktion mit NULL aufruft. Bei einer Referenz geht das nicht (so einfach). Die Stringverarbeitung kann man auch noch etwas vereinfachen: #include <iostream> #include <string> using namespace std; string zahlen(short z); int main() { short zahl; while(true) { cout << "Zahl = ? "; cin >> zahl; string zahlentext = zahlen(zahl); cout << zahl << " = " << zahlentext << endl; } return 0; } string zahlen(short z) { if(z<20 || z>39) { return "unbekannt"; } string einer[10] = {"", "einund", "zweiund", "dreiund", "vierund", "fuenfund", "sechsund", "siebenund", "achtund", "neunund"}; string zehner[2] = {"zwanzig","dreissig"}; return einer[z%10] + zehner[z/10-2]; }[/code] Zitieren
qat Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 Aber wenn man schon einen Parameter draus macht, dann doch bitte als Referenz, nicht als Zeiger. Bei einem Zeiger besteht immer die Gefahr, dass man die Funktion mit NULL aufruft. Bei einer Referenz geht das nicht (so einfach). Das ist natürlich schon richtig, Referenzen kann man auch nicht mehr einfach unabsichtlich verbiegen. Aber ich arbeite 'privat' lieber mit Zeigern, da ich dann sofort beim rübergucken des Aufrufs im Quellcode erkenne was in der Funktion verändert wird. Kann man sich sicherlich drüber streiten, aber ist ebend so. ;-) Und NULL kann man auch abfangen. @madjakk Deine Überarbeitung ist im Prinzip genau wie meine, nur dass ich noch Falscheingaben abgefangen hab. Sehe also den Sinn da gerade nicht warum du das nochmal posten musstest. -.- Aber würde mich doch auch mal interessieren in welchem Semester bekommt ihr diese Aufgabe? (bzw: Studienfach?) ^^ Zitieren
madjakk Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 jo prinzipiell dasselbe aber die aufgabe war ein quasi halbfertiges exemplar zu vervollständigen und zu berichtigen. wir sollen die funktion unten dranhängen und als void definieren. hab mein beispiel im prinzip nur gemäß der aufgabenstellung gemacht. das is etechnik 1.semester im fach grundlagen höhere programmiersprachen. dennoch danke ich euch auch für die hilfe bei diesem beispiel. hatte auch erst meine schwierigkeiten. mfg mad Zitieren
seto Geschrieben 6. Dezember 2007 Autor Geschrieben 6. Dezember 2007 du studierst nicht zufällig in aachen seto? das kommt mir alles bis ins kleinste detail vertraut vor =P naja... will dir mal helfen weil ich eigentlich nicht glaube dass es so laufen kann wie du es da auch im letzten post stehen hast. und dazu als tip: lerne unbedingt mit call by reference, pointern und addressplätzen umzugehen sonst bist du da verloren. sollte die einfachste art sein denke ich... man kann natürlich die funktion im kopf machen aber aus irgendeinem grund mag das unser prof nicht (welcher mir extrem schleierhaft ist da ich nicht wirklich eine sinnvolle optimierung darin erkennen kann). Du hast mich durchschaut :uli Du hast recht, da musst ich mehr über die Sache mit Call by reference und Call by Value nachlesen, aber gut das das gesagt hast. Die Augaben lautet das wir NUR die Fehler rausfinden sollen und den Struktur des Programm nicht verändern sollen.....ich mag mein Prof. nicht weil der ..... du weiß schon falls du in meine Gruppe bis...... Zitieren
qat Geschrieben 6. Dezember 2007 Geschrieben 6. Dezember 2007 Man hatte sowas ja schon vermutet nach deinem ersten Post... 1. Mit Lügen kommst du hier nicht weit, das merkt man sich auch. 2. Mit deiner Fragestellung kamen Antworten/Problemlösungen die dir nicht viel weiterhalfen bzw. einfach zu weit gingen, und Helfern dementsprechend unnötig arbeit machten! 3. Mit deinem Post von #10 hast du die Aufgabe nicht korrekt gelöst. Zitieren
Don Felice Geschrieben 16. Dezember 2007 Geschrieben 16. Dezember 2007 Ich finde das Lustig wir haben genau das gleiche als Hausaufgabe in der Schule auf (Passau) 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.