logo sapienza

Fondamenti di Informatica, anno accademico 2018-2019
Statistica Gestionale - Statistica, Economia e Società
9 crediti
Docente: Paolo Franciosa


Obiettivi Programma Materiale didattico
Orario delle lezioni Ricevimento studenti Modalità d'esame
Diario delle lezioni Prove d'esame

Per commenti e segnalazioni, contatta il docente all'indirizzo
paoloQUIUNPUNTOfranciosaQUIUNACHIOCCIOLAuniroma1QUIUNPUNTOit


Obiettivi e contenuti del corso

Vengono illustrati i principi fondamentali della programmazione strutturata, con particolare riferimento alla programmazione orientata agli oggetti, utilizzando il linguaggio Java.

Vengono presentati alcuni algoritmi fondamentali per problemi di ordinamento, ricerca e selezione, alcuni problemi numerici, evidenziandone le caratteristiche di efficienza attraverso l'analisi di complessità asintotica.

Vengono descritti i principali metodi di codifica dell'informazione.

Alla fine del corso lo studente sarà in grado di:

torna all'inizio


Programma

Componenti di un sistema di elaborazione: hardware, software, principali unità periferiche. Interazione con un sistema operativo basato su finestre. Il sistema operativo: funzioni principali, gestione dei processi, gestione della memoria, file system. Concetto di cartella, documento, applicazione/programma.

Rappresentazione dell'informazione: codifica di informazioni numeriche - sistemi di numerazione posizionali, codifica binaria, ottale, esadecimale, conversioni di base. Rappresentazione di numeri interi negativi. Rappresentazione in virgola mobile. Codifica di caratteri.

Concetto di algoritmo. Esempi di algoritmi in linguaggio naturale. Generalità sui linguaggi di programmazione, compilatori.

Programmazione in linguaggio Java: la Java Virtual Machine, ambienti di programmazione, compilazione ed esecuzione di programmi Java. Costrutti essenziali del linguaggio: variabili, espressioni, oggetti. Assegnazioni, metodi di input/output, istruzioni di selezione, ed iterazione. Uso di classi predefinite, invocazione di metodi. Consultazione della documentazione standard Java. Definizione di classi, principio della riutilizzazione del codice. Implementazione di vettori e matrici. Ereditarietà e polimorfismo.

Algoritmi fondamentali: Ricerca sequenziale, ricerca dicotomica su un vettore ordinato. Ordinamento: selection sort, merge sort, quick sort, bubble sort. Algoritmo di Euclide per la ricerca del Massimo Comun Divisore (MCD). Algoritmo per la ricerca del k-esimo elemento. Algoritmi di base su matrici.

Introduzione alla complessità computazionale: concetto di complessità di un algoritmo, notazioni asintotiche. Equazioni di ricorrenza e metodi per la loro soluzione. Complessità computazionale degli algoritmi studiati.

torna all'inizio


Materiale didattico

Testi consigliati

Testo di riferimento per il linguaggio Java:
Walter Savitch
Programmazione con Java
Pearson, 2013.
In alternativa, per il linguaggio Java:
Marco Bertacca, Andrea Guidi
Programmare in Java
McGraw-Hill, 2007.
Escludere 11.1, 11.4, 11.5, 11.7
13, 14, 15 (in programma solo classi e metodi utilizzati nelle esercitazioni per l'accesso a files di testo), 16, 17, 18, 19
Per approfondimenti:
Cay S. Horstmann.
Concetti di informatica e fondamenti di Java,
Edito da APOGEO, Terza Edizione, 2005.
Materale aggiuntivo è disponibile in http://www.apogeonline.com/libri, seguendo i link "Booksite" e poi "Area Studenti"", nell'area studenti.
Per gli argomenti di algoritmi e complessità, poche pagine dal testo seguente:
Cormen, Leiserson, Rivest: Introduzione agli algoritmi, volume 1, Jackson libri
Materiale di riferimento per la codifica dell'informazione:
Ceri, Mandrioli, Sbattella: Informatica arte e mestiere, McGraw-Hill.
Cap. 11, pagg. 243-255,
o in alternativa
Ceri, Mandrioli, Sbattella: Informatica istituzioni, McGraw-Hill.
Cap. 2 fino a 2.2.2 compreso e ad 2.3 alla fine del capitolo, pagg. 29-43

Strumenti di programmazione

Gli studenti che hanno difficoltà nel reperire il software possono rivolgersi al docente. L'intero software occupa circa 150 MByte.

Altri link rilevanti

torna all'inizio


Modalità d'esame

L'esame consiste in una prova scritta e un colloquio. Nella prova scritta si richiede di scrivere programmi in Java e di rispondere a domande su argomenti teorici.

torna all'inizio


Diario delle lezioni a.a. 2018/2019

24 settembre 2018 26 settembre 2018 (lab) 26 settembre 2018
1 ottobre 2018 3 ottobre 2018 (lab) 3 ottobre 2018
8 ottobre 2018 8 e 10 ottobre 2018 (lab) 10 ottobre 2018
15 ottobre 2018 15 ottobre 2018 (lab) 17 ottobre 2018
22 ottobre 2018 22 e 24 ottobre 2018 (lab) 24 ottobre 2018
sospensione causa maltempo 31 ottobre 2018 (lab) 31 ottobre 2018
interruzione attività didattica per svolgimento prove intermedie
12 novembre 2018 12 e 14 novembre 2018 (lab) 14 novembre 2018
19 novembre 2018 21 novembre 2018 (lab) 21 novembre 2018
26 novembre 2018 28 novembre 2018 (lab) 28 novembre 2018
3 dicembre 2018 ore 12:30
3 dicembre 2018 ore 15:00
5 dicembre 2018 (lab) 5 dicembre 2018
10 dicembre 2018 ore 12:30
10 dicembre 2018 ore 15:00
12 dicembre 2018 (lab) 12 dicembre 2018
17 dicembre 2018 19 dicembre 2018 (lab)

Per commenti e segnalazioni, contatta il docente all'indirizzo
paoloQUIUNPUNTOfranciosaQUIUNACHIOCCIOLAuniroma1QUIUNPUNTOit

torna all'inizio


https://bit.ly/2DrZwjc
24 settembre 2018
Argomenti
  • Introduzione al corso
  • Concetto di problema e di algoritmo
  • Esempi di algoritmi
  • Linguaggi di programmazione
    • dall'algoritmo al programma eseguibile
    • compilazione/interpretazione
    • errori sintattici/semantici
    • il caso del linguaggio Java
Materiale Compilare il questionario con informazioni generali sugli studenti

torna all'elenco delle lezioni

26 settembre 2018 (lab)
Importante: comunica il tuo indirizzo e-mail
Argomenti

Descrizione dei pacchetti JRE (Java Runtime Environment) e JDK (Java Development Kit)

Editing di programmi Java con Blocco Note

Compilazione ed esecuzione da "Prompt dei comandi" usando gli strumenti javac e java del JDK

Esempi di semplici programmi Java

I metodi System.out.print() e System.out.println()

Correzione di errori sintattici e semantici

Esercizi proposti

Primo programma: primo programma

Esercitazione 1

torna all'elenco delle lezioni

26 settembre 2018
Argomenti

Tipi primitivi: interi, reali, carattere, boolean

Dichiarazione di variabili

Identificatori

Istruzione di assegnazione

Uso di literal (costanti)

Operatori aritmetici

Semplici espressioni

Overflow

Assegnazioni, uso di semplici espressioni

Precedenza tra operatori

Listati ed esercizi proposti

calcolo perimetro e area di un rettangolo CalcoloPerimetro.java

Uso di tipi primitivi TipiPrimitivi.java

torna all'elenco delle lezioni

1 ottobre 2018
Argomenti

Conversione implicita

Conversione esplicita (cast)

Assegnazioni tra tipi disomogenei

Precedenza tra operatori

Costruzione di espressioni complesse

Listati ed esercizi proposti
  1. Date le coordinate di tre punti a=(xa, ya), b=(xb, yb), c=(xc, yc), calcolare la lunghezza dei lati del triangolo definito di tre punti (assegnando valori a piacere alle coordinate) Soluzione: PiuVicino.java
  2. Siano x1, y1, x2, y2, x3, y3, x4, y4 le coordinate (assegnate a piacere) double di quattro punti. Calcolare e stampare le pendenze (coefficiente angolare) della retta passante per (x1, y1) e (x2, y2) e della retta passante per (x3, y3) e (x4, y4).
  3. Si vuole studiare un insieme di 5 pazienti a, b, c, d, e, dei quali conosciamo il peso espresso in kg (pa, pb, pc, pd, pe) e l'altezza espressa in metri (ha, hb, hc, hd, he).
    Calcolare e stampare il body mass index (BMI) dei 5 soggetti. Il BMI di una persona è definito dal peso in kg diviso il quadrato dell'altezza in metri.
    Per i valori da utilizzare: il peso deve essere compreso tra 50 e 90 kg, l'altezza tra 1,50 e 2,00 m.
  4. Dato capitale iniziale e interesse annuo (ad esempio 4.5 se l'interesse è del 4,5% annuo), calcolare il capitale dopo un anno e dopo 3 anni (Soluzione: Capitale3Anni.java)

torna all'elenco delle lezioni

3 ottobre 2018 (lab)
Argomenti

Invocazione di metodi e uso del valore restituito

Generazione di numeri pseudocasuali con Math.random()

Stampa formattata con il metodo System.out.printf(...)

Esercizi proposti

Esercitazione 2

torna all'elenco delle lezioni

3 ottobre 2018
Argomenti

Operatori relazionali:    >   >=   <    <=   ==   !=

Istruzione if() ... else ...

Istruzione if() ... senza else

Istruzione composta { ... } e ambito di visibilità delle variabili

Espressioni boolean complesse: gli operatori logici && e ||

Uso dell'istruzione composta nella istruzione if() ... else ...

Istruzioni if nidificate

Listati ed esercizi proposti
  1. Date tre variabili double, contenenti valori distinti a piacere, che rappresentano i coefficienti di una equazione di secondo grado in una variabile, trovare le soluzioni (se reali) oppure stampare un messaggio (se complesse). Il programma deve funzionare correttamente per qualsiasi terna di interi. (Soluzione: EquazioneSecondoGrado.java)
  2. Ordina tre numeri. Dati tre numeri interi distinti stamparli in ordine crescente. Si può decidere di eseguire i confronti e stampare i tre valori nell'ordine richiesto oppure di usare altre tre variabili alle quali assegnare rispettivamente il valore minimo, mediano e massimo e poi stampare le tre variabili: (Soluzione: Ordina3.java)
  3. Verifica se tre interi possono essere le misure dei lati di un triangolo e individua il tipo di triangolo. Per esempio, 3, 2 e 8 non possono esserlo perché ... non si riesce a "chiudere" il triangolo! (Soluzione: Triangolo.java)
  4. Come al punto precedente, ma in caso affermativo decidere se il triangolo è rettangolo, acutangolo od ottusangolo (suggerimento: se vale il teorema di Pitagora è rettangolo, altrimenti ...)
  5. Dati due intervalli I1=[a, b] e I2=[c, d], rappresentati nel programma da quattro variabili int a, b, c, d;, con a<b e c<d, decidere se l'intervallo I1 contiene l'intervallo I2 (come ad esempio nel caso I1=[3, 40] e I2=[12, 25]) oppure I2 contiene I1, oppure non c'è relazione di contenimento (come ad esempio nel caso I1=[11, 56] e I2=[28, 80]. Visualizzare gli intervalli e un messaggio che indica l'eventuale contenimento. (Soluzione: Intervalli.java)

torna all'elenco delle lezioni

8 ottobre 2018
Argomenti

Lettura di valori da tastiera con oggetti Scanner

L'istruzione di ciclo while

Esercizi sull'uso di cicli e istruzioni condizionali

Listati ed esercizi proposti

Input da tastiera Esaminare il programma SommaInput.java, che accetta in input due interi da tastiera e stampa la loro somma. Modificare il programma in modo che vengano letti due interi e venga stampato solo il maggiore dei due.

Negli esercizi proposti di seguito, utilizzare lo stesso schema per immettere valori da tastiera. Per leggere un double si può ricorrere al metodo nextDouble(). Per esempio:

    ...
    int a;
    double x;
    Scanner lettore = new Scanner(System.in);
    
    System.out.print("Digita un numero intero: ");
    a = lettore.nextInt();
    System.out.print("Digita un numero reale: ");
    x = lettore.nextDouble();
    ...

Scrivere un programma che accetta da tastiera tre numeri reali e ne stampa massimo e media.

Soluzione: MaxMedDaTastiera.java


  • Scrivere un programma che, dati due numeri naturali a e b, stampi il valore di ab, senza utilizzare il metodo Math.pow(..., ...) Soluzione: Potenza.java
  • Calcola il numero di anni necessari per raggiungere un dato importo a partire da un capitale iniziale e un tasso di interesse annuo dati CapitaleObiettivo.java
  • Mostrare l'incremento di capitale per ciascun anno con capitalizzazione degli interessi Capitale.java
  • Verifica se un naturale è primo
    • versione semplice Primalita.java
    • versione migliorata PrimalitaEfficiente.java
    • altri miglioramenti proposti:
      • terminare il ciclo appena trovato un divisore
      • evitare la divisione per numeri pari maggiori di 2
      • scrivere un programma che combina tutti i miglioramenti elencati
  • Stampa il numero di divisori di un naturale (si possono utilizzare alcune delle idee a proposito del test di primalità) Soluzione: ContaDivisori.java Soluzione più efficiente: ContaDivisoriVeloce.java
  • Scoprire cosa fa il programma seguente: Ignoto.java
  • Fare in modo che il programma Ignoto.java funzioni anche quando a e/o b contengono valori negativi
  • Scrivere un programma che stampi i numeri della successione di Fibonacci minori o uguali a 200 Soluzione: Fibonacci.java
  • Scrivere un programma che stampi i primi 50 elementi della successione di Fibonacci Soluzione: PrimiNFibonacci.java

torna all'elenco delle lezioni

8-10 ottobre 2018 (lab)
aula XI e aula 16
Argomenti

Esercizi sull'uso di cicli e istruzioni condizionali

Esercizi proposti

Esercitazione 3

torna all'elenco delle lezioni

10 ottobre 2018
Argomenti

Istruzioni di assegnazione con modifica += -= *= /= %=

Operatori di preincremento e postincremento ++, predecremento e postdecremento --

Uso di variabili boolean per il controllo di cicli

Semplici programmi con cicli

Istruzione break;

Esempi di programmi con cicli e istruzioni di selezione

Istruzione di ciclo for, analogie e differenze rispetto alla istruzione while

Listati ed esercizi proposti
  • Dato un numero naturale n, stampare un quadrato (pieno) di asterischi di lato n. Il quadrato sarà formato da n righe, ciascuna contenente n asterischi.
      **********
      **********
      **********
      **********
      **********
      **********
      **********
      **********
      **********
      **********
    
    
    Soluzione: QuadratoAsterischi.java Soluzione con ciclo for: QuadratoAsterischiFor.java
  • Dato un numero naturale n, stampare un quadrato (solo il bordo) di asterischi di lato n. Il quadrato dovrà avere l'aspetto seguente:
      ********** . . . ****
      *                   *
      *                   *
      *                   *
        . . . . . . . .
        
      *                   *
      ********** . . . ****
    
    
    Soluzione: QuadratoBordoAsterischi.java Soluzione con ciclo for: QuadratoBordoAsterischiFor.java
  • Dati due numeri naturali n e b, con b < n/2, stampare un quadrato di asterischi di lato n con il bordo di spessore b. Ad esempio, se il valore di b fosse 3, il quadrato dovrebbe avere l'aspetto seguente:
      ********** . . . ****
      ********** . . . ****
      ********** . . . ****
      ***               ***
      ***               ***
      ***               ***
        . . . . . . . .
        
      ***               ***
      ********** . . . ****
      ********** . . . ****
      ********** . . . ****
    
    
    Soluzione: QuadratoBordoSpessoAsterischi.java Soluzione con ciclo for: QuadratoBordoSpessoAsterischiFor.java
  • Dato un numero naturale n, stampare un triangolo rettangolo (pieno) di asterischi di lato n. Il triangolo sarà formato da n righe di lunghezza crescente.
      *
      **
      ***
      ****
       . . .
      
      *********
      **********
    
    
    Soluzione: TriangoloAsterischi.java Soluzione con ciclo for: TriangoloAsterischiFor.java
  • Dato un numero naturale n, stampare un triangolo rettangolo (solo il bordo) di asterischi di lato n. Il triangolo dovrà avere l'aspetto seguente:
      *
      **
      * *
      *  *
       . . .
      
      *      *
      *       *
      **********
    
    
  • Stampare la somma dei primi n termini della serie armonica: 1/1 + 1/2 + 1/3 + ... + 1/n SerieArmonicaSemplice.java (con for: SerieArmonicaSempliceFor.java)
  • Come sopra, mostrando la differenza tra il risultato ottenuto eseguendo la somma in un senso o in senso opposto: 1/1 + 1/2 + 1/3 + ... + 1/n rispetto a 1/n + 1/(n-1) + 1/(n-2) + ... + 1/2 + 1/1 SerieArmonica.java (con for: SerieArmonicaFor.java)

  • Mostrare l'andamento della somma della serie armonica, visualizzandone il valore ogni 100 termini aggiunti fino a un massimo numero di termini immesso da tastiera.
    Mostrare che la differenza tra la somma dei primi n termini e il logaritmo naturale (Math.log) di n, al crescere di n, tende a una costante. SerieArmonicaConTraccia.java (con for: SerieArmonicaConTracciaFor.java)
  • Stampa della tavola pitagorica n per n TavolaPitagorica.java (con for: TavolaPitagoricaFor.java), assumendo che che l'input (n) sia compreso nell'intervallo [1,18] (Suggerimento: per ottenere la tabella ben incolonnata usare il metodo System.out.printf invece del metodo System.out.print)

Somme di quadrati

Scrivere un programma che, dato in input un numero naturale n, stampa tutte le coppie di naturali x, y tali che x^2 + y^2 = z^2, con x, y <= n e z naturale.

Per n = 20 le soluzioni dovrebbero essere le seguenti:

3^2 + 4^2 = 5^2
5^2 + 12^2 = 13^2
6^2 + 8^2 = 10^2
8^2 + 15^2 = 17^2
9^2 + 12^2 = 15^2
12^2 + 16^2 = 20^2
	

Soluzione: TernePitagoriche.java

torna all'elenco delle lezioni

15 ottobre 2018
Argomenti

Istruzione break;

Esempi di programmi con cicli multipli e istruzioni di selezione

Istruzione di ciclo do ... while, analogie e differenze rispetto alla istruzione while

Esercizi di programmazione

torna all'elenco delle lezioni

15 ottobre 2018 (laboratorio)
Argomenti

Metodi di input/output della classe JOptionPane.

Listati ed esercizi proposti Esercitazione 4

torna all'elenco delle lezioni

17 ottobre 2018
Argomenti

Introduzione agli array monodimensionali: dichiarazione, allocazione ed uso

La proprietà .length di array monodimensionali

Input e output di array

Listati ed esercizi proposti

Esercizi di base su array:

  • Leggi da tastiera una sequenza di double, memorizzala in un array, stampa la somma degli elementi SommaArray.java
  • Leggi da tastiera una sequenza di double, memorizzala in un array, crea un array che contiene una copia degli elementi del primo array CopiaArray.java
  • Leggi da tastiera una sequenza di double, memorizzala in un array, crea un array che contiene una copia degli elementi del primo array, ma in ordine inverso CopiaOrdineInverso.java
  • Leggi da tastiera una sequenza di int che rappresenta delle frequenze, memorizzala in un array, crea un array che contiene le frequenze cumulate e stampa, in due colonne, la sequenza delle frequenze (sulla sinistra) e la sequenza delle frequenze cumulate (sulla destra) Cumula.java


Data in input una sequenza di interi che rappresentano frequenze:

  • stampare la frequenza massima e la frequenza minima;
  • calcolare l'array delle frequenze relative e stamparlo;
  • calcolare l'array delle frequenze relative cumulate e stamparlo;
  • stampare in quale posizione si trovano la frequenza massima e la frequenza minima.

Soluzione: Frequenze.java

torna all'elenco delle lezioni

22 ottobre 2018
Argomenti

Precisazioni sugli array monodimensionali: dichiarazione, allocazione e assegnazione del riferimento.

Assegnazioni tra array.

Inizializzazione di array.

Algoritmo di ordinamento selection sort SelectionSortSemplice.java

Listati ed esercizi proposti
  • Creare un array contenente 20 interi random in [0, 100) e stampare il numero di elementi pari, il numero di elementi maggiori di 70, media e varianza degli elementi. AnalisiArrayRamdom.java
  • Leggi da tastiera una sequenza di interi (la lunghezza è data anch'essa da tastiera), memorizzala in un array monodimensionale, verifica se la sequenza è in ordine non decrescente VerificaOrdine.java
  • Modificare il programma precedente per verificare se la sequenza è crescente, non decrescente, non crescente o decrescente
  • Dato un array di interi, creare un altro array contenente solo gli elementi di posizione pari del primo array
  • Dato un array di interi, creare un altro array contenente solo gli elementi di posizione dispari del primo array
  • Dato un array di interi, creare un altro array contenente solo gli elementi pari (deve essere pari il valore, indipendentemente dalla posizione) del primo array
  • Leggi da tastiera una sequenza di interi (la lunghezza è data anch'essa da tastiera), memorizzala in un array, inverti l'array, stampa l'array ottenuto. Il problema deve essere risolto SENZA USARE ALTRI ARRAYS
  • Dati due array di interi A e B, con A.length ≥ B.length verificare se la sequenza B compare in A, e in caso positivo indicare in quale posizione. Ad esempio, la sequenza B = 3, 2, 10 compare nella sequenza A = 12, 2, 3, 2, 8, 3, 2, 10, 4, 2 in posizione 5

torna all'elenco delle lezioni

22-24 ottobre 2018 (laboratorio)
Argomenti

Esercizi su array monodimensionali.

Listati ed esercizi proposti Esercitazione 5

torna all'elenco delle lezioni

24 ottobre 2018
Argomenti

Algoritmo di ordinamento a bolle (Bubble sort) e suoi miglioramenti (Bubble sort migliorato)

Analisi della prestazioni del bubble sort

Listati ed esercizi proposti

Dato un array di double di lunghezza n e un intero k<n, calcolare l'array delle n-k+1 medie mobili di lunghezza k. La media mobile di lunghezza k è la media di k elementi consecutivi, e naturalmente può essere calcolata a partire dalla prima posizione, dalla seconda, e così via fino ad iniziare in posizione n-k+1.

Arricchire il programma del punto precedente individuando anche la posizione in cui si trovano la massima e la minima media mobile.

torna all'elenco delle lezioni

31 ottobre 2018 (laboratorio)
Argomenti

Introduzione agli array bidimensionali.

Listati ed esercizi proposti Esercitazione 6

torna all'elenco delle lezioni

31 ottobre 2018
Argomenti

I metodi

Definizione e chiamata di metodi static

Metodi void, metodi che restituiscono valori

Parametri formali e parametri attuali: il passaggio dei parametri di tipo primitivo

La signature di un metodo

Overloading di metodi

Listati ed esercizi proposti
  • Esempio di metodi con o senza parametri o valore di ritorno Metodi.java
  • Metodo che restituisce la media di due interi
  • Metodo che restituisce il massimo tra due interi
  • Metodo che restituisce il massimo tra tre interi

    Soluzione: SempliciMetodi.java

  • Metodo che, dato come parametro un naturale, restituisce true se è primo o false se è composto
  • Stampa i primi compresi tra 1 e un intero N fornito in input, utilizzando un metodo che verifica la primalità di un intero e restituisce un boolean

    Soluzione: StampaPrimi.java

  • Metodo che, dati come parametri due naturali a e b, restituisce il valore ab
  • Metodo che, dato come parametro un array di interi, restituisce la media dei valori dell'array
  • Metodo che, dato come parametro un array di interi, stampa su una riga i valori degli elementi separati da spazio e termina andando a capo

torna all'elenco delle lezioni

12 novembre 2018
Argomenti

Il passaggio dei parametri

  • parametri di tipo primitivo o riferimento ad array: versione HTML parametri/index.html. Far scorrere la presentazione premendo la barra spaziatrice o la freccia verso destra. Potrebbe non essere visualizzato correttamente dal browser Chrome)
  • parametri di tipo primitivo: versione PDF parametriSemplici.pdf (far scorrere verso il basso le varie pagine)
  • parametri di tipo riferimento ad array: parametriRiferimento.pdf (far scorrere verso il basso le varie pagine)

L'algoritmo di ricerca dicotomica (o ricerca binaria, ricerca logaritmica)

Listati ed esercizi proposti
  • metodo che crea una copia di un array dato;
  • metodo che, a partire da un parametro intero n, crea e restituisce un array di double random di lunghezza n;
  • metodo che riceve come parametro un array di int e lo rovescia;
  • metodo che riceve come parametro un array di int e ne restituisce una copia rovesciata;


Ricerca sequenziale in array RicercaSequenziale.java

Selection sort con metodi su array SelectionSortMetodi.java

Ricerca binaria (in array ordinato) RicercaBinaria.java

Ricerca binaria (in array ordinato): soluzione con metodi RicercaBinariaMetodi.java

Riferimenti al testo

Cormen, Leiserson, Rivest, pagg. 21-26

torna all'elenco delle lezioni

12 e 14 novembre 2018
Argomenti Metodi, accesso a classi esterne
  • Esercitazione 7
    Esercitazione7Svolta.java usando i metodi nella classe MieiMetodi.java
  • torna all'elenco delle lezioni

    14 novembre 2018
    Argomenti

    Misure di complessità: le notazioni asintotiche O(), Ω(), Θ()

    Esempi di classi di funzioni

    Uso delle notazioni asintotiche per esprimere limitazioni superiori e inferiori della complessità di algoritmi

    Complessità computazionale di semplici algoritmi: selection sort, bubble sort, ricerca sequenziale e ricerca binaria

    Riferimenti al testo

    Cormen, Leiserson, Rivest, pagg. 21-26

    torna all'elenco delle lezioni

    19 novembre 2018
    Argomenti

    Introduzione alla ricorsione.

    Esempio di algoritmo ricorsivo per il calcolo del fattoriale FattorialeRicorsivo.java

    Il paradigma divide et impera.

    Somma di un array applicando il paradigma divide et impera SommaRicorsiva.java.

    L'algoritmo di Euclide per il calcolo del Massimo Comun Divisore: versione ricorsiva MCDricorsivo.java

    Complessità computazionale dell'algoritmo MCD di Euclide

    Riferimenti al testo Cormen, Leiserson, Rivest
    Listati proposti
    • scrivere un metodo ricorsivo che dato un array di double restituisce il massimo elemento dell'array
    • scrivere un metodo ricorsivo che dato un array di int restituisce il numero di elementi negativi contenuti nell'array

    torna all'elenco delle lezioni

    21 novembre 2018 (laboratorio)
    Argomenti

    Ulteriori metodi su arrays

    Listati ed esercizi proposti

    Esercitazione8.html

    Esercitazione8Svolta.java

    torna all'elenco delle lezioni

    21 novembre 2018
    Argomenti

    Questo non è un algoritmo ricorsivo: fusione di due array ordinati in un nuovo array ordinato (Fusione.java)

    L'algoritmo di ordinamento per fusione (Merge Sort) MergeSort.java

    Complessità computazionale del merge sort

    Riferimenti al testo Cormen, Leiserson, Rivest
    Link utili Aminazione di algoritmi di ordinamento https://www.toptal.com/developers/sorting-algorithms

    torna all'elenco delle lezioni

    26 novembre 2018
    Argomenti

    L'algoritmo quick sort: QuickSort.java

    Versione animata dell'algoritmo quick sort, che mostra il funzionamento per ciascuna chiamata ricorsiva: QuickSortAnimato.java

    fuori programma: dimostrazione della complessità minima possibile (lower bound) per il problema dell'ordinamento basato su confronti

    Riferimenti al testo Cormen, Leiserson, Rivest (pagine indicate)
    Link utili Aminazione di algoritmi di ordinamento https://www.toptal.com/developers/sorting-algorithms

    torna all'elenco delle lezioni

    28 novembre 2018 (laboratorio)
    Argomenti

    Accesso a file di testo

    • Uso della classe Scanner:
      • costruttori Scanner(String) e Scanner(File)
      • metodi hasNextInt(), hasNextDouble(), ...
      • metodi nextInt(), nextDouble(), nextLine(), ...

    Uso del costrutto try ... catch ...

    Listati ed esercizi proposti

    Esercitazione 9: accesso a file di testo.

    torna all'elenco delle lezioni

    28 novembre 2018
    Argomenti

    Introduzione alla programmazione a oggetti

    • Principio dell'information hiding
    • Da variabile-tipo a oggetto-classe
    • Variabili membro e metodi membro
    • Privatezza delle variabili membro

    Definizione della classe Contatore

    • descrizione dei requisiti
      • creazione dell'oggetto
      • incremento
      • restituzione del valore
      • azzeramento
    • signature dei metodi membro
    • variabili membro
    • costruttori
    • implementazione dei metodi membro

    Listati proposti
    • realizzazione di una semplice classe Contatore (Contatore.java)
    • programma che usa un oggetto di classe Contatore (Divisori.java)
    • realizzazione della classe Osservazioni, basandosi sulle chiamate presenti nel programma al punto successivo (ecco una possibile soluzione: Osservazioni.java)
    • programma che usa un oggetto di classe Osservazioni (UsaOsservazioni.java)

    torna all'elenco delle lezioni

    3 dicembre 2018
    Argomenti

    Analisi della complessità computazionale di algoritmi ricorsivi.

    • Soluzione di equazioni di ricorrenza attraverso il teorema principale (senza dimostrazione).
    • Esempi di applicazione del teorema principale: ricerca binaria, merge sort, quick sort.

    Complessità computazionale del quick sort nel caso peggiore

    Algoritmo per il calcolo del k-esimo elemento: Selection.java e sua complessità computazionale

    Versione animata dell'algoritmo Selection, che mostra il funzionamento per ciascuna chiamata ricorsiva: SelectionAnimato.java

    Riferimenti al testo Cormen, Leiserson, Rivest (pagine indicate)

    torna all'elenco delle lezioni

    3 dicembre 2018
    Argomenti

    Esempio di definizione ed uso di una classe

    Sovraccarico del costruttore: uso del this()

    L'oggetto di invocazione: uso del this nella disambiguazione dei riferimenti

    Definizione ed invocazione di metodi static e metodi membro

    Listati proposti

    torna all'elenco delle lezioni

    5 dicembre 2018 (laboratorio)
    Argomenti

    Esercitazione sulla programmazione a oggetti

    torna all'elenco delle lezioni

    5 dicembre 2018 h 12:30
    Argomenti

    Esercizi di programmazione

    Definizione di una classe EsperimentoLanciDado

    torna all'elenco delle lezioni

    10 dicembre 2018 h 12:30
    Argomenti

    Sottoclassi ed ereditarietà

    Definizione di sottoclassi

    definizione di una sottoclasse di Persona: Studente.java

    Chiamata del costruttore della superclasse attraverso super

    esempio di uso della classe Studente: UsaStudente.java

    Il this come oggetto di invocazione

    Ereditarietà

    Overriding: ridefinizione di metodi in sottoclassi

    Il metodo toString() di Object e sua ridefinizione

    Chiamata di metodi della superclasse attraverso super.METODO(...)

    torna all'elenco delle lezioni

    10 dicembre 2018
    Argomenti

    Exceptions

    Il costrutto try ... catch ... finally ...

    Il costrutto throws

    Esempio: lettura e scrittura di arrays da file di testo MetodiFile.java

    torna all'elenco delle lezioni

    12 dicembre 2018 (laboratorio)
    Argomenti Accesso a file attraverso oggetti JFileChooser
  • Esercitazione 10
  • torna all'elenco delle lezioni

    12 dicembre 2018
    Argomenti

    Codifica dell'informazione:

    • Generalità sulla notazione posizionale per numeri naturali, interpretazione di numeri espressi in base b
    • conversione da base b a base 10 e da base 10 a base 2
    • codifica ottale ed esadecimale, conversione dalla base 2 alla base 16

    Riferimenti al testo appunti delle lezioni e testo di Ceri, Mandrioli, Sbattella
    Listati ed esercizi proposti

    CodificaPosizionale.java

    torna all'elenco delle lezioni

    17 dicembre 2018
    Argomenti

    Codifica dell'informazione:

    • rappresentazione di numeri interi in modulo e segno
    • rappresentazione di numeri interi in complemento a due
    • rappresentazione di caratteri: codifiche ASCII, ASCII esteso, Unicode

    Riferimenti al testo appunti delle lezioni e testo di Ceri, Mandrioli, Sbattella
    Listati ed esercizi proposti

    CodificaPosizionale.java

    torna all'elenco delle lezioni

    19 dicembre 2018 (lab)
    Argomenti

    Esercizi di programmazione

    Listati ed esercizi proposti
    • dato un array monodimensionale di int restituire la moda: si può risolvere ordinando l'array (ma in questo modo è preferibile creare una copia dell'array passato e non modificare l'array originale) (soluzione: Moda.java), oppure senza ordinare l'array (soluzione: ModaSenzaOrdinare.java)
    • dato un array monodimensionale di int e un intero f, restituire
      • il numero di elementi dell'array la cui frequenza è maggiore o uguale a f
      • un array contenente gli elementi la cui frequenza è maggiore o uguale a f (senza duplicati)

      (soluzione: ElemFreqMagg.java)

    • date due matrici di double A e B delle stesse dimensioni restituire una matrice, ancora delle stesse dimensioni di A e B, in cui la riga i-esima è la i-esima riga è una copia della i-esima riga di A o di B, scegliendo quella di varianza minima (soluzione: MatRigheMinVar.java)
    • problema delle regine: data una matrice quadrata di interi in {0, 1}, determinare se esistono almeno due valori 1 allineati in orizzontale, verticale, o in obliquo (soluzione: ControllaRegine.java, la sua correttezza non è stata verificata a fondo)

    torna all'elenco delle lezioni