PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger Fragen - c++



Einstein
25.04.2017, 22:38
Servus,

ich hatte schon sehr lange vor mich mal intensiv mit dem Programmieren zu befassen, kein copy und paste um mein Ziel mit Code schnipsel zusammen zu pfriemeln.
Also fange ich dementsprechend von "0" an, ich verfolge ein kleines Tutorial einer App die das ganz nett gemacht hat in dem man interaktiv das gelernte gleich nach der Info anwenden kann.

Ich mache derzeit kleinste Übungen zu Variablen und haben den Code hier :


#include <iostream>
using namespace std;

int main()
{
int a;
cout << "Please enter a number \n";
cin >> a;

cout << a;

return 0;
}

Da stellt sich mir die Frage woher weiß das "Programm" jetzt das der Input eine Zahl sein muss ?

mfg Einstein

Cystasy
25.04.2017, 23:03
Da stellt sich mir die Frage woher weiß das "Programm" jetzt das der Input eine Zahl sein muss ?



Daran:



int a;


Int ist die Abkürzung für "Integer", was eine Zahl darstellt.
Mit int variablename erstellst du quasi eine Integer Variable.. und in diese Variable können dann logischerweise nur Zahlen rein ;)
Da gibts dann aber auch noch Variablen Arten wie char, float etc. die dann entsprechend andere Daten annehmen (Char Zeichen, Float Zahlen, Strings usw.)

p.s: Schon ne Weile her als ich C++ gemacht hab, daher Sorry falls ichs nicht krass Detailiert beschreiben kann :)

grüße

Einstein
25.04.2017, 23:21
Danke für die Info, ja das kenne ich so richtig intensiv mit dem Programmieren habe ich mich vor ~ 6 Jahren beschäftigt meiner Meinung nach verlorene Zeit also kann ich da mit fühlen :D

Das interessant, dann kann ich mir die Variablen wie Bibliotheken vorstellen mit verschiedenen Eigenschaften.

Ich hätte dazu noch 2 Fragen :
Wie regelt man dann die Situation wenn es Zeichen, Zahlen und co haben soll bzw. mehr als nur einen Input ?
Und wie stelle ich das an das sich das ganze erst schließt wenn auch wirklich eine Zahl eingegeben wurde bzw. dementsprechend das was durch die Variable gewollt ist, so wie es da oben steht schließt es sich nach dem ersten Input egal ob Zahl der Buchstabe.

mfg Einstein

Cystasy
25.04.2017, 23:41
Wie regelt man dann die Situation wenn es Zeichen, Zahlen und co haben soll bzw. mehr als nur einen Input ?


Indem du einfach mehrfach Dinge abfrägst, dann aber eben mit verschiedenen Variablen^^
Oder du nimmst ein Variablen Typ wie z.b String.. dann ist es halt keine Zahl oder so mehr sondern ein String.. heißt wenn du dann z.b 2 Zahlen hast die jeweils als String gespeichert sind, musst die erst nach Int konvertieren damit du diese 2 Zahlen zusammenrechnen kannst.



Und wie stelle ich das an das sich das ganze erst schließt wenn auch wirklich eine Zahl eingegeben wurde bzw. dementsprechend das was durch die Variable gewollt ist, so wie es da oben steht schließt es sich nach dem ersten Input egal ob Zahl der Buchstabe.

Also.. das sich dein Programm direkt nach der Eingabe schließt, liegt daran das du return 0; machst und danach dein Programm beendet wird, und du da eben keine Pause eingebaut hast^^
Und wenn du möchtest das des Programm sich erst beendet wenn da eine Zahl vorkommt, musst du dein Programm eben so lange in einer Schleife laufen lassen und nach jeder Eingabe kontrollieren ob das eingegebene eine Zahl ist bis der User deines Programms dann auch eine Zahl eingibt.. falls nicht wird die Schleife halt weiter ausgeführt bis dies der Fall ist^^

Schlagworte die du dir dafür mal anschaun kannst:

- If Abfragen
- While Schleifen

grüße

55F
26.04.2017, 03:26
Integer == Ganzzahl
Float == Fließkommazahl
String == Zeichenkette
Char == einzelnes Zeichen

Die Variable "a" wurde als Integer deklariert, genauso kannst du weitere Variablen/Konstanten (.z.B. mit weiteren Datentypen) deklarieren.


#include <iostream>
#include <string>
using namespace std;

int main (void); {
string name; // Eine Variable vom Datentyp String
cout << "Bitte Namen eingeben\n";
cin >> name;
cout << "Hallo" << name << endl;
cin.get() // Erwartet eine Eingabe bevor das Programm geschlossen wird.
return 0;
}

Ihr dürft mich gerne korrigieren/steinigen falls ich komplett daneben oder falsch liege.
Gefunden habe ich noch ein Openbook: https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Einf%C3%BChrung_in_C%2B%2B

Leange
26.04.2017, 11:02
#include <iostream>
#include <string>
using namespace std;

int main() {
string name; // Eine Variable vom Datentyp String
cout << "Bitte Namen eingeben\n";
cin >> name;
cout << "Hallo" << name << endl;
cin.get(); // Erwartet eine Eingabe bevor das Programm geschlossen wird.
return 0;
}

Das Problem damit ist, dass du die Eingabe vom Namen mit Enter abschließt.
Dein inputstream sieht dann so aus "eingegebenerName\n".
In die Variable name kommt aber nur "eingegebenerName", das \n murkst immer noch im buffer rum.
cin.get() findet das \n un dein Programm schließt sich.

Also entweder so:

int main() {

string name;
cout << "Bitte Namen eingeben: ";
cin >> name;

cout << "Deine name: " << name << endl;

cout << "Press Enter ...";
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.get();

return 0;
}

Oder wenn der String Leerzeichen enthalten soll:

int main() {

string name;
cout << "Bitte Namen eingeben: ";
getline(cin, name);

cout << "Deine name: " << name << endl;

cout << "Press Enter ...";
cin.get();

return 0;
}

getline() nimmt das \n mit weg, deshalb kannste dir cin.ignore() sparen.

Aber! Wenn du erst cin>>irgendwas; machst und dann getline(), bekommste auch wieder das gleiche Problem. getline() findet das Zeilenende das noch im buffer ist und liest den Rest nicht.
Gibt dann bessere Möglichkeiten mit stringstreams ect., aber Hauptsache du hast es schonma gehört xD.


Das interessant, dann kann ich mir die Variablen wie Bibliotheken vorstellen mit verschiedenen Eigenschaften.
Näh es sind mehr die Operatoren die das Regeln. In dem Fall:
http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
Du kannst die Operatoren auch überladen für eigene Klassen ect..
Aber das wird jetzt zu deep fürn Anfang. Hastes mal gehört. :)

Leange

wacked
26.04.2017, 14:44
Da stellt sich mir die Frage woher weiß das "Programm" jetzt das der Input eine Zahl sein muss ?

Das tut es eben nicht:


a@DESKTOP-JU125PR:/tmp$ cat einstein.cpp
#include <iostream>


int main() {
int a;


std::cin >> a;
std::cout << a << '\n';
}
a@DESKTOP-JU125PR:/tmp$ g++ -o einstein einstein.cpp
a@DESKTOP-JU125PR:/tmp$ ./einstein
das hier ist gar keine Zahl
0
a@DESKTOP-JU125PR:/tmp$


Ich geb Text ein und das wird "akzeptiert". std::cin will in eine Zahl schreiben -- wenn halt was anderes kommt haste Pech gehabt. Mir fällt gerade kein Weg (mit std::iostream) zu erkennen ob das was eingegeben wurde auch das richtige Format hatte.

Sonst würde ich es halt so machen:


a@DESKTOP-JU125PR:/tmp$ cat main.cpp
#include <iostream>
#include <cstdio>
#include <errno.h>


int main() {
int a;


while(1) {
int ret = scanf("%d", &a);
// could an int be read?
if (ret == 1) {
break;
}
// is the stream fucked or has it ended?
else if (ferror(stdin) || feof(stdin)) {
return 0;
}
else {
/* remove the unparsed data from stdin, so the next call to scanf
doesn't read the same data again
todo: find out why fflush(stdin) doesn't work */
getchar();
}
}


std::cout << a << '\n';
}
a@DESKTOP-JU125PR:/tmp$ ./einstein
aaaa
abc
123
123
a@DESKTOP-JU125PR:/tmp$


ist aber glaube ich nicht wirklich Anfängerfreundlich

sn0w
26.04.2017, 15:34
Wenn die 0 als eingabe akzeptiert werden soll wird es wohl komplizierter wenn nicht einfach schauen ob 0 zurückgegeben wurde. Könntest natürlich auch alles einlesen und dann schauen ob noch was anderes außer 0-9 * x eingegeben wurde.

Einstein
26.04.2017, 16:09
Servus,

hopla hätte nicht mit so viel Resonanz gerechnet erstmals danke dafür. Ich muss zu geben das ganz schön viel Info auf ein mal aber je mehr ich darüber nachdenke und mich rein Lese desto mehr komme ich der Sache näher.
Es ist schon sehr interessant zu sehen wie eine eigentlich einfache Frage "Input = Zahl ? True Close, Not true ask again" einiges an umdenken und code mit sich bringt. Ich werde es auf jeden fall versuchen hin zu kriegen und dabei so viel mit zu nehmen wie es geht :D


#include <iostream>
#include <cstdio>
#include <errno.h>


int main() {
int a;


while(1) {
int ret = scanf("%d", &a);
// could an int be read?
if (ret == 1) {
break;
}
// is the stream fucked or has it ended?
else if (ferror(stdin) || feof(stdin)) {
return 0;
}
else {
/* remove the unparsed data from stdin, so the next call to scanf
doesn't read the same data again
todo: find out why fflush(stdin) doesn't work */
getchar();
}
}


std::cout << a << '\n';
}

Wenn ich das richtig sehe?
Eine Schleife die überprüft ob eine Integer == Ganzzahl eingegeben wurde, wenn JA dann close, wenn NEIN dann return 0; um die abfrage zu wiederholen mit den gleichen "Parameter bzw. abfrage"

while(1) {
int ret = scanf("%d", &a);
// could an int be read?
if (ret == 1) {
break;
}

Und wenn ich z.b das hier entferne schreibt er die Zahl nur 1 mal so wie es glaube ich sein sollte, aber warum das so ist kann ich nicht sagen.

else {
/* remove the unparsed data from stdin, so the next call to scanf
doesn't read the same data again
todo: find out why fflush(stdin) doesn't work */
getchar();
}
}


std::cout << a << '\n';
}

Mfg Einstein

Leange
26.04.2017, 17:21
Etwa das gleiche was wacked gemacht hat aber mit regulären ausdrücken

https://pastebin.com/URrEWHma

Viele, viele Möglichkeiten um das gleiche Ziel zu erreichen ^^

Leange

Edit: Ok is dochn bissel was anderes :P

wacked
26.04.2017, 18:21
Etwa das gleiche was wacked gemacht hat aber mit regulären ausdrücken


Viele, viele Möglichkeiten um das gleiche Ziel zu erreichen ^^

Leange

Edit: Ok is dochn bissel was anderes :P
Eigentlich wollte ich mich darüber beschweren das du keine negativen oder Zahlen mit exponent einlesen kannst, aber dann:


$ wget https://pastebin.com/raw/URrEWHma
$ mv URrEWHma leange.cpp
$ g++ -std=c++11 -o x leange.cpp
$ ./x
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted (core dumped)
$ g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.





...
Es ist schon sehr interessant zu sehen wie eine eigentlich einfache Frage "Input = Zahl ? True Close, Not true ask again" einiges an umdenken und code mit sich bringt. Ich werde es auf jeden fall versuchen hin zu kriegen und dabei so viel mit zu nehmen wie es geht :D

Das ist halt scheiße das "input parsen", also (Eingabe)daten korrekt interpretieren eine der schwersten Sachen ist die es beim Programmieren gibt *und* gleichzeitig die erste die man braucht.




Wenn ich das richtig sehe?
Eine Schleife die überprüft ob eine Integer == Ganzzahl eingegeben wurde, wenn JA dann close, wenn NEIN dann return 0; um die abfrage zu wiederholen mit den gleichen "Parameter bzw. abfrage"

while(1) {
int ret = scanf("%d", &a);
// could an int be read?
if (ret == 1) {
break;
}

Und wenn ich z.b das hier entferne schreibt er die Zahl nur 1 mal so wie es glaube ich sein sollte, aber warum das so ist kann ich nicht sagen.

else {
/* remove the unparsed data from stdin, so the next call to scanf
doesn't read the same data again
todo: find out why fflush(stdin) doesn't work */
getchar();
}
}


std::cout << a << '\n';
}

Mfg Einstein
Naja es ist eine Schleife bei der 3 Sachen passieren können:
a) es wurde eine Zahl eingegeben --> break;
b) das wo die Zahl von gelesen werden soll ist ("stdin" = Standard Input) funktioniert nicht mehr oder sagt das da jetzt nix mehr kommen kann -> return 0
c) es wurde etwas eingegeben, war aber keine Zahl -> der Rest.

Zu a) scanf() ist sowas wie die C version von std::cin. Du kannst da mehrere Parameter angeben und dann wird auf Benutzerinput gewartet. Irgendwie sowas hier:


float a;
int b, c, ret;

ret = scanf("%f%d%d", &a, &b, &c);


(Diese %X geben an was für ein Variablentyp erwartet wird, was die &-Zeichen da sollen kommt viel später) Und in ret steht dann wie viele dieser Variablen mit dem erwarteten Typ besetzt werden konnten. Also in dem Beispiel soll erst eine Kommazahl, dann zwei Integer eingegeben werden. Und wenn das erste schon keine Kommazahl ist dann hört die Funktion einfach auf und gibt 0 zurück --> 0 Eingaben passten mit dem erwarteten Variablentyp zusammen bevor es zum ersten Fehler kam. Wenn man "12.345 a 1" oder so eingeben würde, wäre ret == 1, da die Kommazahl noch geklappt hat aber dann beim ersten Integer unerwarter Text war.

Das ist der große Unterschied zu std::cin (das macht einfach fröhlich weiter) und quasi das Herzstück von dem Code.

Aber: scanf() lässt die Daten die es nicht parsen konnte im buffer. Wenn ich also einmal einen Buchstaben eingebe wird danach jeder Versuch eine Zahl einzulesen fehlschlagen. Bis:
* ein scanf() versucht Buchstaben zu lesen und die dann noch vorhandenen Daten akzeptiert
* man den Buffer löscht (das wollte ich eigentlich mit fflush() machen, ging aber nicht...)
* getchar() oder ein anderer Befehl den Buchstaben da rausnimmt.

Leange
27.04.2017, 08:16
@wacked

http://gcc.gnu.org/gcc-4.9/changes.html



Improved support for C++11, including:

support for <regex>;




Eigentlich wollte ich mich darüber beschweren das du keine negativen oder Zahlen mit exponent einlesen kannst
Die regex nen bissel erweitern und das und noch vieles mehr geht. :P

Leange

NSK
27.04.2017, 12:50
Klar gibt es viele Möglichkeiten, das gesetzte Ziel zu erreichen.
Es ist anfäglich zwar wichtig, dass man es erreicht, doch sollte man immer sauber programmieren.
Anfägliche Fehler lassen sich später schwer ausmerzen, wenn man sie erstmal verinnerlicht hat.

s3rb31
29.04.2017, 00:57
Also ich versuche mal hier ein wenig Licht ins Dunkle zu bringen.


Ich geb Text ein und das wird "akzeptiert". std::cin will in eine Zahl schreiben -- wenn halt was anderes kommt haste Pech gehabt.

Also das es akzeptiert stimmt nicht ganz. Die Daten liegen auch noch auf dem Stream, wenn nicht akzeptiert wurde!


Mir fällt gerade kein Weg (mit std::iostream) zu erkennen ob das was eingegeben wurde auch das richtige Format hatte.

Dafür gibt es ja die Dokumentation ;)


http://en.cppreference.com/w/cpp/io/ios_base/iostate

Also es gibt drei Statusflags in der std::ios. Grob kann man das so beschreiben:

- das Badbit wird nur bei ernsthaften IO Fehlern gesetzt
- das Failbit für Operationen die einen Fehler erzeugen dürfen
- das Eofbit um zu signalisieren dass das Ende des Streams erreicht wurde

Für unseren Fall ist das Failbit interessant. Ich habe mal ein wenig Beispielcode vorbereitet:


https://git.free-hack.com/s3rb31/cin-test/src/master/test.cpp


Zu dem Beispiel von wacked:



Sonst würde ich es halt so machen:


#include <iostream>
#include <cstdio>
#include <errno.h>

int main() {
int a;

while(1)
{
int ret = scanf("%d", &a);
// could an int be read?
if (ret == 1) {
break;
}
// is the stream fucked or has it ended?
else if (ferror(stdin) || feof(stdin)) {
return 0;
}
else {
// remove the unparsed data from stdin,
// so the next call to scanf doesn't
// read the same data again
// todo: find out why fflush(stdin)
// doesn't work

getchar();
}
}

std::cout << a << '\n';
}



Bitte nicht! Hier wird C mit C++ vermischt was in den seltensten Fällen zu empfehlen ist, und m. M. n. auch kein guter Style ist! Eine schöne Erklärung warum man das nicht will gibt es hier (http://stackoverflow.com/a/4025907).

Abschließend bleibt noch zu sagen dass Reguläre Ausdrücke für das validieren von Zahlen, wortwörtlich, mit Kanonen auf Spatzen schießen ist! Mit welchen anderen Problemen man dann zu Kämpfen hat zeigt die Exception weiter oben ganz gut finde ich!

Leange
29.04.2017, 09:57
Abschließend bleibt noch zu sagen dass Reguläre Ausdrücke für das validieren von Zahlen, wortwörtlich, mit Kanonen auf Spatzen schießen ist!

Das stimmt in dem Fall ... es ging aber für mich darum ne Möglichkeit zu zeigen wie man Input generell (nicht nur Zahlen) validieren kann.


Mit welchen anderen Problemen man dann zu Kämpfen hat zeigt die Exception weiter oben ganz gut finde ich!

Ffs c++17 ist wip. Benutzt compiler mit ner ordentlichen c++11 Implementierung oder btfo. xD

Leange

wacked
29.04.2017, 17:18
Dafür gibt es ja die Dokumentation ;)
Ok ja ich hätte wenigstens versuchen können das rauszufinden, aber cppreference ist ein bisschen wie die man pages: Um etwas komplett neues herauszufinden sind die ungeignet, die sind nur als Nachlagwerk top.


Also das es akzeptiert stimmt nicht ganz. Die Daten liegen auch noch auf dem Stream, wenn nicht akzeptiert wurde!Ähm kann ich jetzt nicht reproduzieren:


$ cat s3rb31.cpp
#include <iostream>
#include <string>


int main() {
int a;
std::string b, c;


std::cin >> a >> b;
std::cin >> c;
std::cout << a << ',' << b << ',' << c << '\n';
}
$ g++ -o x s3rb31.cpp
$ ./x
a b c
0,,





Ffs c++17 ist wip. Benutzt compiler mit ner ordentlichen c++11 Implementierung oder btfo. xD
Naja, guck dir das mal an: http://en.cppreference.com/w/cpp/compiler_support

Klar die großen 3 (gcc, MSVC, clang) haben fast alles aber wenn man sich mal anhand der Versionsnummern anguckt wann die ersten Features implementiert wurden und wann die letzten...

Einstein
29.04.2017, 17:20
Danke, für die sehr informativen Beiträge. Ich setze mich heute Abend wieder ran und vermute Stark das noch einige Fragen kommen werden, daher würde ich das ganze hier offen lassen.

Eventuell kann man ja hier in der c++ Sektion ein paar Tutorials Posten, einiges ist hier ja schon etwas älter. Ich kann ja was zusammen Kratzen wenn ich was hilfreiches finde in meinen Büchern bzw. tuts.

mfg Einstein

s3rb31
29.04.2017, 17:41
Ok ja ich hätte wenigstens versuchen können das rauszufinden, aber cppreference ist ein bisschen wie die man pages: Um etwas komplett neues herauszufinden sind die ungeignet, die sind nur als Nachlagwerk top.

Dafür gibt es Google ;)



Ähm kann ich jetzt nicht reproduzieren:



$ cat s3rb31.cpp
#include <iostream>
#include <string>


int main() {
int a;
std::string b, c;


std::cin >> a >> b;
std::cin >> c;
std::cout << a << ',' << b << ',' << c << '\n';
}
$ g++ -o x s3rb31.cpp
$ ./x
a b c
0,,



Hast du meinen Beispielcode gelesen? Wenn du nicht abfragst ob da ein Fehler passiert ist und das Failbit clearest, kann es ja auch nicht klappen.



#include <string>
#include <iostream>

bool check_input()
{
if(std::cin.fail())
{
std::cin.clear();
return false;
}

return true;
}

int main()
{
int a;
std::string b, c;

std::cin >> a >> b >> c;

if (!check_input())
{
std::cin >> b >> c;
std::cout << "Zahl ungültig. " << b << ',' << c << std::endl;

return 1;
}

std::cout << a << ',' << b << ',' << c << std::endl;

return 0;
}



[18:40:13] s3rb31@archbase:~ $ ./a.out
a b c
Zahl ungültig. a,b
[18:40:16] s3rb31@archbase:~ $ ./a.out
1 a b
1,a,b
[18:40:25] s3rb31@archbase:~ $ ./a.out
0s 123 a
0,s,123

wacked
29.04.2017, 18:38
Hast du meinen Beispielcode gelesen? Wenn du nicht abfragst ob da ein Fehler passiert ist und das Failbit clearest, kann es ja auch nicht klappen.

Habe ich, aber als ich bei Zeile 61 angekommen war hatte ich vergessen das in check_input() am iostream etwas verändert wurde. Wurde ja aus dem Funktionsnamen auch nicht (mehr) offensichtlich.

Hätte ich aber vielleicht nochmal drüber gucken sollen bevor ich was gesagt hab... Peinlich

Leange
30.04.2017, 13:05
Mich wunderts ehrlich gesagt dass noch keiner sich über "using namespace std;" beschwert hat. :rolleyes:

Mit Try-Catch

#include <iostream>
#include <string>

using namespace std;

int main() {

string str;
int n;
cin >> str;

try {
n = stoi(str);
cout << "Zahl ist: " << n << endl;
}
catch (const invalid_argument&) {
cout << "Keine Zahl. Eingabe ist: " << str << endl;
}
catch (const out_of_range&) {
cout << "Zahl ist nicht in range: " << str << endl;
}

/*cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.get();*/

return 0;
}

Leange

Einstein
16.08.2017, 01:58
Guten Abend,

da man mir ja hier schon mal so schön helfen konnte und ich wieder ein wenig Zeit gefunden habe mich mit c++ zu beschäftigen habe ich hier mal eine kleine weitere Frage. Um mich stetig weiter zu bilden dachte ich mir sind kleine Projekte oder Aufgaben die ich versuche zu lösen ein guter Weg schnell und sauber zu lernen.

Ich dachte mit ein Taschen Rechner währe da eine gute Wahl simple abfolgen zu lernen und zu verstehen



#include <iostream>
using namespace std;


int main(){
double zahl1, zahl2, ergebnis; // Die Variablen für die Zahlen Eingabe nur Gleitkommazahlen.
char rechenzeichen; // Variable fürs Rechenzeichen (+ - / )


cout << "Geben Sie eine Rechenaufgabe ein: "; // Eingabeaufforderung
cin >> zahl1 >> rechenzeichen >> zahl2; // Aufgabe einlesen


switch(rechenzeichen){ // Wert von rechenzeichen ermitteln
case '+': ergebnis = zahl1+zahl2; break; // entsprechend dem
case '-': ergebnis = zahl1-zahl2; break; // Rechenzeichen
case '*': ergebnis = zahl1*zahl2; break; // das Ergebnis
case '/': ergebnis = zahl1/zahl2; break; // berechnen
// Fehlerausgabe und Programm beenden, falls falsches Rechenzeichen eingegeben wurde
default: cout << "unbekanntes Rechenzeichen...\n"; return 1;
}


// Aufgabe noch mal komplett ausgeben
cout << zahl1 << ' ' << rechenzeichen << ' ' << zahl2 << " = " << ergebnis << '\n';
}

Gut jetzt stellt sich mir die Frage wie stelle ich es am besten an das ganze ein wenig komplexer gestalten zu können. Ich habe mich ein wenig an if ab fragen versucht, aber da hatte ich das Problem das ich da keine Rechenzeichen nutzen konnte sondern nur Zahlen.

z.b habe ich mit if ab fragen einfach mal etwas rum probiert und das der code hier ging nicht.



if (rechenzeichen==+)
{
cout << "hallo";
}


Mit Zahlen ging es dann ?



if (zahl1==1)
{
cout << "hallo";
}



Ich habe dann versucht wie oben mit switch zu arbeiten wenn es z.b zahl1 + zahl2 + zahl3 in der cin abfragen vorkommen dann schreibe "hallo" zum testen ob es geht aber so ganz habe ich das nicht hin bekommen. Eventuell gibt es hier eine schönere Lösung ?

Natürlich könnte ich google durchforsten aber ich finde hier konnte ich deutlich mehr daraus lernen.

mfg

Benu
16.08.2017, 07:07
Du musst das + schon in Anführungszeichen setzen.


if (rechenzeichen == "+")

Das sind Basics. Lern erstmal die Datentypen.

Leange
16.08.2017, 12:33
if (rechenzeichen == '+')

Wenn schon korrigieren dann richtig :P

Ansonsten wirds eigentlich nur noch komplexer.

https://free-hack.com/showthread.php?70897-C-Taschenrechner-(Anf%C3%A4ngerprojekt-Orly-)

Code scheint aber leider down zu sein. Vielleicht hat noch wer?

Leange

P.S. *hust* division durch 0 *hust*

Einstein
16.08.2017, 15:29
Wieso muss ich ein Zeichen mit "" definieren und eine Zahl nicht ?

sn0w
16.08.2017, 16:08
Ist das dein Ernst?

http://bfy.tw/DPER

Einstein
16.08.2017, 16:37
Ja das war er ;) Ich sagte schon zuvor warum ich einer Gezielten Erklärung Google vorziehe. Aber na gut nicht das jemand noch weinen muss ;)

BadboyGER
16.08.2017, 16:59
Integer Datentypen werden ohne Führungszeichen geschrieben.
Alles was in den Führungszeichen steht wird als Text interpretiert.
Die Programmlogik rechnet mit Zahlen (Integers) und nicht mit Text.
Man schreibt ja auch nicht drei + 4.

http://www.virtual-maxim.de/c-plus-plus-teil-3-variablen-und-konstanten/

Hier ist das ganz gut erklärt.

blackberry
16.08.2017, 17:26
@Leange: Ja, den Code habe ich noch und der Link im Thread ist jetzt aktualisiert (Abkürzung: https://pastebin.com/hY0rgLJM)