//név: Szlávi Péter
//ETR-azonosító: SZPKAFT.ELTE
//drótposta-cím: szlavip@elte.hu
//Feladat:
//  Véletlen tesztadatok generálása fájlba, a "tengeres" feladatokhoz.
//Specifikáció:
//  Be: N ELEME EGÉSZ [tesztadatok száma]
//      NEu,NAm ELEME EGÉSZ [Európára, Amerikára eső mérési adatok "várható" száma]
//      PSzig ELEME VALÓS [szigetre esés valószínűsége]
//      MaxMag ELEME EGÉSZ [a generálható legnagyobb magasság]
//  Ki: Mag ELEME TÖMB[1..N:EGÉSZ]
//  Ef: NEu,NAm>=1 ÉS N>=NEu+NAm ÉS
//      PSzig ELEME [0..1) ÉS
//      MaxMag>0
//  Uf: Mag[1],Mag[N] ELEME [1..MaxMag] ÉS
//      LÉTEZIK eu ELEME [1..NEu]: LÉTEZIK am ELEME [1..NAm]:
//         BÁRMELY i ELEME [1..eu]: Mag[i] ELEME [1..MaxMag] ÉS Mag[eu+1]=0 ÉS
//         BÁRMELY i ELEME [N-am+1..N]: Mag[i] ELEME [1..MaxMag] ÉS Mag[am-1]=0 ÉS
//         BÁRMELY i ELEME [eu+1..N-am]: Mag[i] ELEME [0..MaxMag]
//  Megjegyzés: nem foglalkoztunk valószínűségi elvárásokkal!

#include <iostream>
#include <fstream>
//#include <time.h>//csak a 'srand(time(NULL))' rand()-inicializáláshoz kell!
#include <windows.h> //Code::Blocks 10.05-höz már kell a system kedvéért

using namespace std;

//Paraméterbeolvasás:
//beolvassa a _mnN.._mxN közötti egész számot (_mxN<_mnN => végtelen)
void be_int(string _kerd, int &_n, int _mnN, int _mxN, string _uz);
//beolvassa a _mnN.._mxN közötti valós számot (_mxN<_mnN => végtelen)
void be_float(string _kerd, float &_x, float _mnN, int _mxN, string _uz);
//Fájlba generálás:
void fajlbaGeneralas(string _fN, int _n, int _nEu, int _nAm, float _pT, int _mxM);
void billentyureVar();

int main()
{
    //Bemenet:
    int N,NEu,NAm,MaxMag;
    float PSzig;
    //Kimenet:
    const string fN="tenger.csv";//kimeneti fájl neve

    //srand(time(NULL));//rand()-inicializáláshoz kell!
    //adatok beolvasása:
    be_int("Europai pontok (varhato) szama",NEu,1,0,"Hibas termeszetes szam!");
    be_int("Amerikai pontok (varhato) szama",NAm,1,0,"Hibas termeszetes szam!");
    be_int("Meresi pontok szama",N,NEu+NAm,0,"Hibas termeszetes szam!");
    be_float("Tengeri pontok valoszinusege",PSzig,0,1,"Hibas valos szam!");
    be_int("Legnagyobb magassag",MaxMag,1,0,"Hibas termeszetes szam!");

    //a lényeg:
    fajlbaGeneralas(fN,N,NEu,NAm,PSzig,MaxMag);

    billentyureVar();
    return 0;
}

//Fájlba generálás:
void fajlbaGeneralas(string _fN, int _n, int _nEu, int _nAm, float _pT, int _mxM)
//Uf: N sorban, soronként egyetlen 0..mxM közötti egész szám ...
//    l. még a fenti Uf-t
{
    ofstream oF(_fN.c_str());
    int eu=rand()%_nEu+1;//Európa hossza
    int am=rand()%_nAm+1;//Amerika hossza
    for(int i=1;i<=eu;++i)
    {
      oF << rand()%_mxM+1 << endl;
    }
    //TODO: lehet, h. Európának még nincs vége!
    for(int i=eu+1;i<=_n-am;++i)
    {
      if (rand()/(RAND_MAX+1.0)<_pT)
      {
        oF << rand()%_mxM+1 << endl;
      }
       else
      {
        oF << 0 << endl;
      }
    }
    //TODO: lehet, h. Amerika már elkezdődött!
    for(int i=_n-am+1;i<=_n;++i)
    {
      oF << rand()%_mxM+1 << endl;
    }
    oF.close();
}

//beolvassa a _mnN.._mxN közötti egész számot (_mxN<_mnN => végtelen)
void be_int(string _kerd, int &_n, int _mnN, int _mxN, string _uz)
{
    bool hiba;
    string tmp;

    do{
      if (_mxN>=_mnN)
      {
        cout << _kerd << " (" << _mnN << ".." << _mxN << "):"; cin >> _n;
        hiba=cin.fail() || _n<_mnN || _n>_mxN;
      }
        else
      {
        cout << _kerd << " (" << _mnN << "..):"; cin >> _n;
        hiba=cin.fail() || _n<_mnN;
      }
      if (hiba)
      {
        cout << _uz << endl;
        cin.clear(); getline(cin,tmp,'\n');
      }
    }while(hiba);
}

//beolvassa a _mnN.._mxN közötti valós számot (_mxN<_mnN => végtelen)
void be_float(string _kerd, float &_x, float _mnN, int _mxN, string _uz)
{
    bool hiba;
    string tmp;

    do{
      if (_mxN>=_mnN)
      {
        cout << _kerd << " (" << _mnN << ".." << _mxN << "):"; cin >> _x;
        hiba=cin.fail() || _x<_mnN || _x>_mxN;
      }
        else
      {
        cout << _kerd << " (" << _mnN << "..):"; cin >> _x;
        hiba=cin.fail() || _x<_mnN;
      }
      if (hiba)
      {
        cout << _uz << endl;
        cin.clear(); getline(cin,tmp,'\n');
      }
    }while(hiba);
}

void billentyureVar()
{
    system("pause");
}
