/*
14. Vytvořte program který bude řešit následující úkoly.

1)	Vytvořte pole numbers  18 celých čísel. Pole naplňte náhodnými hodnotami z intervalu <-50;100).
2)	Zjistìte počet čísel dělitelných èíslem 3 v poli numbers  .
3)	Vytvořte dynamické pole trojky  a nakopírujte do něj čísla dělitelná číslem 3 z pole numbers.
4)	Vytvořte funkci tisk, která vypíše prvky pole. Pomocí ní vypište nejprve pole numbers  a pak i pole trojky.
5)	Vytvořte funkci, která bude vracet pro parametr pole dvě hodnoty : počet čísel z intervalu <0;50>
     v tomto poli a aritmetický průměr čísel z intervalu <0;50> z pole. Funkci zavolejte nejprve pro pole numbers
     a pak i pro pole trojky  . Výsledky vypište ve funkci main().
6)	Vytvořte funkci pro sestupné setřízení prvků pole (od největšího k nejmenšímu).
     Setřiďte touto funkcí pole numbers  a pak i pole trojky. Obě pole znovu vytiskněte pomocí funkce tisk.
*/

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>

//definice NUMBERSCOUNT udává počet prvků v poli NUMBERS (které není dynamické, podle zadání)
#define NUMBERSCOUNT 18

//zadefinujeme strukturu, abychom ji mohli použít jako návratovou hodnotu pro funkci pocetPrumer
struct retPocPrum{
    int pocet, prumer;
};

//funkce tisk přebírá jako první parametr pole čísel a jako druhé jeho délku, dále cyklem vypisuje prvky pole, odděluje mezerou
void tisk (int pole[], int delka) {
    int i;

    for(i=0;i<delka;i++) {
        printf("%d ",pole[i]);
    }

    return;
}

//funkce pocetPrumer z pole vezme prvky náležící do intervalu <0;50> a vrací dvojici hodnot - počet prvků a jejich arit.průměr
struct retPocPrum pocetPrumer(int pole[],int delka) {
    int i;
    struct retPocPrum navrat;

    navrat.pocet=0;
    navrat.prumer=0;
    for(i=0;i<delka;i++) {
        if(pole[i]>=0 && pole[i]<=50) {
            navrat.pocet++;
            navrat.prumer+=pole[i];
        }
    }

    if(navrat.pocet>0) {
        navrat.prumer/=navrat.pocet;
    }
    return navrat;
}

//funkce seradit pro sestupné seřazení prvků v poli (použit algoritmus Insert Sort upravený na sestupný)
void seradit(int pole[], int delka) {
    int i, j;
    for (i=1; i<delka; i++) {
        j=i;
        while (j>0 && pole[j-1]<pole[j]) {
            int docasne=pole[j];
            pole[j]=pole[j-1];
            pole[j-1]=docasne;
            j--;
        }
    }
    return;
}

int main() {
    //deklarace proměnných - pole numbers o velikosti zadefinované výše, ukazatel na začátek dynamicky alokovaného pole trojky a proměnné I pro cykly
    int numbers[NUMBERSCOUNT], *trojky;
    //deklarace proměnné deltremi i s přiřazením 0 (pak už do ní rovnou mohu přičítat pomocí deltremi++ aniž bych riskoval přičítání do paměťového smetí
    int deltremi=0;
    //inicializace náhodnosti čísel dle času
    srand(time(NULL));

    //cyklus pro vložení čísel do pole numbers
    for(int i=0;i<NUMBERSCOUNT;i++) {
        numbers[i]=rand()%151-50;
    }

    //cyklus pro zjištění počtu čísel dělitelných třemi
    for(int i=0;i<NUMBERSCOUNT;i++) {
        if (numbers[i]%3==0) {
            deltremi++;
        }
    }
    printf("Pocet cisel delitelnych tremi z pole \"numbers\" je roven %d.\n\n",deltremi);

    //alokace dynamického pole trojky
    trojky=(int*)malloc(deltremi*sizeof(int));

    //deklarace proměnné J pro přiřazování do pole trojky - zde přiřazujeme čísla dělitelná třemi z pole numbers do trojky
    int j=0;
    for(int i=0;i<NUMBERSCOUNT;i++) {
        if (numbers[i]%3==0) {
            trojky[j]=numbers[i];
            j++;
        }
    }

    //použití funkce tisk pro výpis obsahu obou polí
    printf("Vypis pole \"numbers\":\n");
    tisk(numbers,NUMBERSCOUNT);

    printf("\n\nVypis pole \"trojky\":\n");
    tisk(trojky,deltremi);

    //použití funkce pocetPrumer
    printf("\n\nPrvky nalezici do intervalu <0;50> - pocet=%d, arit.prumer=%d",pocetPrumer(numbers,NUMBERSCOUNT).pocet,pocetPrumer(numbers,NUMBERSCOUNT).prumer);
    printf("\n\nPrvky nalezici do intervalu <0;50> - pocet=%d, arit.prumer=%d",pocetPrumer(trojky,deltremi).pocet,pocetPrumer(trojky,deltremi).prumer);

    //výpis seřazených polí
    printf("Vypis serazeneho pole \"numbers\":\n");
    seradit(numbers,NUMBERSCOUNT);
    tisk(numbers,NUMBERSCOUNT);

    printf("\n\nVypis serazeneho pole \"trojky\":\n");
    seradit(trojky,deltremi);
    tisk(trojky,deltremi);

    //uvolnění paměti dynamického pole
    trojky=NULL;
    free(trojky);
    getch();

    return 0;
}
