Advertisement
fcamuso

Eserciziario C++ Lezione

Apr 10th, 2024
697
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.68 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 &quanti_alunni,
  134.                string alunni[], string interrogati[])
  135. {
  136.   //tocca a voi!
  137. }
  138.  
  139. void stampa_array_stringhe(string v[], int quanti,
  140.                     bool a_capo=true, char c='*') //parametri di default
  141. {
  142.   for (int i=0; i<quanti; i++)
  143.   {
  144.     cout << v[i];
  145.     if (a_capo) cout<<endl; else cout << " ";
  146.   }
  147.  
  148.   cout << string(30, c) << endl;
  149. }
  150.  
  151. void salva_array_su_file(string v[], int quanti_da_salvare, string path_file)
  152. {
  153.  //tocca a voi!
  154. }
  155.  
  156.  
  157. int main()
  158. {
  159.   srand(time(0));
  160.  
  161.   //IDEA professionale (non la implemento, solo come suggerimento)
  162.   //i nomi dei file e altri parametri potrebbero essere letti da un file di
  163.   //servizio in modo che li si possa facilmente cambiare senza toccare il programma
  164.  
  165.   string path_file_alunni = "alunni.txt";
  166.   string path_file_backup = "alunni_backup.txt";
  167.  
  168.   //per dare la possibilitá di resettare con elenco alunni al completo
  169.   //creo una copia di backup dell'elenco degli alunni
  170.   //questa operazione va fatta solo la prima volta che si lancia il programma
  171.   if (!esiste_file(path_file_backup))
  172.     copia_file(path_file_alunni, path_file_backup);
  173.  
  174.   //leggo gli interrogandi in un array e li conto
  175.   const int MAX_ALUNNI = 40;
  176.   string alunni[MAX_ALUNNI];
  177.   string interrogati[MAX_ALUNNI];
  178.   int quanti_da_interrogare = 0;
  179.  
  180.   int alunni_rimasti = carica_array_da_file(path_file_alunni, alunni, MAX_ALUNNI);
  181.  
  182.   //preparo le voci come da testo dell'esercizio
  183.   string voci_menu[] {"Sorteggio",
  184.                       "Elenco rimanenti",
  185.                       "Elenco di chi e' gia' stato interrogato",
  186.                       "Reset"};
  187.   int num_voci_menu = 4;
  188.  
  189.   int scelta=0;
  190.  
  191.   do
  192.   {
  193.  
  194.     scelta = menu(voci_menu, 4);
  195.  
  196.     switch (scelta)
  197.     {
  198.       case 1: //sorteggio interrogati
  199.         if (alunni_rimasti==0)
  200.           cout << "Nessun alunno rimasto da interrogare\n";
  201.         else
  202.         {
  203.           quanti_da_interrogare = leggi_intero(1, alunni_rimasti, "Quanti da interrogare");
  204.           sorteggia(quanti_da_interrogare, alunni_rimasti, alunni, interrogati);
  205.           stampa_array_stringhe(interrogati, quanti_da_interrogare);
  206.  
  207.           //aggiorno su disco gli alunni rimasti da interrogare
  208.           salva_array_su_file(alunni, alunni_rimasti, path_file_alunni);
  209.         }
  210.       break;
  211.  
  212.       case 2: //elenco rimasti
  213.         stampa_array_stringhe(alunni,alunni_rimasti);
  214.       break;
  215.  
  216.       case 3: //chi rimane da interrogare
  217.         //il file di backup li contiene tutti
  218.         //alunni[] contiene quelli ancora da interrogare
  219.        
  220.       break;
  221.  
  222.       case 4: //reset per nuovo giro interrogazioni
  223.       {
  224.        
  225.       }
  226.       break;
  227.  
  228.       default:
  229.  
  230.        break;
  231.     }
  232.  
  233.     system("pause"); system("cls");
  234.   }
  235.   while (scelta != num_voci_menu+1 );
  236.  
  237.   return 0;
  238. }
  239.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement