Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was ist eigentlich....



Sinned
03.06.2010, 08:14
Hallo,

Ich hatte da ein paar Fragen zu einzelnen Befehlen und so. Aber ich wollte mal wissen wie ihr euch so an das lernen ranhaltet. Ich lese ein paar Minuten im Buch und dann hab ich auch schon keine lust mehr, weil ich auch vieles im Buch nicht verstehe bzw da nicht wirklich erklärt wird wann man das braucht. In der Schule siehts schon anders aus, aber da lernen wir nur 'Rechnunge aufstellen'. Die Rechnungen kommen mir schon aus dem Hals raus, seit ca 1 1/2 mach ich nix anderes. Ich glaube effektivere Sachen (kleiner Datei Manager oder so) würden einem die motivation zurückbringen, oder seh ich das falsch. Nun gut jetzt zu meinen eigentlichen Fragen.

Was bedeutet diese Zeile?
if( ! (cin >> wert) )
und
wert = cin.get()

Was ist cin.get und wann braucht man das?

Und was hat es mit wchar_t auf sich?

li0n
03.06.2010, 08:42
ICh muss zugeben dass ich mich mit C++ nicht so gut auskenne aber ich glaube dass cin.get etwas aus der standart eingabe einließt (macht cin zumindest) wchar_t inst ein Dateityp und das ! bei der If anweisung sagt denke ich dass die Bedingung nur erfüllt ist wenn das in der klammer nicht geklappt hat... (aber wie shon gesagt ich bin mir da ziemlich unsicher weil ich nicht so der Objektorientierte bin :S )

Was das lernen angeh solltest du dich bei Kapiteln wie Pionter Arrays Varriablen u.s.w. also der ganze Kram der später vorrausgesetzt wird ordentlich rein hängen wenn du dann merkst dass auf einmalalles besser klappt kommt das mit dem Spaß schon keine Bange ;)

blackberry
03.06.2010, 08:54
Was bedeutet diese Zeile?
if( ! (cin >> wert) )

Das überprüft, ob "wert" auch richtig eingelesen werden konnte (sagen wir mal wert sei ein int und du gibst als User "A" ein).
Ist die Eingabe vom User "passend", so gibt operator>> *this zurück - andernfalls 0.
Das wird als bool'scher Wert behandelt (nach C-Art: 0 = falsch, alles ungleich 0 = wahr) und durch den Negationsoperator (!) negiert.
D.h.: gibt operator>> den Wert 0 zurück, so wird der Code nach dem if ausgeführt (ich vermute mal da wird das Programm abgebrochen und ein Fehler ausgegeben).

------------------------------------
EDIT:
Ich habe mich nochmal schlau gemacht, nachdem ich versucht habe dieses Verhalten nachzuprogrammieren, jedoch auch Fehler gestoßen bin. Das mit dem 0 zurückgeben stimmt nicht wirklich und ist in der Realität etwas komplizierter.
istream's operator>> gibt IMMER eine Referenz auf das momentane Objekt (hier: cin) zurück - d.h. IMMER *this.
Darum darf man den Operator auch "verketten":
cin >> a >> b >> c; wird zu: ((cin >> a) >> b) >> c;
Da jedes mal *this zurückgegeben wird klappt das auch - würde 0 zurückgegeben werden, so würde man einen Laufzeitfehler bekommen (da 0 keine gültige Objektreferenz ist).
Über dies hinaus ist es in C++ verboten 0 einer Referenz zuzuweisen, d.h. es ist verboten 0 zurückzugeben, wenn nach der Funktionsdeklaration eine Referenz zurückgegeben werden muss!

Um ehrlich zu sein weiß ich nicht genau welche Methode dafür zuständig ist, aber es funktioniert ungefähr so:
In istream (oder einer der Mutterklassen von istream) wird eine Methode deklariert, die beim Benutzen von istream an einer Stelle, wo Booleans erwartet werden je nachdem, ob das letzte Einlesen funktioniert hat 0, oder das Objekt selber zurückgeben wird.

Siehe dazu:
http://www.fredosaurus.com/notes-cpp/io/io-operators.html
------------------------------------


wert = cin.get()

Was ist cin.get und wann braucht man das?

Steht alles hier: (Google!!)
get - C++ Reference (http://www.cplusplus.com/reference/iostream/istream/get/)


Und was hat es mit wchar_t auf sich?

Auch hier gilt: Google!
Wide character - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/Wide_character)


Und zuletzt:

Aber ich wollte mal wissen wie ihr euch so an das lernen ranhaltet. Ich lese ein paar Minuten im Buch und dann hab ich auch schon keine lust mehr, weil ich auch vieles im Buch nicht verstehe bzw da nicht wirklich erklärt wird wann man das braucht. In der Schule siehts schon anders aus, aber da lernen wir nur 'Rechnunge aufstellen'. Die Rechnungen kommen mir schon aus dem Hals raus, seit ca 1 1/2 mach ich nix anderes. Ich glaube effektivere Sachen (kleiner Datei Manager oder so) würden einem die motivation zurückbringen, oder seh ich das falsch.

Im Gegensatz zur Schule hat das eigentständige Lernen einer Programmiersprach den Vorteil, dass man jederzeit aufhören kann.
Wenn du vieles im Buch nicht verstehst, dann könnte das vielleicht damit zusammenhängen, dass du es von Anfang an nie gründlich genug gelesen hast.

Auch solltest du dich weniger daran aufhalten dich zu fragen wozu man das braucht. Wie so oft im Leben macht man Dinge ohne sie zuerst richtig zu verstehen - aber soviel sei sicher - der "AHA"-Effekt ist nachher um so größer! Da du schon von rechnen sprichst: schau dir mal folgende Aufgabe an:
http://www.imagebanana.com/img/higzhf46/ungl.png
In diesem Fall ist es wirklich wichtig sich an diese Hinweise zu halten - man soll beweisen, dass k! >= 2^(k-1) ist. Wieso ist einem in erster Linie egal - man macht es einfach. Es sei dir jedoch gesagt, dass man gerade durch diese Abschätzung und Satz 1.8 (die geometrische Summenformel) zum Ziel kommt!

Zudem sollte klar sein: bevor man etwas machen kann, muss man verstehen, wie man es macht. Wenn du eine Benutzeroberfläche programmieren willst (und nicht gleich auf RAD-Tools wie Visual Studio umsteigst - deren genauerer Aufbau sicher noch schwieriger zu ergründen ist), dann wirst du wohl um die WinAPI nicht rumkommen. Damit kannst du nicht nur auf Dateien und die Registry zugreifen, sondern auch Fenster erstellen. Aber hier sind wir doch gleich im Bezug auf das was du lernst bzw. noch lernen wirst: was ist eine Funktion? Was machen Parameter? Wie übergibt man Parameter? Was sind Zeiger (welche in der WinAPI häufig verwendet werden)?
Auch wirst du feststellen, dass es sehr aufwändig ist Fenster via WinAPI zu programmieren (obwohl sich hinter diesen vielen Funktionsaufrufen auch ein großes Kontrollpotenzial verbirgt). Wieso schreibt man sich dann nicht ein eigenes Framework, oder entsprechende Klassenbibliotheken, um sich eine gute Schnittstelle für häufig gebrauchte Konzepte bereitzustellen? Oder wieso benutzt man nicht gleich ein bereits vorhandenes Framework?
Hier sind wir dann bei OOP angekommen: wie willst du ein Framework - welches Ausprogrammierung und Überladen von Methoden sowie das Erben von anderen Klassen erfordert, wenn du kein OOP beherrscht?
Der Grund wieso du also in deinem Buch keine solchen Aufgaben findest lässt sich in zwei Tatsachen unterteilen:
1. solche Programme würden den Rahmen eines Buches sprengen
2. du bist mit deinen momentanen Kenntnissen weder fähig soetwas zu programmieren, noch es völlig zu verstehen.

Sinned
03.06.2010, 10:00
Das man mit cin Eingaben einliest weiß ich, nur irretiert mich das .get()


Auch solltest du dich weniger daran aufhalten dich zu fragen wozu man das braucht.


Zudem sollte klar sein: bevor man etwas machen kann, muss man verstehen, wie man es macht.

Das wiederspricht sich ein bisschen. Ich muss doch wissen was eine Funktion macht.

Wo du gerade bool ansprichst. Bool ist dazu da um Funktionen auf den 'Wahrheitswert' zu überprüfen. Aber etwas zu überprüfen ob es wahr ist, kann man doch auch if benutzen oder versteh ich da was falsch?

blackberry
03.06.2010, 10:12
Das man mit cin Eingaben einliest weiß ich, nur irretiert mich das .get()

get() ist eine Methode der Klasse istream, von welcher cin ein Objekt ist.
>> ist auch eine Methode dieser Klasse (genauer gesagt ein überladener Operator).


Das wiederspricht sich ein bisschen. Ich muss doch wissen was eine Funktion macht.

Nein, das wiederspricht sich nicht. Auch wenn du weißt was eine Funktion/Methode macht muss das noch lange nicht heißen, dass du auch weißt wozu man diese braucht.

Beispiel aus der WinAPI: FindWindow(): gibt dir ein Handle auf ein Fenster zurück. Jetzt weißt du was passiert, aber nicht wozu das gut ist.


Wo du gerade bool ansprichst. Bool ist dazu da um Funktionen auf den 'Wahrheitswert' zu überprüfen. Aber etwas zu überprüfen ob es wahr ist, kann man doch auch if benutzen oder versteh ich da was falsch?

Ein Boolean überprüft in erster Linie gar nichts - es ist nur ein Datentyp, der zwei Zustände haben kann: wahr, oder falsch (true/false).
if ist ein Sprachkonstrukt, das dazu dient einen Ausdruck auf seinen Wahrheitswert zu überprüfen und entsprechend zu handeln (d.h. Code auszuführen).

Das Überprüfen findet also in Konstruken wie if, switch, for, while, do-while, usw. statt. Ein Boolean dient nur dazu solche Wahrheitswerte zu speichern - nicht entsprechend des Wertes zu handeln.

krusty
03.06.2010, 10:28
ich werfe das mal nochmal in den raum...
einige funktionen geben dir einen boolischen wert zurück, um dir zu sagen, ob das, was sie gemacht haben auch wirklich funktioniert hat. die cin funktion (methode)
nimmt eine eingabe des benutzers entgegen und speichert sie in einer variablen. wenn der benutzer nun aber etwas eingibt, was nicht für die variable geeignet ist, dann kommt es zu problemen und genau hier sagt deine cin funktion "Stopp! da ist was schief gelaufen, ich gebe dir false zurück!".
wie blackberry schon meinte zB ein 'A' in einen integer. Eine integer variable kann nur Ganzzahlen entgegennehmen, mit einer zeichenkette kann sie relativ wenig anfangen.
Hoffe ich liege da soweit richtig.

Sinned
03.06.2010, 11:43
Unter der if( ! (cin >> wert) ) stand noch << (char) wert . Das heißt das int wert in gecastet wurde oder besser gesagt in einen char Typ umgewandelt wurde oder?