Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 21:37

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Unterprogramme

Discussion on Unterprogramme within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
Crrrespo's Avatar
 
elite*gold: 87
Join Date: Jul 2009
Posts: 2,998
Received Thanks: 1,640
Unterprogramme

Hey, ich hab nächsten Dienstag nen Wiederholungstest in Informatik. Das wichtigste Thema sind Unterprogramme. Nur leider hab ich keine Ahnung wann ich welche Dinger hinschreiben soll (die Dinger sind float, int, void ...)

Hier ein Ausschnitt vom ersten Test (nicht mein Test)


Also unserem Lehrer ist eig ziemlich egal was nach der Kopfzeile im UP steht. Das wichtigste ist die Kopfzeile (beim Beispiel 'subtrahiere' die Zeile "float subtrahiere (float a, float b)

Also warum kann ich nicht schreiben (z.B.) 'void subtrahiere (int &a, int &b)'

Wäre geil wenn ihr mir erklären könnt wann genau ich:
void
float
int
und das '&' Zeichen benutzen muss
Crrrespo is offline  
Old 05/29/2010, 12:18   #2
 
elite*gold: 0
Join Date: May 2010
Posts: 551
Received Thanks: 732
char benutzt man um zeichen einer variablen zuzuweisen

bsp.: char test[11] = "elf Zeichen!";

int benutzt man um zahlen einer variablen zuzuweisen

bsp.: int test = 22;

float benutzt man um Gleitkommazahlen einer variablen zuzuweisen

bsp.: float test = 3,1415926535;

zu void empfehle ich dir schau mal in diesem thread vorbei :

~YaZZn`
Yazzn™ is offline  
Thanks
1 User
Old 05/29/2010, 13:36   #3


 
Ende!'s Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 6,378
Received Thanks: 7,996
Der Variabletyp vor einer Funktion bestimmt, in welchem Format die Funktion einen Wert zurückgibt. void bedeutet so viel wie nichts und eine void Funktion kann auch nichts zurückgeben, wesshalb der Funtionstyp Int oder Float (oder eben ein anderer Zahlentyp) sein sollte. Alternativ könntest du das Ergebnis der Funkion auch in einen Pointer schreiben, welcher dann zusätzlich übergeben werden muss.

z.B.:
void addieren(int zahl1, int zahl2, int *ergebnis) {
*ergebnis = zahl1 + zahl2 ;
}
Ende! is offline  
Thanks
1 User
Old 05/29/2010, 16:28   #4
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
Das & Zeichen in der Argumenten Liste der Funktion bedeutet das eine Variable per Refernz übergeben wird und nicht per Wert, dh. wenn du die Variable in deiner Funktion/Unterprogramm änderst ist sie auch nach dem return in der Hauptroutine geändert, das heißt also wenn eine Funktion die ihr übergebene Variable für das Hauptprogramm ändern soll musst du in der Argumenten Liste ein & vor die Variable schreiben, dass sieht das zb so aus:
Code:
void negieren(int& z)
{
     z=-z;
}
wenn du dieser Funktion eine beliebige int Variable übergibst ist danach auch im Hauptprogramm das Vorzeichen negiert, wenn man das & weg lässt wird in der Funktion eine neue Variable erstellt die nur innerhalb der Funktion gültig ist.

Wenn ihr Pointer noch nicht behandelt habt, dann Ignoriere einfach was Ende! geschrieben hat.

@Ende
Übrigens löst man das was du gemacht hast für gewöhnlich mit einer Referenz:
Code:
void addieren(int zahl1, int zahl2, int & Ergebnis)
{
    Ergebnis = zahl1+zahl2;
}
Der Grund dafür ist simpel, man spart sich die Pointer Arithmetik und es ist nicht möglich versehentlich nicht belegten Speicher zu Adressieren, in deinem Fall würde das passieren wenn man den * Operator vergisst, allgemein gilt wenn man die Adresse des Zeigers nicht ändern will übergibt man Parameter per Referenz, bei der Übergabe per Zeiger muss man nämlich auch noch darauf Achten den Adressoperator vor das Argument, welches als Zeiger genutzt wird, zu setzten.
Bot_interesierter is offline  
Thanks
1 User
Old 05/29/2010, 17:33   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Das stimmt zwar, normalerweise meckert ein Compiler aber, wenn man das & vergisst und eine normale Variable vom Typ int übergibt.

Noch dazu finde ich, dass Referenzen ein bisschen zu unflexibel sind (für meinen Geschmack und meine Zwecke )

Eigentlich ist für die Aufgaben nirgendwo Pointerarithmetik oder Referenzübergabe nötig.
Jede dieser eher mathematischen Aufgaben kann einen Wert zurückgeben, void wird also schonmal unnötig.

char macht hier auch eher wenig Sinn, da man zwar auch Werte mit der gleichen Anzahl an Bit wie ein short speichern kann, aber in der Regel ist char für Zeichen und short für Zahlenwerte.
Short kann aber im Vergleich zu int viel weniger Werte speichern, durch die geringe Anzahl an Bit.

Der Universaltyp ist eigentlich int, also würde ich den auch nehmen.
Wenn dein Leher allerdings möchte, dass die Funktionen auch mit Dezimalstellen umgehen können, ist float von Nöten double halte ich da eher wieder für einen overkill, da man selten mit so vielen Dezimalstellen rechnet, genau so wie long ein overkill wäre, da man selten solche Riesenwerte verwendet.


Also, je nach dem, was dein Leher möchte (ich halte float für wahrscheinlicher) ist float oder int der richtige Rückgabetyp für deine Funktionen oder "Unterprogramme".
void dürftest du nur brauchen, wenn es explizit gefragt ist, dass die Originalvariable verändert wird.


edit:

hupps ich sehe gerade, die Variablen in der main sind vom Typ float.
Du siehst am Typ der Variablen, welchen du für die Funktion nutzen musst
Wenn da eine Zuweisung ist, bei der einer float Variable der Rückgabewert der Funktion zugewiesen wird, ist klar, dass die Funktion den Rückgabetyp Float hat!

und ich sehe gerade, dass void ja doch explizit gefragt ist und zwar bei der "negiere"-Funktion.


Dann hat natürlich Bot_interessierter Recht:

da muss dann
Code:
void negiere(float &zahl)
stehen.

Und zwar nur das! Ein Pointer darf hier deswegen nicht hin, weil in der main nicht steht
Code:
negiere(&j);
Da würde dann ein Pointer gefragt sein! Aber es wird nur das j übergeben, also muss eine Referenz genutzt werden

Btw. wenn du nicht genau weißt, was diese Typen alle bedeuten/wann du sie nutzt, ist euer Leher entweder schlecht im Erklären oder du hast nicht aufgepasst.
Ich denke mal nicht, dass er einen Test über Funktionen macht, wenn ihr noch nichtmal die Datentypen hattet.


Kleine Erklärung des Zeichens '&' bei Variablen:

Wenn es zwischen Typ und Variable steht, also
Code:
int &variable
, dann bedeutet es, dass es eine Referenz ist.
D.h. es teilt sich den gleichen Speicher mit der Variable, die man ihr zuweist.
Bsp.:

Code:
int x = 5;
int &x2 = x;    //x2 hat auch den Wert 5
x = 10;          //x2 hat auch den Wert 10
Wenn es allerdings nur vor dem Variablennamen steht (ohne den Datentyp davor), bedeutet es, dass die Adresse der Variable im Speicher genutzt wird.
Das ist zum Beispiel bei Pointern nötig, die als Wert die Adresse einer anderen Variable haben und somit auf die Variable "zeigen":

Code:
int x = 5;
int *x2 = &x;    // * steht für pointer/zeiger; &x bedeutet, dass x2 nun als Wert die Adresse von x hat

x = 10;           //x2 hat immernoch den gleichen Wert (adresse von x), zeigt deshalb immernoch auf x, welches nun den Wert 10 hat

//zugreifen würde man auf den Wert, auf den der Pointer zeigt(!), durch das *
*x2 = 5;         //der Wert von x2 bleibt gleich (Adresse von x), aber hierdurch wird x auf 5 gesetzt

x2 = 5;           /*großer Fehler. Nun zeigt der Pointer x2 auf die Adresse 5 im Speicher. 
                       Die ist ungültig; hier darf man nicht schreiben oder lesen. 
                       Würde also jemand dann folgendes tun, gäbe es einen Crash:
*x2 = 5;
Allerdings kannst du die Pointer außer Acht lassen, da im Beispiel steht negiere(j), wird keine Adresse von einer Variable übergeben, sondern die Variable selbst.
Es kann sich hierbei also nur um eine Referenz handeln
Code:
void negiere(float &parameter)
MrSm!th is offline  
Thanks
1 User
Old 05/29/2010, 18:01   #6
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
@MrSm!th
schau dir das Bild mit der Aufgabe genau an, die Funktion Negieren muss einen int Parameter nehmen und Aufgrund der Aufgabenstellung muss sie auch mit einem Refernz Parameter Arbeiten.

Edit: und spammt den Thread nicht mit soviel Unnötigen Informationen zu, der TE hat sehr genau gesagt was er wissen möchte
Bot_interesierter is offline  
Thanks
1 User
Old 05/29/2010, 18:57   #7


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Bot_interesierter View Post
@MrSm!th
schau dir das Bild mit der Aufgabe genau an, die Funktion Negieren muss einen int Parameter nehmen und Aufgrund der Aufgabenstellung muss sie auch mit einem Refernz Parameter Arbeiten.

Edit: und spammt den Thread nicht mit soviel Unnötigen Informationen zu, der TE hat sehr genau gesagt was er wissen möchte
edit nicht gesehn?
Hab mich doch korrigiert.


Und warum unnötig? Er fragte, wann man & benutzt und das habe ich ihm erklärt ;O
MrSm!th is offline  
Thanks
1 User
Old 05/30/2010, 14:21   #8

 
x]vIrus[x's Avatar
 
elite*gold: 37
Join Date: Apr 2004
Posts: 2,154
Received Thanks: 250
Quote:
Originally Posted by Bot_interesierter View Post
@MrSm!th
schau dir das Bild mit der Aufgabe genau an, die Funktion Negieren muss einen int Parameter nehmen und Aufgrund der Aufgabenstellung muss sie auch mit einem Refernz Parameter Arbeiten.

Edit: und spammt den Thread nicht mit soviel Unnötigen Informationen zu, der TE hat sehr genau gesagt was er wissen möchte
wenn man immer nur über direkt das labern würde was direkt was mit dem 1. post zu tun hat, wär das boardleben langweilig, interessante themen entwickeln sich nunmal, und warum nicht dort diskutieren wo sie ihren ursprung haben?
man, nervt net >;O

du sagst in deiner klasse auch net zu deinen mitschülern sie sollen bitte die klappe halten, weil ihr jetzt mathe habt und die sich über sonstwas unterhalten
x]vIrus[x is offline  
Old 05/30/2010, 20:11   #9
 
Crrrespo's Avatar
 
elite*gold: 87
Join Date: Jul 2009
Posts: 2,998
Received Thanks: 1,640
float subtrahiere (float a, float b)

Das float steht da weil das Ergebnis eine Kommastelle hat?


Die beiden floats stehen da weil die Variablen a, b Kommastellen haben?

__________________________________________________ _____________

Und das '&' steht in der "Kopfzeile" wenn ich eine Variable innerhalb und außerhalb des Unterprogramms geändert haben will?
Crrrespo is offline  
Old 05/30/2010, 20:26   #10

 
x]vIrus[x's Avatar
 
elite*gold: 37
Join Date: Apr 2004
Posts: 2,154
Received Thanks: 250
les dir das hier durch, hab grad nach ner schönen tabelle gesucht, hab keine gefunden, aber wenn du das hier liest, verstehst du wahrscheinlich eh mehr als wenn ich nur ne plumpe tabelle gefundne hätt

x]vIrus[x is offline  
Old 05/30/2010, 20:35   #11


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Crrrespo View Post
float subtrahiere (float a, float b)

Das float steht da weil das Ergebnis eine Kommastelle hat?


Die beiden floats stehen da weil die Variablen a, b Kommastellen haben?
Ganz genau so ist es.
Das Ergebnis ist float, weil die Variable, in der das Ergebnis gespeichert werden soll, float ist.
Und die beiden Variablen a und b sind float, weil aus ihnen ja das Ergebnis berechnet werden soll.
Da muss dann natürlich auch der Typ float sein
Quote:
Und das '&' steht in der "Kopfzeile" wenn ich eine Variable innerhalb und außerhalb des Unterprogramms geändert haben will?
Genau und in dem Falle ist dann auch das void als Rückgabetyp gefragt.
MrSm!th is offline  
Thanks
1 User
Old 05/30/2010, 20:46   #12
 
Crrrespo's Avatar
 
elite*gold: 87
Join Date: Jul 2009
Posts: 2,998
Received Thanks: 1,640
Ich kann nur wiederholen: Sm!th, du bist Göttlich <3
Crrrespo is offline  
Old 05/30/2010, 21:45   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Das halte ich für ein Gerücht

Ich frage mich nur, warum weißt du das alles nicht?
Müsstet ihr das nicht im Unterricht habt haben, wenn ihr darüber einen Test schreibt?

Ich sage dir, falls du nicht aufpasst, ist das keine gute Einstellung, um bei einem Thema wie C/C++ gut abzuschneiden
MrSm!th is offline  
Old 05/30/2010, 21:49   #14
 
Crrrespo's Avatar
 
elite*gold: 87
Join Date: Jul 2009
Posts: 2,998
Received Thanks: 1,640
Naja Informatik interessiert mich nicht wirklich (habs nächstes Jahr auch nicht mehr bzw. abgewählt). Also ich passe nicht wirklich auf & der Lehrer ist auch nicht so ganz mein Typ >.>
Crrrespo is offline  
Old 05/30/2010, 22:10   #15


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Das ist dann natürlich schade.
Man sollte Info nicht unterschätzen, wenn man es wählt ;O

Viel Glück beim Test
MrSm!th is offline  
Reply




All times are GMT +1. The time now is 21:37.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.