Fondamenti di Informatica
(Statistica per le Tecnologie dell'Informazione, Statistica e Informatica per la Gestione Aziendale)
Docente: Paolo Franciosa
anno accademico 2006-2007
(8 crediti)


Prerequisiti Obiettivi Programma
Materiale didattico Orario delle lezioni Ricevimento studenti
Diario delle lezioni Modalità 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 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

Da definire

torna all'inizio


Materiale didattico

Testi consigliati

Testo di riferimento per il linguaggio Java:
Lezioni di Fondamenti di Informatica, Parte I,
D. Calvanese, G. De Giacomo, C. Demetrescu, L. Iocchi, D. Nardi.
Edito da Esculapio, 2003.
Per approfondimenti:
Concetti di informatica e fondamenti di Java,
Cay S. Horstmann.
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.
Testo di riferimento per algoritmi e complessità:
Cormen, Leiserson, Rivest: Introduzione agli algoritmi, volume 1, Jackson libri
Materiale di riferimento per la codifica dell'informazione:
da definire

Strumenti di programmazione

Gli studenti che hanno difficoltà nel reperire il software possono rivolgersi al docente.

Altri link rilevanti

torna all'inizio


Modalità d'esame

L'esame consiste nello sviluppo di un progetto in linguaggio Java, su un argomento assegnato dal docente, e in un colloquio. Il progetto può essere realizzato in piccoli gruppi (2-3 persone).

Alternativamente, lo studente può optare per la modalità di esame tradizionale, che prevede il superamento di una prova scritta in sostituzione dello sviluppo del progetto. Nella prova scritta si richiede di scrivere o completare un sorgente Java e/o di rispondere a domande su argomenti teorici.

torna all'inizio


Diario delle lezioni

1 marzo 2007
5/6 marzo 2007 (lab) 7 marzo 2007
12/13 marzo 2007 (lab) 14 marzo 2007 15 marzo 2007
19/20 marzo 2007 (lab) 21 marzo 2007 22 marzo 2007
26/27 marzo 2007 (lab) 28 marzo 2007 29 marzo 2007
2/3 aprile 2007 (lab) 4 aprile 2007
11 aprile 2007
16/17 aprile 2007 (lab) 18 aprile 2007 19 aprile 2007
23/24 aprile 2007 (lab) 26 aprile 2007
2 maggio 2007 3 maggio 2007
7/8 maggio 2007 (lab) 9 maggio 2007 10 maggio 2007
14/15 maggio 2007 (lab) 16 maggio 2007 17 maggio 2007
21/22 maggio 2007 (lab) 23 maggio 2007 24 maggio 2007

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

torna all'inizio


1 marzo 2007
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 Unità 1: tutta.
Listati ed esercizi proposti

torna all'elenco delle lezioni


5/6 marzo 2007 (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
Listati ed esercizi proposti Esercitazione 1

torna all'elenco delle lezioni


7 marzo 2007
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 Unità 4 fino a 4.30 compreso, tranne 4.20 e 4.21
Listati ed esercizi proposti

torna all'elenco delle lezioni


12/13 marzo 2007 (laboratorio)
Argomenti Analisi e correzione di errori sintattici
Metodi della classe java.swing.JOptionPane per l'input/output: showInputDialog e showMessageDialog
Conversione da stringhe attraverso i metodi Integer.parseInt, Double.parseDouble ...
Riferimenti al testo
Listati ed esercizi proposti Esercitazione 2

torna all'elenco delle lezioni


14 marzo 2007
Argomenti Istruzione condizionale if ... else ...
If nidificati
Istruzione composta { ... }
Espressioni booleane complesse: operatori && || !
Operatori di preincremento e postincremento ++, predecremento e postdecremento --
Riferimenti al testo Unità 4 da 4.31 alla fine
Unità 5 fino alla 5.15 compresa
Listati ed esercizi proposti
  • Ordina tre numeri: Ordina3.java
  • Verifica se tre interi sono i lati di un triangolo e individua il tipo di triangolo: Triangolo.java
  • Decidere se tre reali sono i lati di un triangolo rettangolo, acutangolo od ottusangolo
  • Dato capitale iniziale e interesse annuo, calcolare il capitale dopo un anno e dopo 3 anni
  • Date le coordinate di due punti trovare la loro distanza euclidea (usare il metodo Math.sqrt() per il calcolo della radice quadrata)

torna all'elenco delle lezioni


15 marzo 2007
Argomenti Istruzioni di ciclo: l'istruzione while
Uso di variabili boolean per il controllo di cicli
Riferimenti al testo Unità 6 fino a 6.22 compresa
Listati ed esercizi proposti
  • 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à)

torna all'elenco delle lezioni


19/20 marzo 2007 (laboratorio)
Argomenti Uso del ciclo while
Ricerca di massimo e minimo di un insieme
Riferimenti al testo
Listati ed esercizi proposti Esercitazione 3

torna all'elenco delle lezioni


21 marzo 2007
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 Unità 6 da 6.23 a 6.48 (comprese)
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. Ad esempio, per n=6 bisogna visualizzare il seguente disegno:
          *
         ***
        *****
       *******
      *********
     ***********
          *
          *
    

torna all'elenco delle lezioni


22 marzo 2007
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 Unità 7 fino a 7.17 (compresa) ed esercizi
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


26/27 marzo 2007 (laboratorio)
Argomenti Semplici esercizi su arrays
Riferimenti al testo
Listati ed esercizi proposti Esercitazione 4

torna all'elenco delle lezioni


28 marzo 2007
Argomenti

Nomi di array come riferimenti: assegnazione tra array
Array multidimensionali
Somma per righe e per colonne di una matrice

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 Unità 3: da 3.4 a 3.16
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


29 marzo 2007
Argomenti Overloading di metodi
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 Unità 3: 3.17
Listati ed esercizi proposti
  • Definizione e uso di variabili locali Variabili.java
  • Definizione e uso di metodi su array MetodiArray.java
  • Scrivere un programma che:
    • definisce e alloca due array monodimensionali di int della stessa lunghezza (lunghezza da tastiera)
    • li inizializza con valori immessi da tastiera (definire un metodo che popola un array con valori immessi da tastiera e chiamarlo due volte)
    • calcola e poi stampa il prodotto scalare tra i due array, cioè la somma dei prodotti degli elementi omologhi (definire e poi chiamare un metodo che accetta due array come parametri e restituisce un double)
    • definisce ed alloca un terzo array della stessa dimensione
    • calcola nel terzo array la somma vettoriale dei due array iniziali (definire e poi chiamare un metodo che accetta come parametri tre array, il terzo dei quali viene usato per memorizzare il risultato)
    • verifica se il primo array domina il secondo: A domina B se A[i]>B[i] per tutti gli i (definire e poi chiamare un metodo con due parametri array che restituisce un boolean)
    • verifica se il secondo array domina il primo (chiamare di nuovo il metodo già definito)
    • Soluzione: osservare il listato EsercizioArray.java solo dopo aver almeno tentato di risolvere l'esercizio.

torna all'elenco delle lezioni


2/3 aprile 2007 (laboratorio)
Argomenti Definizione e uso di metodi static su array
Riferimenti al testo
Listati ed esercizi proposti Esercitazione 5

torna all'elenco delle lezioni


4 aprile 2007
Argomenti

Concetto di problema, istanza, algoritmo
Il problema dell'ordinamento
Algoritmo di ordinamento per selezione
Complessità di un algoritmo
Notazione asintotica O( )
Complessità asintotica dell'algoritmo di ordinamento per selezione

Riferimenti al testo
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


11 aprile 2007
Argomenti Misure di complessità: le notazioni asintotiche O(), Omega() e Theta()
Esempi di classi di funzioni
Uso delle notazioni asintotiche per esprimere limitazioni superiori, esatte o inferiori della 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
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


16/17 aprile 2007 (laboratorio)
Argomenti Uso di metodi di oggetti String
Riferimenti al testo
Listati ed esercizi proposti

Esercitazione 6

Soluzione alla Esercitazione 6 (da consultare solo dopo aver provato a risolvere il problema)

torna all'elenco delle lezioni


18 aprile 2007
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
  • signature dei metodi membro
  • variabili membro
  • costruttori
  • implementazione dei metodi membro

Definizione della classe Osservazioni

  • descrizione dei requisiti
    • creazione dell'oggetto
    • aggiunta di un valore osservato
    • restituzione del numero di valori osservati
    • restituzione della media dei valori osservati

Riferimenti al testo Unità 3: da 3.18 a 3.41 (compreso). Molti argomenti saranno ripresi nelle lezioni seguenti
Listati proposti
Esercizi proposti

torna all'elenco delle lezioni


19 aprile 2007
Argomenti

Definizione di una classe Pila

Uso del parametro implicito this

Riferimenti al testo
Listati proposti

Definizione di una classe Pila, che gestisce un insieme di interi con la politica LIFO (last in - first out). Devono essere realizzati i metodi

  • push, che inserisce un elemento nell'insieme
  • vuota, che rivela se l'insieme è vuoto
  • top, che restituisce, tra gli elementi presenti nell'insieme, quello inserito più di recente
  • pop, che elimina, tra gli elementi presenti nell'insieme, quello inserito più di recente/li>

Una versione migliorata è mostrata nella classe PilaMigliorata, con commenti Javadoc per la creazione del sito di documentazione della classe.

torna all'elenco delle lezioni


23/24 aprile 2007 (laboratorio)
Argomenti Accesso a file di testo
Listati ed esercizi proposti

Esercitazione 7: accesso a file di testo. Nella stessa pagina è disponibile una soluzione alla esercitazione

torna all'elenco delle lezioni


26 aprile 2007
Argomenti

Chiamata di metodi static e metodi membro

Eccezioni: eccezioni controllate e non controllate

Gestione delle eccezioni (costrutto try ... catch ...) e propagazione delle eccezioni (costrutto throws ...)

Posizionamento della gestione delle eccezioni

La classe StringTokenizer: uso dei metodi countTokens, nextToken e hasMoreTokens.

Riferimenti al testo Unità 9: tutta escluso 9.16, 9.17 e 9.18
Esercizi proposti

Modificare il programma fornito con la soluzione della esercitazione 7, facendo in modo che venga scritto nel file di output, oltre a numero, somma e media dei valori presenti, anche il numero di righe che non rappresentano valori numerici corretti. Suggerimento: gestire l'eccezione NumberFormatException, generata dal tentativo di conversione da stringa in numero, per incrementare un contatore

Scrivere un programma Java che legge da tastiera una sequenza di interi nel formato

xxx;xx;xxxx;...;xx
di cui non si conosce a priori il numero di interi, e stampa il numero di interi, la loro somma e la loro media. Suggerimento: utilizzare la classe StringTokenizer, e riutilizzare la classe Sequenza definita nella soluzione dell'esercitazione 7

torna all'elenco delle lezioni


2 maggio 2007
Argomenti

Definizione di sottoclassi, ... extends ....
Chiamata del costruttore della superclasse super(...) e chiamata di metodi della superclasse super.nomeMetodo(...)
Ereditarietà di campi e metodi. Specializzazione di metodi per la sottoclasse attraverso la loro riscrittura (overriding).
La classe Object.
Il metodo toString().

Riferimenti al testo Unità 3: da 3.42 alla fine.
Esercizi proposti

Definire una sottoclasse della classe Pila, che renda disponibile anche i metodi getMin e getMax. che restituiscono rispettivamente il minimo e il massimo degli elementi presenti nella pila.

Definire una classe Estrattore, che possiede un costruttore con due parametri int che definiscono l'intervallo di valori che devono essere estratti. La classe deve possedere un metodo nextValue che genera un numero pseudocasuale (utilizzando il generatore Random) e un metodo getFrequenza(int v) che restituisce il numero di volte che è stato estratto il valore v.

torna all'elenco delle lezioni


3 maggio 2007
Argomenti

Esercitazione sulla definizione ed uso di classi.

Overloading di costruttori: chiamata di un altro costruttore attraverso this(...)

Soluzione dell'esercizio proposto nella lezione precedente:

Versioni migliorate:

torna all'elenco delle lezioni


7/8 maggio 2007 (laboratorio)
Argomenti Classi geometriche
Listati ed esercizi proposti

Esercitazione 8: Classi geometriche e packages

torna all'elenco delle lezioni


9 maggio 2007
Argomenti

Introduzione alla ricorsione.

Esempio di algoritmo ricorsivo per il calcolo del fattoriale.

L'algoritmo di Euclide per il calcolo del Massimo Comun Divisore MassimoComunDivisore.java

Analisi di complessità dell'algoritmo MCD di Euclide.

Introduzione al Merge Sort

Fusione di due array ordinati in un array ordinato.

torna all'elenco delle lezioni


10 maggio 2007
Argomenti

L'algoritmo Merge Sort MergeSort.java

Analisi di complessità del Merge Sort.

torna all'elenco delle lezioni


14/15 maggio 2007 (laboratorio)
Argomenti Introduzione agli applet
Listati ed esercizi proposti

Esercitazione 9: Definizione di un applet che visualizza oggetti grafici

torna all'elenco delle lezioni


16 maggio 2007
Argomenti

Analisi della complessità computazionale di algoritmi ricorsivi.

Soluzione di equazioni di ricorrenza attraverso il teorema principale (senza dimostrazione)

Studio della complessità dell'algoritmo di ricerca binaria attraverso il teorema principale

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

torna all'elenco delle lezioni


17 maggio 2007
Argomenti

L'algoritmo di ordinamento quick sort QuickSort.java

Complessità computazionale del quick sort nel caso migliore e nel caso peggiore

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

torna all'elenco delle lezioni


21/22 maggio 2007 (laboratorio)
Argomenti Introduzione alla programmazione a eventi: intercettare click e movimenti del mouse in un applet
Listati ed esercizi proposti

Esercitazione 10: Definizione di un applet che intercetta click e movimenti del mouse

torna all'elenco delle lezioni