huhu, hab mir mal nen kleines progg zusammengebastelt, aber irgendwie funzt das alles net... dann könnt ihr mir auch gleich mal erklären, wie diese return funktion hier eingebaut wird. ich möchte nämlich, wenn bei der abfrage N eingegeben wird, das das programm von vorn anfängt.
Code:
#include <iostream.h>
int a = 0;
int b = 0;
char c = 0;
void main(void)
{
cout << "Ein kleines Zahlenvergleichsprogramm." << endl;
cout << " " << endl;
cout << "Bitte geben sie jetzt die erste Zahl an: " << endl;
cin >> a;
cout << "Bitte geben sie jetzt die zweite Zahl an: " << endl;
cin >> b;
cout << "Die erste Zahl lautet: " << a << endl;
cout << "Die zweite Zahl lautet: " << b << endl;
cout << "Sind diese Eingaben korrekt?" << endl;
cout << "Geben sie 'J' für Ja ein und 'N' fuer Nein." <<endl;
cin >> c;
if (c==J)
{
if (a>b)
{
cout << a;
cout << " ist groesser als ";
cout << b;
}
else
{
cout << a;
cout << " ist kleiner als ";
cout << b;
if (a==b)
{
cout << a;
cout << ist genau so gross wie ";
cout << b;
}
}
else
{
cout << "Ein kleines Zahlenvergleichsprogramm." << endl;
cout << " " << endl;
cout << "Bitte geben sie jetzt die erste Zahl an: " << endl;
cin >> a;
cout << "Bitte geben sie jetzt die zweite Zahl an: "; << endl;
cin >> b;
cout << "Die erste Zahl lautet: " << a << endl;
cout << "Die zweite Zahl lautet: " << b << endl;
cout << "Sind diese Eingaben korrekt?" << endl;
cout << "Geben sie 'J' für Ja ein und 'N' fuer Nein." <<endl;
cin >> c;
if (c==J)
{
if (a>b)
{
cout << a;
cout << " ist groesser als ";
cout << b;
}
else
{
cout << a;
cout << " ist kleiner als ";
cout << b;
if (a==b)
{
cout << a;
cout << ist genau so gross wie ";
cout << b;
}
}
}
}
}
}
Erstmal: ich lerne auch gerade C++ und bin warscheinlich noch noobiger als du, also bitte net böse sein wenn was net stimmt. Okay ich hab das jetzt mal nach eigenem ermessen abgeändert und dann sieht das so aus.
Code:
#include <iostream>
using namespace std;
int main() {
int a;
int b;
cout << "\nEin kleines Zahlenvergleichsprogramm";
cout << "\n\nBitte geben sie jetzt die erste Zahl an: ";
cin >> a;
cout << "\nBitte geben sie jetzt die zweite Zahl an: ";
cin >> b;
cout << "\nDie erste Zahl lautet:" << " " << a;
cout << "\nDie zweite Zahl lautet:" << " " << b;
cout << "\nSind diese Eingaben korrekt?";
cout << "\nGeben sie 'J' fuer Ja ein und 'N' fuer Nein."; // muss jemand anderes lösen
cout << "\n\n";
if (a>b) {
cout << " " << a << " ist groesser als" << " " << b;
}
if (a<b) {
cout << " " << a << " ist kleiner als" << " " << b;
}
if (a=b) {
cout << " " << a << " ist genau so gross wie" << " " << b;
}
return 0;
}
So bekomm ichs zumindest kompiliert. Das mit dem "Ja/Nein" muss mal jemand anderes lösen.
Ok, ich versuch erstmal die Fehler im Code anzumerken:
Code:
#include <iostream.h> // besser: #include <iostream>
// hier fehlt eigentlich ein using namespace std;
int a = 0;
int b = 0;
char c = 0; // ist ein character, besser mit 'N' initialisieren
// warum machst hier ne globale initialisierung? Die Variablen lieber mit in die main packen
void main(void) // besser: int main (void)
{
cout << "Ein kleines Zahlenvergleichsprogramm." << endl;
cout << " " << endl;
cout << "Bitte geben sie jetzt die erste Zahl an: " << endl;
cin >> a;
cout << "Bitte geben sie jetzt die zweite Zahl an: " << endl;
cin >> b;
cout << "Die erste Zahl lautet: " << a << endl;
cout << "Die zweite Zahl lautet: " << b << endl;
cout << "Sind diese Eingaben korrekt?" << endl;
cout << "Geben sie 'J' für Ja ein und 'N' fuer Nein." <<endl;
cin >> c;
if (c==J) // Charaktervergleich!! J wird hier als undeklarierte Variable gesehen (da meckert der compiler), richtig waere: if (c=='J')
{
if (a>b) // hier ist a>b => korrekt
{
cout << a;
cout << " ist groesser als ";
cout << b;
}
else // hier ist a<b ODER a=b
{
cout << a; // erstmal a < b ausgeben???? hoeh???
cout << " ist kleiner als ";
cout << b;
if (a==b) // und danach testen, ob nicht doch a=b??
{
cout << a;
cout << ist genau so gross wie "; // hier fehlen die Anfuehrungszeichen "
cout << b;
} // if(a=b) ende
} // else ende
// hier fehlt das if (c==J) ende }
else
{
cout << "Ein kleines Zahlenvergleichsprogramm." << endl;
cout << " " << endl;
cout << "Bitte geben sie jetzt die erste Zahl an: " << endl;
cin >> a;
cout << "Bitte geben sie jetzt die zweite Zahl an: "; << endl; // erst ein ; und dann noch << endl; ?
cin >> b;
cout << "Die erste Zahl lautet: " << a << endl;
cout << "Die zweite Zahl lautet: " << b << endl;
cout << "Sind diese Eingaben korrekt?" << endl;
cout << "Geben sie 'J' für Ja ein und 'N' fuer Nein." <<endl;
cin >> c;
if (c==J) // hier muss J wieder ein character sein: 'J'
{
if (a>b) // hier ist a > b
{
cout << a;
cout << " ist groesser als ";
cout << b;
}
else // hier ist a < b oder a = b
{
cout << a; // erstmal ausgeben, das a < b ?????
cout << " ist kleiner als ";
cout << b;
if (a==b) // und dann nochmal testen, ob a = b?????
{
cout << a;
cout << ist genau so gross wie "; // Anfuehrugsstriche net immer vergesen!
cout << b;
}
}
}
} // hier ist irgendeine der klammern zuviel (die vom if oben?)
}
/// hier sollte stehen: return 0;
}
Das Problem an dem Code ist auch, das das Programm nach der 2. falschen Eingabe nochmal nachfragt, ob die Eingaben nun richtig sind oder nicht, und bei N einfach abbricht.
Hier solltest besser mit ner Schleife arbeiten, am besten ne do{ }while(); schleife.
also etwa so:
Code:
int main()
{
variablen initialisieren;
do{
nach Zahlen fragen;
nach Korrektheit fragen;
}while(nicht korrekt);
Ergebnis ausgeben;
return 0;
}
oder als Code:
Code:
#include <iostream>
using namespace std;
int main(void)
{
int a = 0; //erste zahl
int b = 0; //zweite zahl
char c = 'N'; //Abfrageergebnis
/////////////////////// EINGABE der Daten
do{
cout << "Ein kleines Zahlenvergleichsprogramm." << endl;
cout << " " << endl;
cout << "Bitte geben sie jetzt die erste Zahl an: " << endl;
cin >> a; // eingabe der ersten Zahl
cout << "Bitte geben sie jetzt die zweite Zahl an: " << endl;
cin >> b; // eingabe der zweiten Zahl
cout << "Die erste Zahl lautet: " << a << endl;
cout << "Die zweite Zahl lautet: " << b << endl;
cout << "Sind diese Eingaben korrekt?" << endl;
cout << "Geben sie 'J' für Ja ein und 'N' fuer Nein." <<endl;
cin >> c; // abfrage auf korrektheit
}while ( c == 'N'); // solange Daten nicht korrekt, erneut fragen
//////Jetzt ist sicher, das die Zahlen stimmen - AUSGABE
if (a > b) // teste auf a > b
{
cout << a << " ist groesser als " << b;
}
else if (a < b) // teste auf a < b
{
cout << a << " ist kleiner als " << b;
}
else // es muss a = b sein
{
cout << a << " ist genau so gross wie " << b;
}
cout << " " << endl; // damits am ende schoen aussieht
return 0;
}
Ein paar kleine Tips noch: Gewoehn Dir an, Kommentare in den Text zu schreiben. also z.B. welche Klammer welches if oder else beendet. Das hilft ungemein bei der Fehlersuche.
Dann: Versuch, auf die Fehlermeldungen des Compilers zu reagieren. also wenn er sich beschwert, das 'ist' keine Variable ist und noch Zeile 35 dazu angibt ("c.cpp:35: error: `ist' undeclared (first use this function)") , solltest dir die Zeile 35 und eventuell die drueber nochmal genauer angucken. Genauso die Sache mit dem J. J an sich wird als Variable gesehen, wogegen 'J' ein Character ist und "J" ein String. (zumindest in C )
Dann nochwas: Hast Du nen Editor mit Syntax-Highlighting und automatischer Einrueckung? Das hilft auch ungemein.
Bei C++ kann man sich das .h sparen, bei C war es noch nötig.
Zu den anderen - kurz gesagt, beides gehört zum sauberen programmieren und sorgen dafür, dass praktisch jeder Compiler das schluckt.
Ich habe ja die main nicht als void deklariert, sondern als int main() das heisst, das main eine funktion mit Rueckgabedatentyp int ist, und nicht wie bei Dir, void (=nix). Und das return 0; am Ende als allerletzte Anweisung, teilt dem Betriebssystem mit, das das Programm ohne Fehler durchgelaufen und fertig ist. 0 ist dann der Rueckgabewert (muss, wie oben deklariert, vom Datentyp int sein, was er auch ist.)
Andere Rueckgabewerte kannst du selbst an beliebiger Stelle setzen, und zwar, wenn ein Fehler aufgetreten ist und Du das Programm sofort beenden moechtest. z.B. in Deinem Programm, wenn einer statt J oder N irgendwas anderes eingbt.
Code:
int main()
{
variablen initialisieren;
do{
nach Zahlen fragen;
nach Korrektheit fragen;
if (nicht J oder N eingegeben)
{
Ausgabe: Falscher Buchstabe eingegeben!
return 1; ///// Programm abwuergen bei falscher Eingabe.
}
}while(N eingegeben);
Ergebnis ausgeben;
return 0;
}
Ne allgemeine Regel ist, je Groesser der Rueckgabewert, um so schlimmer der Fehler. Das solltest natuerlich auch irgendwo dokumentieren, welcher Rueckgabewert welchem Fehler entspricht.
das heisst, wenn ich jetzt oben int main (z) deklariere, dann kann ich weiter unten irgendwo return z; eingeben und dann bricht das programm an der stelle ab? oder fängt das dann von vorne an?
noe, das was in den klammern steht, ist das, was vom betriebssystem (resp. vom Benutzer) an die Funktion beim starten uebergeben wird. das was der Funktion uebergeben wird, hat absolut nichts mit dem zu tun, was die Funktion selbst zurueckgibt. Bei return wird die Funktion einfach beendet.
Genauso kannst Du Dir deine eigenen Funktionen selber basteln, da wirds vielleicht klarer, was es mit diesen Rueckgabewerten so auf sich hat. Mal n einfaches Beispiel zu rueckgabewerten:
Code:
int main(void)
{
int a;
int b;
int c;
int ergebnis1;
int ergebnis2;
nach werten fuer a,b,c fragen;
ergebnis1=summenberechnung(a,b); // hier wird die Summe aus a und b gerechnet
ergebnis2=summenberechnung(a,c); // hier wird die Summe aus b und c berechnet
ergebnis1 und ergebnis2 ausgeben;
return 0;
}
int summenberechnung(int summand1, int summand2)
{
int summe;
summe=summand1+summand2;
return summe;
}
Der Wert der funktion summenberechnung am ende ist jeweils summe.
Dabei wird aber nur die Funktion beendet, in der das return auftaucht, nicht das ganze Programm. Nur, wenn return in main auftaucht beendet das ganze Programm.
meine summenberechnung-funktion nimmt 2 werte vom datentyp int an (int summand1, int summand2) und gibt einen wert vom datentyp int zurueck an die main funktion (return summe.
Danke an Twin View, telepornos, Live und kerri fuer Eure Hilfe, hat mich zumindest ein kleines Stueckchen weitergebracht. Danke das Ihr Euch fuer mein Problem Zeit genommen habt und das Ihr Euch den Ars*h aufgerissen habt, um mir was zu erklaeren. Nochmals vielen Dank.
und:
Zitat:
Zitat von kodak
[...]dann könnt ihr mir auch gleich mal erklären[...]
Ja, ich weiss, bitte und danke sind in letzter Zeit recht selten verwendete Worte, das find ich extrem schade
Gruesse, kerri
PS.: Ich frage mich momentan ernsthaft, warum ich so bloed bin und ueberhaupt noch auf solche (im nachhinein betrachtet doch recht unfreundlichen) Beitraege antworte.
es sind ja noch wilde jugendliche die wissen noch nix von guten umfangsformen
so wie ich
nee mal ernsthaft - seh das dochmal so: da beansprucht jemand deinen überaus göttlichen skill und du kannst den so richtig unter beweis stellen - das ist z.b. mir dank genug (aber nur manchmal :P)
btw.
kodak: vielleicht kannste die letzte PM mal publizieren, wäre ganz interessant für andere c-anfänger
der beitrag kommt vielleicht unfreundlich rüber, das heisst aber noch lange nicht das ich unfreundlich bin
ausserdem war ich noch gar net fertig damit mein code so zu richten wie du das beschrieben hast
aber das mit dem return hab ich wohl jetz so einigermaßen verstanden.. muss da nochmal n bissl mit rumexperementieren
danke kerri
@tele
du meinst diese pn
ich glaub das mit dem return hab ich wohl jetz so einigermaßen verstanden.. muss da nochmal n bissl mit rumexperementieren
Zitat:
der return befehl gibt ab welche variable aus ner funktion returned werden soll (to return = zurückliefern)
der returnwert ist vom typ immer gleich dem typ der funktion, man kann sagen, dass die funktion einen typ hat und der return wert diesen wert repräsentiert
verwirrend ? okay hier ein bsp:
du deklarierst eine funktion addiere() mit dem typ in (int = integer, ganze zahlen)
int addiere()
{
}
da diese funktion jetzt keinen null-typ (=void) hat (achtung null ist hier als kein wert und nichzt als numerischer zahlenwert zu verstehen), muss ein rückgabewert vom typ der funktion erfolgen, welcher ist klar, der mit dem die funktion deklariert wurde, hier int
ergo wenn ich schreibe
int addiere()
{
int a=1;
int b=2;
int c;
c=a+b;
return c;
}
dann liefert mir die funktion das ergebnis von 1+2 zurück
etwas praktischer:
ich deklariere eine funktion addiere(int a, int b) welche das ergebnis der beiden parameter a und b zurückliefert.
int addiere(int a, int b)
{
int c;
c=a+b;
return c;
}
wenn ich jetzt diese funktion in der main aufrufe, kann ich den rückgabewert der funktion weiter verwenden:
int main()
{
int a_main=1;
int b_main=2;
int c_main;
c_main=addiere(a_main, b_main);
printf("Das ergebnis von a und b ist: %i ", c_main);