Quattro chiacchiere su Java SE

Pagina creata da Antonio Luciani
 
CONTINUA A LEGGERE
Quattro chiacchiere su Java SE
Quattro chiacchiere su Java SE

        Alberto MOLINARI
        albertom.altervista.org
      molinari.alberto@gmail.com

           26 marzo 2010

                               “Imparare è un’esperienza,
                      tutto il resto è solo informazione.”
                                               (A. Einstein)
Quattro chiacchiere su Java SE
Introduzione

Definizione (intuitiva) di “linguaggio di programmazione”
E’ un linguaggio non verbale dotato di lessico, regole,. . . che ha come
scopo quello di scrivere programmi per computer

Java è un linguaggio di programmazione
    Recente: Gosling, 1995, Sun Microsystems (ora Oracle)
    Case Sensitive
    Dodato di un gran numero di funzionalità già disponibili senza
    installare programmi aggiuntivi
    Possibilità di creare piccoli programmi (anche avanzati, detti applet)
    che si integrano nelle pagine web
    Linguaggio di programmazione basato su interpretazione
    Orientato agli oggetti

                           Alberto Molinari   Quattro chiacchiere su Java SE
Quattro chiacchiere su Java SE
Cenni alla programmazione orientata agli oggetti

    Gli oggetti sono entità astratte che hanno uno stato e possono
    compiere azioni
    Ogni oggetto è di un determinato tipo
    Si può pensare ad un programma come un insieme di oggetti che
    interagiscono tra loro
    Un oggetto può chiedere a un altro un servizio; quest’ultimo se ne fa
    carico e deve rispondere adeguatamente
    Esempio: Un’automobile con poca benzina (stato) richiede (azione) al
    benzinaio (l’altro oggetto) di fare benzina. Questo se ne fa carico e
    riempie il serbatoio

                         Alberto Molinari   Quattro chiacchiere su Java SE
Quattro chiacchiere su Java SE
Sintassi

    La sintassi (cioè l’insieme delle regole di scrittura) è diversa da quella
    del Pascal. E’ invece uguale a quella del C/C++
    Si fa uso abbastanza massiccio di parentesi graffe { } per separare
    blocchi di codice con lo stesso significato (come il begin ed end del
    Pascal)
    Al termine di ogni istruzione bisogna mettere un                  ;

                           Alberto Molinari   Quattro chiacchiere su Java SE
Primo, classico, programma
“Hello World!”

class Prova{

           public static void main (String[] args){

                  System.out.println("Hello world!");

           }

}

                       Alberto Molinari   Quattro chiacchiere su Java SE
Ottenere il file in Java Bytecode

    In realtà Java è parzialmente compilato: bisogna, dal codice sorgente
    puro, ottenere il bytecode
    Il bytecode è un linguaggio di basso livello, adatto per essere inviato
    in rete
    Il bytecode è quello che viene interpretato in tempo reale dalla Java
    Virtual Machine ed eseguito
    Per ottenere il bytecode: comando nel prompt dei comandi
    javac nome file.java

                          Alberto Molinari   Quattro chiacchiere su Java SE
Versatilità di Java

    Esiste una versione (più correttamente, un’ implementazione) della
    JVM per ogni sistema operativo
    I vostri programmi funzioneranno su Windows, Linux, MacOs X,
    WindowsMobile, Android, Symbian. . .

    Con piccoli adattamenti, potete creare le applet e integrarle
    direttamente in una pagina web: il browser e la JVM le eseguiranno in
    “collaborazione”

                         Alberto Molinari   Quattro chiacchiere su Java SE
Ambienti di sviluppo (IDE)

    Gli ambienti di sviluppo sono software che aiutano i programmatori a
    scrivere codice più velocemente
    Suggeriscono il nome delle funzioni
    Permettono di compilare ed eseguire con un unico tasto
    Aiutano nel debug
“Legge” di Kernighan
“Debugging is twice as hard as writing the code in the first place”
    Quelli più utilizzati per Java sono
         NetBeans (Sun)
         Eclipse (HP, IBM, Intel, open-source)

                          Alberto Molinari   Quattro chiacchiere su Java SE
NetBeans

   E’ più intuitivo e semplice

                         Alberto Molinari   Quattro chiacchiere su Java SE
Esercizio per iniziare. . .

Modificare il programma “Hello World!” perchè visualizzi il vostro nome e
cognome.

                         Alberto Molinari   Quattro chiacchiere su Java SE
I tipi fondamentali
Dichiarazione di variabili

      Variabile intera
      int numero = 5 ;

      Variabile carattere
      char carattere = ’d’ ;

      Variabile stringa
      String parola = ‘‘ciao’’ ;
            Le variabili stringa in realtà sono oggetti

      Variabile booleana
      boolean verofalso = false ;

      Variabile reale (o meglio, floating point)
      float numdec = 0.4567 ;

                               Alberto Molinari   Quattro chiacchiere su Java SE
I tipi fondamentali
Dichiarazione di costanti

      La dichiarazione è uguale, basta premettere la keyword final.
      Costante intera
      final int numero = 5 ;
      Costante carattere
      final char carattere = ’d’ ;
      Costante stringa1
      final String parola = ‘‘ciao’’ ;
      Costante booleana
      final boolean verofalso = false ;
      Costante reale (o meglio, floating point)
      final float numdec = 0.4567 ;
    1
      In realtà la keyword final applicata alle variabili che puntano a oggetti ha un
significato un po’ diverso. Con le stringhe però l’effetto ottenuto è identico a quello per
gli altri tipi fondamentali
                                Alberto Molinari   Quattro chiacchiere su Java SE
Assegnamento

   E’ possibile assegnare valori alle variabili non solo in fase di
   dichiarazione
   L’operatore di assegnamento è = (che equivale al := del Pascal)
   Esso non va confuso con == che indica invece l’uguaglianza
   Esempi
        k = 54; //supponiamo che k sia un int
        str = ‘‘qualche testo’’; //str è una String
        x = x + 56.5671; //x è un float

                         Alberto Molinari   Quattro chiacchiere su Java SE
Assegnamento

   Operatore uguale ==
   Operatore diverso !=
   Operatori di disuguaglianza < > =
   Not, and, or logici (sono cortocircuitati) ! && ||
   I primi 3 tipi di operatori si possono usare con interi, floating-point e
   caratteri (per le stringhe vedere in seguito)
   I primi 2 tipi e il quarto tipo si possono applicare ai booleani

                          Alberto Molinari   Quattro chiacchiere su Java SE
Simboli di operazione

     somma +
     sottrazione -
     moltiplicazione *
     divisione / (se entrambi gli operandi sono interi il risultato è intero,
     altrimenti è un floating-point)

Per fissare le idee. . .
Come si può ottenere un quoziente float se gli operandi sono interi? (Es.
3/2 = 1.5)

     resto nella divisione intera % (es. 5 % 2 = 1)
     Molte altre con Math.funzione_scelta(...)
          Math.pow(5.0, 2.0) //restituisce 25.0
          Math.cos(Math.PI/2.0) //restituisce il coseno di
          π/2 radianti

                           Alberto Molinari   Quattro chiacchiere su Java SE
Alcuni costrutti fondamentali
I cicli

          Ciclo for
          for (int i=1; i
Alcuni costrutti fondamentali
If . . . then . . . else . . .

        Se la condizione dopo “if” è vera, si esegue il primo blocco, altrimenti
        il secondo
        if (numero>0){
                System.out.println("Il numero è positivo");
        }else{
                System.out.println("Il numero è negativo o nullo")
        }

                                 Alberto Molinari   Quattro chiacchiere su Java SE
Alcuni costrutti fondamentali
If . . . then . . . else . . . nidificati

       Se la condizione dopo “if” è vera, si esegue il primo blocco, altrimenti
       il secondo o il terzo in base alla seconda condizione
       if (numero>0){
               System.out.println("Il numero è positivo");
       }else if (n==0){
               System.out.println("Il numero è nullo");
       }else{
               System.out.println("Il numero è negativo");
       }

                                       Alberto Molinari   Quattro chiacchiere su Java SE
Esempio
Calcolo del MCD di due naturali

public class MCD {
    public static void main(String[] args){

           int i=392, k=42;
           while(i!=k){
               if(i>k) i=i-k;
               else k=k-i;
           }
           System.out.print("Il MCD dei numeri inseriti e’ ");
           System.out.println(i);

           if (i==1) System.out.println("I numeri sono coprı̀mi");
      }
}

                              Alberto Molinari   Quattro chiacchiere su Java SE
Alcune cose in più sulle stringhe

    Supponendo di aver dichiarato una stringa, String str="ciao";
    sono definite le operazioni:
        str.toLowerCase() //converte tutto in minuscole
        str.toUpperCase()
        str.length() //lunghezza stringa
        str.substring(int ind1, int ind2)
        //sottostringa che parte da ind1 a ind2 escluso
        str.equals(String str2)
        //vero se le 2 stringhe sono uguali
        str.charAt(int k) //dà il carattere (char) in posizione k
        //(il primo è in posizione 0)
    Usare il metodo equals, non == con le stringhe

                        Alberto Molinari   Quattro chiacchiere su Java SE
Esempio
Inverti stringhe in output

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class stringheOut {

    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        System.out.println("Immettere più parole. Per terminare STOP");
        String str = br.readLine();
        String strOut = "";

        while (!str.equals("STOP")) {
            strOut = str + "; " + strOut;
            str = br.readLine();
        }
        System.out.println("Le parole inserite sono, in ordine invertito");
        System.out.println(strOut);
    }
}

                                Alberto Molinari   Quattro chiacchiere su Java SE
Esercizi base

  1   Fornire in output tutti i numeri interi compresi fra 20 e 300
  2   Dati 2 naturali ≥ 2, calcolare il minimo comune multiplo
  3   Richiedere 10 valori e dare in output la media aritmetica
  4   Richiedere un valore naturale e fornire in output il suo fattoriale
Definizione di fattoriale
n! = n × (n − 1) × (n − 2) · · · × 3 × 2 × 1 ∀n ∈ N∗
0! = 1
  5   Richiedere in input una stringa di caratteri e fornire in output il
      numero di occorrenze del carattere ‘a’

                            Alberto Molinari   Quattro chiacchiere su Java SE
Vettori

    I vettori non sono altro che variabili dello stesso tipo che hanno lo
    stesso nome e si distinguono grazie a un indice

    Esempio: int[ ] vettinteri = new int [7];
    Abbiamo dichiarato un vettore di 7 interi
    Per assegnare dei valori a ogni elemento:
    vettinteri[0]=38; ... vettinteri[6]=10;
    La keyword new indica che il vettore è un oggetto
    vettinteri.length indica la lunghezza del vettore
    (in questo caso 7)

                          Alberto Molinari   Quattro chiacchiere su Java SE
Esempio I
Inverti parole

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class NewClass {

     public static void main(String[] args) throws IOException {
         InputStreamReader isr =
                 new InputStreamReader(System.in);
         BufferedReader br = new BufferedReader(isr);

          System.out.println("Immettere massimo 50 parole.");
          System.out.println(" Per terminare STOP.");
          String str = br.readLine();
          String[] vett = new String[50];
          int k = 0;

                           Alberto Molinari   Quattro chiacchiere su Java SE
Esempio II
Inverti parole

           while (!str.equals("STOP")) {
               k = k + 1;
               vett[k - 1] = str;
               str = br.readLine();
           }
                   for (int j = 0; j < k / 2; j = j + 1) {
               String temp = vett[j];
               vett[j] = vett[k - j - 1];
               vett[k - j - 1] = temp;
           }
           System.out.println("Le parole in ordine invertito sono");
           for (int x = 0; x < k; x = x + 1) {
               System.out.println(vett[x]);
           }
      }
}

                           Alberto Molinari   Quattro chiacchiere su Java SE
Primo esercizio

    Dopo aver dichiarato un vettore di 5 interi, assegnare alle entrate i
    valori 0, 2, 4, 6, 8 e stamparli (a video)
    Suggerimenti:
        Usare un ciclo for per assegnare i valori agli elementi del vettore
        Con un altro ciclo for stampare i vettori
    Rifare la stessa cosa per 100 valori

                          Alberto Molinari   Quattro chiacchiere su Java SE
Primo esercizio
Soluzione

class primoes{
        public static void main(String[]args){
                int[] vettore = new int[100];
                for (int k=0; k
Metodi I

   I metodi corrispondono alle function (o procedures) del Pascal
   Il nome deriva dalla programmazione a oggetti
   Possono essere pensate come “scatole” in cui si inseriscono valori e ne
   restituiscono altri
   Esempio
   public static int somma (int i, int j){
           return i+j;
   }

   Altro sempio

                        Alberto Molinari   Quattro chiacchiere su Java SE
Metodi II

    public static boolean pari (int numero){
            while (numero >= 2){
                    numero = numero - 2;
            }
            if (numero == 0) return true;
                    else return false; //è uguale a 1
    }

    I metodi devono dichiarare il tipo che restituiscono
    I metodi devono restituire obbligatoriamente un valore di quel tipo
    con la keyword return
    Dopo return il metodo restituisce il controllo al chiamante

                         Alberto Molinari   Quattro chiacchiere su Java SE
Metodi senza valore di ritorno

    Se il tipo restituito è void, allora il metodo non restituisce in realtà
    alcun valore
    In questo caso return non è seguita da alcun valore
    Il metodo termina, come al solito, con return o, alternativamente,
    quando è raggiunta l’ultima istruzione
    Esempio
    public static void stampa (String str){
            System.out.println(str);
    }       //qui il return è facoltativo

                           Alberto Molinari   Quattro chiacchiere su Java SE
Programma con metodi

import java.io.*;

class Programma{
    public static void main (String[] args) throws IOException{
        BufferedReader keyboard_reader =
            new BufferedReader(new InputStreamReader(System.in));
        String str = keyboard_reader.readLine();
        int k=Integer.parseInt(str); //convers. a int
        if (pari(k)) System.out.println("e’ pari");
    }

    public static boolean pari (int numero){
        while (numero >= 2){
            numero = numero - 2;
        }
        if (numero == 0) return true;
        else return false; //è uguale a 1
    }
}

                          Alberto Molinari   Quattro chiacchiere su Java SE
Esempio I
Trova numeri primi

public class DetPrimi {
    public static void main(String[] args){
        final int MAX = 120; //tutti i numeri primi fino a MAX
        int[] primi = new int [MAX];
        int cont=0;
        primi[0]=2; //il 2 è convenzionalmente primo
        for (int k=3; k
Esempio II
Trova numeri primi

           }
      }

      public static boolean primo (int i){
          for (int k=2; k
Secondo esercizio

    Scrivere un metodo che restituisca true se la stringa accettata in
    input è palindroma, altrimenti false

    Suggerimenti:
        Con un ciclo for scandire i caratteri della stringa da quello in posizione
        0 fino a quello in posizione length/2
        Verificare se quelli in posizioni simmetriche (cioè 0 e lenght-1, 1 e
        length-2, . . . ) sono uguali o meno

                          Alberto Molinari   Quattro chiacchiere su Java SE
Secondo esercizio I
Soluzione

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Classe1 {

     public static void main(String[] args) throws IOException {
         InputStreamReader isr = new InputStreamReader(System.in);
         BufferedReader br = new BufferedReader(isr);
         System.out.println("Inserire una parola per sapere se e’
                 palindroma");
         String str = br.readLine();
         if (palindroma(str)) System.out.println("e’ palindroma");
         else System.out.println("non e’ palindroma");
     }

                         Alberto Molinari   Quattro chiacchiere su Java SE
Secondo esercizio II
Soluzione

     public static boolean palindroma(String str){
         int n=str.length();
         for (int k=0; k
Terzo esercizio

    Scrivere una versione semplificata di
    Integer.parseInt(String str) che abbiamo utilizzato per
    convertire una stringa che contiene solo cifre nel corrispondente
    numero intero
    Ricordare che charAt(int k) restituisce caratteri. Questi si
    rappresentano cosı̀: ’d’
        Scandire la stringa con un ciclo for
        Trasformare i caratteri della stringa in cifre e fare in modo che vengano
        “collocati” al posto giusto nell’intero risultante

                          Alberto Molinari   Quattro chiacchiere su Java SE
Terzo esercizio I
Soluzione

public static int convertiAInt(String str) {
        int intero = 0;
        for (int k = 0; k < str.length(); k = k + 1) {
                if (str.charAt(k) == ’0’) {
                        intero = intero * 10 + 0;
                } else if (str.charAt(k) == ’1’) {
                        intero = intero * 10 + 1;
                } else if (str.charAt(k) == ’2’) {
                        intero = intero * 10 + 2;
                } else if (str.charAt(k) == ’3’) {
                        intero = intero * 10 + 3;
                } else if (str.charAt(k) == ’4’) {
                        intero = intero * 10 + 4;
                } else if (str.charAt(k) == ’5’) {
                    Alberto Molinari   Quattro chiacchiere su Java SE
Terzo esercizio II
Soluzione

                              intero = intero * 10 + 5;
                   } else    if (str.charAt(k) == ’6’) {
                              intero = intero * 10 + 6;
                   } else    if (str.charAt(k) == ’7’) {
                              intero = intero * 10 + 7;
                   } else    if (str.charAt(k) == ’8’) {
                              intero = intero * 10 + 8;
                   } else    if (str.charAt(k) == ’9’) {
                              intero = intero * 10 + 9;
                    }
            }
            return intero;
}

                        Alberto Molinari   Quattro chiacchiere su Java SE
Quarto esercizio: SelectionSort

    Gli algoritmi di ordinamento sono “ricette” (un po’ diverse da quelle
    per i dolci) che permettono di ordinare, con una quantità di passaggi
    finita, un vettore di numeri in ordine crescente o decrescente
    Implementare l’algoritmo di ordinamento “Selection-Sort”
        Si determina la posizione del minimo degli elementi del vettore e si
        scambia il minimo con l’elemento in prima posizione
        Si determina la posizione del minimo degli elementi del vettore dal
        secondo in poi e si scambia il secondo minimo con l’elemento in
        seconda posizione
        . . . e cosı̀ via per tutto il vettore

                          Alberto Molinari   Quattro chiacchiere su Java SE
Quarto esercizio: SelectionSort
Soluzione

public static int[] selectionSort(int[] x) {
        for (int i=0; i
Riferimenti

    Diapositive http://albertom.altervista.org/javapres.pdf
    JDK Selezionare il primo bottone
    NetBeans (scegliere lingua e sistema operativo: la versione corretta è
    quella per Java SE, c.a. 54 MB)
    Pacchetto JDK + NetBeans Selezionare il terzo bottone
    Eclipse (dopo aver selezionato il sistema operativo, scegliere “Eclipse
    IDE for Java Developers”, nella versione a 32 o 64 bit)

                         Alberto Molinari   Quattro chiacchiere su Java SE
Puoi anche leggere