Esercitazione #3

Istruzioni

Lo scopo di questa esercitazione è di cominciare a scrivere i primi, semplici programmi Java. Per compilare ed eseguire questi programmi si useranno i comandi javac e java da shell.

Prima della fine dell'esercitazione, inviare tutti i file .java prodotti (anche se incompleti) a rbruni@cli.di.unipi.it come attachment di un messaggio di posta elettronica con Subject: ES-03.


Primi passi...

(1) Compilare con javac e eseguire con java
  • Creare nella propria home la directory ProgJava11/ES03, in cui metteremo tutti i nostri file java. Controllare che la directory esista con il comando ls.

  • Scaricare il programma Java AreaRettangolo.java e salvarlo nella cartella ProgJava11/ES03.
  • Posizionarsi nella cartella ProgJava11/ES03 e verificare che contenga il file AreaRettangolo.java.
     
  • Compilare il file eseguendo da shell il comando
  • javac AreaRettangolo.java
  • Eseguire il programma da shell usando il comando
  • java AreaRettangolo
    L'output dovrebbe essere:

    L'area del rettangolo e' di 35 metri quadrati.

Attenzione: Se per qualche motivo non siete riusciti ad eseguire correttamente il programma, potreste avere serie difficoltà nel resto dell'esercitazione. Avvisate subito il docente o magari prima chiedete aiuto a un collega...


(2) Editare un programma

Questo semplice esercizio consiste nel modificare il programma "AreaRettangolo" nel programma "AreaPerimetroRettangolo".

Come prima cosa create una copia del file AreaRettangolo.java chiamata AreaPerimetroRettangolo.java usando il comando cp.

Quindi editate il file AreaPerimetroRettangolo.java con gedit, emacs o kedit (o qualsiasi altro editor preferiate), invocando il comando

gedit AreaPerimetroRettangolo.java &

All'interno del file dovete cambiare il nome della classe, aggiungere l'espressione che calcola il perimetro e le istruzioni per stamparne il valore.

Compilare il programma dalla shell usando il comando javac ed eseguirlo con il comando java.

Il risultato è quello atteso, cioè 24? In caso contrario, controllate bene il programma...


Esercizi


Per ognuno degli esercizi che seguono, sviluppare un'opportuno programma Java. Ricordatevi di inviare al docente TUTTI i file prodotti alla fine dell'esercitazione.
  • [1]  Scrivere il programma Interesse3 che modifica Interesse2 calcolando gli interessi maturati durante i primi 3 anni partendo da un capitale di 2500 euro. Per ogni anno si stampi l'interesse maturato e il capitale accumulato fino a quel momento.
    (Il capitale finale dovrebbe essere 2692.2265625).
  • [2]  Nei prossimi esercizi si chiederà di scrivere programmi che leggono i dati da tastiera sfruttando la classe Input.java (invece di inizializzare le variabili con valori fissati).
    La classe comprende molti metodi statici per leggere diversi tipi di dato, tra cui:

    public static int readInt() // metodo per leggere interi
    public static double readDouble()  // per leggere numeri in virgola mobile

    Ciascuno di questi metodi può essere invocato senza argomenti o con un argomento di tipo stringa che viene usato come messaggio di prompt per il dato da inserire.

    La classe Input non appartiene alla distribuzione standard di Java. Dovete quindi scaricarla nella cartella dell'esercitazione e compilarla.

    La classe Input non contiene il metodo main, quindi non potete eseguirla.

  • [3]  Scrivere il programma DueVar che dichiara due variabili, le inizializza con due valori in virgola mobile letti in input, e ne stampa la somma e il prodotto.
  • Esempio di interazione con il programma (in verde l'input dell'utente):

    java DueVar

    Dammi il primo valore (in virgola mobile):  10.34
    Dammi il secondo valore (in virgola mobile): 1.179
    Somma = 11.519
    Prodotto = 12.19086

  • [4]  Scrivere il programma Divisione che legge due numeri interi n e m e stampa prima il quoziente della loro divisione intera e poi il resto (operatore %), su due righe diverse e con un opportuno commento. 

    Cosa succede se si tenta di dividere per zero?

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

    java Divisione

    Dammi il primo numero (un intero):  19
    Dammi il secondo numero (un intero): 4
    Il risultato della divisione intera e': 4
    Il resto e': 3

  • [5]  Scrivere un programma Diagonale che chiede all'utente la lunghezza dei due lati di un rettangolo, calcola la lunghezza della diagonale usando il teorema di Pitagora (per estrarre la radice quadrata, usare il metodo predefinito Math.sqrt(x)) e la stampa.

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

  • java Diagonale

    Dammi la lunghezza del primo lato (un reale): 3.0
    Dammi la lunghezza del secondo lato (un reale): 4.0
    La diagonale e' lunga 5.0

  • [6]  Qualcuno ha scritto il programma Quadrato che chiesti all'utente i valori della base e dell'altezza di un rettangolo dovrebbe stampare il perimetro del quadrato avente la stessa area.

    Sfortunatamente il programma contiene errori sintattici (che ne impediscono la corretta compilazione) e logici (che porterebbero a un risultato errato).

    L'esercizio consiste nel correggere e commentare opportunamente il codice.

  • [7]  Scrivere un programma Somma che legga 10 valori interi e ne stampi la somma totale.
  • [8]  Dati i seguenti file di testo, ciascuno contenente 10 numeri interi su righe separate, usare il programma Somma (es. [7]) e la ridirezione dello standard input per stampare la somma dei valori contenuti in ciascun file.
  • [9]  Preso il file di testo dati.txt, sfruttare il comando cut e la pipe, per calcolare la somma dei valori presenti nella quarta colonna del file di dati usando il programma Somma (es. [7])

    (totale 138)

  • [10]  Correggere il programma AreaTriangolo in modo che stampi correttamente l'area di un triangolo con base 9 e altezza 7.

  • [11]  Assumendo che le variabili intere x, y e z valgano inizialmente 1, quali valori stamperebbe la seguente serie di istruzioni?
        x = x++;
        System.out.println(x);
        y += ++y;
        System.out.println(y);
        z -= z + x + y;
        System.out.println(z);
        System.out.println(++x);
        System.out.println(y++);
        System.out.println(++z + ++y + ++x);
        System.out.println(x = y = z = x + y);
    
    Verificate la vostra risposta scrivendo ed eseguendo un opportuno programma.

  • [12]  Assumendo che inizialmente le variabili intere x, y e z valgano rispettivamente 1,2 e 3, quali valori stamperebbe la seguente serie di istruzioni?
        x = x + y * y + z / y - 1;
        System.out.println(x);
        y *= x *= z *= y;
        System.out.println(y);
        z = z -= z += z;
        System.out.println(z);
    
    Verificate la vostra risposta scrivendo ed eseguendo un opportuno programma.

  • [13]  Scrivere il programma Velocita per risolvere il seguente problema: Il signor Marmitta si reca al lavoro in macchina percorrendo lo stesso tragitto sia all'andata che al ritorno, però a causa della diversità del traffico mattutino da quello serale viaggia a una media di 30 Km/h all'andata e di 60 Km/h al rientro. Qual è la velocità media del viaggio giornaliero?

    Nota: Il quesito è più sottile di quanto sembri e la risposta non è 45 Km/h, come si potrebbe essere portati a rispondere.

  • [14]  Modificare il programma Velocita in modo che possa risolvere una qualsiasi istanza del problema (cioè con valori diversi per la media di andata e di rientro).

  • [15]  Scrivere il programma TiraDado che genera casualmente dieci numeri interi compresi tra 1 e 6 (inclusi) e li stampa su righe separate.

    Sfruttare il programma TiraDado e la ridirezione dello standard output per produrre un file lanci.txt contenente 50 numeri interi generati casualmente e compresi tra 1 e 6 (inclusi). Sfruttare il comando grep e il comando wc per capire quale numero compare meno volte dentro il file lanci.txt.

    Per la generazione di numeri casuali, si usi il metodo Math.random(), che restituisce un numero decimale casuale compreso tra 0 (incluso) e 1 (escluso). Il numero così generato può essere trasformato opportunamente. Ad esempio, per assegnare alla variabile intera numeroCasuale un numero casuale intero compreso tra 1 e n, si può utilizzare l'istruzione
    int numeroCasuale = (int)(Math.random()*n) + 1;