Advertisement
fcamuso

Eserciziario C++ Lezione 17

Apr 14th, 2024
629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.12 KB | None | 0 0
  1. /*
  2. Preparare con il blocco note un file studenti.txt contenente i
  3. nominativi della vostra classe nella forma cognome-nome (Rossi-Mario),
  4. un nominativo per riga. Il programma parte presentando questo menu:
  5.  
  6. 1 - Sorteggio
  7. 2 - Elenco rimanenti
  8. 3 - Elenco di chi é giá stato interrogato
  9. 4 - Reset
  10. 99 - fine
  11.  
  12. Scegliendo 1
  13. Il programma chiede quanti nominativi devono essere estratti e procede
  14. all'estrazione listando i nominativi; questi saranno tolti
  15. dall'elenco di estrazione. All'uscita il programma aggiornerá
  16. i dati sui file in modo che alla prossima ripartenza si potrá
  17. procedere con i rimanenti.
  18.  
  19. Scegliendo 2
  20. Sará presentata una lista di chi deve ancora essere interrogato.
  21.  
  22. Scegliendo 3
  23. Sará presentata una lista di chi é gia stato interrogato
  24.  
  25. Scegliendo 4
  26. I dati su disco (e in RAM) saranno aggiornati in modo tale
  27. che si riparta con le estrazioni con l'elenco degli
  28. alunni al completo.
  29. */
  30.  
  31. #include <iostream>
  32. #include <fstream>
  33. #include <ctime>
  34.  
  35.  
  36. using namespace std;
  37.  
  38. int leggi_intero(int min, int max, string messaggio="")
  39. {
  40.   int letto=0;
  41.   do
  42.   {
  43.      cout<<messaggio<<" ("<<min<<" - "<<max<<"): ";
  44.      cin>>letto;
  45.  
  46.      if (letto<min || letto>max)
  47.        cout<<endl<<"Valore non nell'intervallo consentito ("<<min<<" - "<<max<<")\n";
  48.   } while ( letto<min || letto>max );
  49.  
  50.   return letto;
  51. }
  52.  
  53. //presenta un elenco di scelte numerate e gestisce la scelta dell'utente
  54. //restituisce o la scelta o -1 se l'utente ha annullato
  55.  
  56. int menu(string voci_menu[], int quante_voci)
  57. {
  58.     for(int i=0; i<quante_voci; i++)
  59.       cout << i+1 << " - " << voci_menu[i] << endl;
  60.  
  61.     cout << quante_voci + 1 << " - STOP\n";
  62.  
  63.     return leggi_intero(1, quante_voci+1,   "Scegli una voce");
  64. }
  65.  
  66.  
  67. //testa esistenza file
  68. bool esiste_file(string path_file)
  69. {
  70.   bool esiste=false;
  71.  
  72.   ifstream f(path_file);
  73.   if (f)
  74.   {
  75.     f.close(); f.clear();
  76.     esiste = true;
  77.   }
  78.  
  79.   return esiste;
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. int carica_array_da_file(string path_file, string v[], int capienza_array)
  89. {
  90.  
  91.   if (!esiste_file(path_file)) return 0;
  92.  
  93.   int conta=0;
  94.   ifstream leggi(path_file);
  95.  
  96.   while (conta<capienza_array && getline(leggi, v[conta])) conta++;
  97.  
  98.   leggi.close(); leggi.clear();
  99.  
  100.   return conta;
  101.  
  102. }
  103.  
  104. //restituisce -1 se il file non esiste, altrimenti il numero di righe copiate
  105. int copia_file(string path_sorgente, string path_destinazione)
  106. {
  107.   if (!esiste_file(path_sorgente)) return -1;
  108.  
  109.   ifstream sorgente(path_sorgente);
  110.   ofstream destinazione(path_destinazione);
  111.  
  112.   if (!destinazione)
  113.   {
  114.     sorgente.close(); sorgente.clear();
  115.     return -2;
  116.   }
  117.  
  118.   string riga;
  119.   int copiate=0;
  120.  
  121.   while ( getline(sorgente, riga) )
  122.   {
  123.     //cout << riga
  124.     destinazione << riga << endl;
  125.     copiate++;
  126.   }
  127.  
  128.   sorgente.close(); sorgente.clear();
  129.   destinazione.close(); destinazione.clear();
  130.   return copiate;
  131. }
  132.  
  133. void sorteggia(int quanti_da_interrogare, int &alunni_rimasti,
  134.                string alunni[], string interrogati[])
  135. {
  136.   for (int i=0; i<quanti_da_interrogare; i++)
  137.   {
  138.     int interrogato = rand()%alunni_rimasti;
  139.     interrogati[i] = alunni[interrogato];
  140.     //swap(alunni[interrogato], alunni[alunni_rimasti-1]);
  141.     alunni[interrogato] = alunni[alunni_rimasti-1];
  142.     alunni_rimasti--;
  143.   }
  144. }
  145.  
  146. void stampa_array_stringhe(string v[], int quanti,
  147.                     bool a_capo=true, char c='*') //parametri di default
  148. {
  149.   for (int i=0; i<quanti; i++)
  150.   {
  151.     cout << v[i];
  152.     if (a_capo) cout<<endl; else cout << " ";
  153.   }
  154.  
  155.   cout << string(30, c) << endl;
  156. }
  157.  
  158. void salva_array_su_file(string v[], int quanti_da_salvare, string path_file)
  159. {
  160.   ofstream scrivi(path_file);
  161.  
  162.   for (int i=0; i<quanti_da_salvare; i++) scrivi << v[i] << endl;
  163.  
  164.   scrivi.close(); scrivi.clear();
  165. }
  166.  
  167. int cerca_stringa_in_vettore(string cercata, string v[], int num_ele)
  168. {
  169.   for (int i=0; i<num_ele; i++)
  170.     if (cercata==v[i]) return i;
  171.  
  172.   return -1;
  173. }
  174.  
  175. void stampa_gia_interrogati(string path_file_backup, string alunni[], int alunni_rimasti)
  176. {
  177.   ifstream leggi(path_file_backup);
  178.  
  179.   //leggo un nominativo lo cerco in alunni[] e se non lo trovo lo stampo
  180.   string alunno ="";
  181.  
  182.   while ( getline(leggi, alunno) )
  183.     if (cerca_stringa_in_vettore(alunno, alunni, alunni_rimasti) < 0) //non trovato
  184.       cout << alunno << endl;
  185.  
  186.    leggi.close(); leggi.clear();
  187.  }
  188.  
  189.  
  190.  
  191. int main()
  192. {
  193.   srand(time(0));
  194.  
  195.   //IDEA professionale (non la implemento, solo come suggerimento)
  196.   //i nomi dei file e altri parametri potrebbero essere letti da un file di
  197.   //servizio in modo che li si possa facilmente cambiare senza toccare il programma
  198.  
  199.   string path_file_alunni = "alunni.txt";
  200.   string path_file_backup = "alunni_backup.txt";
  201.  
  202.   //per dare la possibilitá di resettare con elenco alunni al completo
  203.   //creo una copia di backup dell'elenco degli alunni
  204.   //questa operazione va fatta solo la prima volta che si lancia il programma
  205.   if (!esiste_file(path_file_backup))
  206.     copia_file(path_file_alunni, path_file_backup);
  207.  
  208.   //leggo gli interrogandi in un array e li conto
  209.   const int MAX_ALUNNI = 40;
  210.   string alunni[MAX_ALUNNI];
  211.   string interrogati[MAX_ALUNNI];
  212.   int quanti_da_interrogare = 0;
  213.  
  214.   int alunni_rimasti = carica_array_da_file(path_file_alunni, alunni, MAX_ALUNNI);
  215.  
  216.   //preparo le voci come da testo dell'esercizio
  217.   string voci_menu[] {"Sorteggio",
  218.                       "Elenco rimanenti",
  219.                       "Elenco di chi e' gia' stato interrogato",
  220.                       "Reset dello stesso elenco (nuovo turno interrogazioni"};
  221.   int num_voci_menu = 4;
  222.  
  223.   int scelta=0;
  224.  
  225.   do
  226.   {
  227.  
  228.     scelta = menu(voci_menu, 4);
  229.  
  230.     switch (scelta)
  231.     {
  232.       case 1: //sorteggio interrogati
  233.         if (alunni_rimasti==0)
  234.           cout << "Nessun alunno rimasto da interrogare\n";
  235.         else
  236.         {
  237.           quanti_da_interrogare = leggi_intero(1, alunni_rimasti, "Quanti da interrogare");
  238.           sorteggia(quanti_da_interrogare, alunni_rimasti, alunni, interrogati);
  239.           stampa_array_stringhe(interrogati, quanti_da_interrogare);
  240.  
  241.           //aggiorno su disco gli alunni rimasti da interrogare
  242.           salva_array_su_file(alunni, alunni_rimasti, path_file_alunni);
  243.         }
  244.       break;
  245.  
  246.       case 2: //elenco rimasti
  247.         stampa_array_stringhe(alunni,alunni_rimasti);
  248.       break;
  249.  
  250.       case 3: //chi é giá stato interrogato
  251.         //il file di backup li contiene tutti
  252.         //alunni[] contiene quelli ancora da interrogare
  253.         stampa_gia_interrogati(path_file_backup, alunni, alunni_rimasti);
  254.       break;
  255.  
  256.       case 4: //reset per nuovo giro interrogazioni
  257.       {
  258.         string conferma="NO";
  259.         cout << "Reset dello stesso, confermi (scrivi SI) -> ";
  260.         cin >> conferma;
  261.  
  262.         if (conferma=="SI")
  263.         {
  264.           //ripristino file alunni
  265.           alunni_rimasti = copia_file(path_file_backup, path_file_alunni);
  266.  
  267.           //ricarico elenco
  268.           carica_array_da_file(path_file_alunni, alunni, MAX_ALUNNI);
  269.  
  270.         }
  271.  
  272.  
  273.       }
  274.       break;
  275.  
  276.       default:
  277.  
  278.        break;
  279.     }
  280.  
  281.     system("pause"); system("cls");
  282.   }
  283.   while (scelta != num_voci_menu+1 );
  284.  
  285.   return 0;
  286. }
  287.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement