Problemino di Carla

Quando è necessario scegliere chi interrogare oppure chi spostare in classe potrebbe essere utili avere un  generatore automatico di sequenze casuali di vittime predestinate del sistema scolastico nazionale…

Algoritmo

  1. Quanti allievi in classe?
  2. Acquisisci tutti nomi
  3. Mescola i nomi in modo imparziale
  4. Comunica la sequenza di nomi

Esempio

  • Elenco prima = { ‘Antoniol’, ‘Canzio’, ‘Cappellaro’, ‘Casanova De Marco’, ‘Chiovaro’, …, ‘Zucco’ }
  • Elenco dopo = { ‘Chiovaro’, ‘Antoniol’, ‘Peratoner’, ‘Cappellaro’, ‘Casanova De Marco’, …, ‘Canzio’ }

Approfondimenti

  1. I nomi degli allievi sono stringhe
  2. La sequenza di nomi diventa un array
  3. Per mescolare in modo imparziale si usa Random() e SCAMBIA()
  4. Le permutazioni possibili per n nomi sono n!=n*(n-1)*(n-2)*...*2*1.
Program Problemino_di_Carla;
Uses
    Crt;
Const
    TANTO=50; // numero scambi
    N    =26; // numero studenti 3AA...
Var
    NOMI: Array[1..N] of String;
    i,    
    primo,
    secondo: Integer;
    TEMP: String;
Begin
    // INIZIALIZZA L'ARRAY CON I NOMI DELLA 3AA - 2013-14
    NOMI[ 1]:='Antoniol';
    NOMI[ 2]:='Canzio';
    NOMI[ 3]:='Cappellaro';
    NOMI[ 4]:='Casanova De Marco';
    NOMI[ 5]:='Chiovaro';
    NOMI[ 6]:='Chistruga';
    NOMI[ 7]:='De Bortoli';
    NOMI[ 8]:='De Salvador';
    NOMI[ 9]:='Della Chiesa';
    NOMI[10]:='Fontan';
    NOMI[11]:='Fontana';
    NOMI[12]:='Guzzo';
    NOMI[13]:='Iseo';
    NOMI[14]:='Maoret';
    NOMI[15]:='Mione';
    NOMI[16]:='Moretta';
    NOMI[17]:='Pannilunghi A';
    NOMI[18]:='Pannilunghi E';
    NOMI[19]:='Peratoner';
    NOMI[20]:='Polesana';
    NOMI[21]:='Riviello';
    NOMI[22]:='Rossi';
    NOMI[23]:='Saadaoui';
    NOMI[24]:='Secco';
    NOMI[25]:='Vaccari';
    NOMI[26]:='Zucco';

    // MESCOLA I NOMI IN MODO CASUALE
    Randomize;
    For i:=1 to TANTO Do
        Begin
            primo:=Random(N)+1;
            secondo:=Random(N)+1;
            
            TEMP:=NOMI[primo];              // SCAMBIA(NOMI[primo], NOMI[secondo])
            NOMI[primo]:=NOMI[secondo];
            NOMI[secondo]:=TEMP;
        End;

    // VISUALIZZA L'ELENCO APPENA GENERATO
    ClrScr;
    For i:=1 to N Do
        Write(NOMI[i]:20);
    Readln;
End.

Meglio strutturare…

...
Begin
   Inizializza;
   Mescola;
   Visualizza;
End.

Continua

  1. Fai in modo che il programma possa essere utilizzato per qualsiasi classe
    Numero studenti? Nomi?
  2. Se la sequenza risultante non è soddisfacente?
    Aggiungi un menu con le opzioni input-mescola-output...

Attenzione!

Se si aggiungono delle condizioni, come

  • Tizio non può sedersi con Caio
  • Sempronio è miope…
  • le coppie (1°-2°, 3°-4°, …) devono essere sempre diverse
  • chi oggi occupa la prima fila la prossima volta deve passare in seconda..

allora ogni permutazione generata deve

  • superare tutte le condizioni stabilite,
  • … anche quelle rispetto alle permutazioni utilizzate precedentemente
  • … che quindi devono essere salvate su memoria di massa (file).

Il problema diventa più complesso…