Ausgabe eines typedef Arrays falsch?
-
Hey ho
Die Aufgabe war, ein Programmcode zu vervollständigen, der eine zufällige float zahl zwischen 100 und 100000 erzeugt und dann weitere zufallszahlen zwischen 0 und der vorherigen zahl erzeugt, bis die zahl zwischen 0 und 1 liegt. Diese Zahlen werden in 5 Arrays gespeichert und ausgegeben.Bei mir sieht die Ausgabe jedoch anders aus. Mir werden nicht mal irgendwelche Inhalte des Arrays ausgegeben.
Hier mal alles nach der Reihe, was mir wichtig erscheint.//Hier soll der Typ RandomSet definiert werden. /*DONE*/ typedef struct RandomSet{ float newNumber; //Hierbei war ich mir nicht sicher float* numbers; unsigned int length; } RandomSet;
Wo der fehler wahrscheinlich liegt ist hier:
float randomFloat(float a, float b) { //Hier die Funktion entwickeln : /*DONE*/ //die Rueckgabe muss eine zufaellige Gleitkommazahl zwischen a und b sein. float x = (float)rand() / (float)(RAND_MAX / a-b); //x = rand() % (b-a) + a; return x; }
Ich glaube dort habe ich einen Fehler bei rand() gemacht.
Da man mit dem Modulo-Operator nur Integerzahlen benutzen kann, musste ich das Ganze ein wenig ummodellieren. Dennoch scheine ich dabei ein bisschen gescheitert zu sein (obwohl mir der Compiler keinen Fehler ausgeworfen hat!).mit besten Grüßen
(und ich kann natürlich noch den kompletten Quellcode posten falls es notwendig ist ;))
Lordakius
-
Du schreibst, du hast Probleme bei der Ausgabe und zeigst nichts davon.
Auch gut.Dann nehme ich mal den Fehler, den ich sehe.
Dein randomFloat erzeugt nur Fließkomazahlen zwischen 0 und (a-b), Was je nach Wahl der Grenz auch negative Werte sein können.
Sinnvolle Bezeichner wären Obergrenze und Untergrenze (oder in der Art) statt a und b.Mit
(double)rand() / RAND_MAX
bekommst du Zahlen zwischen 0.0 und 1.0 (einschließlich der Grenzen)Ob
double
nötig ist oderfloat
reicht, hängt auch von dem Wert vonRAND_MAX
ab.
-
float x = (float)rand() / (float)(RAND_MAX / a-b);//Punktrechnung vor Strichrechnung.
[/quote]
-
DirkB schrieb:
Du schreibst, du hast Probleme bei der Ausgabe und zeigst nichts davon.
Auch gut.Oh sry... da hab ich doch glatt das wichtigste vergessen ^^
RandomSet: 1 numbers: 0.000000 RandomSet: 1 numbers: 0.000000 RandomSet: 1 numbers: 0.000000 RandomSet: 1 numbers: 0.000000 RandomSet: 1 numbers: 0.000000
Das is die Ausgabe
Nun nochmal zu RandomFloat:
Ich möchte ja ne Zufallszahl, also hatte ich zunächstfloat x = rand() % (a-b) + a;
(habs net mehr so richtig im Kopf, aber das sieht so ähnlich aus.)
Das hat mir dann Fehler gegeben, den ich untersucht habe und dann gemerkt habe, dass man % nur mit Integerzahlen benutzen konnte. Da a und b aber float-Zahlen waren, musste ich das umschreiben. Kann mir jemand nich einfach sagen, wie ich das mache? Das müsste dann eigentlich die Lösung sein.
Hier nochmal der komplette Code (nich dass ich schon wieder was vergesse)
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> //----------------------------------------------------------------------------- //Hier soll der Typ RandomSet definiert werden. /*DONE*/ typedef struct RandomSet{ float newNumber; float* numbers; unsigned int length; } RandomSet; //----------------------------------------------------------------------------- float randomFloat(float a, float b) { //Hier die Funktion entwickeln : /*DONE*/ //die Rueckgabe muss eine zufaellige Gleitkommazahl zwischen a und b sein. float x = (double)rand() / RAND_MAX; //x = rand() % (b-a) + a; return x; } //----------------------------------------------------------------------------- /* diese Funktion initialisiert ein RandomSet */ void initRandomSet(RandomSet* p_set) { p_set->numbers = 0; p_set->length = 0; } void addNumberToSet(RandomSet* p_set, float number) { //Hier die Funktion entwickeln : /*DONE*/ //number muss zum Set p_set hinzugef?gt werden. p_set->length++; float* temp = (float*)realloc(p_set->numbers, (p_set->length)*sizeof (float)); if (!temp) exit(1); p_set->numbers = temp; //p_set->numbers[p_set->length--] = number; } /* diese Funktion gibt ein RandomSet auf der Konsole aus */ void printRandomSet(RandomSet* p_set) { printf("\nRandomSet:\n"); printf("%i numbers: ", p_set->length); for (unsigned int i = 0; i < p_set->length; i++) printf("%f ", p_set->numbers[i]); printf("\n"); } //----------------------------------------------------------------------------- int main() { printf("\n===== Random series ==================================\n"); //Initialisiere den Zufallszahlengenerator. /*DONE*/ srand((unsigned int)time); //srand(time(NULL)); =>Gibt jedoch einen Fehler .. typkonvertierung von time_t zu unsigned int RandomSet sets[5]; // 5 leere Sets werden erzeugt /*for (int a = 0; a < 5; a++) { sets[a].numbers = (float*)malloc(sets[a].length * sizeof(float)); }*/ for (int i = 0; i < 5; i++) // fuellt die 5 sets und gibt sie aus { initRandomSet(&sets[i]); float newNumber = randomFloat(100.0, 100000.0); // erzeugt Startzahl dieses Sets addNumberToSet(&sets[i], newNumber); // fuegt diese Zahl dem Set hinzu //Hier m?ssen jetzt die weiteren Nummern erzeugt werden! /*TODO*/ while ( newNumber <= 1.0 && newNumber >= 0.0) { newNumber = randomFloat(0.0, newNumber); addNumberToSet(&sets[i], newNumber); } } for (int i = 0; i < 5; i++) printRandomSet(&sets[i]); // gibt die Sets aus for (int i = 0; i < 5; i++) free(sets[i].numbers); // gibt den Speicher der Sets wieder frei printf("\n"); system("PAUSE"); return 0; }
-
Das ständige übergeben eines Zeigers auf die struct statt der struct ohne Zeiger ist nicht überall nötig.
http://ideone.com/VFpnpl