C Division liefert verrückte Werte

Leberkäse

Cadet 3rd Year
Registriert
Juni 2014
Beiträge
36
Hallo,
Ich versuche gerade für ein Praktikum im Studium eine Aufgabe zu programmieren.
Dabei möchte ich Werte aus einem int Array durch eine Zahl teilen, und das Ergebnis als Kommazahl in ein anderes Array speichern.
Hier mein Code:

for(int i=1; i<=6;i++){
WK[(i-1)]=(((float)anz[i-1])/100.00);
}

Wenn ich mir die Werte von anz[] und WK ausgeben lasse bekomme ich folgendes Ergebnis:
Anz: 6
WK: -1.776616
Anz: 18
WK: 0.180000
Anz: 24
WK: 0.240000
Anz: 17
WK: 0.170000
Anz: 20
WK: 0.200000
Anz: 15
WK: 0.150000

Wie man erkennen kann, stimmen die Werte für alle außer dem ersten Schleifendurchlauf. Woran könnte das liegen? Bin gerade im ersten Semester und noch kein Vollprofi in C ;)
 
Wenn lustige Werte in Arrays stehen in C, dann hat man meistens den Speicher nicht initialisiert. Dann werden die Werte die in den Speicherbereichen stehen eben einfach als int oder was auch immer du angegeben hast interpretiert. Das passiert aber eigentlich nur bei malloc. Hast du das verwendet? Ansonsten mal etwas mehr vom Code zeigen.
 
Das wäre der komplette Code:
Geht um Zufallszahlen




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

void lineareKongruation(FILE* exp, int x0, int a, int c, int m,int z[]){
int x;
int u=0;
x=x0;
for(int i=1; i<=100; i++){
x= (a*x+c)%m;
u= x%6+1;
fprintf(exp, "%d\n",u);
z=u;
}
}

void internZz(FILE* exp, int z[]){
int i;
int a;
time_t t;
time(&t);
srand((unsigned int)t);
for(i=0; i<100;i++){
int a = rand()%6+1;
fprintf(exp, "%d\n",a);
z= a;
}
}

statistik(int z[]){
float WK[6]={0,0,0,0,0,0};
double Erwartungswert =0;
double Autokorelationskoeffizient[4];
double Varianz=0;
double Zaehler=0;
int anz[6]={0,0,0,0,0,0};

anzahlwerte(z, anz);

for(int i=1; i<=6;i++){
WK[(i-1)]=(((float)anz[i-1])/100.00);
}

for(int h=1;h<=6;h++){
Erwartungswert = Erwartungswert + WK[h-1]*h;
}

/*for(int j=1; j<=6;j++){
Varianz = Varianz + ((j-Erwartungswert)*(j-Erwartungswert))*Wahrscheinlichkeit[j-1];
}*/

for(int s=2;s<=6;s++){
for(int k=1;k<=(6-s);k++){
Varianz = Varianz + ((k-Erwartungswert)*(k-Erwartungswert))*WK[k-1];
Zaehler= Zaehler + ((k+s-Erwartungswert)*(k-Erwartungswert))*WK[k-1];
}
Autokorelationskoeffizient[s-2]= Zaehler/Varianz;
}
for(int x=0;x<=5;x++){
printf("Anz: %i \n WK: %3f\n", anz[x], WK[x]);

}
}

anzahlwerte(int z[], int anz[]){
for(int i=0;i<100;i++){
for(int h=1; h<=6;h++){
if(z==h){
anz[h-1]= anz[h-1]+1;
}
}
}
}


int main()
{
FILE * exp1;
FILE * exp2;
FILE * exp3;

int z1[100];
int z2[100];
int z3[100];

for(int i=0;i<=100;i++){
z1=0;
z2=0;
z3=0;
}

exp1= fopen("exp1.txt", "w");
exp2= fopen("exp2.txt", "w");
exp3= fopen("exp3.txt", "w");

lineareKongruation(exp1,1,137,1,256,z1);
lineareKongruation(exp2,1,21,1,256,z2);
//internZz(exp3,z3);


statistik(z1);
/*statistik(exp2);
statistik(exp3);
*/

//fclose(exp1);
//fclose(exp2);
//fclose(exp3);
return 0;
}
 
Ich kann dir grade nicht wirklich helfen, aber bei mir funktionierts anstandslos.

Code:
#include <iostream>

int main() {
	int anz[6] = {6, 18, 24, 17, 20, 15};
	float WK[6];

	for (int i = 0; i <= 5; i++) {
		WK[(i)] = (((float)anz[i]) / 100.00);
		std::cout <<std::endl<< anz[i] << std::endl << WK[i];
	}
	
}
 
Zuletzt bearbeitet von einem Moderator:
Hmm, Du definierst in der Funktion statistik() die Arrays anz und WK, dann werden die an anzahlwerte() übergeben, die Funktion anzahlwerte() liefert aber nichts zurück, bzw. die dort erzeugten Werte existieren nur innerhalb der Funktion, nicht aber in statistik().

Entweder anzahlwerte mit in statistik() kopieren oder anz und WK global machen.

Ich bin übrigens grad beim selbigen Thema in Statistik, muss es aber auf dem Papier lösen :(
 
Zuletzt bearbeitet:
Aber Du nutzt keine Pointer für die beiden Arrays :)
 
Arrays sind ja Pointer auf den ersten Wert im Speicherbereich, das Funktioniert ja auch tadellos. :D
Ergänzung ()

Hab aber jetzt ein neues Problem, in der Funktion internZz stürzt mein Programm plötzlich immer ab, kann mir da jemand helfen?
 
Leberkäse schrieb:
Arrays sind ja Pointer auf den ersten Wert im Speicherbereich, das Funktioniert ja auch tadellos. :D
Ergänzung ()

Hab aber jetzt ein neues Problem, in der Funktion internZz stürzt mein Programm plötzlich immer ab, kann mir da jemand helfen?

Ich glaube Du hast fclose() noch auskommentiert. Du musst auch noch prüfen, ob die Dateien korrekt geöffnet wurden und ansonsten abbrechen mit einer Fehlermeldung.
 
Zuletzt bearbeitet:
Beim befüllen von Z1 z2 und z3 in main begehst du einen Speicherzugriffsfehler:
Von i=0 bis bis i<=100. es sollte nur <100 heißen.

Zum Erkennen solcher Speicherzugriffsfehler hilft Valgrind.
Der gleiche Fehler steckt ebenfalls in lineareKomgruation:
z mit i=100.
 
Zuletzt bearbeitet:
Und lineareKongruation durchläuft das Array ab 1, 0 wird also nie befüllt:
Code:
for(int i=1; i<=100; i++){
  ...
  z[i]=u;
}
 

Ähnliche Themen

Zurück
Oben