Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo IT-ler!

Will nicht lange drum rum reden - mache seit 2 Jahren eine Ausbildung zum Fachinformatiker für Systemintegration - macht wirklich Spaß - bis auf die tatsache, dass ich im Programmieren nochnie besser als Note 4 war ...

Nun zum Hauptthema:

In C++ verstehe ich sogut wie überhaupt nichts.

"Hallo Welt" schaffe ich gerade noch auszugeben -.- und vllt ne Eingabe von ner Zahl aber dann hörts auch schon auf.

Mein größtes Problem liegt in Funktionen, Arrays und Pointern....

Meine Lehrer sind sich irgendwie zu gut, um mir das zu erklären, sie sagen: Die anderen Schüler verstehen es doch auch....

Naja, aufjedenfall wollte ich jetzt hier mal fragen, ob jemand vllt ein paar Nützliche Tipps und Tricks hat, sich zu merken, wie man beispielsweiße eine Funktion verwendet usw.

Wäre echt nett von euch.

grüße Julian

Geschrieben

Willkommen auf dem Board :)

Es ist besser, wenn du konkrete Fragen stellst. Wir können hier seitenlang über Funktionen dozieren, aber wenn das nicht zufällig deine Verständnislücken trifft, ist es nicht besonders zielführend.

Geschrieben

Danke :)

Ja, deine Signatur entspricht glaub genau dem Inhalt des ersten Postes von mir :D:D

Sorry!

Ja also zurzeit machen wir Arrays, davor haben wir Funktionen angefangen...

Bei Funktionen hab ich keine Ahnung wo man was tun muss...

Irgendwas vor der main() schreiben, dann in der Main irgendwo aufrufen und unter der main dann die eigentliche funktion ...

Ich weiß nicht wie, und vorallem wo und wann ich was genau verwenden soll...

Geschrieben

Man benutzt Funktionen aus 2 Gründen:

  • Um Wiederholungen zu vermeiden. Wenn dasselbe Stück Code mehrfach im Programm auftaucht, lagert man das Stück in eine Funktion aus. Denn doppelter Code birgt die Gefahr, dass man irgendwann eine Stelle ändert (z.B. ein Bugfix), aber die andere(n) nicht.
  • Um den Code zu strukturieren. Wenn man bestimmte Teilaufgaben mit klaren Ein- und Ausgabedaten abgrenzen kann, reduziert man die Gefahr, dass sich irgendwelche Abhängigkeiten quer durchs Programm einschleichen.

Soweit klar?

Geschrieben

stell dir die "main" als gang durch den supermarkt vor, vom eingang bis zur kasse. da passiert erst mal nicht viel. rein, durchgehen, raus. erst die interaktionen machen die sache spannend. die käsetheke: du gehst hin und bittest den verkäufer, dir 1 kilo tilsitter zu geben. analog dazu: du rufst die funktion "käsekaufen" auf. als parameter übergibst du "1kg" und " tilsitter".

der verkäufer übergibt dir die ware (ein päckchen käse. die funktion "käsekaufen" hat den rückgabewert "einpäckchenkäse".

das päckchen käse hast du jetzt in deinem körbchen - in der main - und kannst es weiterverarbeiten.

Geschrieben

Sorry, ist zwar OT, aber:

@localhost, selten so sehr geschmunzelt und das return EXIT_SUCCESS bedeutet, dann das ich das Essen endlich verputzen darf und return EXIT_FAILURE bedeutet, dass mit die Tüte auf dem Parkplatz gerissen ist....

Geschrieben

@Localhost, das klingt ja schonmal gut - aufjedenfall verständlicher als in der Schule.

Mein Problem liegt aber darin, zu verstehen wie die Syntax bei der Definition, bei dem aufruf und in der funtkion selber (auch das zurückgeben des wertes) ....

gleiches wiederum mit arrays, for-schleifen, while schleifen und if-else...

edit: und 4er kandidat wäre ja toll... ich sagte war nochnie besser als eine 4... normalerweiße hab ich 2-3 punkte in klausuren :D -.-

Geschrieben

Funktionsdefinition (vereinfacht):

RÜCKGABETYP FUNKTIONSNAME(PARAM1-TYP PARAM1-NAME, PARAM2-TYP PARAM2-NAME, ...)

{

// INHALT

return AUSDRUCK;

}

RÜCKGABETYP ist ein Typ, der beschreibt, welche Art von Daten die Funktion ausgibt. Wenn die Funktion nichts zurückgibt, ist das void.

Die Parameter beschreiben die Eingabedaten der Funktion. Eine Funktion kann Parameter haben, muss aber nicht.

PARAMn-TYP ist der Typ des jeweiligen Parameters.

PARAMn-NAME ist der Name, über den im Rumpf auf den Parameter zugegriffen werden kann.

AUSDRUCK ist ein Ausdruck, der vom Typ RÜCKGABETYP oder zumindest in diesen umwandelbar sein muss.

Die Namen sind frei wählbar, solange sie eindeutig sind.

Aufruf:

FUNKTIONSNAME(ARG1, ARG2, ...)

ARGn ist ein Ausdruck, dessen Typ auf den jeweiligen Parameter-Typ der Definition passen muss.

Der gesamte Funktionsarufruf ist selbst ein Ausdruck, der als Typ den Rückgabetyp der Funktion hat. Du kannst damit also den Rückgabewert des Aufrufs einer Variablen zuweisen, oder den gesamten Aufruf-Ausdruck selbst wieder als Argument für eine Funktion benutzen.

Wenn etwas unklar ist, sag Bescheid.

Geschrieben (bearbeitet)

RÜCKGABETYP ist ein Typ, der beschreibt, welche Art von Daten die Funktion ausgibt. Wenn die Funktion nichts zurückgibt, ist das void.

Also wäre das z.B void käsekaufen, int käsekaufen, je nachdem was gebraucht wird?

Die Parameter beschreiben die Eingabedaten der Funktion. Eine Funktion kann Parameter haben, muss aber nicht.

PARAMn-TYP ist der Typ des jeweiligen Parameters.

PARAMn-NAME ist der Name, über den im Rumpf auf den Parameter zugegriffen werden kann.

das wäre dann void käsekaufen (string tilsitter, int menge)

AUSDRUCK ist ein Ausdruck, der vom Typ RÜCKGABETYP oder zumindest in diesen umwandelbar sein muss.

What?! :D:D

Bearbeitet von tschulian
Geschrieben
also wäre das z.b void käsekaufen, int käsekaufen, je nachdem was gebraucht wird?
Genau. Du erstellst eine Funktion ja aus einem bestimmten Grund, z.B. zur Strukturierung. Du hast also klare Ein- und Ausgabedaten. Der Rückgabetyp bezeichnet die Art der Ausgabedaten.

Das wäre dann void käsekaufen (string tilsitter, int menge)
Der Name "tilsitter" ist unglücklich gewählt, besser wäre "sorte", aber ansonsten stimmt das.

what?! :D:d
Der Ausdruck an der return-Anweisung muss zum Rückgabetyp passen. Wenn der Rückgabetyp beispielsweise int ist, kannst du nicht return "HundKatzeMaus"; oder so etwas machen.
Geschrieben

Also so versteh ich es schonmal viel besser.

Aber gibts irgendwelche Eselsbrücken um sich zu merken wo ich was schreiben muss?

vor der main muss ich es ja irgendwie anders schreiben in den runden Klammern als da, wo ich die funktion benutzte also nach der main ... und der aufruf geschieht wie? mit cout?

Geschrieben
Aber gibts irgendwelche Eselsbrücken um sich zu merken wo ich was schreiben muss?
Nicht dass ich wüsste. Das hat man aber nach ein paar Mal drauf.

vor der main muss ich es ja irgendwie anders schreiben in den runden Klammern als da, wo ich die funktion benutzte also nach der main

Langsam, das ist wieder etwas anderes.

Bevor du eine Funktion aufrufen kannst, muss sie deklariert sein. Und "bevor" heißt hier leider wirklich "weiter oben im Code". Du könntest einfach deine Funktionsdefinition vor deine main-Funktion stellen. Aber oft will man das nicht, z.B. wenn man seine Funktionen auf mehrere Dateien verteilt.

Dann muss man die Funktion deklarieren:

RÜCKGABETYP FUNKTIONSNAME(PARAM1-TYP PARAM1-NAME, PARAM2-TYP PARAM2-NAME, ...);

Das ist eine FunktionsDEKLARATION. Der Unterschied zur DEFINITION ist, dass der Rumpf mit den geschweiften Klammern fehlt. Vor einem Aufruf muss eine Deklaration stehen, die Definition darf ruhig irgendwo anders stehen.

... und der aufruf geschieht wie? mit cout?
Der Aufruf geschieht so, wie ich es oben geschrieben habe. Was du mit dem Ergebnis des Aufrufs machst, ist davon komplett unabhängig. Du kannst ihn direkt an cout übergeben, wenn du den Rückgabewert auf der Konsole ausgeben willst. Du kannst den Rückgabewert auch einer Variablen zuweisen, oder direkt als Argument für einen anderen Funktionsaufruf benutzen. Kommt drauf an, was du vorhast.
Geschrieben

Noch ein bisschen Senf zu Funktionen:

Wenn Du eine Funktion innerhalb deiner main-funktion aufrufst, dann muss der Compiler zu dem Zeitpunkt, an dem er deinen Quelltext in ein lauffähiges Programm übersetzt, bereits etwas von der Funktion wissen (nicht, was sie macht, sondern einfach nur, dass es sie gibt).

Das, was Du also vor deiner main-Funktion hinschreibst, nennt man den "Prototyp". Das gleiche geht auch mit Klassen und zum Beispiel auch mit Strukturen.

Bei Funktionen ist dieser Prototyp die Signatur der Funktion, als der Rückgabetyp, dann der Name und dann in den runden Klammern noch die Parameter. Wenn Du Dir jetzt beispielsweise eine Funktion zum addieren von zwei Zahlen schreiben willst dann schreibst Du beispielsweise

int addiereAundB( int a, int b );

Dann weiss der Compiler, dass es eine Funktion gibt, die 2 Ganzzahlen als Parameter entgegen nimmt und eine Ganzzahl zurück gibt.

Wenn Du das gleiche Verhalten für Gleitkommazahlen umsetzten wolltest, dann sähe die Signatur wie folgt aus:

float addiereAundB( float a, float b );

Wenn Du weiter unten dann irgendwann die Funktion implementierst, dann schreibst du genau das nochmal, aber diesmal mit Funktionsrumpf ( das zwischen { und } ).

Also: float addiereAundB( float a, float b ) {

return a+b;

}

Das Schlüsselwort return bedeutet, dass an dieser Stelle etwas zurückgegeben wird, also die addiereAundB-Funktion etwas zurückgibt.

Zum Schluss noch eine Sache zu Pointern:

Bei den beiden Beispielen oben wird der Funktion der tatsächliche Wert der Variablen übergeben, also beispielsweise 2 und 5. Das nennt sich "Call-by-Value". Wenn Du jetzt mit Pointern arbeiten würdest, dann spricht man von "Call-by-Reference", es wird also nicht der tatsächliche Wert übergeben, sondern "nur" ein Verweis, also die Information (Speicheradresse) wo der Wert steht.

Ein wenig abstrakter: "Call-by-Value" arbeitet mit einer Kopie, "Call-by-Reference" arbeitet mit der gleichen Variable.

Ich hoffe, das war jetzt nicht zu kompliziert, und ich konnte Dir ein klein wenig Erleuchtung bringen.

Grüße, Sh4dow

PS: Falls Du Dich noch ein bisschen tiefer in die Materie einarbeiten möchtest, dann empfehle ich Dir das openbook "C von A bis Z" bei Galileo Computing (Link: Galileo Computing :: C von A bis Z)

Das Buch beschäftigt sich zwar mit C, aber da C++ eine Weiterentwicklung (z.B. OOP) von C ist, sind viele Dinge gleich.

Geschrieben

Ich habe da einen komplett unorthodoxen Vorschlag:

Vergiss erst einmal C/C++, die Schule etc.

Als nächstes kannst Du Dir mal: How to Think Like a Computer Scientist — How to Think Like a Computer Scientist: Learning with Python 3 durchlesen.

Da geht es um die Grundlagen. Allerdings in einer für dich neuen -aber sei beruhigt: einfach zu erlernenden- Sprache.

Ich denke, dort wirst Du das Handwerkszeug, was Dir noch fehlt, erlernen. Und wenn Du einigermassen Fuß gefasst hast, kannst Du hier reinschauen: C++ Language Tutorial - C++ Documentation

Geschrieben

@Shadow, dankeschön, klingt schonmal richtig gut. : )

werde einfach mal weng üben usw. :)

@lilith2k3, nocheine programmiersprache :D ohje ...

werd aber auchmal reingucken. fang gleich heute nach der schule an, schreib in c++ am 19.6 schulaufgabe ...

  • 4 Wochen später...
Geschrieben

1. Berechnen Sie den durchschnittlichen Quartals-Umsatz nach Eingabe der einzelnen Quartalsumsätze durch den Anwender.

2. Ermitteln Sie den größten und den kleinsten Umsatz mit den Funktionen

- double max_such (double adUmsatz[], int iAnzahl)

- double min_such (double adUmsatz[], int iAnzahl)

3. Der Anwender soll die Möglichkeit erhalten, die eingegebenen Werte nachträglich zu ändern, - die bisher ermittelten Ergebnisse sollen für diesen Fall dann neu berechnet werden.

Wäre jemand so freundlich und würde mir vllt erklären wie man das Lösen soll -.-

PS: adUmsatz, das "ad" steht für array und double, wurde in meiner Schule so eingeführt um sich leichter zurecht zu finden.

das "i" bei iAnzahl steht dann für integer.

Wäre nett von euch, wenn ihr mir bisschen helfen könntet da morgen (19.06.2012) die letzte Schulaufgabe in dem Jahr ansteht und ich auf 4,2 stehe -.-

Grüße tschulian.

Geschrieben

Also, zu 1):

Bei 4 Quartalen berechnet sich der Durchschitt wie folgt: durchschnitt = ( q1 + q2 + q3 + q4) / 4

Zu 2): Du musst den beiden Funktionen das entsprechende Array und die Größe des Arrays (also der Elemente im Array) übergeben, da die Funktionen sonst nicht wissen, wie viele Elemente es im Array gibt.

Zu 3):

Das Zauberwort heisst hier "Schleifen": Sowohl die Eingabe der Umsätze als auch die Möglichkeit, Eingaben zu korrigieren lassen sich mit Hilfe von Schleifen umsetzen...

Ich hoffe, das reicht Dir erstmal... Du hast ja mehr davon, wenn Du dir das selbst erarbeitest ;)

Geschrieben

Aufgabe:

1. Berechnen Sie den durchschnittlichen Quartals-Umsatz nach Eingabe der einzelnen Quartalsumsätze durch den Anwender.

2. Ermitteln Sie den größten und den kleinsten Umsatz mit den Funktionen

- double max_such (double adUmsatz[], int iAnzahl)

- double min_such (double adUmsatz[], int iAnzahl)

3. Der Anwender soll die Möglichkeit erhalten, die eingegebenen Werte nachträglich zu ändern, - die bisher ermittelten Ergebnisse sollen für diesen Fall dann neu berechnet werden.

Danke an Shadow für seine Tipps!

Hier der Code, den ich zusammen mit meinem Arbeitskollegen geschrieben habe

(er kann wenigstens erklären, was die Lehrer unsere Berufschule NICHT können.:cool:..)


#include<iostream>

using namespace std;

double max_such(double adUmsatz[], int iAnzahl);

double min_such(double adUmsatz[], int iAnzahl);



int main()


{

char cNochmal='n';

do{

double umsaetze[4];

double summe, durchschnitt;

cout<<"Bitte geben Sie die Umsätze ein:"<<endl;

cout<<"Q1: ";

cin>>umsaetze[0];

cout<<"Q2: ";

cin>>umsaetze[1];

cout<<"Q3: ";

cin>>umsaetze[2];

cout<<"Q4: ";

cin>>umsaetze[3];

summe = umsaetze[0] + umsaetze[1] + umsaetze[2] + umsaetze[3];

durchschnitt = summe / 4;

cout<<"Der durschnittliche Quartalsumatz betaegt: "<<durchschnitt<<" EUR"<<endl;

cout<<"Maximalwert: "<<max_such(umsaetze,4)<<endl;

cout<<"Minimalwert: "<<min_such(umsaetze,4)<<endl;

cout<<"Moechten Sie Ihre eingabe Aendern? (j/n): ";

cin>>cNochmal;


}while(cNochmal=='j' || cNochmal=='J');

cin.get();cin.get();

return 0;

}



double max_such(double adUmsatz[], int iAnzahl)

{

double dMax=0;

for(int i=0;i<iAnzahl;i++)

{

if(adUmsatz[i]>dMax)

{

dMax = adUmsatz[i];

}

}

return dMax;

}



double min_such(double adUmsatz[], int iAnzahl)

{

double dMin;

dMin = adUmsatz[0];

for(int i=0;i<iAnzahl;i++)

{

if(adUmsatz[i]<dMin)

{

dMin = adUmsatz[i];

}

}

return dMin;

}

Irgendwelche Verbesserungsvorschlaege um z.b schreibarbeit zu ersparen in der schriftl. Schulaufgabe (wir dürfen dafür keinen Rechner verwenden)

Geschrieben
Man benutzt Funktionen aus 2 Gründen:

  • Um Wiederholungen zu vermeiden. Wenn dasselbe Stück Code mehrfach im Programm auftaucht, lagert man das Stück in eine Funktion aus. Denn doppelter Code birgt die Gefahr, dass man irgendwann eine Stelle ändert (z.B. ein Bugfix), aber die andere(n) nicht.
  • Um den Code zu strukturieren. Wenn man bestimmte Teilaufgaben mit klaren Ein- und Ausgabedaten abgrenzen kann, reduziert man die Gefahr, dass sich irgendwelche Abhängigkeiten quer durchs Programm einschleichen.

Soweit klar?

Außerdem wird damit der ausführbare Code deutlich kleiner - eine Funktion kann beliebig oft verwendet werden und ist dennoch nur einmal im Code enthalten. (bei Macros ist das anders - die werden vorm eigentlichen Compiler, vom Preprocessor, tatsächlich im Source eingefügt/ersetzt).

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