C Natürliche Zahl abfragen mittels If

Scholle1309

Lt. Commander
Registriert
Feb. 2007
Beiträge
1.142
Hallo,

wir sollen für das anstehende Praktikum ein Programm programmieren welches eine Dezimalzahl in eine Binär, Oktal oder Hexadezimalzahl umwandelt. Das Programm funktioniert. Allerdings sehe ich anscheinend den Wald vor lauter Bäumen nicht mehr.

in der Mainfunktion muss ich abfragen, ob die eingegebene zahl eine natürliche zahl ist, dies mache ich mit:

Code:
	if(zahl == (int)zahl)

ist es keine natürliche zahl, so soll er

Code:
	else
	{
		printf("Sie haben keine natuerliche Zahl eingegeben!\n");
		system("Pause");
		return 0;
	}

ausgeben. Dies funktioniert aber nicht, wenn ich z.B. 12,3 eingebe, so führt er das Programm einfach einmal komplett aus ohne weiteres Abfragen und gibt keine Fehlermeldung aus.. Wieso? Ist die Abfrage der natürlichen Zahl falsch? Er soll ja nur natürliche Zahlen akzeptieren, also 1,2,3 .... n. Das ist erst mein zweites "Projekt" was wir an der FH machen, also bitte nicht gleich erschlagen :D

Code für eventuelle Copy&Paster entfernt =P Problem wurde gelöst!
 
Zuletzt bearbeitet:
Deine Abfrage ist Blödsinn. Überleg mal welchen Wertebereich unsigned int besitzt und ob der Datentyp Nachkommastellen enthält. Dein Problem liegt an der Eingabe, wie du selbst ja auch bereits entdeckt hast. Besser ist immer einen String entgegenzunehmen und diesen durch entsprechende Casts oder Funktionen (bspw. atoi) auf Validität zu prüfen.
 
Ich würd es mit zahl%1 == 0 versuchen.
Nur so eine fixe Idee, ob das unter C funzt weiß ich nicht.
 
Mika911 schrieb:
Ich würd es mit zahl%1 == 0 versuchen.
Nur so eine fixe Idee, ob das unter C funzt weiß ich nicht.

Kommt das selbe Ergebnis bei raus, er läuft einfach einmal komplett durch..

@ Yuuri: Vorgabe ist folgendes, vllt stehe ich deswegen so auf dem Schlauch: "Schreiben Sie ein C-Programm, das eine natürliche Zahl des Dezimalsystems (überprüfen!, dargestellt als int) in ein eingebbares anderes Zahlensystem (Binär, Oktal oder Hexadezimal) umwandelt. ..."
 
Und was sollst du überprüfen? Was soll denn bitte in zahl auch anderes stehen als ein integer? Und was soll scanf(%d) anderes einlesen?
 
Moin,
hab auch nur sehr elementare Kenntnisse, aber ich versuch mich mal ... ;)

  • Wenn ich das richtig sehe, liest du die Zahl bereits als Integer ein, daher ist die Abfrage immer true.
  • Integer sind ganze Zahlen, nicht natürliche.
  • Je nach Sprecheinstellungen kann es zu verschiedenen Interpretationen des Kommas kommen. (Dezimalzeichen Komma oder Punkt je nach Sprache)

Also müsste (so aus der Kalten) das Einlesen so aussschauen:
Code:
float zahl;
...
scanf("%f", &zahl);

und das if so:
Code:
if(zahl == (int)zahl && zahl > 0)

Hoffe das hilft zumindest als Denkanstoß ;)

Edit: Jaja ... ich tippe viel zu langsam -.-
 
ApeHunter schrieb:
Moin,
hab auch nur sehr elementare Kenntnisse, aber ich versuch mich mal ... ;)

  • Wenn ich das richtig sehe, liest du die Zahl bereits als Integer ein, daher ist die Abfrage immer true.
  • Integer sind ganze Zahlen, nicht natürliche.
  • Je nach Sprecheinstellungen kann es zu verschiedenen Interpretationen des Kommas kommen. (Dezimalzeichen Komma oder Punkt je nach Sprache)

Also müsste (so aus der Kalten) das Einlesen so aussschauen:
Code:
float zahl;
...
scanf("%f", &zahl);

und das if so:
Code:
if(zahl == (int)zahl && zahl > 0)

Hoffe das hilft zumindest als Denkanstoß ;)

Edit: Jaja ... ich tippe viel zu langsam -.-

Danke für den Denkanstoß @ simpsonsfan und ApeHunter, damit funktioniert die Abfrage bei 12.3, bei 12,3 kommt jedoch noch das selbe Problem...
 
damit funktioniert die Abfrage bei 12.3, bei 12,3 kommt jedoch noch das selbe Problem...
klar, der Compiler kennt halt nur Englishe (Amerikanische) Zahlen Eingaben...

Ich würde dies als eine Referenz im Text einbauen, direkt vor der Nummer Eingabe... zB. (oben deine CODE Zeilen 39 - 41)

Code:
printf("<==========Zahlensysteme==========>\n");
printf("Welche Dezimalzahl wollen Sie umrechnen?\n");
printf("Als Komma bitte Punkt benutzen")
scanf("%i", &zahl);

Da dies ja euer zweites Programm erst ist (annahme), geht das meist auch durch, sonnst musst du alles mit einem STRING machen, diesen STRING erst prüfen ob ein Punkt oder ein Komma darin enthalten ist, dann entweder gleich Konvertieren (kein Punkt/Komma also INTEGER) oder dann Zerlegen auf Vor- und Nachkomma Zahlen etc. etc...
oder einfacher Kommas durch String Manipulation zum Punkt Konvertieren und dann STRING zu FLOAT umwandeln... ;)
 
Ich sag jetzt mal bnei deinem Text, JAAAAA GENAU! :D Spaß beiseite, dass mit der amerikanischen Zahleneingabe macht natürlich Sinn. Wir werden zu dem Programm abgefragt ob wir das auch verstanden haben und da werde ich das dann erwähnen ;) (Oder einfach selbstständig Punkt statt Komma eingeben, vllt kriegt's keiner mit :D!)
Danke für eure Hilfe!
 
Ich glaube nicht, dass sowas gemeint ist, sondern nur, dass du prüfen sollst, ob die Zahl größer oder gleich 0 ist. Du kannst aber auch float verwenden und prüfen, ob eine natürliche Zahl eingegeben wurde. Aber auf ein Komma musst du die Eingabe bestimmt nicht überprüfen, du sollst ja eher die Umrechnung ins Hexadezimalsystem üben als dein Programm zu internationalisieren...
 
das locale in C hängt vom terminal locale ab, was dort eingestellt ist gilt :)
dazu passen muss dann auch das file encoding, sonst ensteht wieder murks.

und ami / deutsche zahlen ?? bezweifel ich.
ANSI ist wie ASCII, nur erweitert. Was ASCII kennt, kennt auch ANSI und zwar an gleicher Position.

Schaut euch die Zeichentabellen an. Gespeichert werden Zahlen (auch Strings funktionieren so), die einem Eintrag in der Zeichentabelle zugeordnet werden. Was eine "40" in C ist, hängt also von der Zeichentabelle ab.
 
Zuletzt bearbeitet:
Zurück
Oben