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.
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.
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
:
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.
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.
Tags und Links c floating-point floating-point-conversion