Per commenti e segnalazioni contatta il docente all'indirizzo
Si raccomanda di chiedere l'iscrizione al gruppo facebook del corso "Informatica 2015-2016"
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.
Componenti di un sistema di elaborazione: hardware, software, principali unità periferiche.
Interazione con un sistema operativo basato su finestre.
Il sistema operativo: funzioni principali, gestione dei processi, gestione della memoria, file system.
Concetto di cartella, documento, applicazione/programma.
Rappresentazione dell'informazione: codifica di informazioni numeriche - sistemi di numerazione posizionali,
codifica binaria, ottale, esadecimale, conversioni di base. Rappresentazione di numeri interi negativi.
Rappresentazione in virgola mobile. Codifica di caratteri.
Concetto di algoritmo.
Esempi di algoritmi in linguaggio naturale.
Generalità sui linguaggi di programmazione, compilatori.
Programmazione in linguaggio Java: la Java Virtual Machine, ambienti di programmazione, compilazione ed esecuzione di programmi Java.
Costrutti essenziali del linguaggio: variabili, espressioni, oggetti.
Assegnazioni, metodi di input/output, istruzioni di selezione, ed iterazione.
Uso di classi predefinite, invocazione di metodi.
Consultazione della documentazione standard Java.
Definizione di classi, principio della riutilizzazione del codice.
Implementazione di vettori e matrici.
Ereditarietà e polimorfismo.
Algoritmi fondamentali:
Ricerca sequenziale, ricerca dicotomica su un vettore ordinato.
Ordinamento: selection sort, merge sort, quick sort, bubble sort.
Algoritmo di Euclide per la ricerca del Massimo Comun Divisore (MCD). Algoritmo per la ricerca del k-esimo elemento. Algoritmi di base su matrici.
Introduzione alla complessità computazionale: concetto di complessità di un algoritmo, notazioni asintotiche. Equazioni di ricorrenza e metodi per la loro soluzione. Complessità computazionale degli algoritmi studiati.
Walter Savitch
Programmazione con Java
Pearson, 2013.
In alternativa, per il linguaggio Java:
Marco Bertacca, Andrea Guidi
Programmare in Java
McGraw-Hill, 2007.
Escludere 11.1, 11.4, 11.5, 11.7
13, 14, 15 (in programma solo classi e metodi utilizzati nelle esercitazioni per l'accesso a files di testo), 16, 17, 18, 19
Per approfondimenti:
Cay S. Horstmann.
Concetti di informatica e fondamenti di Java,
Edito da APOGEO, Terza Edizione, 2005. Materale aggiuntivo è disponibile in
http://www.apogeonline.com/libri,
seguendo i link "Booksite" e poi "Area Studenti"", nell'area studenti.
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 8 JDK (Java Development Kit), disponibile sul sito http://java.sun.com/javase/downloads/index.jsp, premere il tasto
"Download" sotto la voce "JDK". 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 8, disponibile sul sito http://www.oracle.com/technetwork/java/javase/downloads/index.html.
Scorrere la pagina fino alla terza tabella (Additional resources), colonna di destra, alla voce "Java 8 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:
L'esame consiste in una prova scritta e un colloquio. Nella prova scritta si richiede di
scrivere programmi in Java e di rispondere a domande su argomenti teorici.
Descrizione dei pacchetti JRE (Java Runtime Environment) e JDK (Java Development Kit)
Editing di programmi Java con Blocco Note
Compilazione ed esecuzione da "Prompt dei comandi" usando gli strumenti javac e java del JDK
Esempi di semplici programmi Java
I metodi System.out.print() e System.out.println()
Correzione di errori sintattici e semantici
Si invitano tutti gli studenti del corso a iscriversi al gruppo facebook
del corso Informatica 2015-2016.
Sul gruppo verranno scambiate domande, chiarimenti, esercizi e soluzioni.
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
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.
Per i valori da utilizzare: il peso deve essere compreso tra 50 e 90 kg, l'altezza tra 1,50 e 2,00 m.
Il sesso può essere rappresentato da una variabile boolean.
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 usando una sequenza di istruzioni molto simili tra loro) una tabella con il valore del seno e del coseno degli angoli da 0 a 90 gradi, con incrementi di 10 gradi.
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
Istruzione composta { ... } e ambito di visibilità delle variabili
Uso dell'istruzione composta nella istruzione if() ... else ...
Istruzione if() ... senza else
Istruzioni if nidificate
Listati ed esercizi proposti
Input da tastiera
Esaminare il programma
SommaInput.java,
che accetta in input due interi da tastiera e stampa la loro somma. Modificare il programma in modo che vengano letti due
interi e venga stampato solo il maggiore dei due.
Negli esercizi proposti di seguito, utilizzare lo stesso schema per immettere valori da tastiera.
Per leggere un double si può ricorrere al metodo nextDouble(). Per esempio:
...
int a;
double x;
Scanner lettore;
lettore = new Scanner(System.in);
System.out.print("Digita un numero intero: ");
a = lettore.nextInt();
System.out.print("Digita un numero reale: ");
x = lettore.nextDouble();
...
Scrivere un programma che accetta da tastiera tre numeri reali e ne stampa massimo e media.
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 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 vale 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
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
Esercizi sull'uso di cicli e istruzioni condizionali
Listati ed esercizi proposti
Scrivere un programma che, dati due numeri naturali a e b, stampi il valore di ab, senza utilizzare il metodo Math.pow(..., ...)Soluzione: Potenza.java
Calcola il numero di anni necessari per raggiungere un dato importo
a partire da un capitale iniziale e un tasso di interesse annuo dati
CapitaleObiettivo.java
Incremento di capitale con capitalizzazione degli interessi
Capitale.java
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.javaSoluzione più efficiente: ContaDivisoriVeloce.java
Scoprire cosa fa il programma seguente:
Ignoto.java
Fare in modo che il programma Ignoto.java funzioni anche quando a e/o b contengono valori negativi
Uso di variabili boolean per il controllo di cicli
Esercizi sull'uso di cicli e istruzioni condizionali
Istruzione break;
Esempi di programmi con cicli multipli e istruzioni di selezione
Operatori di preincremento e postincremento ++, predecremento e postdecremento --
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.
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:
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.
Come sopra, mostrando la differenza tra il risultato ottenuto eseguendo la somma in un senso o in senso opposto:
1/1 + 1/2 + 1/3 + ... + 1/n
rispetto a 1/n + 1/(n-1) + 1/(n-2) + ... + 1/2 + 1/1 SerieArmonica.java
(con for: SerieArmonicaFor.java)
Mostrare l'andamento della somma della serie armonica, visualizzandone il valore ogni 100 termini aggiunti fino a un massimo numero di termini immesso da tastiera.
Mostrare che la differenza tra la somma dei primi n termini e il logaritmo naturale (Math.log) di n, al crescere di n, tende a una costante.
SerieArmonicaConTraccia.java
(con for: SerieArmonicaConTracciaFor.java)
Stampa della tavola pitagorica n per nTavolaPitagorica.java (con for: TavolaPitagoricaFor.java), assumendo che che l'input (n) sia
compreso nell'intervallo [1,18] (Suggerimento: per ottenere la tabella ben incolonnata usare il metodo System.out.printf invece del metodo System.out.print)
Introduzione agli array monodimensionali: dichiarazione,
allocazione ed uso
Inizializzazione di array
La proprietà .length di array monodimensionali
Input e output di array
Listati ed esercizi proposti
Esercizi di base su array:
Leggi da tastiera una sequenza di double,
memorizzala in un array, stampa la somma degli elementi SommaArray.java
Leggi da tastiera una sequenza di double,
memorizzala in un array, crea un array che contiene una copia degli elementi del primo array
CopiaArray.java
Leggi da tastiera una sequenza di double,
memorizzala in un array, crea un array che contiene una copia degli elementi del primo array,
ma in ordine inverso
CopiaOrdineInverso.java
Leggi da tastiera una sequenza di int che rappresenta delle frequenze,
memorizzala in un array, crea un array che contiene le frequenze cumulate e stampa, in due colonne,
la sequenza delle frequenze (sulla sinistra) e la sequenza delle frequenze cumulate (sulla destra)
Cumula.java
Data in input una sequenza di interi che rappresentano frequenze:
stampare la frequenza massima e la frequenza minima;
calcolare l'array delle frequenze relative e stamparlo;
calcolare l'array delle frequenze relative cumulate e stamparlo;
stampare in quale posizione si trovano la frequenza massima e la frequenza minima.
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 di double di lunghezza n e un intero k<n, calcolare l'array delle n-k+1 medie mobili di lunghezza k.
La media mobile di lunghezza k è la media di k elementi consecutivi, e naturalmente può essere calcolata
a partire dalla prima posizione, dalla seconda, e così via fino ad
iniziare in posizione n-k+1.
Arricchire il programma del punto precedente individuando anche la posizione in cui si trovano la massima e la minima media mobile.
Dati due array di interi A e B, con A.length ≥ B.length verificare se la sequenza B compare in A, e
in caso positivo indicare in quale posizione.
Ad esempio, la sequenza B = 3, 2, 10 compare nella sequenza A = 12, 2, 3, 2, 8, 3, 2, 10, 4, 2 in posizione 5
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 pari a 0 nel triangolo inferiore (elementi al di sotto della diagonale principale),
assumendo che la matrice sia quadrata
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
parametri di tipo primitivo: versione HTML parametri/index.html potrebbe non essere visualizzato correttamente dal browser Chrome)
parametri di tipo primitivo: versione PDF parametriSemplici.pdf (far scorrere verso il basso le varie pagine)
parametri di tipo riferimento ad array:
parametriRiferimento.pdf (far scorrere verso il basso le varie pagine)
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);
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)