LIP-07 - Esercitazione #6

Istruzioni

Questa esercitazione verte principalmente sui comandi iterativi di Java.

Indirizzi di posta elettronica da utilizzare

CORSO ACORSO B
lipa-doc oppure lipa-doc@cli.di.unipi.it lipb-doc oppure lipb-doc@cli.di.unipi.it Per inviare programmi svolti in aula o dopo le esercitazioni.
acorradi oppure acorradi@cli.di.unipi.it gorir oppure gorir@cli.di.unipi.it Per eventuali dubbi o problemi relativi alla soluzione di esercizi, per problemi "amministrativi", richieste di appuntamento per ricevimento, ecc.

Esercizi

Per gli esercizi che richiedono di leggere dei dati in input da tastiera, scaricare la classe Input.java. Un esempio di uso dei metodi di questa classe è contenuto nella classe EuroInput.java.

  • Usando il comando mkdir della shell, creare una directory nella propria home chiamata Es06, in cui scriverete tutti i file java di questa esercitazione. Controllare che la directory esista con il comando ls.
    Ricordarsi di copiare il file Input.java all'interno della directory Es06.
  • [35] Scrivere un programma Confronta3String che chiede all'utente di immettere tre stringhe, le legge e stampa quella che precede le altre due secondo l'ordine lessicografico.

    Esempi di interazione con il programma (in blu l'input dell'utente):

    java Confronta3String
    
    Prima stringa: cucchiaio
    Seconda stringa: forchetta
    Terza stringa: coltello
    
    La stringa che precede le altre e': coltello
    
    java Confronta3String Prima stringa: bicchiere Seconda stringa: vino Terza stringa: bicchiere La stringa che precede le altre e': bicchiere
  • [36]  Scrivere il programma Riga che chiede all'utente un intero n, e stampa una riga di n ripetizioni del numero n. Se l'intero letto è negativo considerare il suo valore assoluto Math.abs(n).

    Suggerimento: Trattandosi di iterazione determinata, si utilizzi un ciclo for. Per stampare la riga le sole istruzioni di stampa consentite sono:

    System.out.print(n) // stampa il valore di n  senza andare a capo
    System.out.println()   // va a capo
    

    Esempi di interazione con il programma (in blu l'input dell'utente):

    java Riga
    
    Scrivi un intero: 5
    55555
    
    
    java Riga Scrivi un intero: -10 10101010101010101010
  • [37] Scrivere un programma Calcolatrice che legge un valore di tipo double, uno di tipo char e poi ancora uno di tipo double e infine usa il comando switch per fare in modo che:
    • se il carattere letto è '+' allora stampa la somma dei due valori numerici;
    • se il carattere è '*' allora stampa il prodotto dei due valori numerici;
    • se il carattere è '^' allora stampa la potenza del primo valore elevato al secondo (usare un opportuno metodo della classe Math);
    • se è un altro carattere allora stampa il primo valore.

    Esempi di interazione con il programma (in blu l'input dell'utente):

    java Calcolatrice
    
    Primo valore (double): 12.5
    Operazione: *
    Secondo valore (double): 2
    
    12.5 * 2.0 = 25.0
    
    java Calcolatrice Primo valore (double): 11.1 Operazione: ^ Secondo valore (double): 1.1 11.1 ^ 1.1 = 14.120669121494236
  • [38]  Scrivere il programma ContaMultiplo che chiede una sequenza di numeri interi all'utente, uno alla volta. Il programma termina quando l'utente fornisce un numero minore o uguale a 0, e stampa un messaggio dicendo quanti numeri positivi multipli di 7 l'utente ha fornito.

    Attenzione: spiegare in un commento la scelta delle eventuali istruzioni iterative utilizzate.

    Esempio di interazione con il programma (in blu l'input dell'utente):

    java ContaMultiplo
    
    Dammi un intero (0 o negativo per terminare): 52
    Dammi un intero (0 o negativo per terminare): 28
    Dammi un intero (0 o negativo per terminare): 70
    Dammi un intero (0 o negativo per terminare): 5
    Dammi un intero (0 o negativo per terminare): 67
    Dammi un intero (0 o negativo per terminare): -7
    Hai scritto 2 numero/i positivo/i multiplo/i di 7  

  • [39]  Scrivere il programma Divisori che legge un intero maggiore di 1 e stampa tutti i suoi divisori (diversi da 1). Nella fase di lettura del valore, se l'utente immette numeri minori di 2 bisogna continuare a ripetere la richiesta del valore.

    Attenzione: questo programma richiede l'uso di due cicli (non annidati). Spiegare in un commento la scelta delle istruzioni iterative utilizzate.

    Esempio di interazione con il programma (in blu l'input dell'utente):

    java Divisori
    
    Dammi un intero (maggiore di 1): -5
    Dammi un intero (maggiore di 1): 77
    Un divisore di 77 e': 77
    Un divisore di 77 e': 11
    Un divisore di 77 e': 7
    

  • [40]  Modificare il programma precedente per ottenere il programma PiccoloDivisore che legge un intero maggiore di 1 e stampa solo il più piccolo dei suoi divisori propri (diversi da 1 e dal numero stesso), se esiste, altrimenti stampa il messaggio "Non trovato"

    Attenzione: spiegare in un commento la scelta delle istruzioni iterative utilizzate e ottimizzare il codice in modo da eseguire il minor numero possibile di iterazioni.

    Esempio di interazione con il programma (in blu l'input dell'utente):

    java PiccoloDivisore
    
    Dammi un intero (maggiore di 1): 0
    Dammi un intero (maggiore di 1): 77
    Il più piccolo divisore di 77 e' 7

  • [41]  Scrivere il programma AlberoNatale che chiede all'utente un intero n, e quindi, usando cicli for opportunamente annidati, stampa un triangolo isoscele di asterischi, di altezza lunga n e base lunga 2n-1. (Se il valore letto è negativo si consideri il suo valore assoluto Math.abs(n)).

    NOTE: Come nel programma Riga, per stampare il triangolo le sole istruzioni di stampa consentite sono:

    System.out.print('*')  // stampa un asterisco senza andare a capo
    System.out.print(' ')  // stampa uno spazio senza andare a capo
    System.out.println()   // va a capo 
    

    Esempio di interazione con il programma (in blu l'input dell'utente):

    java AlberoNatale
    
    Dammi un numero intero : 6
    
         *
        ***
       *****
      *******
     *********
    ***********

  • [42]  Scrivere il programma MinStringa  che legge un numero prefissato di stringhe e stampa la stringa più corta tra quelle immesse. Prima di procedere con la lettura della sequenza di stringhe, il programma deve chiedere all'utente la lunghezza della sequenza, che deve essere un intero positivo. Se il dato in input non soddisfa questa condizione, il programma deve richiederlo. Se ci sono più stringhe di lunghezza minima, si selezioni quella che segue tutte le altre in ordine lessicografico.

    Attenzione: spiegare in un commento la scelta delle eventuali istruzioni iterative utilizzate.

    Esempi di esecuzione (input utente in blu)

    java MinStringa
    
    Numero di stringhe (intero positivo): -3
    Numero di stringhe (intero positivo): 0
    Numero di stringhe (intero positivo): 4
    
    Dammi la stringa n. 1 della sequenza: casa
    Dammi la stringa n. 2 della sequenza: LIP
    Dammi la stringa n. 3 della sequenza: WWW
    Dammi la stringa n. 4 della sequenza: la vita e' bella
    
    La stringa piu' corta e' WWW (ha lunghezza 3).

  • [43]  In una precedente esercitazione abbiamo visto il programma Bisestile.java che verifica se un certo anno letto da tastiera è bisestile.

    Copiare il file Bisestile.java nella directory Es06 e modificarlo in modo che continui a leggere valori quando l'utente immette anni non bisestili e che si fermi quando l'utente immette un anno bisestile.

    Esempio di interazione con il programma (in blu l'input dell'utente):

    java Bisestile
    
    Dammi un anno (un intero): 1997
    1997 non e' bisestile!
    Dammi un anno (un intero): 1853
    1853 non e' bisestile!
    Dammi un anno (un intero): 1992
    Finalmente un anno bisestile!

  • [44]  Copiare il programma AlberoNatale.java e modificarlo in AlberoMatematico.java per stampare un triangolo isoscele, di altezza lunga n (con n compreso tra 0 e 9 ) e base lunga 2n-1 fatto come sotto. Se il valore letto è non è compreso tra 0 e 9 si chieda all'utente un nuovo valore finché l'intero immesso non appartenga all'intervallo richesto.

    Esempio di interazione con il programma (in blu l'input dell'utente):

    java AlberoMatematico
    
    Dammi un numero intero positivo compreso tra 0 e 9: -2
    Dammi un numero intero positivo compreso tra 0 e 9: 5
    
         1
        212
       32123
      4321234
     543212345
    

  • [45] Scrivere il programma BaseBinaria che chiede all'utente un intero positivo, e ne stampa la rappresentazione binaria (senza segno), ottenuta con successive operazioni di divisione e modulo. Infatti, dato un numero n, il bit meno significativo (quello più a destra) della sua rappresentazione binaria è

    b1 = n % 2
    il bit successivo è

    b2 = (n / 2) % 2
    quindi

    b3 = ((n / 2) / 2) % 2
    e così via.

    Esempi di esecuzione (input utente in blu)

    java BaseBinaria
    
    Dammi un numero positivo: -12
    Dammi un numero positivo: 0
    Dammi un numero positivo: 569
    
    La rappresentazione binaria di 569 e' 1000111001

  • [46]  Scrivere un programma ConvertiBits che legge la rappresentazione binaria senza segno come stringa e stampa il numero intero corrispondente alla sequenza di 0 e 1. Se la stringa letta contiene caratteri diversi da 0 e 1 viene stampato un opportuno messaggio di errore.

    Nota: Spiegare in un commento la scelta delle istruzioni iterative utilizzate.

    Esempi di interazione con il programma (in blu l'input dell'utente, in rosso commenti all'interazione):

    java ConvertiBits
    
    Digitare una sequenza di 1 o 0: 11001
    
    La sequenza che hai digitato corrisponde al numero 25.
    
    
    java ConvertiBits Digitare una sequenza di 1 o 0: 12001 Mi dispiace la sequenza che hai digitato non e' binaria.