#include <iostream>
#include <vector>

using namespace std;

/*!
\brief Saisit un tableau.
\param t Tableau.
*/
void Get(vector<float> &t)
{
    cout << "Saisie" << endl;
    // Taille
    cout << "Taille : ";
    int s;
    cin >> s;
    t.resize(s);
    // Elements
    for (int i = 0; i < s; i++)
    {
        cout << "Element " << i << " :";
        cin >> t[i];
    }
}

/*!
\brief Affiche un tableau
\param t Tableau.
*/
void Show(const vector<float> &t)
{
    cout << "Affiche" << endl;
    for (int i = 0; i < t.size(); i++)
    {
        cout << "Element " << i << " = " << t[i] << endl;
    }
}

/*!fedoraproject
\brief Permute deux reels.
\param a,b Reels echanges.
*/
void Echange(float &a, float &b)
{
    float x = a;
    a = b;
    b = x;
}

/*!
\brief Renverse les elements du tableau.
\param t Tableau.
*/
void Reverse(vector<float> &t)
{
    for (int i = 0; i < t.size() / 2; i++)
    {
        Echange(t[i], t[t.size() - 1 - i]);
    }
}

/*!
\brief Somme les elements du tableau
\param t Tableau.
*/
float Somme(const vector<float> &t)
{
    float s = 0.0;
    for (int i = 0; i < t.size(); i++)
    {
        s += t[i];
    }
    return s;
}

/*!
\brief Moyenne.
\param t Tableau.
*/
float Moyenne(const vector<float> &t)
{
    return Somme(t) / t.size();
}

/*!
\brief Egalite.
\param a,b Tableaux.
*/
bool Identique(const vector<float> &a, vector<float> &b)
{
    // Faux si les deux tableaux ont pas la meme taille
    if (a.size() != b.size())
        return false;

    for (int i = 0; i < a.size(); i++)
    {
        if (a[i] != b[i])
        {
            return false;
        }
    }
    return true;
}

/*!
\brief Tri.
\param t Tableau.
*/
void Tri(vector<float> &t)
{
    for (int i = 0; i < t.size(); i++)
    {
        for (int j = i + 1; j < t.size(); j++)
        {
            if (t[i] > t[j])
            {
                Echange(t[i], t[j]);
            }
        }
    }
}

/*!
\brief Calcul un nombre aleatoire entre deux valeurs
\param a,b Bornes.
*/
float Alea(float a, float b)
{
    const int N = 648792;
    float t = float(rand() % N) / float(N - 1);
    return (1.0 - t) * a + t * b;
}

/*!
\brief Initialise un tableau avec des valeurs aléatoires.
\param t Tableau.
\param a,b Bornes.
\param n Nombre d'elements.
*/
void Alea(vector<float> t, float a, float b, int n)
{
    t.resize(n);
    for (int i = 0; i < n; i++)
    {
        t[i] = Alea(a, b);
    }
}

/*!
\brief Teste si un tableau est trie.
\param t Tableau.
*/
bool EstTrie(const vector<float> t)
{
    for (int i = 0; i < t.size() - 1; i++)
    {
        if (t[i] > t[i + 1])
            return false;
    }
    return true;
}

int main()
{
    // Initialisation directe du tableau
    // Pour ne pas avoir a appeler la saisie
    vector<float> u = {2, 5, 6};

    // Affichage
    // Get(u);
    Show(u);

    Reverse(u);
    Show(u);

    // Somme et moyenne
    cout << "Somme = " << Somme(u) << endl;
    cout << "  Moy = " << Moyenne(u) << endl;

    // Copie sur v
    vector<float> v = u;
    cout << Identique(u, v) << endl;

    // Changement d'un element de v pour qu'il soit différent de u
    v[0] *= 2.0;
    cout << Identique(u, v) << endl;

    // Remplissage aleatoire et tri
    Alea(u, -500.0, 500.0, 10000000);
    cout << "Le tableau est il trie ? " << EstTrie(u) << endl;
    Tri(u);
    cout << "Le tableau est il trie ? " << EstTrie(u) << endl;
    return 0;
}