Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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]

Geschrieben

#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 :(

Geschrieben

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.

B) Genau schreiben, was nicht funktioniert. Deinem zweiten Code-Posting nach solltest Du ja durchaus Compilerfehler bekommen haben.

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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]

Geschrieben

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]

Geschrieben

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

Geschrieben

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]

Geschrieben
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?) ^^

Geschrieben

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

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

Geschrieben

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.

  • 2 Wochen später...

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