#include "Bets.h" #include #include #include #include #include #include #include #include #include #include #include struct Player_stats { int codeplayer; string nome; double saldo; }; int gera_numero() // gera números aleatórios { return 1 + rand() % (50 - 1 + 1); } int gera_estrela () // gera estrelas aleatórias { return 1 + rand() % (11 - 1 + 1); } bool checkAposta (vector v, int numero, unsigned int i) { bool checkflag = false; for(i; i < v.size(); i++) { if (v[i] == numero) { checkflag = true; return checkflag; break; } i++; } return checkflag; } void bubbleSort(vector &vec, unsigned int imin, unsigned int imax){ // programa que ordena os números das apostas bool sortAccendingOrder = true; for(unsigned int i = imin; i <= imax;i++) for(unsigned int j = i+1; j <= imax; j++) { if(sortAccendingOrder) { if(vec[i] > vec[j]) std::swap(vec[i],vec[j]); } else if(vec[i] < vec[j]) //else decendingOrder std::swap(vec[i],vec[j]); } } vector gera_aposta () // gera um vector de aposta com números aleatórios { vector v_bets; int bet; unsigned int i = 0; while ( i < 5) { bet = gera_numero(); if (!checkAposta(v_bets, bet, 0)) { v_bets.push_back(bet); i++; } } while ( i < 7) { bet = gera_estrela(); if (!checkAposta(v_bets, bet, 5)) { v_bets.push_back(bet); i++; } } bubbleSort(v_bets, 0, 4); bubbleSort(v_bets, 5, 6); return v_bets; } void mostra_aposta (vector v) // faz display de um vetor na consola, para fins de validação pelo utilizador { for (int i = 0; i < 7; i++) cout << v[i] << " "; } vector introduzAposta () // cria um vector que contém uma aposta com números introduzidos pelo utilizador { vector vbet; int n = 1; int nEstrela = 1; int numero; unsigned int i = 0; while (i < 7) { if (i < 5) { cout << "Numero " << n << ":"; cin >> numero; cout << endl; if (!checkAposta(vbet, numero, 0) && numero >= 1 && numero <= 50) { vbet.push_back(numero); n++; i++; } else { cout << "O numero que introduziu esta fora dos limites ou e repetido!" << endl; } } else { cout << "Estrela " << nEstrela << ":"; cin >> numero; cout << endl; if (!checkAposta(vbet, numero, 5) && numero >=1 && numero <=11) {vbet.push_back(numero); nEstrela++; i++;} else cout << "O numero que introduziu esta fora dos limites ou e repetido!" << endl; } } bubbleSort(vbet, 0, 4); bubbleSort(vbet, 5, 6); return vbet; } void addBet (vector > &vbets, vector bet) { vbets.push_back(bet); } bool writeBets (vector> v, int codeplayer) // escreve uma determinada aposta no ficheiro 'bets.txt' { bool validoutput = true; ofstream betsfile; betsfile.open ("bets.txt", ios::out | ios::app); const unsigned int LENGTH = v.size(); const unsigned int LENGTH2 = v[1].size(); if (betsfile.is_open()) { betsfile << setfill('0') << setw(8) << codeplayer << setfill(' ') << endl; for (unsigned int i = 0; i < LENGTH; i++) { for (unsigned int j = 0; j < LENGTH2; j++) { if (j == 5) { betsfile << "-" << " " << setw(2) << v[i][j] << " "; } else { betsfile << setw(2) << v[i][j] << " "; } } betsfile << endl; } betsfile << endl; } else { cout << "Error, could not open file" << endl; validoutput = false; } return validoutput; betsfile.close(); } bool findCodePlayer(int code_user, Player_stats &jogador, vector v) { unsigned int i = 0; unsigned int LENGTH = v.size(); bool codeflag = false; while ( i < LENGTH ) { if (code_user == v[i].codeplayer) //se o código fornecido corresponder com o código do jogador { codeflag = true; //activa a flag, encontrou-se o jogador no ficheiro jogador.nome = v[i].nome; // extrai-se a informação do jogador para uma struct, onde se contempla o saldo, nome e código do jogador jogador.saldo = v[i].saldo; jogador.codeplayer = v[i].codeplayer; return codeflag; break; } i++; } return codeflag; // a flag é devolvida no final, tendo o valor de 'true' caso o programa tenha encontrado o jogador com o código fornecido } vector readPlayers() { ifstream players ("players.txt"); string linha; Player_stats jogador; vector v; getline(players, linha); //ignora a primeira linha while(players.good()) { getline(players, linha); jogador.codeplayer = atoi(linha.substr(0,8).c_str()); jogador.nome = linha.substr(8, 21); jogador.saldo = atof(linha.substr(30, 13).c_str()); v.push_back(jogador); } players.close(); return v; } bool writePlayers(vector v) { ofstream players ("players.txt"); unsigned int i = 0; const unsigned int LENGTH = v.size(); const unsigned int LASTPOS = v.size() - 1; bool playersflag = true; players.setf(ios::showpoint); players.precision(2); players.setf(ios::fixed); if (players.is_open()) { players << setfill('0') << setw(7) << v[LASTPOS].codeplayer << ' ' << endl; while (i < LENGTH) { players << setfill('0') << setw(7) << v[i].codeplayer << ' '; players << setfill(' ') << setw(21) << left << v[i].nome; players << setw(13)<< right << v[i].saldo << ' '; if (i != LENGTH - 1) players << endl; i++; } } else { cout << "File could not be opened!" << endl; playersflag = false; } return playersflag; } void actualizaSaldo (vector &players, Player_stats jogador, double custoapostas) { unsigned int i = 0; unsigned const int LENGTH = players.size(); double saldo; saldo = jogador.saldo; while(i < LENGTH) { if (jogador.codeplayer == players[i].codeplayer) { players[i].saldo = saldo - custoapostas; break; } else i++; } } int main() { vector players; vector apostaprov; Player_stats jogador; vector > vbets; int codeplayer; int nApostasAuto, nApostasManu; int naposta = 1; double custoapostas; const int BETSCOST = 1; char resposta; cout << "Indique o seu codigo de jogador: "; cin >> codeplayer; players = readPlayers(); if (findCodePlayer(codeplayer, jogador, players)) { cout << "Quantas apostas manuais pretende fazer? "; cin >> nApostasManu; cout << endl; cout << "Quantas apostas automaticas pretende fazer? "; cin >> nApostasAuto; custoapostas = (nApostasAuto + nApostasManu)* BETSCOST; if (jogador.saldo > custoapostas) { actualizaSaldo (players, jogador, custoapostas); while (nApostasAuto > 0) { apostaprov = gera_aposta(); cout << "A aposta Automaticamente gerada: "; mostra_aposta(apostaprov); cout << endl << "Aceita a aposta? (S / N) "; cin >> resposta; if (toupper(resposta) == 'S') { addBet(vbets,apostaprov); nApostasAuto--; } else cout << "Aposta descartada!" << endl; } while(nApostasManu > 0) { cout << "Introduza a sua aposta: " <<"(" << naposta << ") " << endl; apostaprov = introduzAposta(); cout << "Aceita a seguinte aposta? (S / N)" << endl; mostra_aposta(apostaprov); cin >> resposta; if (toupper(resposta) == 'S') { addBet(vbets,apostaprov); nApostasManu--; naposta++; } else cout << "Aposta descartada!" << endl; } } else { cout << "Saldo de utilizador insuficiente para o numero de apostas em causa" << endl; return 2; } } else { cout << "O numero de codigo que forneceu nao se encontra registado" << endl; return 1; } writeBets (vbets, jogador.codeplayer); writePlayers(players); cout << endl << "Programa executado com exito" << endl; return 0; }