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

void randomnumbergenerator(int *randomnumbers, int length);
int comp(const void* a,const void* b);
int findMostFrequent(int randomnumbers[], int n);

int counted = 0;

int main() {
    int length = 0;
    int validInput = 0;

    while (!validInput) {
        printf("Wieviele Zufallswerte (1..10000): ");
        scanf("%d", &length);
        while (getchar() != '\n'); // Eingabepuffer leeren
        if (length <= 0 || length > 10000) {
            printf("Ungueltige Eingabe. Bitte geben Sie eine Zahl zwischen 1 und 10000 ein.\n");
        } else {
            validInput = 1;
        }
    }

    int randomnumbers[length]; // Array für die Zufallszahlen

    // Zufallszahlengenerator initialisieren
    srand(time(NULL));

    // Zufallszahlen erstellen
    randomnumbergenerator(randomnumbers, length);

    printf("Erzeugte Zufallszahlen: \n");
    for (int i = 0; i < length; i++) {
        printf("%d ", randomnumbers[i]);
    }

    qsort(randomnumbers, length, sizeof(int), comp); // array, die Länge, Bits, vergleichsfunktion

    printf("\nSortierte Zufallszahlen: \n");
    for (int i = 0; i < length; i++) {
        printf("%d ", randomnumbers[i]);
    }

    int result = findMostFrequent(randomnumbers, length);

    printf("\nModus: %d\nHaeufigkeit: %d\n", result, counted);

    return 0;
}

void randomnumbergenerator(int *randomnumbers, int length) { // Zeiger, da man keinen neuen Speicher erstellen will sondern direkt auf die Stellen von randomnumbers zugreifen möchte
    for (int i = 0; i < length; i++) {
        *(randomnumbers + i) = rand() % 99 + 1; // randomnumbers bekommt an jede i´te Stelle eine Zufallszahl
    }
}

int comp(const void* a,const void* b) { // 1. Zahl und 2. Zahl
    return *(int*)a - *(int*)b; // >0 wenn a größer b, <0 wenn b größer a, =0 wenn a gleich b
}

int findMostFrequent(int randomnumbers[], int n) {
    int maxCount = 0;
    int mostFrequent = randomnumbers[0];

    for (int i = 0; i < n; i++) {
        int count = 0;
        for (int j = 0; j < n; j++) {
            if (randomnumbers[j] == randomnumbers[i]) { // wenn Zahlen gleich geht count hoch
                count++;
            }
        }
        if (count > maxCount) {
            maxCount = count;
            mostFrequent = randomnumbers[i];
        }
    }
    counted = maxCount;
    return mostFrequent;
}

