logo sapienza

Fondamenti di Informatica, anno accademico 2012-2013
(Statistica Gestionale e mutuato da Statistica, Economia e Società, 9 crediti)
Docente: Paolo Franciosa


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

Per commenti e segnalazioni contatta il docente a


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


Materiale didattico

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
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 146 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 o completare sorgenti Java e di rispondere a domande su argomenti teorici.

torna all'inizio


Diario delle lezioni

1 Ottobre 2012 3 Ottobre 2012 (lab) 5 Ottobre 2012
8 Ottobre 2012 10 Ottobre 2012 (lab) 12 Ottobre 2012
15 Ottobre 2012 17 Ottobre 2012 (lab) 19 Ottobre 2012
22 Ottobre 2012 24 Ottobre 2012 (lab) 26 Ottobre 2012
29 Ottobre 2012 31 Ottobre 2012 (lab) annullata
annullata 7 Novembre 2012 (lab) 9 Novembre 2012
12 Novembre 2012 14 Novembre 2012 (lab) 16 Novembre 2012
19 Novembre 2012 21 Novembre 2012 (lab) 23 Novembre 2012
26 Novembre 2012 28 Novembre 2012 (lab) 30 Novembre 2012
3 Dicembre 2012 5 Dicembre 2012 (lab) 7 Dicembre 2012
10 Dicembre 2012 12 Dicembre 2012 (lab) 14 Dicembre 2012
17 Dicembre 2012 19 Dicembre 2012 (lab) inizio festività
natalizie

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

torna all'inizio


1 Ottobre 2012
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

3 Ottobre 2012 (lab)
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

Esempi di semplici programmi Java

Correzione di errori sintattici e semantici

Si invitano tutti coloro che frequentano le lezioni a compilare il modulo disponibile su http://goo.gl/j7RhQ

Esercizi proposti Esercitazione 1

torna all'elenco delle lezioni

5 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

Uso di tipi primitivi TipiPrimitivi.java

torna all'elenco delle lezioni

8 Ottobre 2011
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

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

Istruzione if() ... else ...

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)
  • 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
  • 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.
    La radice quadrata si può calcolare con l'espressione Math.sqrt(....), dove i puntini rappresentano una qualsiasi espressione numerica con valore non negativo
  • 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

10 Ottobre 2012 (lab)
Argomenti

Esempi di programmi con istruzioni condizionali

Esercizi proposti

Esercitazione 2

Si invitano tutti coloro che frequentano le lezioni a compilare il modulo disponibile su http://goo.gl/j7RhQ

torna all'elenco delle lezioni

12 Ottobre 2012
Argomenti

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

Espressioni booleane complesse: operatori && || !

Istruzione if() ...

Istruzioni if nidificate

Riferimenti al testo Capitolo 3
Listati ed esercizi proposti
  • Date tre variabili int, contenenti valori distinti a piacere, stamparli in ordine crescente. Il programma deve funzionare correttamente per qualsiasi terna di interi
  • Ordina tre numeri: 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
  • Decidere se tre reali sono le misure dei lati di un triangolo rettangolo, acutangolo od ottusangolo
  • Dati due intervalli I1=[a, b] e I2=[c, d], rappresentati nel programma da quattro variabili int a, b, c, d; i cui valori potrebbero essere generati casualmente ad esempio nell'intervallo [0, 100), decidere se l'intervallo I1 contiene l'intervallo I2 (come ad esempio nel caso I1=[3, 40] e I2=[12, 25]) oppure viceversa, 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.
  • Siano x1, y1, x2, y2, x3, y3, x4, y4 le coordinate double di quattro punti. Decidere se la retta passante per (x1, y1) e (x2, y2) ha pendenza maggiore della retta passante per (x3, y3) e (x4, y4).
  • 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), l'altezza espressa in metri (ha, hb, hc, hd, he) e il sesso (sa, sb, sc, sd, se). Il sesso e' rappresentato da 5 variabili char, che possono contenere il valore 'm' o 'f'.
    Si vuole trovare qual è il massimo body mass index (BMI), e quali sono il massimo BMI tra i maschi e il massimo BMI tra le femmine. Il BMI di una persona è definito dal peso in kg diviso il quadrato dell'altezza in metri.
    Generare casualmente i valori da utilizzare: il peso deve essere compreso tra 50 e 90 kg, l'altezza tra 1,50 e 2,00 m. Per generare il sesso basta osservare un numero pseudocasuale tra 0 e 1 e assegnare 'm' se minore di 0.5 o 'f' altrimenti. Attenzione: se la generazione dei valori è esatta il BMI dei soggetti dovrebbe essere sempre compreso tra 12,5 e 40

torna all'elenco delle lezioni

15 Ottobre 2012
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/o b, stampi il valore di ab, senza utilizzare il metodo Math.pow(..., ...)
  • Scrivere un programma che stampi i primi 50 elementi della successione di Fibonacci
  • 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

17 Ottobre 2012 (lab)
Argomenti

Input da tastiera con oggetti di classe Scanner

Analisi di una sequenza di numeri

Esercizi proposti

Esercitazione 3

torna all'elenco delle lezioni

19 Ottobre 2012
Argomenti

Esercizi sull'uso di cicli e istruzioni condizionali

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

Esempi di programmi con cicli e istruzioni di selezione

Riferimenti al testo Capitoli 4 e 5
Listati ed esercizi proposti
  • Dato un numero naturale, verificare se è un numero perfetto 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

22 Ottobre 2012
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

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.
      **********
      **********
      **********
      **********
      **********
      **********
      **********
      **********
      **********
      **********
    
    
  • Dato un numero naturale n, stampare un quadrato (solo il bordo) di asterischi di lato n. Il quadrato dovrà avere l'aspetto seguente:
      **********...****
      *               *
      *               *
      *               *
      ...............
      *               *
      **********...****
    
    
  • 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.
      *
      **
      ***
      ****
     .......
      *********
      **********
    
    
  • 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 immesso da tastiera.
    Mostrare che la differenza tra la somma dei primi n termini e il logaritmo naturale di n, al crescere di n, tende a stabilizzarsi. SerieArmonicaConTraccia.java
  • Stampa della tavola pitagorica n per n TavolaPitagorica.java, assumendo che che l'input (n) sia compreso nell'intervallo [1,18]

torna all'elenco delle lezioni

24 Ottobre 2012 (laboratorio)
Argomenti

Output formattato con il metodo System.out.printf(....)

Stima del valore di π attraverso una simulazione

Listati ed esercizi proposti Esercitazione 4

torna all'elenco delle lezioni

26 Ottobre 2012
Argomenti

Istruzioni break; e continue;

Istruzione di ciclo do ... while, differenze rispetto all'istruzione while

Soluzione numerica di una equazione attraverso il metodo di bisezione

Esercizi su cicli

Listati ed esercizi proposti

Soluzione degli esercizi proposti

  • Soluzione numerica di una equazione attraverso ilmetodo di bisezione BisezioneSempliceApplicazione.java
  • torna all'elenco delle lezioni

    29 Ottobre 2012
    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.

    torna all'elenco delle lezioni

    31 Ottobre 2012 (laboratorio)
    Argomenti

    Metodi di input/output della classe JOptionPane

    Esercizi su array monodimensionali.

    Listati ed esercizi proposti Esercitazione 5

    torna all'elenco delle lezioni

    7 Novembre 2012 (laboratorio)
    Argomenti

    Esercizi su array bidimensionali.

    Listati ed esercizi proposti Esercitazione 6

    torna all'elenco delle lezioni

    9 Novembre 2012
    Argomenti

    Esercizi 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, 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 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
    • Dato un array 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

    12 Novembre 2011
    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
    • 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 e restituisce un boolean
    • Scrivere un metodo che, dati come parametri due interi che rappresentano un intervallo, restituisce un intero letto da tastiera compresso nell'intervallo

    torna all'elenco delle lezioni

    14 Novembre 2012
    Argomenti
    • Accesso a metodi di classi esterne, chiamata di metodi public static

    Esercitazione su metodi su arrays

    Listati ed esercizi proposti

    Esercitazione7.java

    torna all'elenco delle lezioni

    16 Novembre 2012
    Argomenti

    La signature di un metodo

    overloading di metodi

    Passaggio dei parametri: differenza tra tipi primitivi ed array

    Listati ed esercizi proposti

    Esempio di soluzione (da leggere solo dopo aver tentato a lungo di risolvere l'esercizio) Esercitazione7/MieiMetodi.java

    torna all'elenco delle lezioni

    19 Novembre 2012
    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

    Riferimenti al testo Cormen, Leiserson, Rivest, pagg. 21-26
    Listati ed esercizi proposti

    torna all'elenco delle lezioni

    21 Novembre 2012
    Argomenti

    Ulteriori metodi su arrays

    Listati ed esercizi proposti

    torna all'elenco delle lezioni

    23 Novembre 2012
    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

    L'algoritmo di ordinamento per selezione (selection sort)

    Analisi della complessità computazionale del selection 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

    26 Novembre 2012
    Argomenti

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

    Analisi della complessità computazionale del bubble sort

    Introduzione alla ricorsione.

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

    Esempio di algoritmo ricorsivo per il calcolo del k-esimo numero della sequenza di Fibonacci

    Riferimenti al testo Cormen, Leiserson, Rivest, pagg. 21-26

    torna all'elenco delle lezioni

    28 Novembre 2012
    Argomenti

    Gestione delle eccezioni

    Analisi di una sequenza di estrazioni pseudocasuali

    Listati ed esercizi proposti

    torna all'elenco delle lezioni

    30 Novembre 2012
    Argomenti

    Introduzione alla ricorsione.

    Esempio di algoritmo ricorsivo per il calcolo del fattoriale

    Il paradigma divide et impera.

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

    Riferimenti al testo

    Capitolo 12 e seguenti

    Cormen, Leiserson, Rivest

    torna all'elenco delle lezioni

    3 Dicembre 2012
    Argomenti

    L'algoritmo quick sort: QuickSort.java

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

    Complessità computazionale del quick sort nel caso peggiore

    Riferimenti al testo Cormen, Leiserson, Rivest (pagine indicate)
    Animazione di algoritmi di ordinamento http://www.sorting-algorithms.com/

    torna all'elenco delle lezioni

    5 Dicembre 2012 (laboratorio)
    Argomenti Accesso a file di testo
    • Introduzione al'uso di oggetti: 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, ...

    La classe BigInteger

    Listati ed esercizi proposti

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

    torna all'elenco delle lezioni

    7 Dicembre 2011
    Argomenti

    Algoritmo per il calcolo del k-esimo elemento: Selection.java

    Versione animata dell'algoritmo Selection, che mostra il funzionamento per ciascuna chiamata ricorsiva: SelectionAnimato.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 (pagine indicate)

    torna all'elenco delle lezioni

    7 Dicembre 2012
    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, algoritmo di Euclide per il MCD, quick sort nel caso migliore, algoritmo per il k-esimo elemento (selection).
    Riferimenti al testo Cormen, Leiserson, Rivest (pagine indicate)

    torna all'elenco delle lezioni

    12 Dicembre 2012
    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

    14 Dicembre 2012
    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

    Definizione di sottoclassi: chiamata del costruttore della superclasse attraverso super

    Riferimenti al testo Capitoli 8 e seguenti
    Listati proposti

    torna all'elenco delle lezioni

    17 Dicembre 2012
    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

    19 Dicembre 2012 (laboratorio)
    Argomenti

    Overriding: ridefinizione di metodi in sottoclassi

    Il metodo toString() di Object e sua ridefinizione

    Esercitazione sulla programmazione a oggetti

    torna all'elenco delle lezioni