[Home]
für Einsteiger!
Seite:  [1] - Drucken

Inhalt:


Durchatmen - Zusammenfassung des vierten Teils


[drucken]

Datum und Uhrzeit

Um die Zeit herauszufinden, kannst du wie folgt vorgehen:
Quelltext[376B]Download
  1. //datumzeit.cpp
  2. //Gibt Datum&Zeit aus
  3. #include <iostream>
  4. #include <ctime>
  5.  
  6. int main()
  7. {
  8. std::time_t zeit;
  9. std::tm *jetzt;
  10.  
  11. zeit = std::time(0);
  12. jetzt = std::localtime(&zeit);
  13.  
  14. std::cout << jetzt->tm_mday << '.' << jetzt->tm_mon+1 << '.'
  15. << jetzt->tm_year+1900 << " - " << jetzt->tm_hour
  16. << ':' << jetzt->tm_min << std::endl;
  17.  
  18. return 0;
  19. }
  20.  

 
"std::time_t" und "std::tm" dienen zum Speichern der Informationen! Sie kommen aus "ctime":
  • "std::time_t" ist eigentlich ein "long"-Wert. In ihm werden die Sekunden seit dem 1.1.1970 gespeichert, wenn man die Funktion "time()" aufruft und den Rückgabewert übergibt. Alternativ kann auch die Addresse eines Zielobjekts (Typ: "std::time_t") übergeben werden (Call-by-reference!). Verwendet man "0" als Parameter, wird der Wert einfach zurückgegeben.

 
1179417811
Ist nicht der Code meines Panzerschranks, sondern der Wert von "zeit" zu diesem Augenblick. Dies hat sich allerdings auch soeben wieder geändert... ;)
 
  • "tm" ist eine Ansammlung von anderen Werten. Es handelt sich hierbei um integer, welche das Datum in für uns lesbarer Form speichern:
    • Tag
    • Monat
    • Jahr
    • Stunde
    • Minute
    • Sekunde
    • Wochentag
    • Sommerzeit?

 
Um aus unserer tollen Zahl ein solches Datum zu erzeugen, müssen wir nur die Funktion "localtime()" aufrufen. Als Parameter wird die Zeit als "time_t" übergeben, zurück wird ein "tm" gegeben. Nun können die Werte ausgelesen werden:
 
1179417811
17.5.2007 - 18:3 //3 Minuten nach sechs... ;)

 
Wichtig ist das folgende:
Was? Bemerkungen Wert Name der Variable
Tag des Monats 1-31 tm_mday
Monat im Jahr 0-11 tm_mon
Jahr seit 1900
---
tm_year
Tage seit Sonntag Wochentag 0-6 tm_wday
Tage seit Neujahr
---
0-365 tm_yday
Stunden
---
0-23 tm_hour
Minuten
---
0-59 tm_min
Sekunden
---
0-59 (61) tm_sec
Sommerzeit
---
s.u. tm_isdst
Die Pfeile ("->") geben an, dass die Eigenschaft ausgelesen werden soll. Normalerweise verwendet man Punkte ("."), da wir aber mit einem Zeiger arbeiten sind die Pfeile nötig. (mehr dazu im Kapitel über OOP!)

namespaces - Namensräume

Du erinnerst dich an das erste Programm, in dem wir einen Text ausgegeben haben? Wir haben "std::cout" benutzt. Wir hätten ebenso "cout" nutzen und "using namespace std;" unter die "#include"-Zeile(n) schreiben können:

using namespace std;  =  //using namespace std;
cout << "bla"; std::cout << "bla";


Namespaces wurden eingeführt, um Namenskonflikte zu verhindern. So kann man seine Funktionen nennen wie man will, ohne Angst haben zu müssen, dass es eine Funktion mit diesem Namen bereits gibt.
Daher sollte man "using namespace std;" eigentlich nicht nutzen. Aber man kann (und sollte bei größeren Projekten) auch eigene Namespaces definieren: Dies läuft genauso ab, wie beim schreiben von Funktionen - aber ohne runde Klammern:

Beispiel

Unser Beispiel-Namespace enthält eine Variable, welche wir ebenfalls außerhalb des Namespaces angelegt haben:
Quelltext[809B]Download
  1. //namespaces.cpp
  2. // Erklärt, was Namespaces sind, und wie man sie nutzt
  3.  
  4. #include <iostream>
  5.  
  6. //KEIN USING NAMESPACE STD
  7.  
  8. int i; //globale Variable
  9.  
  10. namespace nasenbaer
  11. {
  12. int i; //Variable gehört zum Namespace "Nasenbaer"
  13. void sages()
  14. {
  15. ::std::cout << "Test!\n"; //::std::cout bedeutet:
  16. // "gehe in den obersten Namespace,
  17. // suche NS "std",
  18. // suche "cout"...
  19. }
  20. }
  21.  
  22. int main()
  23. {
  24. ::i=3; //"::" ist der oberste NS!
  25. // Kann hier auch weggelassen werden!
  26. ::Nasenbaer::i=5;
  27. ::Nasenbaer::sages();
  28. ::std::cout << " " << ::i << "<->" << ::Nasenbaer::i;
  29. ::std::cout << "\nEnde..." << std::endl;
  30. return 0;
  31. }
  32.  

Abschluss

Während es bei kleinen Programmen oder Beispielen wirklich egal ist, ob du namespaces nutzt, solltest du es bei größeren Projekten tun! Ansonsten bieten Anweisungen wie "using std::cout" eine Alternative:
Hier wird nicht der gesamte namespace, sondern nur die Funktion "cout" einbezogen!

Zufallswerte und Zufallszahlen

C++ bietet einen Zufallszahlengenerator. Für die Meisten Fälle reicht dieser aus, ansonsten kann man sich auch mit denen der "Boost"-Bibliothek behelfen. Dazu später mehr!
 

rand()

Diese Funktion findet sich in "<cstdlib>" und liefert einen Zufallswert von 0 bis "RAND_MAX". Dieser "Zufallswert" wird über eine komplexe Formel berechnet. Daher handelt es sich auch immer um die gleichen Zahlen in der gleichen Reihenfolge:
Quelltext[351B]Download
  1. //zufall1.cpp
  2. //Gibt "Zufallszahlen" aus...
  3. #include <iostream>
  4. #include <cstdlib>
  5.  
  6. int main()
  7. {
  8. std::cout << "Zufallszahlen?\n";
  9. std::cout << "\"RAND_MAX\": " << RAND_MAX << "\n\n";
  10. std::cout << "Zahl 1: " << std::rand() << "\n";
  11. std::cout << "Zahl 2: " << std::rand() << "\n";
  12. std::cout << "Zahl 3: " << std::rand() << "\n";
  13. return 0;
  14. }
  15.  

srand()

Mit dieser Funktion kannst du den Zufallszahlengenerator initialisieren! Dies geschieht genau einmal am Anfang des Programms. Die Funktion erwartet einen "unsigned int" als Parameter. Hier kann man z.B. die Zeit übergeben:
Quelltext[395B]Download
  1. //zufall2.cpp
  2. //Gibt Zufallszahlen aus...
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <ctime>
  6.  
  7. int main()
  8. {
  9. std::srand(std::time(0));
  10. std::cout << "Zufallszahlen!\n";
  11. std::cout << "\"RAND_MAX\": " << RAND_MAX << "\n\n";
  12. std::cout << "Zahl 1: " << std::rand() << "\n";
  13. std::cout << "Zahl 2: " << std::rand() << "\n";
  14. std::cout << "Zahl 3: " << std::rand() << "\n";
  15. return 0;
  16. }
  17.  
  18.  

Solange man das Programm nicht innerhalb einer Sekunde mehrfach aufruft, bekommt man nun die gewünschten Zahlen! (daher auch nur 1 Aufruf von "srand()")!

Einen Würfel simulieren

Um einen Würfel zu simulieren, wollen wir einfach mal Zufallszahlen zwischen 1 und 6 ausgeben... Klingt einfach, ist einfach:
  • Zufallszahlen initialisieren (mit "srand" und "time")
  • Zufallszahl erzeugen
  • Wert zwischen 0 und "RAND_MAX" so umformen, dass man eine Zahl von 1 bis 6 bekommt...
In C++ sieht das folgendermaßen aus:
Dabei wird ausgenutzt, das der Rest beim Teilen durch 6 (Stichwort: "Modulo"/"%") zwischen 0 und (6-1)=5 liegt. Einfach noch eins addieren und fertig:
int augen = rand()%6+1;

Dateien

Wenn man Variablen oder Einstellungen auch nach dem Ende des Programmablaufs behalten möchte, muss man diese auf der Festplatte speichern. Dies geschieht in Form von Dateien. Dabei muss man zwischen Text- und Binärdateien unterscheiden, wobei erstere portabler sind als binäre und sich auch von Hand anpassen lassen.
 
Um mit Dateien arbeiten zu können, muss man "<fstream>" inkludieren. Danach stehen folgende Datentypen zur Verfügung:
  • ifstream (in Datei schreiben)
  • ofstream (aus Datei lesen)
  • fstream (lesen und schreiben)

Ein Handle

Um mit einer Datei arbeiten zu können, benötigen wir ein Dateihandle. Ein Handle ist eine Variable, die die Datei darstellt. Dieses Handle kann nun entweder vom Typ ifstream, ofstream oder fstream sein!
Quelltext
  1. #include <fstream>
  2. /*...*/
  3. std::fstream fdh; //Dateihandle erstellen
  4. std::ifstream idh; //Dateihandle erstellen
  5. std::ofstream odh; //Dateihandle erstellen
  6.  

Datei öffnen

Nun können wir diesem Handle eine Datei zuweisen:
Quelltext
  1. dh.open("test.txt", /*wie?*/);
  2.  

 
Für "wie" können wir nun folgende Werte einsetzen:
lesen ios::in
schreiben ios::out
Inhalt anhängen ios::app
Datei vorher löschen ios::trunc
Cursor ans Ende setzen ios::ate
Binäre (Daten-) Datei ios::binary

Mehrere dieser Eigenschaften kann man mit "|" verknüpfen. Um also eine Datei zum Schreiben zu öffnen, etwa ein Logfile, das zu Beginn geleert werden soll, müsste man schreiben:
Quelltext
  1. dh.open("logfile", std::ios::out|std::ios::trunc);
  2.  
  3. //Alternativ:
  4. ofstream log("test.log", std::ios::out|std::ios::trunc);
  5.  

 
Der zweite Parameter darf entfallen. Wird er nicht angegeben, werden die Standardwerte genutzt. Diese sind, je nach Typ des Handles:
ifstreamios::in
ofstreamios::out
fstreamios::in|ios::out

Nun sollte man noch überprüfen, ob die Datei erfolgreich geöffnet wurde. Dies geschieht am Besten durch:
Quelltext
  1. if ( dh.is_open() )
  2. {
  3. //Alles OK!
  4. }
  5.  

Datei lesen

Um eine Datei lesen zu können, solltest du natürlich "ios::in" verwenden. Danach kannst du den Inhalt mit den folgenden Funktionen problemlos auslesen. Dabei musst du dir vorstellen, dass du einen Cursor in der Datei bewegst, fast wie in einem Editor, der die Stelle angibt, an der du gerade liest! (Zum Ändern der Cursor-Position gleich noch mehr!)
Funktion Rückgabe Parameter Bemerkung
dh.get() char - Liest ein Zeichen
dh.getline(char*,int) - wohin und wie viele Zeichen maximal? Eine Zeile, oder max. Anzahl; liest auch Leerzeichen ein
dh >> string - - String wird gelesen, aber nur bis zum nächsten Leerzeichen/Zeilenumbruch (wie "cin")

Datei schreiben

Nachdem du die Datei mit "ios::out" geöffnet hast, kannst du mit den folgenden Funktionen in sie schreiben. Auch dabei musst du dir einen Cursor denken, der eine Position in der Datei angibt, an der du schreibst!
Funktion Parameter Bemerkung
dh.put(char) Zeichen Ein Zeichen
dh << string - String wird geschrieben, auch Leerzeichen (Wie "cout")!

Datei schließen

Um eine Datei zu schließen, und das Handle wieder gebrauchen zu können, muss man:
Quelltext
  1. dh.close();
  2.  

aufrufen. Nun wird die Datei auf die Festplatte geschrieben (Vorher wurde sie zum Schnellzugriff im RAM (Arbeitsspeicher) behalten). Um dieses Verhalten hervorzurufen, kann man auch:
Quelltext
  1. dh.flush();
  2.  

schreiben. Hierbei wird nur die Datei auf die Festplatte gebannt, dass Handle bleibt offen!

Den "Cursor" setzen - sich in der Datei orientieren

Um sich in einer Datei zu orientieren gibt es die folgenden Möglichkeiten. Dabei muss man zwischen Aus- und Eingabecursor unterscheiden!
Quelltext
  1. seekg(int); //[ifstream] setzt den Cursor
  2. seekp(int); //[ofstream]
  3.  
  4. int i=tellg(); //[ifstream] liefert die Position zurück
  5. int i=tellp(); //[ofstream]
  6.  

Die "seek"-Funktionen können außerdem einen weiteren Parameter haben (standardmäßig "ios::beg"), der angibt, von welchem Punkt ausgegangen werden soll. Von diesem Punkt wird dann der erste Parameter weitergezählt und der Cursor gesetzt!
Parameter Position, von der gelesen wird
ios::beg Dateianfang
ios::cur aktuelle Position
ios::end Dateiende

EOF - End of file und andere Flags

Flags sind "bool"-Werte, die den Status ("Flags") beschreiben. Mit den folgenden "Funktionen" kannst du die Dateiarbeiten überwachen:
dh.bad() Gibt "true" zurück, wenn das Schreiben fehlschlägt, etwa weil keine Datei geöffnet ist oder kein Platz mehr vorhanden ist! Ist alles OK, wird "false" zurückgegeben.
dh.fail() Wie "bad()", aber gibt ebenfalls "true" zurück, wenn wir z.B. eine Zahl einlesen wollen, dort aber ein Buchstabe steht... Bei "false" ist alles OK.
dh.eof() Gibt "true" zurück, wenn das Dateiende erreicht wurde.
dh.good() Das wichtigste so genannte "Flag" (Alles in dieser Tabelle sind "Flags"): Gibt "true" zurück, wenn alle anderen oben genannten Werte "false" sind, also alles OK ist!
Oft wird "while(dh.good())" geschrieben, um eine Datei auszulesen...

Binäre Dateien

Da binäre Dateien nicht wie Textdateien schön formatiert sind, kommt man mit den oben genannten Methoden nicht weit. Zum Lesen oder Schreiben brauchen wir etwas neues: (Datei muss mit "ios::binary" geöffnet sein!)
Wie du weißt, hat ein "char" eine Größe von genau einem Byte. Eine Binärdatei kann sehr einfach und "byteweise" gelesen werden. Dazu benötigen wir die beiden folgenden Funktionen:
Quelltext
  1. read(wohin, wieviel);
  2. write(woher, wieviel);
  3.  

"wohin" und "woher" sind Zeiger auf "char", oder der Name eines char-Arrays, wenn wir mehr als ein Byte einlesen wollen. "wieviel" ist dann die Größe in Byte!

Textdateien

Textdateien sind alle Dateien, die wir ohne "ios::binary" öffnen. Hier werden also Zeichen bereits interpretiert, etwa "\n" und Co. Die Dateien enthalten ASCII-Zeichen o.ä.
Quelltext[1kB]Download
  1. //textfile.cpp
  2. // Beispiel zu Textdateien
  3.  
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. int main()
  8. {
  9. std::ifstream idatei;
  10. std::ofstream odatei;
  11. std::string zeile;
  12.  
  13. //----------------------------------------------------------------------------
  14. // SCHREIBEN: "test.txt"
  15. //----------------------------------------------------------------------------
  16.  
  17. odatei.open("test.txt");
  18. //Abbrechen, wenn Fehler:
  19. if (!odatei.good())
  20. {
  21. std::cout << "Fehler: Datei kann nicht geoeffnet werden!" << std::endl;
  22. return -1;
  23. }
  24. odatei << "Zeile 1\n";
  25. odatei << "Zeile 2\n";
  26. odatei << "Zeile x\n";
  27. odatei.close();
  28.  
  29. //----------------------------------------------------------------------------
  30. // LESEN: "test.txt"
  31. //----------------------------------------------------------------------------
  32.  
  33. idatei.open("test.txt");
  34. //Abbrechen, wenn Fehler:
  35. if (!idatei.good())
  36. {
  37. std::cout << "Fehler: Datei nicht gefunden!" << std::endl;
  38. return -2;
  39. }
  40. while (idatei.good())
  41. {
  42. std::getline(idatei, zeile); //Eine Zeile in "zeile" speichern...
  43. std::cout << zeile << std::endl; // ...und ausgeben
  44. }
  45. idatei.close();
  46.  
  47. return 0;
  48. }
  49.  

Textfile-Beispiel
>

Binärdateien

Binäre Dateien lesen wir mit "read()" und schreiben sie mit "write()". Ich hoffe, das folgende Beispiel verdeutlicht das. Du wirst direkt erkennen, das es etwas komplizierter ist, und du Pointer kennen solltest:
Quelltext[2kB]Download
  1. //binfile.cpp
  2. // Beispiel zu Binärdateien
  3.  
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. int main()
  8. {
  9. std::ifstream idatei;
  10. std::ofstream odatei;
  11. std::ifstream::pos_type size;
  12. char* im_ram; //Ein Pointer auf ein char(-Array)
  13.  
  14. //----------------------------------------------------------------------------
  15. //Eine Binärdatei einlesen,
  16. // im RAM zwischenspeichern (komplett)
  17. // und Kopie anlegen
  18. //----------------------------------------------------------------------------
  19.  
  20. idatei.open("test.exe", std::ios::in|std::ios::binary|std::ios::ate);
  21. //Halt irgendeine Datei... (Wir beginnen am Ende ("ate")
  22. if (idatei.good())
  23. {
  24. size=idatei.tellg(); //Größe ermitteln...
  25. std::clog << "Datei \"test.exe\" ist " << size << "Byte gross!" <<std::endl;
  26.  
  27. im_ram=new char[size]; //Genug Arbeitsspeicher reservieren
  28. idatei.seekg(0, std::ios::beg); //An den Anfang...
  29. idatei.read(im_ram, size);
  30.  
  31. if (idatei.good()) std::clog << size << " Byte gelesen!" << std::endl;
  32. else std::clog << "Fehler: 0 Byte gelesen!" << std::endl;
  33. idatei.close();
  34.  
  35. odatei.open("test2.exe", std::ios::out|std::ios::binary|std::ios::trunc);
  36. if (odatei.good())
  37. {
  38. odatei.write(im_ram,size);
  39. if (odatei.good()) std::clog << size << " Byte geschrieben!" << std::endl;
  40. else std::clog << "Fehler: 0 Byte geschrieben!" << std::endl;
  41. odatei.close();
  42. }
  43. else std::clog << "Fehler: Ausgabedateifehler!" << std::endl;
  44. }
  45. else std::clog << "Fehler: Eingabedateifehler!" << std::endl;
  46.  
  47. return 0;
  48. }
  49.  

Binfile-Beispiel
 
Ein weiteres Beispiel folgt im Kapitel über die OOP, wenn wir große Mengen an Daten auf einmal speichern!
Leider kann man nicht immer eine Binärdatei nehmen, da diese nicht von einem Rechner auf einen anderen Rechner übertragen werden können, falls es sich um verschiedene Systeme handelt. Obwohl es meist keine Probleme gibt, kann es bei Systemen mit "Little-Endian" und Systemen mit "Big-Endian" Probleme geben, wenn man Dateien übernehmen möchte...
(siehe auch: http://de.wikipedia.org/wiki/Byte-Reihenfolge)

Dateigröße ermitteln

Um die Größe zu ermitteln, gehen wir zuerst an den Dateianfang, dann ans Dateiende, und gucken dann, wie viele Bytes dazwischenlagen...:
Quelltext[615B]Download
  1. //filesize.cpp
  2. // Gibt die Groesse einer Datei aus...
  3.  
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. int main()
  8. {
  9. long anfang, ende;
  10. std::ifstream datei("test.txt");
  11.  
  12. //Abbrechen, wenn Fehler:
  13. if (!datei.good())
  14. {
  15. std::cout << "Fehler: Datei nicht gefunden!" << std::endl;
  16. return -1;
  17. }
  18.  
  19. //Jetzt Groesse bestimmen:
  20. anfang=datei.tellg(); //Der Dateianfang
  21. datei.seekg(0,std::ios::end); //Ans Ende gehen
  22. ende=datei.tellg(); //Das (Datei-)Ende!
  23.  
  24. datei.close();
  25. std::cout << "Datei \"test.txt\" ist " << (ende-anfang)
  26. << "Byte gross!" << std::endl;
  27. return 0;
  28. }
  29.  

Filesize-Beispiel

Formatierte Ausgaben

Um Ausgaben mit "cout" ein wenig zu formatieren, gibt es eine weitere Erweiterung, die Datei "<iomanip>". Also einfach direkt unter "iostream" einbinden! Nun können wir mit den folgenden Kommandos die Ausgabe beeinflussen:
Wie? Was?
setw(int breite) setzt die minimale Größe der direkt folgenden Ausgabe
setprecision(int praez) Gibt die Zahl der Stellen für Festkomma- oder Gleitkommadarstellung hinter dem Komma an, ansonsten die Maximalzahl der Stellen.
setiosflags s.u.
resetiosflags s.u.

 
Nun zu den "flags":
Flag Gruppe Was?
left adjustfield links ausrichten
right adjustfield rechts ausrichten
internal adjustfield +/- links und Zahl rechts
dec basefield Zahlen dezimal ("normal") ausgeben
hex basefield Zahlen hexadezimal ("Sechzehnersystem") ausgeben
oct basefield Zahlen oktal ("Achtersystem") ausgeben
showbase   zeigt Dezimalbasis von hex- und oct-Zahlen
showpos   "+" vor positive Zahlen
uppercase   Großschreibung
fixed floatfield Festkommazahl
scientific floatfield wissenschaftliche Darstellung

 

Anwendung

Die folgenden Zeilen:
Quelltext
  1. std::cout << std::setfill (' ') << std::setw (10) << std::setprecision (5);
  2. std::cout << 1234.5678;
  3.  

führen zu einer Ausgabe von "____1234.5" ("_"=Leerzeichen!)
 
Um Flags zu nutzen, musst du sie wie folgt aktivieren:
Quelltext
  1. std::cout.setf (std::ios::/*Flag*/, std::ios::/*Gruppe*/)
  2.  
  3. std::cout << std::setiosflags (std::ios::/*Flag*/, std::ios::/*Gruppe*/)
  4.  

Das Deaktivieren geht wie folgt:
Quelltext
  1. std::cout.unsetf (std::ios::/*Flag*/)
  2. std::cout << std::resetiosflags (std::ios::/*Flag*/)
  3. //(ohne Gruppe)
  4.  
  5. std::cout.unsetf (std::ios::/*Gruppe*/)
  6. std::cout << std::resetiosflags (std::ios::/*Gruppe*/)
  7. //Alle Flags einer Gruppe auf Standartwerte
  8.  

Callbacks (Funktionszeiger)

Einen Funktionszeiger legst du an, indem du den Funktionsnamen ohne Klammern ausliest: (aus "beenden()" wid "beenden")

Ein Beispiel

Quelltext[689B]Download
  1. //callback.cpp
  2. // Demonstriert den Einsatz von Funktionszeigern
  3.  
  4. #include <iostream>
  5. #include <cmath>
  6.  
  7. void ausgeben();
  8. void beenden ();
  9. double wurzel(int,void bei_fehlern()); //Für reelle Zahlen
  10.  
  11. int main()
  12. {
  13. //Wurzel aus "-1" ist nicht reell:
  14. wurzel(-1, ausgeben); //Bei Fehler: Einfach ausgeben
  15. wurzel(-1, beenden ); //Bei Fehler: Beenden
  16. return 0;
  17. }
  18.  
  19. void ausgeben()
  20. {
  21. std::cout << "Es ist ein nicht fataler Fehler aufgetreten!" << std::endl;
  22. }
  23.  
  24. void beenden()
  25. {
  26. std::cout << "Es ist ein fataler Fehler augetreten!" << std::endl;
  27. std::exit(-1);
  28. }
  29.  
  30. double wurzel(int wovon, void bei_fehlern())
  31. {
  32. if (wovon<0) bei_fehlern(); //Aua!
  33. else return std::sqrt(wovon);
  34. }
  35.  

author@laptop:~/cpp$ ./callback
Es ist ein nicht fataler Fehler aufgetreten!
Es ist ein fataler Fehler augetreten!
author@laptop:~/cpp$

 
Mehr Informationen: "http://www.newty.de/fpt/index.html" (Englisch)

[drucken]

Keine Beispielprogramme

Hier stehen diesmal keine Programme, die zeigen, was wir schon gelernt haben:
Ich denke wir hatten bereits genug Beispiele in den einzelnen Tutuorials... ;)

Ein paar Aufgaben

Wenn du die Aufgaben lösen kannst, solltest du dieses Kapitel verstanden haben... ;)
  1. Schreibe ein Programm, dass eine Textdatei anlegt, den Namen des Nutzers darin speichert, und ihn nur danach fragt, wenn die Datei nicht existiert... Danach soll er begrüßt werden!
  2. Schreibe nun mehrere Phrasen, mit denen der Nutzer begrüßt werden kann, etwa "Hallo " oder "Guten Tag ". Der Nutzer soll nun eine zufällige Begrüßung sehen! Profis unterscheiden auch nach Tageszeit! (Tipp: Arrays aus "std::strings")
  3. Erweitere das Programm um die Möglichkeit, den Namen und das Alter rechtsbündig auszugeben. Profis speichern den Geburtstag ab und rechnen schnell das Alter aus...!

Wie geht's weiter?

Glückwunsch! Du hast Kapitel 4 absolviert! Eigentlich kannst du jetzt schon alles, was du für Programme brauchst, aber mit der OOP kannst du im nächsten Kapitel ein weitere riesiges Konzept kennen lernen, was du SEHR oft brauchen und vorfinden wirst! Sobald du dich ein wenig damit auskennst, kannst du anfangen, graphisch zu Programmieren: Fenster, Simulationen oder Spiele! Wir sehen uns im nächsten Kapitel!
Seite:  [1] - Drucken