Zwei Anfaengerfragen
-
Hi, hab zwei kleine Fragen, hoffe ihr koennt mir da helfen
1. Lassen sich alle variablen eines enums, durch einen befehl, reihenweise ausgeben?
2. Wie laesst sich eine variable ausgeben, die groesser ist als ein integer, double oder long beherbergen kann?
-
kamelkacke schrieb:
Hi, hab zwei kleine Fragen, hoffe ihr koennt mir da helfen
1. Lassen sich alle variablen eines enums, durch einen befehl, reihenweise ausgeben?
2. Wie laesst sich eine variable ausgeben, die groesser ist als ein integer, double oder long beherbergen kann?Beide Fragen machen keinen Sinn.
1. Ein enum hat keine Variablen. Ein enum ist selber kein Objekt, sondern so etwas wie eine Klasse. Ein enum hat ein paar Bezeichner und die kann man genau so wenig ausgeben wie andere Bezeichner, denn sie sind nur Hilfsmittel für den Programmierer.
2. Was soll eine Ausgabe eines Objekts eines Typs mit der Größe irgendwelcher anderer Datentypen zu tun haben? Was soll daher warum problematisch sein?Beide Fragen klingen so, als wolltest du irgendetwas ganz bestimmtes erreichen. Falls dies der Fall ist, dann frag nach dem, was du erreichen möchtest. Falls es wirklich rein technische Fragen sind, dann hast du leider die Technik schon so weit missverstanden, dass die Fragen selber keinen Sinn mehr machen.
-
Und ich dachte eben so: Was ist denn auf einmal mit dem krümelkacker los?!
-
Hey! Danke für die Antwort.
Also:
enum beispiel {karate, judo, kickboxen = 12}; cout << judo;Da kommt 2 auf dem Bildschirm. Also ist das doch eine Variable die einen Wert ausgibt..ich dachte ein enum ist eine Art Array für Konstanten. Nun dachte ich man koennte die schoen nacheinander ausgeben lassen.
2. Wenn man hier einen sehr hohen Wert eingibt, dann passiert (zumindest bei mir) folgendes: die do while schleife des Programm wiederholt sich bis zur unendlichkeit und ich muss das Programm killen. Deswegen hab ich nach einer Moeglichkeit gesucht eine unendlich grosse Zahl eingeben zu koennen.
#include <iostream> using namespace std; int main () { int variable = 0; int zaehler = 0; cout <<"Zahl eingeben:"; cin >> variable; for (int i=1; i<variable+1; i++) { if (variable%i == 0) { zaehler++; cout << i << endl; } } cout << endl << "Die Zahl " << variable << " hat " << zaehler << " natuerliche Teiler!" << endl << endl; }
-
ich dachte ein enum ist eine art array für konstanten.
Nein, denn die Konstanten, die sog. Enumeratoren, sind keine Objekte. Sie sind nirgends gespeichert.
Da kommt 2 auf dem Bildschirm.
Unmöglich. Es muss 1 sein.
-
Wenn du eine unendlich große Zahl eingibst, dann hast du doch eine Endlosschleife. Zumal Teiler von Unendlich mathematisch auch etwas schwierig sind.
Es gibt bignums, die beliebig groß werden können, aber nicht unendlich. Bei floats gibt es Repräsentationen für Unendlich, aber damit kann man nicht vernünftig rechnen soweit ich weiß.
-
Ja, natuerlich 1!! Ach ach..
Und mit unendlich grosse Zahl meine ich einfach eine riesige. Also das Programm kriegt auf jedenfall keine zahl im Billionenbereich hin.
-
kamelkacke schrieb:
Hey! Danke für die Antwort.
Also:
enum beispiel {karate, judo, kickboxen = 12}; cout << judo;Da kommt 2 auf dem Bildschirm. Also ist das doch eine Variable die einen Wert ausgibt..ich dachte ein enum ist eine Art Array für Konstanten. Nun dachte ich man koennte die schoen nacheinander ausgeben lassen.
Die Begriffe "Variable" und "Konstante" kommen dir nicht irgendwie unvereinbar vor? Ein enum ist am ehesten so etwas:
class my_enum { public: static const int karate = 0; static const int judo = 1; static const int kickboxen = 12; }2. Wenn man hier einen sehr hohen Wert eingibt, dann passiert (zumindest bei mir) folgendes: die do while schleife des Programm wiederholt sich bis zur unendlichkeit und ich muss das Programm killen. Deswegen hab ich nach einer Moeglichkeit gesucht eine unendlich grosse Zahl eingeben zu koennen.
#include <iostream> using namespace std; int main () { int variable = 0; int zaehler = 0; cout <<"Zahl eingeben:"; cin >> variable; for (int i=1; i<variable+1; i++) { if (variable%i == 0) { zaehler++; cout << i << endl; } } cout << endl << "Die Zahl " << variable << " hat " << zaehler << " natuerliche Teiler!" << endl << endl; }Und das hat was mit deiner Frage zu tun?

Ich kann dein Problem anhand deines Codes nicht nachvollziehen und kann mir auch keine Eingabe denken, die zu dem beschriebenen Fehler führt. Gib mal eine Beispieleingabe an, zusammen mit erwarteter Ausgabe und tatsächlicher Ausgabe. Außerdem Information zu Betriebssystem, Compiler und Compileroptionen.Ich rate mal: Das ist gar nicht der Code. Der wirkliche Code ist ein leicht anderer. Zum Beispiel mit Fließkommazahlen statt Integern. Siehe den Link bezüglich des postens des richtigen Codes in meiner Signatur.
-
Achso, dann wär enum geklärt, danke!
Zum Programm, das ist tatsaechlich nur ein Ausschnitt eines codes. Wenn man den Ausschnitt alleine compiliert, tretet der Fehler wirklich nicht auf. Er sagt einfach "Die Zahl 2147483647 hat 0 natuerliche Teiler", wenn man eine Zahl eingibt, die groesser ist als die.
Der gesamte Code kommt gleich. Wobei man die Primzahlenfunktion nicht beachten sollte. Wenn man also im Menue "1" waehlt, kommt man zu genau dem selben code, den ich oben gepostet habe. Er reagiert aber anders. Unzwar wenn ich beispielsweise 9 mal die 9 eingebe, macht er was er soll. Wenn ich 10 mal die 9 eingebe geschieht der besagte Fehler.
#include <iostream> using namespace std; void teiler (); void primzahlen (); int main (){ int menueauswahl; cout << "Shumasterfus Taschenrechner\n\n"; do { cout << "(1) Natuerliche Teiler rausfinden\n" "(2) Primzahlen rausfinden\n" "(9) Programm beenden\n"; cin >> menueauswahl; switch (menueauswahl) { case 1: { teiler (); } break; case 2 : { primzahlen (); } break; case 9 : { cout << "Programm beendet!"; } break; default: { cout << "Falsche Eingabe!\n\n";} } } while (menueauswahl != 9); } void primzahlen () { int variable = 0; int zaehler = 0; cout <<"Zahl eingeben:"; cin >> variable; for (int i=1; i<variable+1; i++) { if (variable/variable == 1 && variable/1 == 1) { zaehler++; cout << i << endl; } } cout << endl << "Die Primzahl " << variable << " hat " << zaehler << " natuerliche Teiler!" << endl << endl; } void teiler () { int variable = 0; int zaehler = 0; cout <<"Zahl eingeben:"; cin >> variable; for (int i=1; i<variable+1; i++) { if (variable%i == 0) { zaehler++; cout << i << endl; } } cout << endl << "Die Zahl " << variable << " hat " << zaehler << " natuerliche Teiler!" << endl << endl; }Ach ja mein System ist ein Handy. Das Galaxy s3. Die app heisst c4droid und da habe ich gcc++ +bionic als compiler eingestellt.
Ansonsten ist das nicht weiter wichtig. Meine Fragen wurden beantwortet. Tausend dank!!!!!!!!
-
Mal ein cooles Beispiel für undefiniertes Verhalten bei signed Integerüberlauf. Und gar nicht konstruiert, sondern aus dem wirklichen Leben
. Der Compiler macht aus deiner Schleife irgendwas cleveres. Wenn du dann einen zu großen Integer eingibst, wird "variable" (doofer Bezeichner!) so etwas wie MAX_INT (in Wirklichkeit wird "variable" so direkt gar nicht mehr existieren, sondern wegoptimiert). Und deine (recht ungewöhnlich konstruierte) Schleife sollte eigentlich abbrechen, weil MAX_INT + 1 etwas negatives ist. Oder besser gesagt: Sein sollte. Dieses Verhalten ist jedoch undefiniert und der Compiler darf Code erzeugen, der dieses Verhalten nicht respektiert. Hier hat er irgendeine schöne Optimierung gefunden, bei der es günstiger ist, dieses Verhalten nicht zu respektieren, dafür läuft der Code für sämtliche anderen Werte schneller.Wunderschönes Beispiel für:
http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html