Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » erste funktion geht nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.01.2008, 14:35 Uhr
latenite



Hallo Leute

ich lerne grad c++ und bin bei Funktionen angekommen. Wollte mal "Fakultaet" schreiben und habe einen fehler den ich nicht verstehe:


C++:
#include<iostream>
using namespace std;

int main()

{
    cout<<"Bitte Zahl die zu \"fakultieren\" ist eingeben: "<<endl;
    int zahl;
    cin>>zahl;

    int fak(int zahl)
    {
        if (argument <= 1) return 1;
        return zahl * fak(zahl-1);
    }
  
    cout<<"ergebnis: "<<zahl<<endl;
}




g++ gibt folgendes aus:

error: a funktion-definition is not allowed here before '{' token


aber die blockklanmern{} brauche ich doch?!

kann mir bitte jemand helfen??

Dieser Post wurde am 16.01.2008 um 14:44 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.01.2008, 14:41 Uhr
RedEagle



Du darft innerhalb einer Funktion keine neue Funktion erstellen
fak muss du vor main packen, und dann in main aufrufen

C++:
#include<iostream>
using namespace std;

int fak(int zahl)
{
if (zahl <= 1) return 1; //Zahl ist das Argument.
return zahl * fak(zahl-1);
}

int main()
{
cout<<"Bitte Zahl die zu \"fakultieren\" ist eingeben: "<<endl;
int zahl;
cin>>zahl;

zahl = fak(zahl);

cout<<"ergebnis: "<<zahl<<endl;
}

--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.01.2008, 14:58 Uhr
latenite



warum geht das nicht?


Code:
#include<iostream>
using namespace std;

int main()

{
    int fak(int);
}

    int fak(int zahl)
    {
        cout<<"Bitte Zahl die zu \"fakultieren\" ist eingeben: "<<endl;
        int zahl;
        cin>>zahl;
        if (zahl <= 1) return 1;
        zahl = zahl * fak(zahl-1);
        cout<<"ergebnis: "<<fak(zahl)<<endl
    }



so würde doch in main die funktion fak aufgerufen...in der dann alles gemacht wird (mit ein und ausgabe)

fehler ist aber:
:14: error: declaration of ‘int zahl’ shadows a parameter
:19: error: expected `;' before ‘}’ token


klasse das das hier so schnell und nett ist mit den antworten... ich wuerde sonst bei dan anfängen echt verzweifeln.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.01.2008, 15:03 Uhr
latenite



und SO...


C++:
#include<iostream>
using namespace std;

int main()

{
    int fak(int);
}

    int fak(int)
    {
        cout<<"Bitte Zahl die zu \"fakultieren\" ist eingeben: "<<endl;
        int zahl;
        cin>>zahl;
        if (zahl <= 1)
        {
            cout<<"ergebnis: "<<zahl<<endl;
        }
        zahl = zahl * fak(zahl-1);
    }




wird das programm erfolgreich compiliert aber das cout in der fak funktion wird nie ausgeführt..

wieso??


Bearbeitung:

Bitte mal code tags benutzen, hab keine lust ständig hinterherzuräumen ...


Dieser Post wurde am 16.01.2008 um 15:54 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.01.2008, 15:46 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von latenite:
warum geht das nicht?


C++:
#include<iostream>
using namespace std;

int main()

{
    int fak(int);
}





int fak(int); ist eine Funktionsdeklaration. Das heisst es ist eine Mitteilung an den Compiler, das es eine Funktion fak gibt. Diese hat einen int-Wert als Eingabe, und liefert einen int-Wert zurück. Das ist alles.
Solche Deklarationen dürfen in C++ aber nie innerhalb von anderen Funktionen stehen, sondern müssen ausserhalb stehen. In Deiner main-Funktion steht jetzt lediglich die Deklaration von fak, aber sonst nichts.

Wie die Fehlermeldungen zustande kommen weis ich jetzt auch nicht genau, hab da zwar ein paar Vermutungen, die würden aber nur verwirren, deshalb spar ich sie mir.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 16.01.2008 um 15:48 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.01.2008, 16:01 Uhr
öni



[C++ Warnung] Unit1.cpp(20): W8070 Funktion sollte einen Wert zurückgeben.

Kommt bei meinem Compiler hätte mich gewundert wenn er es nicht gemacht hätte. Du muss ja noch einen Rückgabewert haben wenn du die Funktion int machst.

Selbst wenn du den dann einen Rückgabewert angibts funktioniert es immer noch nicht.
Anwas es genau liegt weiß ich nicht auf jeden Fall ist eine Funktion so nicht gedacht was du da so machst.
Du rufst ja sogar in der Funktion die Funktion nochmals auf....zahl = zahl * fak(zahl-1);
aber ich glaub das ist sogar beabsichtigt.

Bevor ich aber noch lange rumrede es ist einfach falsch........

Und ich hab jetzt auch schon ne Weile dran rumgedacht und ausprobiert aber ich weiß sowieso gar nicht genau was du machen möchtest.

Edit1: zu spät....hans war schneller

Dieser Post wurde am 16.01.2008 um 16:02 Uhr von öni editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.01.2008, 16:25 Uhr
Hans
Library Walker
(Operator)


@öni: Das mit zahl = zahl * fak(zahl-1); in der Funktion ist schon eine korrekte Konstruktion. Das Prinzip nennt sich Rekursion, und bezeichnet Funktionen, die sich selbst aufrufen. Aber sieh Dir dazu besser den Code an, den RedEagle geposted hat, der ist zum verstehen besser geeignet.

Ach ja, und die Fakultät die da berechnet wird, ist ein mathematische Funktion. Wenn man z.B. 6-Fakultät (geschrieben: 6! ) berechnen will, dann heisst das, das man
1*2*3*4*5*6 rechnen muss. Da kommt 720 raus.
Wenn diese Funktion mit 6 als Anfangsargument aufgerufen wird, ruft sich selber noch 5 mal auf. Beim ersten mal übergibt sie sich den Wert 5, dann ruft sie sich mir dem Wert 4 auf, bis sie bei 1 angekommen ist. Bei den jeweiligen Rücksprüngen findet dann die eigentlich Berechnung statt. Und wenn Du jetzt nur Bahnhof verstanden hast, ist das überhaupt nicht schlimm, weil Rekursion ein schwieriges Thema ist, das nicht jeder sofort versteht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.01.2008, 16:40 Uhr
ao

(Operator)


Hallo latenite, ich poste einfach mal fertigen Code, um dich von ein paar falschen Dampfern wegzuholen. Normalerweise macht man das ungefähr so:

C++:
#include<iostream>
using namespace std;

int fak(int);    // Deklaration von fak

int main()
{
    int zahl;
    int ergebnis;

    // Eingaben abfragen
    cout<<"Bitte Zahl die zu \"fakultieren\" ist eingeben: "<<endl;
    cin>>zahl;

    // fak aufrufen und Ergebnis festhalten
    ergebnis = fak (zahl);

    // Ergebnis ausgeben
    cout << zahl << "! = " << ergebnis << endl;
    return 0;
}

int fak(int zahl)    // Definition von fak (!= Deklaration)
{
//    cout << "fak (" << zahl << ")" << endl;
    if (zahl <= 1)
    {
        zahl = 1;
//        cout << "return " << zahl << endl;
        return zahl;
    }
    else
    {
        zahl = zahl * fak (zahl - 1);
//        cout << "return " << zahl << endl;
        return zahl;
    }
}


Die Deklaration von fak (oben) ist nötig, damit die Funktion in main aufgerufen werden kann. Die Definition (unten) liefert den zugehörigen Code.

Abfrage der Eingaben und Ausgabe des Ergebnisses macht man außerhalb der fak-Funktion - diese soll nur die Rechnung erledigen und sich nicht drum kümmern, wo die Daten herkommen und hingehen.

Du kannst in der Definition die auskommentierten cout-Anweisungen wieder einschalten, um zu sehen, wie der rekursive Aufruf abläuft.

Dieser Post wurde am 16.01.2008 um 16:41 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.01.2008, 16:44 Uhr
latenite



das mit der Rekusoin war so beabsichtig (kannte ich noch aus haskell).

Jetzt habe ich es mal so probiert:

1. eine main mit dem funktionsaufruf
und
2. ein header mit der funktion und der Ein und Ausgabe

geht aber immernich nicht...compiliert..aber bibt nichts aus (so als wuerde die funktion gar nicht bearbeitet)

warum iszt das so?..sorry ich versuche mir grad echt krampfhaft die "basics" beizubringen.

danke für eure hilfe.

kann mir bitte jemand die beidem datein (main und header) so berichtigen das das programm läuft?
am besten so das alle ein un ausgaben in der funktion stattfinden(also im header) nur der aufruf in der main steht?

header:

#include<iostream>
using namespace std;

int fakultaet(int)
{
cout<<"Bitte Zahl die zu \"fakultieren\" ist eingeben: "<<endl;
int zahl;
cin>>zahl;
if (zahl <= 1)
{
cout<<"ergebnis: "<<zahl<<endl;
}
zahl = zahl * fakultaet(zahl-1);
}


main:
#include<iostream>
#include"./fakultaet.h"
using namespace std;

int main()
{
int fakultaet(int);
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.01.2008, 18:29 Uhr
Hans
Library Walker
(Operator)


Hi,

Du haust da die Begriffe durcheinander. Ich kenne zwar Haskel nicht, aber da scheint es andere Konventionen für Bezeichnungen zu geben. In C und in C++ ist ein Header die Datei, die mittels #include eingebunden wird. Deshalb spricht man dabei auch von header-Dateien.

In den Headerdateien von C/C++ stehen grundsätzlich nur Deklarationen, aber KEINE Definitionen. (Erklärung des Unterschiedes unten.)

Und die Fakultät ist doch eine rekursive Funktion, d.h. eine, die sich selbst aufruft. Deshalb haben Userabfragen wie cin darin nichts verloren. In Deinem Beispiel: Wenn die Funktion sich 10 mal aufruft, fragt sie den Benutzer 10 mal, nach der Zahl dessen Fakultät berechnet werden soll. Kann das der Sinn der Funktion sein?


Zitat:
kann mir bitte jemand die beidem datein (main und header) so berichtigen das das programm läuft?

Sieh Dir das Programm von ao an, das ist die korrekte Art und Weise, wie man es in C++ macht. Funktionen in eigene Dateien auslagern ist noch mal ein eigenes Kapitel; das brauchen wir noch nicht. Würde hier auch nur noch mehr verwirren.


Zitat:
am besten so das alle ein un ausgaben in der funktion stattfinden(also im header) nur der aufruf in der main steht?

Diese Aufteilung ist jetzt noch nicht nötig. Es geht doch um die Grundlagen von Funktionen, da reicht es aus, wenn Ein- und Ausgaben in main stattfinden. Das ist in C++ schliesslich auch eine Funktion. Nur für die Berechnung der Fakultät ist eine eigene Funktion zuständig, die in Deinem Fall fak heisst.

Und jetzt zum Unterschied zwischen einer Deklaration und einer Definition: Eine Deklaration ist eine Mitteilung an den Compiler, die ihm sagt, das es etwas gibt. Im Falle einer Funktion bedeutet dies das eine Funktion X existiert, und welche Parameter sie hat. Das ist alles, mehr macht eine Deklaration nicht. Sobald auch nur die geschweiften Klammern für die Funktion X dazu komm, ist es keine Deklaration mehr, sondern eine Definition.

C++:
int fak (int x);  // Deklarration

int fak (int x)  // Definition; - diese Funktion tut nichts
{ }



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: