Prozentuale Ausgabe in C

molojose

Komplett-PC-Aufrüster(in)
Hallo, ich hab hier ein kleines Problem, aber ich kriege es einfach nicht hin und hab mich gewundert ob ihr mir helfen könnt.

Aufgabe:
Zur Erzeugung Gauss-verteilter Zufallszahlen sind folgende Anweisungen notwendig:
d1 = ( (double) rand() ) / RAND_MAX;
d2 = ( (double) rand() ) / RAND_MAX;
n = m + s*(sqrt(-2.0*log(d1))*cos(2.0*M_PI*d2));
a) 1000 Zufallszahlen sollen am Bildschirm ausgegeben werden. m und s sind von der Tastatur
einzulesen.
b) In einem int-Vektor mit 8 Elementen soll die Häufigkeit der in den Intervallen
[-unendlich,m-3s],[m-3s,m-2s],[m-2s,m-s],[m-s,m],[m,m+s],[m+s,m+2s],[m+2s,m+3s], [m+3s,unendlich]
auftretenden Zufallszahlen gezählt und anschließend absolut und prozentual am Bildschirm
ausgegeben werden.

Mein Problem ist, das die Prozentuale Ausgabe nicht stimmt. Da sind einfach keine Nachkommazahlen. Ich hab mehrere Varianten ausprobiert wie hier zu sehen ist.
Danke im Voraus.


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main ()
{

float d1=0, d2=0, n=0, m=0 ,s=0,p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0;
unsigned int i;
int V[8]={0,0,0,0,0,0,0,0};



printf("Geben Sie m ein:");
scanf("%f",&m);
printf("Geben Sie s ein:");
scanf("%f",&s);

for (i=1; i<=1000; i++)
{

d1 = ( (double) rand() ) / RAND_MAX;
d2 = ( (double) rand() ) / RAND_MAX;

n = m + s*(sqrt(-2.0*log(d1))*cos(2.0*M_PI*d2));

if(n<(m-3*s))
V[0]++;
else if((n>=(m-3*s)) && (n<(m-2*s)))
V[1]++;
else if((n>=(m-2*s)) && (n<(m-s)))
V[2]++;
else if((n>=(m-s)) && (n<m))
V[3]++;
else if((n>=m) && (n<(m+s)))
V[4]++;
else if((n>=(m+s)) && (n<(m+2*s)))
V[5]++;
else if((n>=(m+2*s)) && (n<(m+3*s)))
V[6]++;
else if(n>=(m+3*s))
V[7]++;

printf("\nDie %ute. Zahl ist %f\n", i, n);

}
p0=((V[0]*100)/1000);
p1=(V[1]*0,1);
p2=(V[2]/10);
p3=((V[3]*100)/1000);
p4=((V[4]*100)/1000);
p5=((V[5]*100)/1000);
p6=((V[6]*100)/1000);
p7=((V[7]*100)/1000);

printf("\nDie Anzahl der Zahlen zwischen unendlich und %f ist: %i\n",(m-3*s), V[0]);
printf("entspricht %f\n", p0);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-3*s),(m-2*s), V[1]);
printf("entspricht %f\n", p1);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-2*s),(m-s), V[2]);
printf("entspricht %f\n", p2);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-s),m, V[3]);
printf("entspricht %f\n", p3);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",m,(m+s), V[4]);
printf("entspricht %d\n", p4);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m+s),(m+2*s), V[5]);
printf("entspricht %d\n", p5);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m+2*s),(m+3*s), V[6]);
printf("entspricht %i\n", p6);
printf("Die Anzahl der Zahlen zwischen %f und unendlich ist: %i\n",(m+3*s), V[7]);
printf("entspricht %i\n", p7);

return 0;
}
 
Das sollte einfach sein:

p0=(V[0]*0.1f);

Sonst machst du eine Integer-Division, da kommt dann kein float raus.
Floats muss du auch mit einem Punkt "trennen", also 1.5 z.B. Ist die amerikanische Notation.
 
danke sehr, jetzt klappt alles. Ein paar Fragen hätte ich aber noch.
Was macht das f hier? (V[0]*0.1f)
wie kann ich das % Zeichen ausgeben lassen, damit es so aussieht?
entspricht 12.4%
Warum funktioniert es nicht so?
((V[1]*100)/1000) hier ist V[1]=19 aber es kommt nur noch 0.0 raus.

was ich auch komisch finde ist, dass die ausgegeben Felder V[x] fast immer gleich sind. Ist das normal?
 
Zuletzt bearbeitet:
Also...
diese Buchstaben nach der Zahl geben dem Compiler an, was für einen Datentyp du nutzen möchtest. Bei f also "float", gibt auch l für "long".
Wenn du nur 10.88 schreibst, würde der Compiler diesen Wert als double interpretieren und dir ggf. ne Warnung ausgeben, da duch versuchst den Wert in einen float zu speichern (welcher weniger Werte speichern kann).

((V[1]*100)/1000): Hier sind nur ints beteiligt, du machst eine sogenannte Integer-Division. Dabei kann nur eine neue Ganzzahl herauskommen.
Du müsstest z.B. 100.0f oder 1000.0f schreiben. Dann wird eine Fließkommadivision durchgeführt. Alternativ könntest du auch explizit casten:
((V[1]*100)/(float)1000).

Zu dem %: Das musst du "escapen". Versuche dazu mal \% oder \\%. Bin mir grad nicht sicher, welcher das war...

Was da jetzt für Werte rauskommen sollen, kann ich dir leider nicht sagen...
 
Zurück