tschulian Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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 Zitieren
Klotzkopp Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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. Zitieren
tschulian Geschrieben 22. Mai 2012 Autor Geschrieben 22. Mai 2012 Danke Ja, deine Signatur entspricht glaub genau dem Inhalt des ersten Postes von mir :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... Zitieren
Klotzkopp Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 Ist dir denn klar, warum man Funktionen benutzt? Ginge ja auch ohne Aus dem Warum ergibt sich das Was, Wo und Wie. Zitieren
tschulian Geschrieben 22. Mai 2012 Autor Geschrieben 22. Mai 2012 Naja, um strukturiert zu programmieren und eig um das verständnis zu erleichtern... Bei mir bringt es genau das gegenteil. -.- Zitieren
Klotzkopp Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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? Zitieren
127.0.0.1 Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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. Zitieren
flashpixx Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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.... Zitieren
127.0.0.1 Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 ich dachte, bei einem 4er-kandidat muss man mal ein bischen weiter ausholen.... Zitieren
tschulian Geschrieben 22. Mai 2012 Autor Geschrieben 22. Mai 2012 @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 -.- Zitieren
Klotzkopp Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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. Zitieren
tschulian Geschrieben 22. Mai 2012 Autor Geschrieben 22. Mai 2012 (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 Bearbeitet 22. Mai 2012 von tschulian Zitieren
Klotzkopp Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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?! :dDer 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. Zitieren
tschulian Geschrieben 22. Mai 2012 Autor Geschrieben 22. Mai 2012 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? Zitieren
Klotzkopp Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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. Zitieren
Sh4dow Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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. Zitieren
lilith2k3 Geschrieben 22. Mai 2012 Geschrieben 22. Mai 2012 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 Zitieren
tschulian Geschrieben 23. Mai 2012 Autor Geschrieben 23. Mai 2012 @Shadow, dankeschön, klingt schonmal richtig gut. : ) werde einfach mal weng üben usw. @lilith2k3, nocheine programmiersprache ohje ... werd aber auchmal reingucken. fang gleich heute nach der schule an, schreib in c++ am 19.6 schulaufgabe ... Zitieren
tschulian Geschrieben 18. Juni 2012 Autor Geschrieben 18. Juni 2012 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. Zitieren
Sh4dow Geschrieben 18. Juni 2012 Geschrieben 18. Juni 2012 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 Zitieren
tschulian Geschrieben 18. Juni 2012 Autor Geschrieben 18. Juni 2012 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) Zitieren
Aras Geschrieben 18. Juni 2012 Geschrieben 18. Juni 2012 Was machst du wenn du mehr als 4 Quartale hast? Zitieren
lilith2k3 Geschrieben 18. Juni 2012 Geschrieben 18. Juni 2012 Was machst du wenn du mehr als 4 Quartale hast? In einem Jahr? Wird wohl kaum der Fall sein Ansonsten würde ich das mit gesonderten Funktionen für Jahre realisieren P.S.: Hungarian notation is ugly! Zitieren
metux Geschrieben 19. Juni 2012 Geschrieben 19. Juni 2012 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). Zitieren
Empfohlene Beiträge
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.