Hallo
Bin Programmieranfänger und erst mal bei den Basisdingen angelangt (d.h. noch keine Arrays, Klassen usw.).
Da ich aber gerne dann selber ausprobiere und mir Ziele setze, wollte ich mal ein Programm schreiben, welches erkennt, ob man eine Integer-Zahl eingegeben hat oder nicht.
Mit "cout" kann ich ja eine Ausgabe mit einer bestimmten Dezimalstellenanzahl erzwingen. Wenn also z.B. 2 eingegeben wird, wird 2.0 oder 2.00 angezeigt.
Ein Programm habe ich bereits schreiben können, welches Werte wie 2.5 als Nicht-Integer erkennt und eine 2 als Integer. Allerdings wird eine 2.0 auch als Integer bekannt, da anscheinend intern im Speicher, eine 2.0 als 2 dargestelt wird, auch wenn 2.0 eingegeben wird.
Frage: Gibt es eine Möglichkeit mit "cin" oder auf eine andere Weise, eine eingegebene Zahl auf eine solche Null-Dezimalstelle zu prüfen oder diese genau so abzuspeichern, wie sie eingetippt wurde, also nicht als 2, sondern 2.0? Ich möchte nämlich, dass auch diese als Nicht-Integer erkannt werden.
Bitte (wenn es geht) die einfachste Lösung. Falls es keine einfache Lösung gibt, werde ich wohl zuerst noch etwas weiterlernen müssen ;-)
Danke und Gruss
Thomas
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Hallo!
"2.0" ist "2.0" und nicht 2.
Wenn Du einen String eingibst, sollt es doch möglich sein,
diesen auf Vorhandensein eines "." zu überprüfen.
Wenn "." dann Konvertierung nach float, sonst Integer.
Gruss
ChrE
Jetzt mal nur so aus der Hüfte geschossen:
Ich würde den Eingabewert einmal in float und einmal in int casten und dann vergleichen. Sind sie gleich, dann war der Eingaewert ein int.
Ups, sorry. Ich hatte dein Posting zu oberflächlich gelesen, Du willst ja was ganz anderes wissen. Mir ist jedoch nicht ganz klar, was Du erreichen willst, bzw warum Du zwar zwischen float und int unterscheiden willst, ein 2.0 aber unbedingt als float willst.
Definiere das Regel, das ist immer am verständlichsten und du hast mehr Chancen das dir jemand hilft.
Deine Regel lautet:
Wenn der Benutzer eine Zahl mit Dezimaltrennzeichen eingibt soll
diese als double gespeichert werden auch wenn die Stellen nach dem Trennzeichen aus Nullen bestehen. Wenn der Benutzer eine Zahl ohne Dezimaltrennzeichen eingibt soll es als int gespeichert werden.
Korrekt?
Völlig korrekt.
@Chre
Ich glaube, deine Lösung ist tatsächlich die Simpelste und sollte wunderbar funktionieren. Allerdings, falls ich zu einem späteren Zeitpunkt mit dem Wert rechnen möchte, müsste ich dann den String ja nach Int oder Float konvertieren
@xafford
Erreichen will ich damit nichts, aber ich stelle mir gerne Aufgaben, wenn ich am Programmieren lernen bin. Und solche Dinge reizen mich halt, auch wenn es schliesslich keinen Sinn macht. :-)
Gruss und Dank
Thomas
Hm, wie kann ich den String denn auswerten? Habe momentan folgenden Quellcode:
#include '<'iostream
using namespace std;
int main()
{
string Zahl;
cout '<' '<' "Geben Sie eine Integer-Zahl ein: ";
cin '>' '>' > Zahl;
if (string[Zahl]=='.')
{
cout '<' '<' "Dies ist keine Integer-Zahl!";
}
else
{
cout '<' '<' "Die ist eine Integer-Zahl!";
}
return 0;
}
Er meldet mir aber den Fehler: "expected primary-expression before '[' token"
Was habe ich falsch gemacht?
Gruss
Thomas
Alo zum ersten ist mir nicht bekannt das cin für den string datentypen überladen ist.
vielleicht geht das bei dir , welchen compiler benutzt du?
Zweitens
if (string[Zahl]=='.')
Das geht garnicht. Was sollte das werden ?
Wenn Du ermitteln willst ob ein "." darin vorkommt würde ich über ein char array und strstr vorgehen.
char Zahl[128];
cout'<''<'"Geben Sie eine Integer-Zahl ein: ";
cin'>'>Zahl;
char* seperator = strstr((char*)Zahl,".");
if(NULL != seperator)
cout '<'< "Dies ist eine Integer-Zahl!";
else
cout '<'<"Die ist keine Integer-Zahl!";
Allerdings werden wenigstens 50% der Benutzer "," eingeben bzw. das Dezimaltrennzeichen ist ein vielfälftiges Ding in versch. Ländern.
Gib einen Hinweis im Progam aus beim Start das man Dezimalzahlen durch ein "." zu trennen hat wenigstens. Ausserdem musst du noch prüfen ob der Benutzer auch eine gültige Zahl eingegeben hat und nicht z.B. "abc.00ae".
See ya.
*maah* die ausgaben sind verdreht.
cout '<'< "Dies ist eine Integer-Zahl!";
else
cout '<'<"Die ist keine Integer-Zahl!";
andersrum natürlich.
char Zahl[128];
...
cin >> Zahl;
Hmmm, bist Du Dir sicher, dass das eine gute Idee ist? ;o)
Sicherer wär da:
cin.getline ( Zahl, sizeof ( Zahl ) );
Habe es unterdessen geschafft, aber eben mit der Einschränkung, dass noch nicht erkannt wird, ob es wirklich eine Zahl ist und die Zahl wird auch noch nicht gespeichert (was aber das kleinere Problem sein wird).
Momentan kann ich halt mit cin.getline und anderen Befehlen noch nichts anfangen, mit Arrays auch noch nicht. Das Kapitel kommt aber als Nächstes in meinem Buch. Werde wohl mal noch etwas weiterlernen und mich dann wieder um diese Fragestellung kümmern.
Danke trotzdem allen für die Tipps.
Gruss
Thomas
ich glaub das ist in dem fall zu vernachlässigen, geht beides.
sind eh bestimmt noch andere schreibfehler drin :p
Ja, da geb ich Dir Recht. Ich finde nur, dass man auf so Sachen am Besten so früh wie möglich hingewiesen wird und es dadurch verinnerlicht und für die Gefahr sensibilisiert wird.
Andererseits... war wär die IT ohne Buffer Overflows? ;o)