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 oder float reicht, hängt auch von dem Wert von RAND_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ächst

    float 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


Anmelden zum Antworten