Fondamenti di Informatica
(Statistica per le Tecnologie dell'Informazione)
Docente: Paolo Franciosa
anno accademico 2003-2004
(8 crediti)


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

Per commenti e segnalazioni contatta il docente a


Prerequisiti

Si assume che lo studente abbia acquisito i concetti di base sulla architettura di massima di un sistema di elaborazione e la struttura di un file system, ed abbia familiarità nell'interazione con un sistema operativo.

torna all'inizio


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 asintotica.

Vengono descritti i principali metodi di codifica dell'informazione

Alla fine del corso lo studente sarà in grado di

torna all'inizio


Programma

Da definire

torna all'inizio


Materiale didattico

Testi consigliati
  1. Stefano Mizzaro, Elementi di programmazione in linguaggio Java, Franco Angeli, 2000.
  2. Cormen, Leiserson, Rivest: Introduzione agli algoritmi, volume 1, Jackson libri (pagg. 21-26, 58-60).
  3. per ulteriori approfondimenti, un testo sul linguaggio Java aggiornato, completo e didatticamente valido è
    C. S. Horstmann, Concetti di informatica e fondamenti del linguaggio Java 2, seconda edizione (molto migliorata rispetto alla prima), Apogeo, 2000. Materale aggiuntivo è disponibile in http://www.apogeonline.com/libri, seguendo i link "Booksite" e poi "Area Studenti"", nell'area studenti.
  4. Paolo Coppola, Stefano Mizzaro, Laboratorio di programmazione in Java, Apogeo, 2004. E' un'utile raccolta di esercizi, in gran parte svolti e commentati.
Strumenti di programmazione
Altri link rilevanti

torna all'inizio


Modalità d'esame

Durante il corso saranno fissate alcuni test con valutazione, che in caso positivo saranno considerate in sede di esame

L'esame, se non sono state superate le prove di valutazione, consiste in una prova scritta ed un colloquio.

Nella prova scritta si richiede di scrivere o completare un sorgente Java e/o di rispondere a domande.

Non è permessa la consultazione di materiale cartaceo, ne' di quanto non previsto nel paragrafo precedente. torna all'inizio


Prove d'esame

Prova d'esonero del 20 aprile 2004

torna all'inizio


Diario delle lezioni

1 marzo 2004 2 marzo 2004 4 marzo 2004 (lab)
8 marzo 2004 9 marzo 2004 11 marzo 2004 (lab)
15 marzo 2004 16 marzo 2004 (rinviata) 18 marzo 2004 (lab)
22 marzo 2004 23 marzo 2004 25 marzo 2004 (lab)
29 marzo 2004 30 marzo 2004 1 aprile 2004 (lab)
5 aprile 2004
rinviata causa sessione di laurea
6 aprile 2004 7 aprile 2004 (lab)
ore 14:40 lezione di recupero
sospensione per
vacanze pasquali
14 aprile 2004 (lab)
ore 14:40 lezione di recupero
15 aprile 2004 (lab)
19 aprile 2004 20 aprile 2004
PROVA DI ESONERO
22 aprile 2004 (lab)
26 aprile 2004 26 aprile 2004 (lab) 27 aprile 2004
3 maggio 2004 4 maggio 2004 6 maggio 2004 (lab)
10 maggio 2004 11 maggio 2004 13 maggio 2004 (lab)
17 maggio 2004 18 maggio 2004 20 maggio 2004 (lab)
24 maggio 2004 25 maggio 2004 27 maggio 2004 (lab)

Per commenti e segnalazioni, contatta il docente (paolo.franciosa@uniroma1.it)


1 marzo 2004
Argomenti Introduzione al corso
Origini del linguaggio Java
Richiami sulla compilazione/interpretazione di un programma in linguaggio evoluto
Il ciclo di compilazione Java
La Java Virtual Machine
Esempi di programmi Java
I metodi System.out.print e System.out.println
Cenni all'uso di variabili, assegnazioni, strutture di controllo if e while
Riferimenti al testo Capitolo 1: tutto.
Listati ed esercizi proposti
torna all'elenco delle lezioni
2 marzo 2004
Argomenti Tipi primitivi: aritmetici, carattere, boolean
Dichiarazione di variabili, variabili final
Uso di literal
Operatori aritmetici
Costruzione di espressioni complesse
Precedenza tra operatori
Conversioni implicite ed esplicite, operatore cast
Cenni all'operatore relazionale di uguaglianza ==
Riferimenti al testo Capitolo 2: tutto, tranne operatori relazionali e logici.
Listati ed esercizi proposti

torna all'elenco delle lezioni


4 marzo 2004 (laboratorio)
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
Riferimenti al testo Appendice A.
Listati ed esercizi proposti

torna all'elenco delle lezioni


8 marzo 2004
Argomenti Operatori relazionali e logici
Istruzione di selezione if ... else, if nidificati
Istruzione composta { ... }
Riferimenti al testo Capitolo 3.
Listati ed esercizi proposti
  • Stampa tre interi in ordine crescente Ordina3.java
  • Dati tre interi, verifica se possono essere le misure di un triangolo (p.es., 1, 3, 7 non possono esserlo). In caso positivo, dire se il triangolo è equilatero, isoscele o scaleno

torna all'elenco delle lezioni


9 marzo 2004
Argomenti Istruzioni di ciclo: l'istruzione while
Uso di variabili boolean
Operatore di autoincremento postfisso ++
Metodi della classe java.swing.JOptionPane per l'input/output: showInputDialog e showMessageDialog
Conversione da stringhe attraverso i metodi Integer.parseInt, Float.parseFloat ...
Riferimenti al testo Capitolo 3.
Listati ed esercizi proposti
  • Verifica se un naturale e' 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à)

torna all'elenco delle lezioni


11 marzo 2004 (laboratorio)
Argomenti Uso dell'ambiente JCreator LE per l'editing, compilazione ed esecuzione di programmi in Java

torna all'elenco delle lezioni


15 marzo 2004
Argomenti Sviluppo di algoritmi: approccio top-down
Istruzione di ciclo for, analogie con istruzione while
Istruzione di ciclo do ... while, differenze rispetto all'istruzione while
Riferimenti al testo Capitolo 3.
Listati ed esercizi proposti
  • Stampa della tavola pitagorica n per n TavolaPitagorica.java
  • Estensioni proposte: ciclo di verifica che l'input (n) sia compreso nell'intervallo [1,18]
  • Stampa di un triangolo di asterischi di lato n (fornito in input) con vari orientamenti StampaTriangolo.java
    ******    ******
    ***** *****
    **** ****
    *** ***
    ** **
    * *

    * *
    ** **
    *** ***
    **** ****
    ***** *****
    ****** ******
  • Stampa di un albero di natale di altezza n (fornito in input) AlberoDiNatale.java
          *
    ***
    *****
    *******
    *********
    ***********
    *
    *

torna all'elenco delle lezioni


18 marzo 2004 (laboratorio)
Listati ed esercizi proposti

torna all'elenco delle lezioni


22 marzo 2004
Argomenti Introduzione agli array monodimensionali: dichiarazione, allocazione ed uso
Inizializzazione di array
La proprietà .length di array
Input e output di array
Istruzione break;
Istruzioni di assegnazione con modifica += -= *= /= %=
Ricerca sequenziale in un array disordinato
Riferimenti al testo Capitolo 3: sezione 3.7.
Capitolo 4: fino a 4.3 (incluso)
Listati ed esercizi proposti
  • Leggi da tastiera una sequenza di double, memorizzala in un array, stampa la somma degli elementi SommaArray.java
  • Ricerca sequenziale in un array disordinato RicercaValore.java
  • Ricerca sequenziale di più valori in un array disordinato RicercaRipetutaValore.java
  • Leggi da tastiera due sequenze di interi di uguale lunghezza (definita anch'essa da tastiera), memorizza le due sequenze in due array, stampa l'array somma SommaTraArray.java
  • Leggi da tastiera una sequenza di interi (la lunghezza è data anch'essa da tastiera), memorizzala in un array, verifica se la sequenza è in ordine non decrescente VerificaOrdine.java

torna all'elenco delle lezioni


23 marzo 2004
Argomenti Concetto di problema, istanza, algoritmo
Il problema dell'ordinamento
Algoritmo di ordinamento per selezione
Cenni sulla complessità dell'algoritmo di ordinamento per selezione
Riferimenti al testo Capitolo 4: 4.5.4
Listati ed esercizi proposti
  • Algoritmo di ordinamento per selezione SelectionSort.java
  • Leggere da tastiera due sequenze di cifre comprese tra 0 e 9, memorizzarle in due array di int, decidere quale sequenza rappresenta il numero più grande.
  • Leggere da tastiera due sequenze di caratteri, memorizzarle in due array di char, visualizzare le due stringhe in ordine lessicografico crescente.

torna all'elenco delle lezioni


25 marzo 2004 (laboratorio)
Argomenti Consultazione delle API java in
C:\j2sdk1.4.1_02\docs\api\index.html

I metodi static della classe Math
Il metodo Math.random()
I metodi static della classe Arrays in java.util.Arrays
Il metodo Arrays.sort(double[] v)
Listati ed esercizi proposti

torna all'elenco delle lezioni


29 marzo 2004
Argomenti Misure di complessità: la notazione asintotica O (O grande)
Esempi di classi di funzioni
Uso della notazione O() per esprimere limitazioni superiori alla complessità di algoritmi
L'algoritmo di ricerca binaria su array ordinati
Analisi della complessità dell'algoritmo di ricerca binaria
Riferimenti al testo Cormen, Leiserson, Rivest, pagg. 21-26
Capitolo 4: 4.5.5
Listati ed esercizi proposti
  • Ricerca binaria in array ordinato RicercaBinaria.java
  • Scrivere un programma che:
    • genera un array di dimensione letta da tastiera
    • lo inizializza con interi random tra 0 e 1000000
    • lo ordina (usando un qualsiasi metodo di ordinamento)
    • chiede ripetutamente un intero da cercare nell'array e stampa ogni volta il numero di iterazioni eseguite dall'algoritmo di ricerca binaria per trovare l'elemento o per verificarne l'assenza
    • Soluzione: RicercaBinariaRipetuta.java
  • Valutare la complessità asintotica 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

torna all'elenco delle lezioni


30 marzo 2004
Argomenti I metodi
Definizione e uso di metodi static
La signature di un metodo
I metodi void
Parametri formali e parametri attuali
Passaggio di parametri per valore
Riferimenti al testo Capitolo 5: fino a 5.6 (compreso), 5.10
Listati ed esercizi proposti
  • Esempio di metodi con o senza parametri o valore di ritorno Metodi.java
  • Stampa i primi compresi tra 1 e un intero N fornito in input, utilizzando un metodo che verifica la primalità di un intero restituendo un boolean
  • Scrivere un metodo che trova la radice cubica di un intero (la soluzione sarà un intero che approssima la soluzione esatta)
  • Scrivere un metodo che trova la radice cubica di un double x, utilizzando un metodi di ricerca binaria. L'intervallo iniziale di ricerca sarà da 0 a x, il metodo si ferma appena viene raggiunta una approssimazione fissata a priori

torna all'elenco delle lezioni


1 aprile 2004 (laboratorio)
Argomenti Definizione di metodi e inserimento di classi in un package
Listati ed esercizi proposti

torna all'elenco delle lezioni


6 aprile 2004
Argomenti Definizione e uso di variabili locali
Ambito di visibilità di variabili, mascheramento di variabili
Durata delle variabili
Parametri array: passaggio per riferimento
Riferimenti al testo Capitolo 5: da 5.7 alla fine
Listati ed esercizi proposti
  • Definizione e uso di variabili locali Variabili.java
  • Definizione e uso di metodi su array MetodiArray.java (in parte ancora da affrontare)
  • Scrivere un programma che:
    • definisce e alloca due array monodimensionali di double della stessa lunghezza (lunghezza da tastiera)
    • li inizializza con valori immessi da tastiera (definire un metodo che popola un array e chiamarlo due volte)
    • calcola e poi stampa il prodotto scalare tra i due array (somma dei prodotti degli elementi omologhi)
    • definisce ed alloca un terzo array della stessa dimensione
    • calcola nel terzo array la somma vettoriale dei due array iniziali (definire un metodo)
    • verifica se il primo array domina il secondo (A domina B se a[i]>b[i] per tutti gli i)
    • verifica se il secondo array domina il primo
    • Soluzione: EsercizioArray.java

torna all'elenco delle lezioni


7 aprile 2004 (laboratorio)
Argomenti Esercizi per la preparazione del test
Listati ed esercizi proposti

torna all'elenco delle lezioni


14 aprile 2004 (laboratorio)
Argomenti Esercizi per la preparazione del test
Listati ed esercizi proposti

torna all'elenco delle lezioni


15 aprile 2004 (laboratorio)
Argomenti Esercizi per la preparazione del test
Listati ed esercizi proposti

torna all'elenco delle lezioni


19 aprile 2004
Argomenti Distinzione tra definizione e allocazione di un array
Distinzione tra riferimento ad array e array
Assegnazione tra array
Metodi che allocano e restituiscono array
Riferimenti al testo Completare Capitolo 4
Listati ed esercizi proposti

torna all'elenco delle lezioni


22 aprile 2004 (laboratorio)
Argomenti Fusione di due array ordinati
Listati ed esercizi proposti

torna all'elenco delle lezioni


26 aprile 2004
Argomenti Ricorsione
Metodo ricorsivo per il calcolo del fattoriale
Algoritmo di Euclide per il Massimo Comun Divisore (MCD) di due interi
Introduzione al paradigma "Divide et Impera"
Ordinamento per fusione
Riferimenti al testo Completare Capitolo 6
Listati ed esercizi proposti

torna all'elenco delle lezioni


26 aprile 2004 (laboratorio)
Argomenti
  • Ricerca sequenziale in un array attraverso un metodo ricorsivo
  • Ordinamento per fusione, versione semplificata
Listati ed esercizi proposti

torna all'elenco delle lezioni


27 aprile 2004
Argomenti Complessità dell'algoritmo di ordinamento per fusione (Merge sort)
Derivazione dell'equazione di ricorrenza per il merge sort, soluzione per iterazione
Complessità intrinseca di problemi (cenni)
Riferimenti al testo Cormen, Leiserson, Rivest, pagine indicate

torna all'elenco delle lezioni


3 maggio 2004
Argomenti Introduzione alla programmazione a oggetti
Principio dell'information hiding
Da variabile-tipo a oggetto-classe
Variabili membro e metodi membro
Definizione della classe Pila
  • descrizione dei requisiti
    • creazione pila
    • verifica se vuota
    • verifica se piena
    • inserimento elemento: push(...)
    • eliminazione elemento affiorante: pop()
    • restituzione elemento affiorante: top()
  • signature dei metodi membro
  • variabili membro
  • costruttori
  • implementazione dei metodi membro
Privatezza delle variabili membro
Riferimenti al testo Capitoli 7 e 8 (anche se non strettamente aderenti al percorso seguito durante le lezioni)
Listati ed esercizi proposti

torna all'elenco delle lezioni


6 maggio 2004 (laboratorio)
Argomenti
  • Uso di metodi della classe String
  • Uso di metodi di classi geometriche
Listati ed esercizi proposti

torna all'elenco delle lezioni


10 maggio 2004
Argomenti
  • Esempio di uso della classe StringTokenizer
  • Modifica della implementazione della Pila, raddoppiando la dimensione dell'array di elementi ogni volta che la pila è piena
  • Analisi delle prestazioni dell'implementazione proposta nel caso di una sequenza di i operazioni di push
Listati ed esercizi proposti
  • Uso di StringTokenizer: SommaInputInRiga.java
  • Implementazione della pila con raddoppio dell'array
  • Scrivere un metodo che legge da input una sequenza di interi (contenuti in una sola stringa e separati da spazi) e restituisce un array di interi, contenente i valori letti. Suggerimento: usare un oggetto StringTokenizer

torna all'elenco delle lezioni


11 maggio 2004
Argomenti Codifica dell'informazione
  • codifica di caratteri: ASCII, ASCII esteso, UNICODE
  • codifica di numeri naturali
    • la notazione posizionale
    • interpretazione di un numero rappresentato in base qualsiasi
    • conversioni da base b a 10 e viceversa (metodo delle divisioni ripetute)
    • corrispondenza tra notazione in base 2 e notazioni ottale ed esadecimale
    • somma di due naturali in base 2
Listati ed esercizi proposti
  • Scrivere un programma che legge un intero (espresso in base 10) e visualizza la sua rappresentazione in base 2 (come sequenza di '1' e '0')
  • Per verificare la correttezza della soluzione si può confrontare il risultato con quello fornito dal metodo Integer.toBinaryString(int i)
  • Soluzione: ConversioneBinario.java
Riferimenti al testo Gli argomenti trattati possono essere reperiti sulla maggior parte dei testi di Fondamenti di Informatica. Per esempio si può consultare il testo
Ceri, Mandrioli, Sbattella, Informatica: arte e mestiere, McGraw-Hill, capitolo 11.

torna all'elenco delle lezioni


13 maggio 2004 (laboratorio)
Argomenti Completata l'esercitazione del 6 maggio 2003 (seconda parte)

torna all'elenco delle lezioni


17 maggio 2004
Argomenti Codifica dell'informazione
  • codifica di interi in complemento a 2
    • definizione
    • intervallo rappresentabile
    • algoritmo per la codifica
    • somma di interi in complemento a 2
  • rappresentazioni floating point (mantissa ed esponente)
  • robustezza numerica
  • rappresentazione di immagini: rappresentazioni raster e vettoriali, codifiche GIF e JPEG (cenni)
Listati ed esercizi proposti
  • Scrivere un programma che legge un intero (espresso in base 10) e visualizza la sua rappresentazione in complemento a 2 (come sequenza di '1' e '0')
    Soluzione: ConversioneComplementoADue.java
  • Scrivere un metodo che ha come parametri due array di 32 char, che rappresentano la codifica in complemento a 2 di due interi, e restituisce un array di 32 char che rappresenta la loro somma
    Soluzione: SommaComplementoADue.java
  • Scrivere un metodo che calcola la somma delle prime n potenze negative di 3 (somma di 1/3^i), con n elevato.
    Verificare se il risultato differisce sommando i termini per i crescente o per i decrescente, spiegandone il motivo.
    Verificare se il comportamento del metodo differisce usando tipi float o double
    Soluzione: SommaPotenze.java
Riferimenti al testo Gli argomenti trattati possono essere reperiti sulla maggior parte dei testi di Fondamenti di Informatica. Per esempio si può consultare il testo
Ceri, Mandrioli, Sbattella, Informatica: arte e mestiere, McGraw-Hill, capitolo 11.

torna all'elenco delle lezioni


18 maggio 2004
Argomenti Gerarchia delle classi in Java
Definizione di sottoclassi
Membri public, protected, private
Ereditarietà
Variabili membro e metodi ereditati
Riscrittura (overriding) di metodi
Chiamata di metodi della superclasse attraverso super.
Riscrittura del metodo toString()
Listati ed esercizi proposti
  • Riscrivere la classe PilaMigliorata.java come sottoclasse di Pila.java
  • Riscrivere il metodo toString per la classe Pila
  • Riscrivere (se lo si ritiene necessario) il metodo toString per la classe PilaMigliorata
Riferimenti al testo Capitolo 9, fino a 9.2 (compreso)

torna all'elenco delle lezioni


20 maggio 2004 (laboratorio)
Argomenti Definizione di una intera classe e di una sottoclasse
Listati ed esercizi proposti Esercitazione12.html

torna all'elenco delle lezioni


24 maggio 2004
Argomenti Esercitazioni sulla definizione di classi e sottoclassi
Definizione di classi con variabili membro appartenenti ad altre classi
Uso del costrutto this() per la chiamata di altri costruttori della classe
Uso del costrutto super per la chiamata di costruttori della superclasse
Riferimenti al testo Capitolo 9, fino a 9.3 (compreso)

torna all'elenco delle lezioni


25 maggio 2004
Argomenti Classi con variabili membro e variabili static
Differenza tra metodi membro e metodi static
Analogia tra metodi static con parametro oggetto e metodi membro con parametro implicito
Riferimenti al testo Capitoli 7 e 8

torna all'elenco delle lezioni


27 maggio 2004 (laboratorio)
Argomenti Uso di classi predefinite per la scrittura e la lettura su file di testo (Questo argomento non fa parte del programma di esame, ma si ritiene particolarmente utile in un uso reale del linguaggio Java)
  • le classi BufferedReader e FileReader (cenni)
Uso del costrutto try ... catch ... per la gestione delle eccezioni
Listati ed esercizi proposti Esercitazione13.html

torna all'elenco delle lezioni