Unterschied der Codes?!
-
Hallo ich habe ein Problem, ich fang gerade in der 11. Klasse mit C Programmierung an, und hab erst einmal das Hello-World Programm geschrieben.
Danach hab ich ne PDF von meinem Lehrer dort ist das Hello World Programm, selstamerweise viel Komplizierter und mit lauter void funktionen, ich blicke überhaupt nicht durch:
-Was bedeuten diese void's
-warum sind die 3 variabeln im Main programm nochmals gegeben
-Wieso ist das Programm so seltsam struktoriertEinfaches Hello World
//Hier stehen Präprozessoranweisungen #include <stdio.h> #include <conio.h> //Hier beginnt das Haupt-Programm int main (void) { //Der in Anführungszeichen //stehende Text wird ausgegeben printf("Hello World\n"); printf("Press any Key!\n"); getch(); return(0); }
Verwirrendes Hello World
#include <stdio.h> #include <stdio.h> #include <conio.h> #define druck printf #define halten getch() void Text1(); void Text2(); void Bildschirmhalten(); int main(void) { Text1(); Text2(); Bildschirmhalten(); } void Text1() { druck("Hello World\n"); } void Text2() { druck("Press any key!\a\n"); } void Bildschirmhalten() { halten; } void Return() { }
-
Juice91 schrieb:
Hallo, ich habe ein Problem, ich fange gerade in der 11. Klasse mit C-Programmierung an, wir haben erst einmal das Hello-World Programm geschrieben.
Danach haben wir eine PDF-File von unserem Lehrer bekommen, dort ist das Hello World Programm, selstamerweise viel Komplizierter und mit lauter void funktionen, ich blicke überhaupt nicht durch:
-Was bedeuten diese void's
-warum sind die 3 variabeln im Main programm nochmals gegeben
-Wieso ist das Programm so seltsam struktoriertEinfaches Hello World
//Hier stehen Präprozessoranweisungen #include <stdio.h> #include <conio.h> //Hier beginnt das Haupt-Programm int main (void) { //Der in Anführungszeichen //stehende Text wird ausgegeben printf("Hello World\n"); printf("Press any Key!\n"); getch(); return(0); Verwirrendes Hello World [cpp]#include <stdio.h> #include <stdio.h> #include <conio.h> #define druck printf #define halten getch() void Text1(); void Text2(); void Bildschirmhalten(); int main(void) { Text1(); Text2(); Bildschirmhalten(); } void Text1() { druck("Hello World\n"); } void Text2() { druck("Press any key!\a\n"); } void Bildschirmhalten() { halten; } void Return() { }
Scheinbar wollte er damit ein paar neue Dinge einführen. Oder du hast im PDF-File zu weit gelesen, und er spricht diesen Code mit euch in der nächsten Stunde gemeinsam durch.
#define druck printf #define halten getch()
Mit diesen Befehlen werden die dort beschriebenen Dinge ersetzt. Wenn dort druck steht, wird es mit printf ersetzt und wenn dort halten steht wirds durch getch() ersetzt.
void Bildschirmhalten() { halten; }
Aus dieser Zeile wird also:
void Bildschirmhalten() { getch(); }
Dabei handelt es sich um eine Funktion mit dem Namen Bildschirmhalten die durch Bildschirmhalten() aufgerufen werden kann, so wie es in der main() auch gemacht wird. Es handelt sich also nicht um Variablen, sondern um Funktionen:
int main(void) { Text1(); Text2(); Bildschirmhalten(); }
Probier zum Beispiel mal folgendes:
#include <stdio.h> #include <stdio.h> void schreibHallo(); void schreibCiao(); int main() { schreibHallo(); schreibHallo(); schreibHallo(); schreibCiao(); } void schreibHallo() { printf("Hallo!\n"); } void schreibCiao() { printf("Ciao!\n"); }
Zum void: Es ist der Rückgabetyp der Funktion. In diesem Fall: Nichts.
Du könntest auch eine Zahl zurückgeben:
int gib5() // Rückgabetyp: int { return 5; // Gib 5 zurück }
Ich hoffe, dass hilft dir weiter. Ansonsten: Fragen!
Viele Grüße
-
Juice91 schrieb:
Verwirrendes Hello World...
dein 'hello world' ist kurz und knackig. so programmiert man in C. aber der andere code ist, in der tat, ziemlicher mist. so kann man niemandem C beibringen.
-
#define halten getch()
lol
-
Vielen dank! Jetzt habe ich einiges verstanden!
Aber für mich ist es immernoch nicht schlüssig wieso sich die beiden so sehr von der konstruktion unterscheiden,was sagt das hier aus:
void Text1(); void Text2(); void Bildschirmhalten();
und was hat es damit zu tun:
int main(void) { Text1(); Text2(); Bildschirmhalten();
ich verstehe dieses void einfach nicht, es gibt ja nichts an wie drucke,scanne,speichere ._:
-
Juice91 schrieb:
Vielen dank! Jetzt habe ich einiges verstanden!
Aber für mich ist es immernoch nicht schlüssig wieso sich die beiden so sehr von der konstruktion unterscheiden,was sagt das hier aus:
void Text1(); void Text2(); void Bildschirmhalten();
und was hat es damit zu tun:
int main(void) { Text1(); Text2(); Bildschirmhalten();
ich verstehe dieses void einfach nicht, es gibt ja nichts an wie drucke,scanne,speichere ._:
Denke wie ein Computer
Es handelt sich dabei um sog. Prototypen. Sie stehen da, damit der Compiler weiß, dass es diese Funktionen gibt. Er geht schließlich von Oben nach Unten. Folgendes würde nicht klappen:
int main() { blub(); // Hier kennt der Compiler blub() noch nicht } void blub() // Hier würde er es kennen, aber das ist zu spät { } // So wäre es richtig: void blub(); // Ab hier weiß er, dass es blub gibt int main() { blub(); // Hier wirds gebraucht und er kennt es. } void blub() // Und hier findet er schließlich die Funktion { }
Meinst du mit dem void eigentlich dieses: int main(void) ?
Das void ist an dieser Stelle vollkommen überflüssig, und sagt nur das die Funktion keine Parameter hat. Du kannst es also auch weglassen
-
nein ^^ ich meine
void Text1(); void Text2(); void Bildschirmhalten();
void Text1()
ich habe es in der vereinfachten version auch nicht gebraucht und verstehe den sinn nicht
-
Juice91 schrieb:
was sagt das hier aus:
void Text1(); void Text2(); void Bildschirmhalten();
das sind sogenannte 'prototypen' der funktionen, die da kommen werden. ein C compiler geht den code von oben nach unten durch. wenn eine funktion aufgerufen wird, die er noch nicht kennt, dann weiss er nicht, welche argumente und welchen rückgabewert die funktion hat. deshalb schreibt man solche prototypen hin. du kannst übrigens drauf verzichten, wenn du die funktionen vor die 'main' beförderst, bzw. wenn du verschachtelte funktionsaufrufe hast, die innerste funktion am weitesten nach oben schiebst.
-
Juice91 schrieb:
nein ^^ ich meine
void Text1(); void Text2(); void Bildschirmhalten();
void Text1()
ich habe es in der vereinfachten version auch nicht gebraucht und verstehe den sinn nicht
Das sind Funktionen. Nehmen wir an, du müsstest in deinem Programm sehr oft die gleichen Befehle ausführen. Dann bietet es sich an eine Funktion zu schreiben.
Zum Beispiel, willst du von jemanden fünf Zahlen wissen. Die eingegebene Zahl gibst du dann zurück(return). Der Rückgabetyp der Funktion ist also nicht void("nichts") sondern int:
int zahlEingeben() { int zahl; printf("Geben sie eine Zahl ein: "); scanf("%d", &zahl); return zahl; }
Diese Funktion kannst du nun einfach 5 Mal aufrufen:
#include <stdio.h> int zahlEingeben(); // Prototyp int main() { int i; for (i = 0; i < 5; ++i) { printf("Ihre Eingabe: %d", zahlEingeben()); } } int zahlEingeben() { int zahl; printf("Geben sie eine Zahl ein: "); scanf("%d", &zahl); return zahl; }
Verstehst du den Sinn?
-
ein wenig versteh ich den sinn, deine Beispiel ist ein wenig zu schwer für meine verhältnisse, weil ich soweit noch nicht bin^^
also ist void auch kein Befehl wie print o.ä?
Verwirrendes Hello World [cpp]#include <stdio.h> #include <stdio.h>//Bibliotheken für printf und getch #include <conio.h> #define druck printf //Hier hab ichs verstanden, er definiert einen neuen namen fr print und getch #define halten getch() void Text1();//Hier versteh ich nichts ich sehe kein befehl bspw. zum drucken o.ö, also was wird hier gemacht void Text2(); void Bildschirmhalten(); int main(void) // Hauptptogramm wird gestartet { Text1();//hier das selbe , peile nix ^^ Text2(); Bildschirmhalten(); } void Text1()// Denke mal, hier wird der erste teil eingeleitet { druck("Hello World\n"); // unser befehl printf } void Text2() //2 Teil { druck("Press any key!\a\n");//printf } void Bildschirmhalten() { halten; //getch() } void Return() { }
-
Juice91 schrieb:
also ist void auch kein Befehl wie print o.ä?
richtig. 'void' ist ein schlüselwort, dass in verschiedenen zusammenhängen, aber mit ähnlicher bedeutung auftreten kann.
1. vor einem funktionsnamen -> die funktion hat keinen rückgabewert
2. mutterseelenallein in der parameterliste einer funktion -> die funktion braucht keine argumente
3. in einer zeigerdeklaration -> der zeiger kann auf alles zeigen, keine typangabe
4. als type-cast vor einem funktionsaufruf -> der rückgabewert der funktion wird bewusst ignoriert.
...und bestimmt noch ein paar mehr.
-
Juice91 schrieb:
ein wenig versteh ich den sinn, deine Beispiel ist ein wenig zu schwer für meine verhältnisse, weil ich soweit noch nicht bin^^
also ist void auch kein Befehl wie print o.ä?
Verwirrendes Hello World [cpp]#include <stdio.h> #include <stdio.h>//Bibliotheken für printf und getch #include <conio.h> #define druck printf //Hier hab ichs verstanden, er definiert einen neuen namen fr print und getch #define halten getch() void Text1();//Hier versteh ich nichts ich sehe kein befehl bspw. zum drucken o.ö, also was wird hier gemacht void Text2(); void Bildschirmhalten(); int main(void) // Hauptptogramm wird gestartet { Text1();//hier das selbe , peile nix ^^ Text2(); Bildschirmhalten(); } void Text1()// Denke mal, hier wird der erste teil eingeleitet { druck("Hello World\n"); // unser befehl printf } void Text2() //2 Teil { druck("Press any key!\a\n");//printf } void Bildschirmhalten() { halten; //getch() } void Return() { }
Nein, void ist kein Befehl, sondern eine Angabe, das die Funktion "nichts" zurückliefert.
void kannst du gedanklich zu int, float und double stecken.Eine Funktion kann wahlweise einen Wert (z.B. int) oder nichts zurückliefern. Bei dem Hello World-Programm von deinem Lehrer soll ja nur eine Ausgabe auf dem Bildschirm erfolgen => kein Rückgabewert
Würdest du jetzt in der Funktion eine Berechung durchführen, dessen Ergebnis du später brauchst, dann würde statt dem void ein Datentyp stehen.
-
Danke für die Hilfe!
habe es jetzt hinbekommen ^^
#include <stdio.h> //Bibliothek stdio.h wird eingefügt für printf #include <conio.h> //Bibliothek stdio.h wird eingefügt für getch() #define druck printf //bennent printf in druck #define halten getch()//benennt getch() in halten void Hello(void);//Funktion : printf("Hello World") void Key(void);//Funktion : printf("Press any Key") void Halten(void);//Funktion : getch() int main(void) //Hauptprogramm //Hier wird das vorkommen der Funktionen bestimmt { Hello(); Hello(); Key(); Halten(); } void Hello(void)//Funktion 1 wird zugewiesen { druck("Hello Word\a\n"); } void Key(void)//Funktion 2 wird zugewiesen { druck("Press a key!"); } void Halten(void)//Funktion 3 wird zugewiesen { halten; return; }
Noch ein paar fragen ^^
-Was ist der unterschied zwischen syntax,variable,funkion,befehl..
-was sagt mir dass return aus ? was hat es für eine funktion?
-für was steht das void nach dem integer main?
-wenn void nichts bedeuted warum kann ich es dann nicht immer in leere klammern schreiben
-ist int auch eine funktion?
- wieso brauchen die am ende
Hello();
Hello();
Key();
Halten();() und ; am ende?
-
Juice91 schrieb:
Noch ein paar fragen ^^
-Was ist der unterschied zwischen syntax,variable,funkion,befehl..
-was sagt mir dass return aus ? was hat es für eine funktion?
-für was steht das void nach dem integer main?
-wenn void nichts bedeuted warum kann ich es dann nicht immer in leere klammern schreiben
-ist int auch eine funktion?
- wieso brauchen die am ende
Hello();
Hello();
Key();
Halten();() und ; am ende?
Was ist der unterschied zwischen syntax,variable,funkion,befehl..
Das würde wohl hier zu weit gehen, dir jetzt hier alles ausführlich zu erklären. Am besten liest du dir dazu einfach mal ein kleines tutorial durch.
-was sagt mir dass return aus ? was hat es für eine funktion?
Mit return kann man eine Funktion (vorzeitig) beenden und einen wert zurückgeben.int ergebnis(int a, int b) { return a+b; } ... wert = ergebnis(10,20); //ergebnis() gibt die Summe von 10 und 20 zurück
...
-für was steht das void nach dem integer main?
Das sagt aus, das der main-Funktion keine Parameter übergeben werden. Es ist auch möglich, der main-Funktion etwas zu übergeben, um sich zum Beispiel die Eingabe im Programm zu ersparen (Beispiel: format c:)-ist int auch eine funktion?
Nein, das ist ein Datentyp.- wieso brauchen die am ende
Hello();
Hello();
Key();
Halten();() und ; am ende?
() zeigt an, das es eine Funktion ist und das Semikolon wird benötigt, da jede Anweisung damit endet.
-
danke an dich und allen anderen die mir geholfen haben
-
#include <stdio.h> #include <conio.h> void Hello(); void Key(); void Halten(); int main() { Hello(); Key(); Halten(); return 0; } void Hello() { printf("Hello World\n"); } void Key() { printf("Press any key..."); } void Halten() { getch(); ; }
Ist return 0; hier überhaupt sinnvoll in meinem Programm ändert sich nichts
wenn ich return 0; am ende einfüge bekomm ich die fehlermeldung void gibt einen wert zurück, wieso ist das so ? und was müsste ich an return 0; ändern damit es keine probleme gibt, und was hätte das für auswirkungen auf mein programm
-
Juice91 schrieb:
#include <stdio.h> #include <conio.h> void Hello(); void Key(); void Halten(); int main() { Hello(); Key(); Halten(); return 0; } void Hello() { printf("Hello World\n"); } void Key() { printf("Press any key..."); } void Halten() { getch(); ; }
Ist return 0; hier überhaupt sinnvoll in meinem Programm ändert sich nichts
wenn ich return 0; am ende einfüge bekomm ich die fehlermeldung void gibt einen wert zurück, wieso ist das so ? und was müsste ich an return 0; ändern damit es keine probleme gibt, und was hätte das für auswirkungen auf mein programmIch mußte schon ein zweites mal lesen, um zu verstehen, wo du die Probleme hast, denn da, wo das return 0 jetzt steht, gibt es ja keine Probleme.
Die main()-Funktion hat den Rückgabetyp int
=> return 0 sinnvoll (auch wenn man sich das bei der main() ausnahmsweise sparen könnte, aber für die Einheitlichkeit trotzdem sinvoll)
Eine Funktion mit Rückgabetyp void (kein Rückgabewert)
=> return 0 totaler Unsinn, du hast ja festgelegt, das er keinen Rückgabewert hat und willst dann 0 zurückliefern.