|
Fondamenti di Informatica, anno accademico 2013-2014
(Statistica Gestionale e mutuato da Statistica, Economia e Società, 9 crediti)
Docente: Paolo Franciosa |
Per commenti e segnalazioni contatta il docente all'indirizzo
Per essere inseriti nel gruppo facebook del corso basta farne richiesta Paolo Giulio Franciosa, indicando il corso di laurea al quale si è iscritti.
Sul gruppo verranno scambiate domande, chiarimenti, esercizi, soluzioni relative agli argomenti 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:
- scrivere, compilare ed eseguire semplici programmi
nel linguaggio Java;
- consultare la documentazione sulle classi esistenti, riutilizzare
classi predefinite.
- definire ed utilizzare nuove classi.
- progettare semplici algoritmi e valutarne la complessità
computazionale.
torna all'inizio
Componenti di un sistema di elaborazione: hardware, software, principali unità periferiche.
Interazione con un sistema operativo basato su finestre. Concetto di cartella, documento, applicazione.
Il sistema operativo: funzioni principali, gestione dei processi, gestione della memoria, file system.
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
Testi consigliati
- Testo di riferimento 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
- capitolo 1: Introduzione;
- capitolo 2: Ordine di grandezza delle funzioni - contiene l'algoritmo di ordinamento merge sort;
- capitolo 4, pagg. 58-60: soluzione di equazioni di ricorrenza;
- capitolo 8, pagg. 145-153: l'algoritmo di ordinamento quick sort.
- 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
- Java 7 JDK (Java Development Kit), disponibile sul sito http://java.sun.com/javase/downloads/index.jsp, premere il tasto
"Download JDK" a destra della voce "Java SE 7" o release successive se presenti, leggere anche le "Installation Instructions" sotto la stessa voce.
- In ambiente WIndows, dopo aver installato Java è utile modificare la variabile di ambiente PATH:
Come modificare la variabile PATH di Windows per compilare ed eseguire programmi in Java
- Documentazione sulle classi predefinite Java 7, disponibile sul sito http://www.oracle.com/technetwork/java/javase/downloads/index.html,
nella prima tabella, colonna di destra, alla voce "Java SE 7 Documentation" premere il tasto "Download".
Leggere anche le "Docs Installation Instructions" sotto la stessa voce.
- Un ambiente per lo sviluppo di programmi Java: JCreator LE
(Interfaccia per editing e compilazione in ambiente Windows). Una versione gratuita
è disponibile sul sito http://www.jcreator.com/download.htm,
scegliere "JCreator LE version" (la versione "Pro" non è gratuita). Ottimi ambienti di sviluppo gratuiti per codice Java,
ma meno immediati da usare, sono:
Gli studenti che hanno difficoltà nel reperire il software possono rivolgersi al docente. L'intero software occupa circa 146 MByte.
Altri link rilevanti
torna all'inizio
L'esame consiste in una prova scritta e un colloquio. Nella prova scritta si richiede di scrivere o completare sorgenti Java e di rispondere a domande su argomenti teorici.
torna all'inizio
Per essere inseriti nel gruppo facebook del corso basta chiedere l'iscrizione a Paolo Giulio Franciosa, indicando il corso di laurea al quale si è iscritti.
Sul gruppo verranno scambiate domande, chiarimenti, esercizi, soluzioni relative agli argomenti del corso, avvisi vari.
Per commenti e segnalazioni,
contatta il docente all'indirizzo
torna all'inizio
30 Settembre 2013 |
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
|
Riferimenti al testo |
torna all'elenco delle lezioni
4 Ottobre 2013 |
Argomenti |
Descrizione dei pacchetti JRE (Java Runtime Environment) e SDK (Software Development Kit)
Editing di programmi Java con Blocco Note
Compilazione ed esecuzione da "Prompt dei comandi" usando gli strumenti javac e java del SDK
Errori sintattici e semantici
Il primo programma Java
I metodi System.out.print() e System.out.println()
Si invitano tutti gli studenti del corso a iscriversi al gruppo facebook del corso chiedendo amicizia a Paolo Giulio Franciosa. Sul gruppo verranno scambiate domande, chiarimenti, esercizi, soluzioni relative agli argomenti del corso
|
Programmi proposti |
primo programma
|
torna all'elenco delle lezioni
7 Ottobre 2012 |
Argomenti |
Tipi primitivi: interi, reali, carattere, boolean
Dichiarazione di variabili
Identificatori
Istruzione di assegnazione
Uso di literal (costanti)
Operatori aritmetici
Semplici espressioni
Assegnazioni, uso di semplici espressioni
Precedenza tra operatori
|
Riferimenti al testo |
Capitolo 1, Capitolo 3 |
Listati ed esercizi proposti |
calcolo perimetro e area di un rettangolo CalcoloPerimetro.java
Uso di tipi primitivi TipiPrimitivi.java
|
torna all'elenco delle lezioni
9 Ottobre 2013 (lab) |
Argomenti |
Descrizione dei pacchetti JRE (Java Runtime Environment) e SDK (Software Development Kit)
Editing di programmi Java con Blocco Note e Notepad++
Compilazione ed esecuzione da "Prompt dei comandi" usando gli strumenti javac e java del SDK
Esempi di semplici programmi Java
Correzione di errori sintattici e semantici
Esempi di overflow
|
Esercizi proposti |
Esercitazione 1
|
torna all'elenco delle lezioni
11 Ottobre 2013 |
Argomenti |
Conversione implicita
Conversione esplicita (cast)
Assegnazioni tra tipi disomogenei
Precedenza tra operatori
Costruzione di espressioni complesse
Invocazione di metodi e uso del valore restituito
|
Riferimenti al testo |
Capitolo 3 |
Listati ed esercizi proposti |
- Date le coordinate di due punti trovare la loro distanza euclidea
(usare il metodo
Math.sqrt() per il calcolo della radice quadrata)
Soluzione: DistanzaEuclidea.java
- Date le coordinate di tre punti a=(xa, ya), b=(xb, yb), c=(xc, yc) stampare la distanza euclidea tra il punto a e il punto b, tra il punto b e il punto c, tra il punto a e il punto c
- 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 (assumendo che siano reali).
La radice quadrata si può calcolare con l'espressione Math.sqrt(....) , dove i puntini rappresentano una qualsiasi espressione numerica con valore non negativo Soluzione: EquazioneSecondoGradoSoluzioniReali.java
- 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
- Stampare (per ora senza usare cicli) una tabella con il valore del seno e del coseno degli angoli da 0 a 90 gradi, con incrementi di 10 gradi.
angolo seno coseno
0 0 1
10 0.17364... 0.98480...
20 0.34202... 0.93969...
30 .....
...
90 1 0
Soluzione: TabellaAngoli.java
La documentazione sui metodi della classe Math è disponibile su http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html. Notare che i metodi Math.sin e Math.cos richiedono che il valore dell'angolo sia specificato in radianti, e il metodo Math.toRadians permette di convertire una misura in gradi in una misura in radianti
|
torna all'elenco delle lezioni
14 Ottobre 2013 |
Argomenti |
Generazione di numeri pseudocasuali con Math.random()
Istruzione composta { ... } e ambito di visibilità delle variabili
Operatori relazionali: > >= <
<= == !=
Istruzione if() ... else ...
Espressioni booleane complesse: operatori && || !
Istruzione if() ...
Istruzioni if nidificate
|
Riferimenti al testo |
Capitolo 3 |
Listati ed esercizi proposti |
- Date le coordinate di tre punti a=(xa, ya), b=(xb, yb), c=(xc, yc) decidere
quale tra b e c è il più vicino al punto a
Soluzione: PiuVicino.java
- 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)
- 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:
Ordina3.java
- 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é ... il triangolo non si riesce a "chiudere"!
Soluzione: Triangolo.java
- Come al punto precedente, ma in caso affermativo decidere se il triangolo è rettangolo, acutangolo
od ottusangolo (suggerimento: se vael il teorema di Pitagora è rettangolo, altrimenti ...)
- 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
16 Ottobre 2013 (lab) |
Argomenti |
Programmi con istruzioni condizionali
Lettura di valori da tastiera con oggetti Scanner
|
Esercizi proposti |
Esercitazione 2
|
torna all'elenco delle lezioni
21 Ottobre 2013 |
Argomenti |
L'istruzione di ciclo while
Esercizi sull'uso di cicli e istruzioni condizionali
Uso di variabili boolean per il controllo di cicli
|
Riferimenti al testo |
Capitoli 4 e 5 |
Listati ed esercizi proposti |
- 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, dati due numeri naturali
a e b , stampi il valore di ab , senza utilizzare il metodo Math.pow(..., ...) Soluzione: Potenza.java
- 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
- 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
- Incremento di capitale 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
|
torna all'elenco delle lezioni
23 Ottobre 2013 (lab) |
Argomenti |
Semplici programmi con cicli
Analisi di una sequenza di numeri
|
Esercizi proposti |
Esercitazione 3
|
torna all'elenco delle lezioni
25 Ottobre 2013 |
Argomenti |
Esercizi sull'uso di cicli e istruzioni condizionali
Istruzioni break; e continue;
Istruzione di ciclo for , analogie con istruzione while
Esempi di programmi con cicli multipli e istruzioni di selezione
Operatori di preincremento e postincremento ++ , predecremento e postdecremento --
|
Riferimenti al testo |
Capitoli 4 e 5 |
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
- 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
- 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
- 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
- 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
- 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
- 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
- Stampa della tavola pitagorica n per n TavolaPitagorica.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 )
|
torna all'elenco delle lezioni
28 Ottobre 2013
|
Argomenti |
Introduzione agli array monodimensionali: dichiarazione,
allocazione ed uso
Inizializzazione di array
La proprietà .length di array
Input e output di array
|
Riferimenti al testo |
Capitolo 6 |
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
torna all'elenco delle lezioni
4 Novembre 2013
|
Argomenti |
Istruzione di ciclo do ... while , differenze rispetto
all'istruzione while
Array bidimensionali. La proprietà length su array bidimensionali
Istruzioni di assegnazione con modifica += -= *= /= %=
|
Listati ed esercizi proposti |
- 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
- 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
- Dato un array bidimensionale di
int (preferibilmente inizializzato nel codice):
- stamparlo in forma di tabella (questo punto è risolto in StampaMatrice.java)
- trovare il massimo elemento della diagonale principale (assumendo che la matrice sia quadrata)
- stampare la somma di tutti gli elementi della matrice
- separatamente per ciascuna riga, stampare la somma degli elementi della riga
- separatamente per ciascuna colonna, stampare la somma degli elementi della colonna
- stampare la somma di tutti gli elementi sulla diagonale principale (assumendo che la matrice sia quadrata)
- stampare la somma di tutti gli elementi sulla diagonale secondaria (assumendo che la matrice sia quadrata)
- stampare la posizione (riga e colonna) dell'elemento massimo
- verificare se la matrice (che si assume quadrata) è simmetrica
- contare il numero di elementi paro a 0 nel triangolo inferiore (elementi al di sotto della diagonale principale),
assumendo che la matrice sia quadrata
Soluzione: MatriceVarie.java
- Dato un array bidimensionale di
double , che rappresenta i valori di una funzione di due variabili calcolati sui punti di una griglia bidimensionale, individuare i punti in cui la funzione presenta un massimo locale (definiamo un punto di massimo locale come un punto interno alla griglia nel quale la funzione assume un valore strettamente maggiore di tutti gli otto punti adiacenti ad esso). I punti sul bordo della griglia non possono essere punti di massimo locale
|
torna all'elenco delle lezioni
torna all'elenco delle lezioni
torna all'elenco delle lezioni
torna all'elenco delle lezioni
torna all'elenco delle lezioni
15 Novembre 2013 |
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
|
Riferimenti al testo |
Capitolo 7 |
Listati ed esercizi proposti |
|
torna all'elenco delle lezioni
18 Novembre 2013
|
Argomenti |
La signature di un metodo
Overloading di metodi
|
Listati ed esercizi proposti |
programma che crea un array monodimensionale di int la cui dimensione è letta da tastiera, poi legge da tastiera gli elementi dell'array e poi, usando metodi,
risolve i punti seguenti:
- stampa, in riga, gli elementi dell'array;
- stampa la media degli elementi dell'array;
- stampa la varianza degli elementi dell'array questo metodo ha bisogno di calcolare la media);
- stampa il numero di elementi maggiori di 100;
- stampa il numero di elementi maggiori di 130 (per questi due punti è utile usare lo stesso metodo);
Soluzione: MediaVarianzaEtcSuArray.java
|
torna all'elenco delle lezioni
torna all'elenco delle lezioni
22 Novembre 2013 |
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
|
Riferimenti al testo |
Capitolo 12 e seguenti
Cormen, Leiserson, Rivest, pagg. 21-26 |
torna all'elenco delle lezioni
25 Novembre 2013 |
Argomenti |
Implementazione di un metodo per la ricerca sequenziale in un array disordinato
Ricerca sequenziale in un array ordinato
L'algoritmo di ricerca binaria su array ordinati
Complessità computazionale della ricerca binaria
Passaggio dei parametri: riferimenti ad array:
parametriRiferimento.pdf (far scorrere verso il basso le varie pagine)
|
Riferimenti al testo |
Cormen, Leiserson, Rivest, pagg. 21-26 |
Listati ed esercizi proposti |
|
torna all'elenco delle lezioni
27 Novembre 2013
|
Argomenti |
Ulteriori metodi su arrays
|
Listati ed esercizi proposti |
|
torna all'elenco delle lezioni
29 Novembre 2013 |
Argomenti |
L'algoritmo di ordinamento per selezione (selection sort)
Analisi della complessità computazionale del selection sort
Algoritmo di ordinamento a bolle (Bubble sort) e suoi
miglioramenti
Analisi della complessità computazionale del bubble sort
|
Riferimenti al testo |
Capitolo 12 e seguenti
Cormen, Leiserson, Rivest, pagg. 21-26 |
Listati ed esercizi proposti |
- SelectionSort.java
- Valutare la complessità dell'algoritmo di
ricerca binaria nel caso in cui l'intervallo di ricerca non fosse
diviso ogni volta a metà, ma in due porzioni di lunghezza
rispettivamente un terzo e due terzi della lunghezza dell'intervallo di
ricerca precedente. Riferirsi al caso più sfavorevole.
- Utilizzando i metodi definiti nei listati precedenti:
- efficienza del selection sort: stampare una tabella nella quale vengono mostrati i tempi impiegati per ordinare array random di
double di dimensione crescente (100, 200, 400, 800, 1600, 3200, 6400, ...).
I tempi possono essere calcolati attraverso la differenza tra i valori restituiti dal metodo System.currentTimeMillis() , chiamandolo immediatamente prima e immediatamente dopo l'ordinamento; il metodo System.currentTimeMillis() restituisce, sotto forma di long , il numero di millisecondi trascorsi da una origine convenzionale del tempo.
È utile definire un metodo che alloca e restituisce un array random, la cui dimensione viene passata come parametro, e modificare il metodo ordinaConSelectionSort in modo che invece di essere void restituisca il numero di millisecondi impiegati;
- come al punto precedente, ordinando però con il metodo
Arrays.sort() (importare java.util.Arrays ).
|
torna all'elenco delle lezioni
torna all'elenco delle lezioni
4 Dicembre 2013 |
Argomenti |
Cmplessità computazionale del merge sort
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.
|
Riferimenti al testo |
Cormen, Leiserson, Rivest |
torna all'elenco delle lezioni
torna all'elenco delle lezioni
9 Dicembre 2013 |
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
|
Riferimenti al testo |
Programmazione a oggetti: capitoli 8 e seguenti del testo Java |
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
11 Dicembre 2013 (laboratorio)
|
Argomenti |
Accesso a file di testo
- La classe
String e alcuni suoi metodi
- Uso della classe
Scanner :
- costruttori
Scanner(String) e Scanner(File)
- metodi
hasNextInt() , hasNextDouble() , ...
- metodi
nextInt() , nextDouble() , nextLine() , ...
- classi wrapper:
Integer , Double , ...
Gestione delle eccezioni: il costrutto try ... catch ...
|
Listati ed esercizi proposti |
Esercitazione 10: accesso a file di testo. Nella stessa pagina
è disponibile una soluzione alla esercitazione
|
torna all'elenco delle lezioni
16 Dicembre 2013 |
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
|
Riferimenti al testo |
Capitoli 8 e seguenti |
Listati proposti |
|
torna all'elenco delle lezioni
torna all'elenco delle lezioni
18 Dicembre 2013
|
Argomenti |
Definizione di sottoclassi
Chiamata del costruttore della superclasse attraverso
super
Ereditarietà
Overriding: ridefinizione di metodi in sottoclassi
Il metodo toString() di Object e sua ridefinizione
|
Listati ed esercizi proposti |
definizione di una sottoclasse di Persona: Studente.java
esempio di uso della classe Studente: UsaStudente.java
|
torna all'elenco delle lezioni
20 Dicembre 2013 |
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
- rappresentazione di numeri interi in modulo e segno
- rappresentazione di numeri interi in complemento a due
- Codifica ottale ed esadecimale, conversione da e verso la base 2
- 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
20 Dicembre 2013 |
Argomenti |
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 (pagine indicate) |
torna all'elenco delle lezioni