Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C++ Ein paar Fragen zu C++
- Ersteller adeliiix
- Erstellt am
asdfman
Commander
- Registriert
- März 2008
- Beiträge
- 2.315
Für mich reichen die einzeiligen Ausschnitte, die du gepostet hast, um zu sehen, wo dein Verständnisproblem liegt. Es hat wohl niemand geschafft, dir verständlich zu erklären, welche Bedeutung bestimmte grundlegende Konstrukte der Sprache C++ haben. Bei der Bedeutung der Schlüsselwörter für Variablentypen und wann du sie angeben musst, hat es auch noch nicht recht "klick" gemacht. Ich bin aber ein furchtbarer Erklärer. Ich könnte dir vielleicht wenn ich mir viel Mühe gebe, erschöpfend erklären, was es damit auf sich hat, aber das letztendliche intuitive Verständnis zu vermitteln fehlt mir die Fähigkeit. Ich würde dir wohl (auf das tägliche Leben übertragen) erklären können, dass die Feuerwehr mit roten Autos und viel Krach durch die Stadt fährt und mit Wasser um sich spritzt, aber ich würde daran scheitern, klar zu machen, welcher Sinn dahinter steckt und dir einen echten Erkenntnisgewinn zu liefern. Deshalb verweise ich auf didaktisch fähigere Menschen als mich oder den Rest des Forums.
also oben am anfang des quelltexts (es sind alles globale funktionen und variablen) wo ich die funktionen und variabeln angebe gebe ich int etc mit an?
wenn ich die funktion dann aufrufe später muss ich int nicht mehr mit angeben?
wenn ich die funktion dann aufrufe später muss ich int nicht mehr mit angeben?
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
Hoffentlich hilft dir das ein bißchen weiter.
Code:
#include <iostream>
// Hier definieren wir eine Funktion namens "verdoppeln". Man ruft sie auf, indem
// man ihr eine Gleitkommazahl übergibt. Sie gibt dann einfach den doppelten Wert
// davon zurück.
// In einer Funktionsdeklaration / Definition muß immer die vollständige Signatur
// der Funktion angegeben werden. Würdest du hier zum Beispiel das "float" vor
// "inputValue" weglassen, würde sich der Compiler bei dir beschweren. Woher
// sollte er dann schließlich wissen, welchen Datentyp der formelle Parameter
// "inputValue" haben soll? int? double? char? Der Compiler hat keine Lust,
// zu raten, sondern erwartet von dir, daß du ihm genau sagst, was du willst.
float verdoppeln( float inputValue )
{
return inputValue * 2.0f;
}
int main()
{
float dasDoppelteVonDrei;
// Jetzt rufen wir unsere Funktion mal eben auf und weisen das Ergebnis einer
// Variablen zu.
// Wie du siehst, geben wir hier weder den Datentyp des Übergabe-Parameters
// noch den Typ des Rückgabewertes der "verdoppeln"-Funktion an. Wozu auch;
// das haben wir schließlich in der Definition der "verdoppeln"-Funktion
// schon erledigt.
dasDoppelteVonDrei = verdoppeln( 3.0f );
std::cout << "Der Wer der Variablen \"dasDoppelteVonDrei\" ist: " << dasDoppelteVonDrei << std::endl;
}
so meinte ich das auch eig ^^
also immer wenn man zum ersten mal eine funktion schreibt muss mann immer
den Datentyp, Übergabe-Parameters und Rückgabewertes angeben danach wenn man sie aufruft nichts von dem?
float verdoppeln( float inputValue )
{
return inputValue * 2.0f;
Das heißt verdoppeln hat den wert inputValue*2.0f
was heißt die 3.0f hinten?
dasDoppelteVonDrei = verdoppeln( 3.0f );
ist das dann
inputValue*2.0f (der wert von derdoppeln) * 3.0f? oder + oder wie?
also immer wenn man zum ersten mal eine funktion schreibt muss mann immer
den Datentyp, Übergabe-Parameters und Rückgabewertes angeben danach wenn man sie aufruft nichts von dem?
float verdoppeln( float inputValue )
{
return inputValue * 2.0f;
Das heißt verdoppeln hat den wert inputValue*2.0f
was heißt die 3.0f hinten?
dasDoppelteVonDrei = verdoppeln( 3.0f );
ist das dann
inputValue*2.0f (der wert von derdoppeln) * 3.0f? oder + oder wie?
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
adeliiix schrieb:also immer wenn man zum ersten mal eine funktion schreibt muss mann immer
den Datentyp, Übergabe-Parameters und Rückgabewertes angeben danach wenn man sie aufruft nichts von dem?
So isses.
adeliiix schrieb:float verdoppeln( float inputValue )
{
return inputValue * 2.0f;
Das heißt verdoppeln hat den wert inputValue*2.0f
was heißt die 3.0f hinten?
dasDoppelteVonDrei = verdoppeln( 3.0f );
ist das dann
inputValue*2.0f (der wert von derdoppeln) * 3.0f? oder + oder wie?
Nein. verdoppeln hat überhaupt keinen Wert, denn es ist eine Funktion. Funktionen haben keine Werte (*1). Funktionen kann man aber Werte übergeben, und sie können Werte zurückgeben. Stell dir den formellen Parameter inputValue mal als eine Art Platzhalter vor, der erst bei einem Aufruf der Funktion einen konkreten Wert annimmt. In unserem Beispiel haben wir der Funktion beim Aufruf den Wert 3.0 übergeben. Das heißt, in diesem Aufruf hat inputValue den Wert 3.0. Damit bewirkt der Ausdruck return inputValue * 2.0f;, daß die Funktion den Wert 6.0f an den Aufrufer zurückgibt. Und genau dieser Wert landet dann in der Variablen dasDoppelteVonDrei.
EDIT: (*1) Genau deshalb hat Hancock in seinem Beispiel auf Seite 1 dieses Threads auch die sin-Funktion erwähnt. Die sinus-Funktion kennst du aus der Mathematik. Da fragst du ja schließlich auch nicht "Welchen Wert hat die Sinus-Funktion?"
Eben weil die Frage keinen Sinn ergibt. Die Sinus-Funktion hat keinen Wert sondern bildet einen Wertebereich auf einen Wertebereich ab, oder mal weniger doof ausgedrückt, sie nimmt einen Wert entgegen und gibt dir einen anderen Wert zurück.
sin( 90° ) -> 1 ... stimmt's?
Zuletzt bearbeitet:
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
adeliiix schrieb:achja ich habe vergessen das der compiler bei der main funktion anfängt oder?
dann ist das ganze auch schon logischerdanke!
Das Ausführen deines Programms beginnt in der main-Funktion (na ja, strikt genommen ist das auch nicht ganz richtig, aber das würde jetzt zu weit führen). Der Compiler beginnt das Kompilieren ganz am Anfang deiner Quellcode-Datei (wo auch sonst?).
Meine Antwort vorhin war völliger Schwachsinn.
Ich bin nur nie drauf gekommen / unser Lehrer hat uns nie gesagt das sin keinen Wert hat sondern diese nur weiter gibt.
Wir haben einen TR aber keinen GTR
Da kann man Dreiecke und so anzeigen lassen oder?
return 0;
heißt das eig das die zahl 0 zurückgegeben wird oder das nichts zurückgegeben wird?
und bei deiesm Beispiel
da sthet bei der main funktion
Spieler1.Name[0] = '\0';
was bedeutet das : '\0'
und warum steht in den klammern eine 0? die zahl gibt doch an wie viele platz der array hat aber kein platz bedeutet doch das man keinen namen angeben kann?
Ich bin nur nie drauf gekommen / unser Lehrer hat uns nie gesagt das sin keinen Wert hat sondern diese nur weiter gibt.
Wir haben einen TR aber keinen GTR
Da kann man Dreiecke und so anzeigen lassen oder?
Ergänzung ()
return 0;
heißt das eig das die zahl 0 zurückgegeben wird oder das nichts zurückgegeben wird?
und bei deiesm Beispiel
Code:
#include <iostream>
using namespace std;
// Strukturen
//
struct S_Spieler
{
int Energie;
int Punkte;
int xPosition;
int yPosition;
char Name[30];
};
// Prototypen
//
S_Spieler NameAbfragen(S_Spieler Spieler);
// Hauptprogramm
//
int main()
{
// Variablen
//
S_Spieler Spieler1;
// Spieler initialisieren
Spieler1.Energie = 1000;
Spieler1.Punkte = 0;
Spieler1.xPosition = 0;
Spieler1.yPosition = 0;
Spieler1.Name[0] = '\0';
// Name des Spielers abfragen
Spieler1 = NameAbfragen(Spieler1);
cout << "Neuer Spieler: " << Spieler1.Name << endl;
return 0;
}
// NameAbfragen
//
// Aufgabe: Name des Spielers abfragen
//
S_Spieler NameAbfragen(S_Spieler Spieler)
{
// Name abfragen
cout << "Name des Spielers: ";
cin.get(Spieler.Name, 29);
return Spieler;
} // NameAbfragen
Spieler1.Name[0] = '\0';
was bedeutet das : '\0'
und warum steht in den klammern eine 0? die zahl gibt doch an wie viele platz der array hat aber kein platz bedeutet doch das man keinen namen angeben kann?
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
adeliiix schrieb:Ergänzung ()
return 0;
heißt das eig das die zahl 0 zurückgegeben wird oder das nichts zurückgegeben wird?
Ersteres; es wird der Wert 0 zurückgegeben. Es gibt auch Funktionen, die gar nichts zurückgeben ... solche Funktionen haben den Rückgabetyp void. Beispiel:
Code:
void printNumber( int numberToPrint )
{
std::cout << "The number is " << numberToPrint << "\n";
}
Wenn man es ganz genau nimmt, sind solche Funktionen eigentlich gar keine Funktionen sondern Prozeduren, da Funktionen eigentlich immer etwas zurückgeben müssen. Aber die meisten Leute machen da keine Unterscheidung und nennen einfach beides Funktionen.
adeliiix schrieb:und bei deiesm Beispiel
[...]
da sthet bei der main funktion
Spieler1.Name[0] = '\0';
was bedeutet das : '\0'
Das Zeichen '\0' ist ein besonderes Zeichen mit dem Integerwert 0. Es wird in Character-Arrays häufig verwendet, um das Ende einer Zeichenketten darzustellen. Das sollte dein Buch aber auch alles erklären ... wenn nicht, dann schmeiß es weg und besorg dir ein besseres.
adeliiix schrieb:und warum steht in den klammern eine 0? die zahl gibt doch an wie viele platz der array hat aber kein platz bedeutet doch das man keinen namen angeben kann?
Bei der Deklaration / Definition des Arrays gibt die Zahl in den Klammern die Größe des Arrays an. Beim Zugriff auf das Array gibt die Zahl in Klammern; auch als Index bekannt; an, auf genau welches Element innerhalb des Arrays der Zugriff erfolgt ... ACHTUNG: Indizes beginnen bei 0, nicht bei 1.
Ein Array hat mehrere Elemente.
Wenn du nun auf die Elemente zugreifen willst, musst du die irgendwie ansprechen. Das geht mit den [ ].
Die Zahl innendrinnen gibt dann das Element an, aber es geht immer von 0 bis size-1.
Ausgabe:
0
1
4
...
81
Wenn du nun auf die Elemente zugreifen willst, musst du die irgendwie ansprechen. Das geht mit den [ ].
Die Zahl innendrinnen gibt dann das Element an, aber es geht immer von 0 bis size-1.
Code:
int zahlen[10];
for(int i=0;i<10;i++)
zahlen[i]=i*i;//Das i-te Element bekommt i+1 als Wert
for(int i=0;i<10;i++)
cout<<zahlen[i]<<endl;//Das i-te Element ausgeben
0
1
4
...
81
powerfx
Admiral
- Registriert
- Apr. 2009
- Beiträge
- 9.351
Wir legen ein Array gleich mit Inhalt an:
Das Array "foobar" hat also genau fünf Elemente.
Jetzt möchtest du das dritte Element ausgeben (der Index ist "2", da das erste Element - wie antred erklärt hat - Index 0 und nicht 1 hat):
Code:
int foobar[5] = {5, 8, 42, 7, 1337};
Jetzt möchtest du das dritte Element ausgeben (der Index ist "2", da das erste Element - wie antred erklärt hat - Index 0 und nicht 1 hat):
Code:
cout << foobar[2];
blackst0rm
Ensign
- Registriert
- März 2012
- Beiträge
- 182
Die Zählung eine Arrays beginnt bei 0. Sprich das 0. Element Ost die erste Speicherzelle des Arrays. endl steht für endline und gibt stellt einen Systemunabhängigen Zeilenumbruch dar.
asdfman
Commander
- Registriert
- März 2008
- Beiträge
- 2.315
Richtige Funktionen sind in der imperativen Programmierung eh nicht vorgesehen und eigentlich schon fast eine Seltenheit. Sobald man Seiteneffekte hat, ist es mit der Funktionalität vorbei. Und die hat man ja schon, sobald irgendwie eine Zuweisung oder I/O stattfindet.Wenn man es ganz genau nimmt, sind solche Funktionen eigentlich gar keine Funktionen
Zuletzt bearbeitet:
ok aber was ist bei meinem Bepiele also diesem hier:
mit 0tem element gemeint?
also wenn da jetzt steht
Beispiel[5] = {2,5,8,12,14}
wäre das 0te element doch die 2 oder?
Code:
#include <iostream>
using namespace std;
// Strukturen
//
struct S_Spieler
{
int Energie;
int Punkte;
int xPosition;
int yPosition;
char Name[30];
};
// Prototypen
//
S_Spieler NameAbfragen(S_Spieler Spieler);
// Hauptprogramm
//
int main()
{
// Variablen
//
S_Spieler Spieler1;
// Spieler initialisieren
Spieler1.Energie = 1000;
Spieler1.Punkte = 0;
Spieler1.xPosition = 0;
Spieler1.yPosition = 0;
Spieler1.Name[0] = '\0';
// Name des Spielers abfragen
Spieler1 = NameAbfragen(Spieler1);
cout << "Neuer Spieler: " << Spieler1.Name << endl;
return 0;
}
// NameAbfragen
//
// Aufgabe: Name des Spielers abfragen
//
S_Spieler NameAbfragen(S_Spieler Spieler)
{
// Name abfragen
cout << "Name des Spielers: ";
cin.get(Spieler.Name, 29);
return Spieler;
} // NameAbfragen
mit 0tem element gemeint?
also wenn da jetzt steht
Beispiel[5] = {2,5,8,12,14}
wäre das 0te element doch die 2 oder?
Ähnliche Themen
- Antworten
- 3
- Aufrufe
- 505
- Antworten
- 19
- Aufrufe
- 1.107
- Antworten
- 29
- Aufrufe
- 1.053
- Antworten
- 3
- Aufrufe
- 1.021