#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <assert.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)
{
  assert(b>a);
    //Hier die Funktion entwickeln :  /*DONE*/
    //die Rueckgabe muss eine zufaellige Gleitkommazahl zwischen a und b sein.

        float x = (double)rand() / RAND_MAX;
        return a + (b-a)*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++;
    p_set->numbers = realloc(p_set->numbers, (p_set->length)*sizeof (float));
    if (!p_set->numbers) exit(1);
    p_set->numbers[p_set->length-1] = 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(time(0));    //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");
}

