Programmazione per TWM: Esercitazione di laboratorio #3 (28/01)

L'obiettivo di questa esercitazione è familiarizzare con i seguenti concetti, illustrati nel capitolo 3 del libro:

Ove non altrimenti indicato, rispondete alle domande prima ragionando su carta e poi provando a editare, compilare ed eseguire. Gli esercizi etichettati con l'asterisco (*) sono più difficili: affrontateli dopo aver risolto gli altri.

Chi di voi non ha ancora finito gli esercizi dell'esercitazione precedente, lo faccia oggi: ancora per questa settimana aspettiamo "chi è rimasto indietro". Dalla prossima, però, ipotizzerò che tutti abbiano svolto tutti (o quasi) gli esercizi delle esercitazioni precedenti, e quindi non ci sarà più molto tempo per recuperare...

Esercizio 1

Obiettivo: Familiarizzare con la classe EasyIn per l'input agevole di dati.

Attività:

  1. Come avete notato nelle esercitazioni precedenti, l'istruzione Java per l'input di dati da tastiera durante l'esecuzione, la System.in.read(), è piuttosto scomoda: viene letta un'unica cifra, di cui viene restituito il codice ASCII.
    È possibile usare la classe EasyIn per l'input di dati da tastiera durante l'esecuzione di un programma. Va salvata in un file EasyIn.java nella stessa directory del programma che la usa. Vi sono definiti alcuni metodi per l'input dei quattro tipi di interi (readByte(), readShort(), readInt() e readLong()), dei due tipi di razionali (readFloat() e readDouble()), dei caratteri (readChar()), dei booleani (readBoolean()) e delle stringhe (readString()).
    L'uso è semplicissimo, come illustrato dal frammento di programma seguente:
    byte b;
    short s;
    int i;
    long l;
    float f;
    double d;
    boolean t;
    char c;
    string x;
    
    b = EasyIn.readByte();
    s = EasyIn.readShort();
    i = EasyIn.readInt();
    l = EasyIn.readLong();
    f = EasyIn.readFloat();
    d = EasyIn.readDouble();
    t = EasyIn.readBoolean();
    c = EasyIn.readChar();
    x = EasyIn.readString();
    

    Leggete il codice e i commenti di EasyIn.java per ulteriori dettagli sul funzionamento (ma alcune cose vi saranno comunque oscure, almeno per ora).
  2. Completate il frammento di programma precedente con le istruzioni per la visualizzazione dei valori letti, ed eseguitelo su alcuni dati di prova.
  3. Nei programmi che scriverete d'ora in poi, usate la classe EasyIn per l'input.

Esercizio 2

Obiettivo: Familiarizzare con la sequenza delle istruzioni.

Attività:

  1. Considerate il programma seguente
    Class Prova {
      public static void Main(string[] args) {
        int x;
        int y;
        int z;
    
        x = 1;
        y = 2;
        y = x + 1
        z = y + x;
        System.out.println("x = " + x + "\ny = " + y + "\nz = " + z)
      }
    }
    
    Ci sono alcuni (4 + 1) errori: cercate innanzi tutto di individuarli sulla carta, senza compilare. Poi compilate (senza correggere il programma) e analizzate i messaggi di errore del compilatore. Vedrete che gli errori vengono individuati un po' alla volta: correggete di volta in volta solo quelli individuati dal compilatore, e ricompilate finché la compilazione non dà più errori. Poi eseguite: dovrebbe essere segnalato (questa volta dall'interprete) un altro errore: correggetelo, ricompilate e rieseguite.
  2. Considerate il programma precedente, nella sua versione corretta. Che cosa visualizza? Che cosa visualizza se si inverte l'ordine delle ultime due istruzioni di assegnamento? Ossia:
    class Prova {
      public static void main(String[] args) {
        int x;
        int y;
        int z;
    
        x = 1;
        y = 2;
        z = y + x;
        y = x + 1;
        System.out.println("x = " + x + "\ny = " + y + "\nz = " + z);
      }
    }
    
    E che cosa succede se adesso si inverte l'ordine della seconda e terza istruzione di assegnamento? Ossia:
    class Prova {
      public static void main(String[] args) {
        int x;
        int y;
        int z;
    
        x = 1;
        z = y + x;
        y = 2;
        y = x + 1;
        System.out.println("x = " + x + "\ny = " + y + "\nz = " + z);
      }
    }
    
    Perché?

Esercizio 3

Obiettivo: Familiarizzare con l'istruzione di selezione if/else.

Attività:

  1. Considerate il frammento di programma seguente:
    if (x == 0)
      System.out.println("Il valore di x e' zero");
    else if (x == 1)
      System.out.println("Il valore di x e' uno");
    else if (x == 2)
      System.out.println("Il valore di x e' due");
    else if (x == 3)
      System.out.println("Il valore di x e' tre");
    
    Cosa succede se eliminate tutti gli else? Anche se gli else possono sembrare inutili in questo caso, il programma alternativo senza di essi è meno efficiente: perché? Suggerimento: considerate il numero di confronti di uguaglianza che devono essere effettuati dall'interprete Java nei due casi.
  2. Modificate il programma in modo che visualizzi anche il messaggio "x e' pari" o "x e' dispari", a seconda del valore di x (sempre considerando che x possa assumere solo i valori 0,1,2,3). Fatelo in tre modi:
    1. Modificando le 4 istruzioni System.out.println.
    2. Aggiungendo 4 istruzioni System.out.println (occhio alle parentesi graffe!).
    3. Aggiungendo alla fine del codice precedente un altro frammento di codice contenente un if/else con le 2 istruzioni System.out.println opportune (e con un confronto in più...).
    Confrontate le 3 soluzioni: qual è la peggiore (in termini di numero di istruzioni da eseguire)?
    Nota: In realtà la soluzione migliore fa uso di un array: ne parleremo...
  3. Scrivete un istruzione if che visualizza Ciao! se la variabile n di tipo int è pari.
  4. Scrivete un istruzione if che visualizza Ciao! se la variabile b di tipo boolean è true. Nota: Se avete usato l'operatore di uguaglianza ==, siete proprio incorreggibili...

Esercizio 4

Obiettivo: Comprendere la differenza fra l'istruzione if/else e l'operatore condizionale ?:.

Attività:

  1. A volte l'istruzione if/else e l'operatore condizionale ?: sono interscambiabili. Scrivete un'istruzione di assegnamento (che usa l'operatore condizionale ?:) equivalente alla seguente istruzione if/else.
    if (x >= 0)
      y = y + 1;
    else
      y = y + 2;
    
  2. Scrivete un'istruzione di assegnamento (che usa l'operatore condizionale ?:) equivalente alla seguente istruzione if.
    if (x >= 0)
      y = y + 1;
    
  3. Scrivete un'istruzione if/else equivalente alla seguente istruzione di assegnamento.
    z = (x >= 0 && x % 2 == 1) ? 0 : 1;
    
  4. A volte l'istruzione if/else e l'operatore condizionale ?: non sono interscambiabili in maniera immediata. Quali istruzioni di assegnamento (che usano l'operatore condizionale ?:) dovete scrivere per ottenere un frammento di codice equivalente alla seguente istruzione if/else?
    if (x >= 0)
      y = y + 1;
    else
      z = z + 1;
    
    Suggerimento: Per prima cosa, riscrivete l'if/else usando due if...
  5. Scrivete un breve programma per il calcolo del valore assoluto di un numero x. (L'avete già fatto nell'esercitazione precedente usando l'operatore condizionale. Rifatelo usando l'if/else.)

Esercizio 5

Obiettivo: Familiarizzare con gli if/else annidati.

Attività:

  1. Scrivete un frammento di programma che visualizza "yeah" se la variabile x di tipo int è positiva e pari, e visualizza "sigh" altrimenti. Scrivetene due versioni: la prima usando l'operatore di and logico, la seconda con if annidati (fate attenzione!!).
  2. Alice deve decidere se uscire stasera con Bob. Se Bob viene a prenderla con la Ferrari allora uscirà con lui, ma solo se lui non ha i soliti bruttissimi mocassini. Se invece non viene a prenderla con la Ferrari uscirà con lui solo se lui non ha gli occhiali da sole. Alice ha però paura di emozionarsi quando vede Bob, e quindi per sicurezza decide di scrivere un programmino che faccia la scelta per lei secondo questi criteri. Il programmino avrà 3 variabili booleane
    boolean ferrari;
    boolean mocassini;
    boolean occhialiDaSole;
    
    a cui assegnerà il valore opportuno da tastiera (usando EasyIn.readBoolean()). Seguono poi alcune istruzioni che assegnano il valore opportuno alla variabile booleana uscita e altre istruzioni che visualizzano il messaggio "Usciamo" se la decisione è positiva. Scrivete il programmino usando:
  3. Alice decide di modificare il programma per aggiungere un piccolo dettaglio: se Bob non viene in Ferrari, gli dice "Pezzente!" (il resto rimane invariato). Scrivete il programma usando:

Esercizio 6

Obiettivo: Comprendere la differenza fra annidamenti if e annidamenti else.

Attività:

  1. Riscrivete il frammento di codice seguente usando l'annidamento else invece dell'annidamento if (x, y e z sono variabili di tipo boolean).
    if (x)
      if (y)
        if (z)
          System.out.println("Si, si, si");
        else
          System.out.println("Si, si, no");
      else
          System.out.println("Mah");
    else
      System.out.println("Boh");
    

Esercizio 7

Obiettivo: Familiarizzare con l'istruzione while.

Attività:

  1. Scrivete un programma che visualizza tutti i numeri da 10 a 100, uno per riga.
  2. Scrivete un programma che visualizza tutti i numeri da 10 a 100, ma senza usare i letterali 10 e 100 (e quindi usando, ad esempio 9 e 99). Nota: la versione precedente è da preferire a questa, perché gli estremi del ciclo sono espliciti nel programma.
  3. Scrivete un programma che visualizza tutti i numeri da 10 a 100 sulla stessa riga, separati da uno spazio. Suggerimento: L'istruzione System.out.print visualizza i suoi argomenti senza andare a capo...
  4. Scrivete un programma che visualizza tutti i multipli di 5 fra 10 e 100.
  5. Scrivete un programma che visualizza tutti i multipli di 3 fra 10 e 100 (usate un if per decidere se un numero è multiplo di 3).
  6. Scrivete un programma che visualizza tutti i numeri da 10 a 1 (in ordine decrescente).
  7. Scrivete un programma che visualizza tutti i numeri pari da 20 a 1 (in ordine decrescente). Usate un if per decidere se un numero è pari.
  8. Scrivete un programma che visualizza tutti i numeri pari da 100 a 1 (in ordine decrescente), ma senza usare l'if.

Valid XHTML 1.1! Stefano Mizzaro Last modified: Sat Jul 10 11:31:53 ora legale Europa occidentale 2004