Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Bunga Bunga - bunga.cpp

bunga.cpp

Caricato da: XBarboX
Scarica il programma completo

  1. /*
  2. >>Creato da<<: Barberis Enrico
  3.  
  4. >>Data<<:      6 febbraio 2011 completato in 3 ore circa
  5.  
  6. >>Descrizione<<: tutte le info del problema sono disponibli nel pdf allegato al programma.
  7.  
  8. >>Descrizione breve<<: Dato in unput un'elenco di comandi(di 3 tipi: aggiungere una persona, togliere una persona, calcolare bunga bunga) interpetarli correttamente
  9. e nel caso del comando bungabunga <giorno> <n> dare in output i gruppi migliori del bunga bunga in base alle specifiche del problema.
  10.  
  11. >>Utilizzo<<:
  12. Linux: ./bunga persone.txt
  13. Windows: bunga.exe persone.txt
  14.  
  15. Persone.txt è il file di testo con l'elendo dei comandi
  16.  
  17. >>Algoritmo<<: l'algoritmo è molto semplice: semplicemente nella funziona di lettura del file di input il programma legge il comando e in base al comando fa un'azione.
  18. In particolare:
  19. Comando "IN" : aggiunge una persona alla tabella persone[]
  20. Comando "OUT": elimina la persona dalla tabella (persone[x].out=true;)
  21. Comando "BUNGABUNGA": calcola i gruppi migliori del bunga bunga
  22.  
  23. Specifiche del calcolo del bunga bunga:
  24. 1)Calcolo tutte le discrepanze tra le possibili coppie e le salvo in una tabella (coppie[])
  25. 2)scelgo le N migliori e le metto in un vettore (v[][] matrice di adiacenza)
  26. 3)Percorro il grafo e stampo l'output
  27. */
  28.  
  29. #include<iostream>
  30. #include<fstream>
  31. using namespace std;
  32. const int M = 2000;//Numero massimo di persone
  33.  
  34.  
  35. //===STRUTTURE DATI===\\
  36.  
  37. //PERSONE
  38. struct persona{
  39.         string nome;            //Nome
  40.         char sesso;             //Sesso M o F
  41.         int denaro;             //Denaro
  42.         int eta;                //Età
  43.         int altezza;            //Altezza in cm
  44.         int peso;               //Peso in Kg
  45.         double capelli;         //Capelli 0.0 albini 1.0 corvini
  46.         double costituzione;    //0.0 esile 1.0 procace
  47.         string presenze;        //Es: LM è disponibile il giorno LUNEDI' E MARTEDI' (LMEGVSD) e: mercoledì
  48.         bool out;               //Se è vero la persona è uscita dai bungabunga altrimenti ne fa ancora parte
  49. };
  50. persona persone[M];             //Tabella dell'elenco delle persone dei bunga bunga
  51. int c_per=0;                    //Contatore delle persone
  52.  
  53. //COPPIE
  54. struct coppia{
  55.         int id1;                //Indice della prima persona
  56.         int id2;                //Indice della seconda persona
  57.         double discrepanza;     //Discrepanza della coppia (più è piccola più sono "affini")
  58.         bool preso;             //Variabile per scegliere le 10 migliori coppie(evita di riprendere la stessa coppia)
  59. };
  60. coppia coppie[M];               //Tabella delle coppie possibili
  61. int c_cop=0;
  62.  
  63. //MATRICE DI ADIACENZA PER CALCOLARE I GRUPPI
  64. int v[M][M];
  65.  
  66. //===FINE STRUTTRA DATI===\\
  67.  
  68. //Stampa l'elenco delle persone
  69. void stampaPersone(){
  70.         cout<<"ID\t\tNOME\t\tSESSO\t\tDENARO\t\tETÀ\t\tALTEZZA\t\tPESO\t\tCAPELLI\t\tCOSTIT.\t\tPRESEN.\t\tOUT"<<endl<<endl;
  71.         for(int i=0; i<c_per; i++){
  72.          cout<<i<<"\t\t"<<persone[i].nome<<"\t\t"<<persone[i].sesso<<"\t\t"<<persone[i].denaro<<"\t\t"<<persone[i].eta<<"\t\t"<<persone[i].altezza<<"\t\t"
  73.          <<persone[i].peso<<"\t\t"<<persone[i].capelli<<"\t\t"<<persone[i].costituzione<<"\t\t"<<persone[i].presenze<<"\t\t"<<persone[i].out<<endl;
  74.         }
  75. }
  76.  
  77. bool vuoto(int x){
  78.         for(int i=0; i<c_per; i++) if(v[x][i]==1) return false;
  79.         return true;
  80. }
  81.  
  82. //Percorre il grafo, la variabili evita serve per non stampare più volte il nome del chiamante alla funzione
  83. void percorri(int x){
  84. cout<<persone[x].nome<<";";
  85.         for(int i=0; i<c_per; i++){
  86.                 if(v[x][i]==1){
  87.                         v[x][i]=0;
  88.                         v[i][x]=0;
  89.                         percorri(i);
  90.                 }      
  91.         }              
  92. }
  93.  
  94.  
  95. //Calcola il migliore bunga bunga
  96. void bunga(char g, int n){
  97. int c=0; //Contatore per le presenze: se vale 0 vuold dire che nessuno dei due c'è. se vale 1 solo uno dei due c'è. Se 2 tutti e due ci sono
  98. double dis=0; //Discrepanza tra due persone
  99. double x=0;   //variabile temporanea per il calcolo della discrepanza
  100. c_cop=0;
  101.  
  102.         for(int i=0; i<c_per; i++){
  103.                 for(int j=0; j<c_per; j++){
  104.                 //Per tutte le combinazioni possibili delle persone
  105.                         //Controllo che siano del sesso opposto e che sia un maschio(evita doppioni questo)
  106.                         //e che non siano stati eliminati
  107.                         if(persone[i].sesso!=persone[j].sesso && persone[i].sesso=='M' && persone[i].out==false && persone[j].out==false){
  108.                                 //Controllo disponibilità
  109.                                 c=0;
  110.                                 for(int k=0; k<persone[i].presenze.length(); k++){if(persone[i].presenze[k]==g)c++;}
  111.                                 for(int k=0; k<persone[j].presenze.length(); k++){if(persone[j].presenze[k]==g)c++;}
  112.                                 if(c>=2){
  113.                                         //Se è una coppia "valida"
  114.                                         //cout<<"Coppia "<<persone[i].nome<<" e "<<persone[j].nome<<endl;
  115.                                         //Calcolo discrepanza tra i due:
  116.                                         dis=0;
  117.                                        
  118.                                         x=persone[i].denaro-persone[j].denaro;//Discrepanza
  119.                                         if(x<0)x=x*-1;//Modulo
  120.                                         dis=dis+x*0.00009;//Aggiungo disprepanza
  121.                                        
  122.                                         x=persone[i].eta-persone[j].eta;//Discrepanza
  123.                                         if(x<0)x=x*-1;//Modulo
  124.                                         dis=dis+x*1.0;//Aggiungo disprepanza
  125.                                        
  126.                                         x=persone[i].altezza-persone[j].altezza;//Discrepanza
  127.                                         if(x<0)x=x*-1;//Modulo
  128.                                         dis=dis+x*0.1;//Aggiungo disprepanza
  129.                                        
  130.                                         x=persone[i].peso-persone[j].peso;//Discrepanza
  131.                                         if(x<0)x=x*-1;//Modulo
  132.                                         dis=dis+x*0.15;//Aggiungo disprepanza
  133.                                        
  134.                                         x=persone[i].capelli-persone[j].capelli;//Discrepanza
  135.                                         if(x<0)x=x*-1;//Modulo
  136.                                         dis=dis+x*0.5;//Aggiungo disprepanza
  137.                                        
  138.                                         x=persone[i].costituzione-persone[j].costituzione;//Discrepanza
  139.                                         if(x<0)x=x*-1;//Modulo
  140.                                         dis=dis+x*2.0;//Aggiungo disprepanza
  141.                                        
  142.                                        
  143.                                         //... e la salvo nella tabella coppie[]
  144.                                         coppie[c_cop].id1=i;
  145.                                         coppie[c_cop].id2=j;
  146.                                         coppie[c_cop].discrepanza=dis;
  147.                                         coppie[c_cop].preso=false;
  148.                                         c_cop++;
  149.                                        
  150.                                 }
  151.                                
  152.                         }
  153.                 }
  154.         }
  155.        
  156. //Una volta ottenuto le coppie possibili vengono scelte le n migliori che poi verrano "salvate" nella matrice di adiacenza
  157. //for(int j=0; j<c_cop; j++) cout<<coppie[j].id1<<"\t"<<coppie[j].id2<<"\t"<<coppie[j].discrepanza<<"\t"<<coppie[j].preso<<endl;
  158.  
  159. double min=100000;
  160. int temp;
  161.  
  162. for(int i=0; i<n; i++){
  163.         for(int j=0; j<c_cop; j++){
  164.                 if(coppie[j].discrepanza<min &&coppie[j].preso==false){
  165.                 temp=j;
  166.                 min=coppie[j].discrepanza;
  167.                 }
  168.         }      
  169.         coppie[temp].preso=true;
  170.         //cout<<"PRENDO    "<<coppie[temp].id1<<"   "<<coppie[temp].id2<<"   "<<endl;
  171.         v[coppie[temp].id1][coppie[temp].id2]=1; //Aggiungo il collegamento nella matrice di adiacenza tra le due persone
  172.         v[coppie[temp].id2][coppie[temp].id1]=1; //Aggiugno anche l'altro collegamento
  173.         //cout<<persone[coppie[temp].id1].nome<<"  "<<persone[coppie[temp].id2].nome<<endl;
  174.         min=100000;
  175. }
  176.  
  177. //Una volta ottenuta la matrice di adiacenza si percorre per trovare i gruppi:
  178.  
  179. for(int i=0; i<c_per; i++){
  180.         if(persone[i].sesso=='M' && !vuoto(i)){
  181.         cout<<" -"<<persone[i].nome<<";";
  182.                 for(int j=0; j<c_per; j++){
  183.                         if(v[i][j]==1){
  184.                                 v[i][j]=0;
  185.                                 v[j][i]=0;
  186.                                 percorri(j);   
  187.                         }
  188.                 }
  189.         cout<<endl;
  190.         }
  191. }
  192.  
  193.                
  194. }
  195.  
  196. //Procedura leggi() : legge dal file di testo input i comandi e li "mette in pratica"
  197.  
  198. void leggi(string file){
  199. //Variabili locali per la lettura
  200. string s;
  201. char c;
  202. int x;
  203. double d;
  204.  
  205.         ifstream fin(file.c_str());
  206.         cout<<"Caricamento dati dal file "<<file<<"..."<<endl<<endl;
  207.        
  208.         while(!fin.eof()){ //Fino alla fine del file testo
  209.                 fin>>s; //leggo il comando
  210.                
  211.                 if(s=="in"){
  212.                         //Aggiungo persona
  213.                         fin>>s;
  214.                         persone[c_per].nome=s;
  215.                         fin>>c;
  216.                         persone[c_per].sesso=c;
  217.                         fin>>x;
  218.                         persone[c_per].denaro=x;
  219.                         fin>>x;
  220.                         persone[c_per].eta=x;
  221.                         fin>>x;
  222.                         persone[c_per].altezza=x;
  223.                         fin>>x;
  224.                         persone[c_per].peso=x;
  225.                         fin>>d;
  226.                         persone[c_per].capelli=d;
  227.                         fin>>d;
  228.                         persone[c_per].costituzione=d;
  229.                         fin>>s;
  230.                         persone[c_per].presenze=s;
  231.                         persone[c_per].out=false;
  232.                         c_per++;
  233.                         s="";          
  234.                 }
  235.                
  236.                 if(s=="out"){
  237.                         fin>>s;
  238.                         for(int i=0; i<c_per; i++) if(persone[i].nome==s)persone[i].out=true;
  239.                         s="";
  240.                 }
  241.                
  242.                 if(s=="bungabunga"){
  243.                         fin>>c>>x;
  244.                         cout<<"BungaBunga del giorno "<<c<<" con "<<x<<" donazioni: "<<endl;
  245.                         bunga(c,x);
  246.                         cout<<endl;
  247.                         s="";
  248.                 }      
  249.         }
  250.        
  251.         fin.close();
  252. }
  253.  
  254.  
  255.  
  256.  
  257. int main(int argc, char *argv[]){
  258.         leggi(argv[1]);
  259.         return 0;
  260. }