Bestimmen, ob ein Float einen Bruchteil hat?

8

Hier ist das Problem: Das Spiel Totals kann von beliebig vielen Leuten gespielt werden. Es beginnt mit einer Gesamtzahl von 100 und jeder Spieler macht eine ganze Verschiebung zwischen -20 und 20. Der Gewinner ist der Spieler, dessen Anpassung die Summe auf 5 setzt. Nur die drei angegebenen Variablen verwenden: gesamt Einstellung Zähler Hier ist, was ich bisher habe:

%Vor%

Was ich brauche: Wenn eine Dezimalzahl eingegeben wird, wird sie an die Else übergeben. Wie stelle ich fest, ob ein Float einen Bruchteil hat.

    
TheMegalomaniac 18.12.2011, 02:10
quelle

5 Antworten

13

Sie können das float auf ein int umwandeln und es dann mit Ihrer ursprünglichen Variable vergleichen. Wenn sie gleich sind, gab es keinen Bruchteil.

Bei Verwendung dieser Methode ist keine temporäre Variable oder ein Funktionsaufruf erforderlich.

%Vor%

Erläuterung

Da ein int keine Bruchteile verarbeiten kann, wird der Wert von float in ein int gekürzt (als Beispiel wird (float)14.3 in (int)14 gekürzt).

Beim Vergleich von 14 mit 14.3 ist es offensichtlich, dass sie nicht denselben Wert haben und daher "fraktional!" wird gedruckt.

    
Filip Roséen - refp 18.12.2011 02:14
quelle
10
%Vor%

Ссылка

modff findet den Bruchteil, also würde ich testen, ob es gleich 0 oder null ist, wird Ihre Frage beantworten.

    
Neeta 18.12.2011 02:13
quelle
3

Wenn Sie wissen möchten, ob eine reelle Zahl x keinen Bruchteil hat, versuchen Sie x==floor(x) .

    
lhf 18.12.2011 02:13
quelle
0

Die Verwendung von scanf() ist problematisch. Wenn der Benutzer in der ersten Zeile der Eingabe -5 +10 -15 -15 eingegeben hat und dann die Eingabetaste gedrückt hat, werden die 4 Zahlen der Reihe nach mit scanf() verarbeitet. Dies ist wahrscheinlich nicht das, was Sie wollten. Wenn der Benutzer +3 or more eingibt, stoppt natürlich auch die erste Konvertierung, sobald der Speicherplatz gelesen wurde, und alle nachfolgenden Konvertierungen schlagen für o oder or fehl und der Code wird in eine Schleife umgewandelt. Sie müssen den Rückgabewert von scanf() überprüfen, um zu wissen, ob es alles konvertieren konnte.

Die Read-ahead-Probleme sind so gravierend, dass ich mich für die quasi-standardmäßige Alternative der Verwendung von fgets() zum Lesen einer Datenzeile und der Verwendung von sscanf() (die zusätzliche s ist alles wichtig) entscheiden würde. um eine Nummer zu analysieren.

Um zu bestimmen, ob eine Gleitkommazahl sowohl einen Bruchteil als auch einen ganzzahligen Teil hat, könnten Sie das modf() oder modff() Funktion - letzteres, da Ihr adj ein float :

ist %Vor%

Der Rückgabewert ist der vorzeichenbehaftete Teil von x ; Der Wert in iptr ist der ganzzahlige Teil. Beachten Sie, dass modff() möglicherweise nicht in Compilern (Laufzeitbibliotheken) verfügbar ist, die C99 nicht unterstützen. In diesem Fall müssen Sie möglicherweise double und modf() verwenden. Es ist jedoch wahrscheinlich so einfach, den Benutzer auf Ganzzahlen mit %d -Format und einem Integer-Typ für adj zu beschränken. das hätte ich von Anfang an getan.

Ein weiterer Punkt im Detail: Möchten Sie wirklich ungültige Zahlen in der Gesamtzahl der Versuche zählen?

%Vor%

Offensichtlich ignoriere ich geflissentlich die Möglichkeit, dass jemand mehr als 4095 Zeichen eingibt, bevor er zurückgibt.

    
Jonathan Leffler 18.12.2011 02:42
quelle
0

Ich lerne nur C, also sag mir, wenn ich falsch liege, bitte.

Aber wenn statt

zu verwenden %Vor%

wenn Sie Folgendes verwenden:

%Vor%

Wenn der Benutzer also etwas anderes als eine ganze Zahl eintippte, würde & IsUndef nicht gleich NULL sein und einen Bruchteil haben, der den Benutzer an den anderen sendet.

vielleicht.

    
sayth 18.12.2011 13:02
quelle