"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C(++) Problem

Lactobacillus 22.01.2001 - 20:47 1126 15
Posts

Lactobacillus

Addicted
Registered: Sep 2000
Location: gone
Posts: 389
Hallo,

wie schneide ich den Nachkommaanteil einer Variablen ab?

Ich bräuchte es um feststellen zu können, ob eine Zahl gerade oder ungerade ist...

Zitat
if (Nachkommaanteilabgeschnitten(1/a) == 1/a) ...

Auch andere konstruktiven Lösungsvorschläge sind willkommenhttp://overclockers.gamers.at/ubb/smilies/wink.gif

Lactobacillus

Hatzki

Pinky in action
Avatar
Registered: Apr 2000
Location: Dort wo DU nicht..
Posts: 1017
Pff ... ich hab denn ganzen Müll scho glernt aber scho wieder alles vergessen wies ausschaut ... http://overclockers.gamers.at/ubb/smilies/biggrin.gif

Hmm des einzige was ma im Moment einfallt:

Die Zahl die du hast is ja sicher als float definiert ... schau mal ob du sie in eine andere Zahl kopieren kannst die als integer definiert is .. dann könntest as leicht überprüfen ... das geht aber nur wenn der copy befehl von links nach rechts kopiert ... wenn nicht hast die Nachkommastellen im integer ... des wär bled http://overclockers.gamers.at/ubb/smilies/biggrin.gif !!!

Wenns net klappt hat sags dann schau i in meine Bücher nach !

------------------
- Hatzki

<IMG SRC="http://cwm.ragesofsanity.com/s/cwm2/Up_to_something.gif" border=0> KeeP on plaYing

vEspertine

offline..
Registered: Sep 2000
Location: graz
Posts: 4753
@hatzki.. i glaub des wird net funken..

@lacto versuchs mit typcasting:
intvariable=(int)floatvariable;

------------------
greetz
$kawar$ ..

fleshmark

GameDev
Avatar
Registered: Aug 2000
Location: Wien
Posts: 2958
kann man nicht so die nachkommastelle nach unten "wegrunden"?
weiss leider keinen befehl auswendig

-fleshmark

Lactobacillus

Addicted
Registered: Sep 2000
Location: gone
Posts: 389
Das Problem hab' ich gelöst, jetzt plagt mich ein anderes:

Wenn ich
Zitat
float=float+(1/Int)
oder
Zitat
float=float+(1/2)
schreibe und dann mir float per cout ausgeben lasse, dann hat float den ursprünglichen Wert.

Beispiel:
Zitat
#include <stdio.h>
#include <iostream.h>

void main ()
{
float floatvariable(0.5);

floatvariable=floatvariable+(1/2);
cout<<floatvariable; //sollte IMHO ja 1 sein (0.5 + 0.5 = 1)
}

fleshmark

GameDev
Avatar
Registered: Aug 2000
Location: Wien
Posts: 2958
wennst floatzahl=floatzahl+(1.0/2.0) schreibst gehts..
is komisch, ich weiss

-fleshmark

Hatzki

Pinky in action
Avatar
Registered: Apr 2000
Location: Dort wo DU nicht..
Posts: 1017
Na Gott sei Dank gibts noch andere die sich damit auskennen .. http://overclockers.gamers.at/ubb/smilies/icon19.gif .. ich bin derzeit mehr auf der Assembler Welle ... http://overclockers.gamers.at/ubb/smilies/biggrin.gif

------------------
- Hatzki

<IMG SRC="http://cwm.ragesofsanity.com/s/cwm2/Up_to_something.gif" border=0> KeeP on plaYing

Lactobacillus

Addicted
Registered: Sep 2000
Location: gone
Posts: 389
Danke, es funktioniert.

Ich habe einmal einen C++-Kurs besucht, aber das meißte vergessen, da ich mich bis dato eher mit Visual Studio Winsock-Programmierung beschäftigt hab. Ich habe u.a. einen Chat nach Client/Server-Model mit Dedicated Server, et cetera gemacht...

Nur noch eine Frage:
Wenn ich mir mit
Zitat
cout<<Floatvariable;
meine Floatvariable ausgeben will, so wird sie nach ein paar Stellen gerundet.
D.h. aus 2.6(periodisch) wird 2.66667. Ich möchte aber so viele Nachkommastellen wie möglich anzeigen...

Grüße
Lactobacillus

fleshmark

GameDev
Avatar
Registered: Aug 2000
Location: Wien
Posts: 2958
weiss net wies beim cout geht, aber beim printf kann man doch so irgendwie mit dem %-zeichen so die formatierung angeben, weiss aber leider nimmer genau wie das geht, tut mir leid..

-fleshmark

Lactobacillus

Addicted
Registered: Sep 2000
Location: gone
Posts: 389
Mit cout.precision(Wert); funktionierts, aber da bekomme ich nur eine max. 15-stellige Zahl (1 Stelle vor dem Komma, 14 nach dem Komma) heraus. Ich weiß aber nicht, ob es an der Prezision, oder an dem verwendeten Variablentyp liegt...
Als Variablentyp verwende ich double.

Wenn wem was einfällt...

Grüße und "Vielen Dank!"
Lactobacillus

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Double speichert nun mal nicht mehr Stellen.

Wenn du übrigens testen willst, ob eine Zahl gerade oder ungerade ist, dann mach's so: (a&1) (für eine Integervariable)

Der Test mit der Division ist saulangsam.

double -> int umwandeln geht problemlos
Nachkommastellen abschneiden und bei Fließkommazahlen bleiben geht mit floor() (für positive Zahlen)

fleshmark

GameDev
Avatar
Registered: Aug 2000
Location: Wien
Posts: 2958
na, da hast deinen profi http://overclockers.gamers.at/ubb/smilies/biggrin.gif

-fleshmark

Lactobacillus

Addicted
Registered: Sep 2000
Location: gone
Posts: 389
Nur noch eine Frage:

Wie kann ich Befehlszeilenparameter einbauen?
Ich möchte, dass das Programm z.B. bei dem Befehlszeilenparameter /? eine Hilfe ausspuckt, Variablen müssen nicht übergeben werden.

Also etwas wie (im void main())
Zitat
if (Parameter == "/?")
...

Vielen Dank
Lactobacillus

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
main() als main(int argc, char **argv) deklarieren.

dann kannst mit argc die anzahl der argumente (+1 für programmnamen) und mit argv[0], argv[1], ... die argumente ansprechen und halt z.b. mit strcmp("/?", argv[1]) vergleichen

Lactobacillus

Addicted
Registered: Sep 2000
Location: gone
Posts: 389
Ich wollte mich nocheinmal bedanken, dass man hier so schnelle und kompetente (C++) Hilfe bekommt...

Grüße
Lactobacillus
PS: Kann mir jemand nur einen Hinweis geben, wie das mit dem Dateizugriff (lesen u. schreiben) vor sich geht?
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz