PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] cin in cout?



Avior
01.04.2010, 15:05
hallo,

ich bin gerade dabei c++ zu lernen...
nachdem ich nun ein buch zu dem thema gelesen habe, wollte ich mal eine art weckerprogramm schreiben.

#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int main()
{
cout << "Willkommen in diesem Weckerprogramm!!" << endl;
cout << "Bitte geben die sie Zeit ein, in der sie errinnert werden wollen!" << endl;

int minuten;


cout << cin >> minuten; << " Minuten" << endl; //PROBLEM

minuten=minuten*60000;
Sleep(minuten);
cout << "ERRINNERUNG!!!" << endl;


}
---------------------------------------------
in der zeile mit problem hagelt es fehler!
und zwar 30x dieser :

Fehler 3 error C2784: "std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "std::basic_istream<_Elem,_Traits> &" konnte nicht von "std::basic_ostream<_Elem,_Traits>" hergeleitet werden. c:\programmierenlernen\wecker\wecker\main.cpp

leider sagt mir der fehler nichts -.-
deshalb bitte ich euch um hilfe :D

Alexx
01.04.2010, 15:14
cout << cin >> minuten; << " Minuten" << endl; //PROBLEMcin >> minuten;

so sollte es klappen

ach ja: Das "using namespace std;" ist bei dir falsch (du hast es ohne leerzeile)

Avior
01.04.2010, 15:25
cout << cin >> "Minuten" >> minuten;

so klappt es auch nicht...

vll is nicht klar wie das aussehen soll:

__ Minuten
=> __ ist der cin , Minuten = "Minuten"

using namespace ist n copy fehler...im source ist es richtig^^

Lynx_
01.04.2010, 15:35
Guten Tag also ich schreib dir mal den source auf wie so das er funktioniert :):

#include<iostream>
#include<windows.h>
#include<string>
usingn amespace std;
int main(){

int minuten;

cout << "Willkommen in diesem Weckerprogramm!!" << endl;
cout << "Bitte geben die sie Zeit ein, in der sie errinnert werden wollen!" << endl;

cin >> minuten;
cout << "Sie werden in der oben angegebenen Zeit erinnert" << endl;

minuten=minuten*60000;
Sleep(minuten);
cout << "ERRINNERUNG!!!" << endl;

return 0;
}

Habs nich getestet müsste aber so funktionieren :)

mfg Lynx

Avior
01.04.2010, 15:50
cin >> minuten;
cout << "Sie werden in der oben angegebenen Zeit erinnert" << endl;



return 0;


das is aba geschummelt :D
auf die lösung bin ich auch gekommen, aber es geht mir eig darum eben DIREKT beim eingeben "Minuten" danebenstehen zu haben^^

Sawyer
01.04.2010, 15:55
Wie ihr Code schreibt und einrückt ist wirklich mehr als schrecklich. So sollte das ganze funktionieren. Des weiteren benötigst du die String Bibliothek nicht, da du keine Funktion daraus verwendest.


#include <iostream>
#include <windows.h>
using namespace std;

int main(void)
{
cout << "Willkommen in diesem Weckerprogramm!!" << endl;
cout << "Bitte geben die sie Zeit ein, in der sie errinnert werden wollen!" << endl;

int minuten;
cout << "Minuten:";
cin >> minuten;
cout << "Sie werden in der oben angegebenen Zeit erinnert" << endl;

minuten *= 60000;

Sleep(minuten);
cout << "ERRINNERUNG!!!" << endl;

return 0;
}MfG, Sawyer

Avior
01.04.2010, 16:06
dankeschön!
aber gibt es denn gar keine möglichkeit das "Minuten" hinter den cin zu setzen?
@einrücken: sry formatierung wurde beim c&p zerstört^^
@string: die ist absichtlich drin da ich noch einen "errinnerungsgrund" schreiben wollte

S1024
01.04.2010, 16:49
Also wenn du willst das die Minuten direkt im Satz stehen und nicht mehr drüber etc. dann benutzt doch system("cls"). Dann bist du zwar eingeschrängt auf Windows kannst dir den Befehl aber gut merken weil durch system(" Befehl ") man jeden CMD Befehl einfügen kann.

CODE:



#include <iostream>
#include <windows.h>
using namespace std;

int main(void)
{
cout << "Willkommen in diesem Weckerprogramm!!" << endl;
cout << "Bitte geben die sie Zeit ein, in der sie errinnert werden wollen!" << endl;

int minuten;
cin >> minuten;
system("CLS");
cout << endl << endl;
cout << "Sie werden in "<< minuten <<" Minuten erinnert" << endl;
minuten = minuten * 60000;
Sleep(minuten);
cout << "ERRINNERUNG!!!" << endl;

return 0;
}

sp1nny
01.04.2010, 17:17
My 2 cents:



#include <iostream>
#include <windows.h>
using namespace std;

int main(void){

cout << "Willkommen in diesem Weckerprogramm!" << endl;
cout << "Bitte geben sie die Zeit ein, in der sie errinnert werden wollen!" << endl;
cout << "Minuten: ";

int iMinutes;
if(!(cin >> iMinutes))
exit(1);

cout << "\n\nSie werden in "<< iMinutes <<" Minuten erinnert." << endl;

Sleep(iMinutes*60000);
cout << "ERINNERUNG!!!" << endl;

cin.ignore();
cin.get();
return 0;
}

DoS
01.04.2010, 19:29
Das was Sp1nny geschrieben hat ist korrekt und solltest du nehmen.


Für Freaks: Rein theoretisch geht das cin "zusammen" mit cout.


cout << static_cast<char>(!(cin >> minuten)) << "\n" <<minuten <<" Minuten" << endl;Funktionieren tut es schon, aber ob es Sinn macht ist die andere Frage ;) . In der Praxis niemals so etwas nutzen :).



Edit: Zur Erklärung: Ich werde hier einmal kurz Schritt für Schritt erklären, wie das funktioniert:

Die Klammern bei (cin>>minuten) besagen, dass cin auf die Variable "minuten" angewendet wird. Ohne diese Klammern würde minuten gar nicht direkt von der cin Funktion genutzt. Da Klammern aber bindungsstärker sind, wird dieses also "zusammen" ausgeführt ( mit bindungsstärker meine ich so etwas, wie dass z.B. Punkt vor Strich Rechnung kommt.)

Das cin gibt hier einen void Zeiger zurück, der erstmal keine Bedeutung hat. Ist er allerdings 0 hat etwas nicht funktioniert.

Jetzt sind wir soweit, dass cin in cout ausgeführt wurde, allerdings ist da noch diese hässliche zurückgegebene Adresse ;) . So, da der Wert normalerweise immer ungleich 0 ist kann man mit der Verneinung ( "!" ) den Wert auf 0 setzen, denn nach Herr Boole ist alles was ungleich 0 (also z.B. 0,7;2;6) ist true. Mit der Umkehrung ist das also false und entspricht einer 0. Damit wir die "hässliche 0" nicht sehen ;) , casten wir die 0 in einen Char , in dem die 0 keine für uns lesbare Ausgabe ist.

Kurzfassung: Die Klammern sorgen dafür, dass cin>>minuten ausgeührt wird und der Rest static_cast<char>(! ... sorgt dafür, dass man die Rückgabe nicht sieht.

Fazit: Sinnlos aber rein theoretisch möglich :D . Falls ihr das interessant fandet könnt ihr ja auf den THX-Butten drücken :)




Mit freundlichen Grüßen
DoS

GregorSamsa
01.04.2010, 19:35
#include <stdio.h>

int main(int argc, char *argv[])
{
while(--argc)
{
printf("\n0x");
while(*argv[argc])
printf("%02x", (unsigned char)*argv[argc]++);
}

return 0;
}

Also so code ich ^^

Aber das nur am Rand...
Du könntest das mithilfe von getch() machen, und nach jedem Input mit (ich glaube) gotoxy() den Textcursor neu setzen, den Buffer ausgeben und dann Minuten schreiben - wäre ne Alternative...

DoS
01.04.2010, 20:00
@GregorSamsa: Du hast eindeutig C und nicht C++ gelernt :D

@Threadstarter: Da du C++ Anfänger bist, sei nicht frustriert, wenn du das letzten Posts nicht verstehst. Das kommt noch, da bin ich mir sicher ;)

Für dein Problem guck dir Sp1nnys Post an. Wenn du noch fragen hast, helfen wir dir gerne weiter.

Edit: Da ich gerade zu viel Zeit habe und ich mir denken kann, dass du einen Teil von Sp1nnys Antwort vielleicht nicht verstehst, schreibe ich noch etwas dazu. Normalerweise hätte dir Sp1nny das natürlich selber weiter erklärt nur weiß ich zufällig, dass er keine Zeit mehr hat(te) ;) .


if(!(cin >> iMinutes))
exit(1);

Du fragst dich vielleicht, was das soll. Erstmal solltest du wissen, falls du es nicht schon weißt, dass wenn man keine geschweiften Klammern "{ ", "}" nach if setzt, die nächste Zeile bei erfolgreicher Bedingung (true) ausgeführt wird.


if(Bedingung)
Anweisung1;
Anweisung2entspricht also:


if(Bedingung)
{
Anweisung1;
}
Anweisung2;


Wie ich bereits geschrieben habe, wird bei erfolgreicher Ausführung von cin ein Wert ungleich 0 zurückgegeben. Mit "!" verneint er den Rückgabewert. Das heißt, wenn ein Fehler auftritt, ist die Rückgabe gleich 0. Durch die Verneinung "!" wird dies also zu 1 bzw. true. Somit wird "exit(1); " ausgeführt, welches das Programm beendet.

Zusammengefasst dient dies also dazu um bei fehlerhaften Verhalten das Programm zu beenden.

Das "cin.get();" am Ende sorgt dafür, dass sich das Programm nicht beendet, sondern man noch eine Taste drücken muss. Das weißt du vielleicht, aber wofür ist vorher dieses mysteriöse "cin.ignore();"?

Antwort: Dies löscht den Eingabe-Puffer. Somit kann "cin.get()" in "Ruhe seine Arbeit machen". ;)


Mit freundlichen Grüßen
DoS

GregorSamsa
01.04.2010, 20:48
[FONT=Arial]@GregorSamsa: Du hast eindeutig C und nicht C++ gelernt :D
Ja... Damals... mit Büchern! (So Dinger aus Papier - kp, das Turbo C 2.01 Handbuch wurde warscheinlich noch mit Hand geschreiben... xD)

Ich weiß nicht welchen Compiler du verwendest.
Ich habe damals Turbo C gehabt - das war 1337 bis zum Ende!
Ultra geil...

Solltest du mal in C reingucken (ähnlich wie C++) versuch dir mal das Turbo C 2.01 Buch von Markt&Technik (ISBN: 3-89090-215-4) zu besorgen - für mich eine Bibel, das könnte dir vielleicht helfen.
Dort gibt es eine große und gute Auflistung aller C-Befehle (die i.d.R. auch in C++ benutzbar sind...)

greetz

DoS
01.04.2010, 21:09
:D Das war nur eine Bemerkung ;). Ich meinte das wegen dem "#include <stdio.h>" und printf. Als C++ler würde man ja "#include <cstdio> schreiben und cout oder so benutzen. Das war keine Kritik ;). Benutzen tuen die meisten C++ler C sowieso. Meistens unbewusst :D. Cstrings sind außerdem viel cooler und schneller als die Strings aus der STL, die jeder Trottel nutzen kann xD.

Mal eine andere Frage: Wie alt bist du, wenn du das damals schon benutzt hast :)?

Na ja, das Buch kann man anscheinend nicht mehr neu kaufen :D.

Mit freundlichen Grüßen
DoS :)

Avior
02.04.2010, 13:04
Wie ich bereits geschrieben habe, wird bei erfolgreicher Ausführung von cin ein Wert ungleich 0 zurückgegeben. Mit "!" verneint er den Rückgabewert. Das heißt, wenn ein Fehler auftritt, ist die Rückgabe gleich 0. Durch die Verneinung "!" wird dies also zu 1 bzw. true. Somit wird "exit(1); " ausgeführt, welches das Programm beendet.

Zusammengefasst dient dies also dazu um bei fehlerhaften Verhalten das Programm zu beenden.

Das "cin.get();" am Ende sorgt dafür, dass sich das Programm nicht beendet, sondern man noch eine Taste drücken muss. Das weißt du vielleicht, aber wofür ist vorher dieses mysteriöse "cin.ignore();"?

Antwort: Dies löscht den Eingabe-Puffer. Somit kann "cin.get()" in "Ruhe seine Arbeit machen". ;)

was sind denn fehler?
falsche eingaben a la buchstaben ?

cin.ignore() löscht praktich den ersten cin damit der nicht automatisch das cin.get() auslöst oder?

btw: was ich schon seit ewigkeiten herrauszufinden versuche, ist, wie man mit hilfe von c++ ein anderes programm öffnet oder schließt(komischer satz oO)
kann mir da jemand helfen^^?

DoS
02.04.2010, 13:16
"was sind denn fehler?
falsche eingaben a la buchstaben ?"

Richtig. Denn Buchstaben können in unserem Fall nicht mit dem Datentyp "int" dargestellt bzw. gespeichert werden. Ein anderer Fehler wäre zum Beispiel wenn der Arbeitsspeicher voll ist.

"cin.ignore() löscht praktich den ersten cin damit der nicht automatisch das cin.get() auslöst oder?"

Sowie du das meinst, ist das korrekt. Ist nur etwas ungenau formuliert ;)

"btw: was ich schon seit ewigkeiten herrauszufinden versuche, ist, wie man mit hilfe von c++ ein anderes programm öffnet oder schließt"

Google mal "openprocess". Aber das hier ist wieder ein neues "Problem" und kommt in einen anderen Thread ;)

Mit freundlichen Grüßen
DoS

sp1nny
02.04.2010, 16:39
Um einen neuen Prozess zu erstellen brauchst du die WinAPI Funktion "CreateProcess" - zu finden ist sie hier : http://msdn.microsoft.com/en-us/library/ms682425%28v=VS.85%29.aspx Ich bin sicher DoS hat diese Funktion gemeint, denn mit "OpenProcess" öffnet man lediglich bereits laufende Prozesse. Vlt. sollte man noch wissen, dass man Chars auch als Ints darstellen kann ( damit keine Verständnisprobleme auftreten ). In dem Falle wird der ASCII Wert des Buchstabens gespeichert. Hilfreich ist bei solchen Angelegenheiten eine ASCII-Table ( http://www.asciitable.com/ ). Das Problem tritt nur auf, da "cin" keine Typen castet. Nochmal zur verdeutlichung:


#include <iostream>
using namespace std;

int main(void){

cout << "ASCII-Wert des Buchstabens 'a': " << (int)'a' << endl;
cout << "Darstellung von 'a' mit Hilfe des ASCII-Wertes: " << (char)97 << endl;

cout << "Schleife um die Buchstaben 'A' bis 'E' auszugeben: " << endl;

for(int i = 65; i <= 69; i++)
{
cout << (char)i << endl;
}

cin.get();
return 0;
}

DoS
02.04.2010, 17:46
Jo, Sp1nny hat natürlich Recht ;).

Für weitere Fragen stehen wir dir gerne zur Verfügung.

Mit freundlichen Grüßen
DoS

blackberry
02.04.2010, 17:51
/closed wegen 18 Posts für einen Fehler, bzw. für Abweichen vom Thema.
Sollten weitere Fragen bestehen, so stellt diese gesondert, sodass auch andere in einem halben Jahr mit dem selben Problem eine Chance haben das zu finden.

Oder besprecht das über IM'ing weiter.