Eserciziario di informatica
Wikibooks, manuali e libri di testo liberi.
Eserciziario di programmazione strutturata e SQL per i corsi di programmazione nella scuola superiore, indirizzato prevalentemente agli Istituti Tecnici Commerciali. Il livello di difficoltà degli esercizi è contenuto.
[modifica] Assegnazioni e struttura di sequenza
A. Obiettivo: ripasso dichiarazione variabili.
Questi sono esempi di dichiarazioni corrette.
Dim numero as Integer Dim misura as Real Dim parola as String * 12 Dim obiettivoRaggiunto as Boolean
Ricopiate una tabella come quella che segue scrivendo nella terza colonna le dichiarazioni in VB delle variabili indicate:
| Nome della variabile | Tipo di dato della variabile | Dichiarazione |
|---|---|---|
| num1 | Integer | |
| peso | Real | |
| totale | Real | |
| nome | String | |
| codiceFiscale | String * 16 | |
| eguaglianzaPeso | Boolean |
Individuare le dichiarazioni errate, scrivendo sotto per quale motivo la dichiarazione sia errata:
Dim mio numero as Integer Dim stringa as Stringa Dim numero as Integer Dim numero as String Dim nome as String * 12 Dim nome1 as String * 1
Queste assegnazioni sono corrette:
num1 = 11 misura = 11.1 eguaglianzaPeso = False diversitaDirezione = True nome = "Luca" numeroCivico = "9"
Copiate una tabella come quella che segue e scrivete nella seconda colonna qualche esempio di valore che può essere assegnato alle variabili del tipo indicato nella prima colonna.
| Tipo di dato | Esempi di valore |
|---|---|
| String | |
| String*4 | |
| Integer | |
| Single |
[modifica] Ripasso assegnazioni
Individuare le assegnazioni errate, spiegando quale sia l'errore.
N.B. Le assegnazioni possono essere errate perché i membri a destra e sinistra dell'assegnazione sono di tipo diverso, perché viene assegnato un valore incompatibile con il tipo di dato.
Dim N1 as Integer Dim N2 as Integer Dim N3 as Single Dim S1 as String Dim S2 as String Dim S3 as String Dim N4 as String Dim N5 as String N1 = 12 + N2
(specificare anche il valore di N1 dopo l'esecuzione dell'assegnazione)
N1 = 7/2 N1 = 10/3 N3 = 3,4 S1 = "Libertà di " & "pensiero" N4 = 11 N5 = N4 + "1" S2 = S2 & S3
[modifica] Condizioni logiche e struttura di selezione
Un insieme di attributi parziale del concetto di insetto potrebbe essere:
- numeroZampe
- numeroAli
- lunghezzaVitaMedia
- pesoMedio
- numeroAntenne
- capaceDiVolare
- prolificità (numero medio di figli per insetto)
- esoscheletroPresente
- nomeComune
- nomeScientifico
- climaPreferito
Seguono alcune proposizioni logiche atomiche che riguardano esempi del concetto di insetto.
( 6 < numeroZampe) (numeroZampe <= numeroAli) (capaceDiVolare = True) (numeroAli < 6) (False = esoscheletroPresente ) (capaceDiVolare <> esoscheletroPresente) (climaPreferito <> ‘polare’) (climaPreferito = ‘continentale’) (nomeComune = ‘grillo’) (lunghezzaVitaMedia <13) (prolificità <= 1.02) (nomeComune = nomeScientifico) (numeroAntenne <= 4) (numeroAli < lunghezzaVitaMedia) (lunghezzaVitaMedia >= 10) (12 <= pesoMedio) (numeroAntenne >= 2) (pesoMedio > 1.3)
- Di quale tipo è l’informazione generata dal tracing di ciascuna proposizione?
- Raggruppare le precedenti proposizioni logiche atomiche. In base a quale criterio avete raggruppato?
- Proporre un altro criterio di raggruppamento delle stesse proposizioni.
- Cosa abbiamo cercato di apprendere con l’esercizio 1?
- Associare un tipo di informazione a ciascuno degli elementi dell’intensione.
- Scegliere due esempi di insetto e, dopo avere inventato "di sana pianta" i valori delle caratteristiche non conosciute, determinare il valore di verità delle proposizioni logiche elencate sopra.
Utilizzare tabelle con la seguente intestazione:[idcar1] [ idcar2] [ proposizione logica]
- Quante righe avrà ciascuna tabella?
- Quante tabelle dovrete utilizzare?
[modifica] Strutture di iterazione
[modifica] Strutture annidate
[modifica] Array
[modifica] Vettori paralleli
[modifica] Matrici
[modifica] Sottoprogrammi
[modifica] PASSAGGIO PARAMETRI PER RIFERIMENTO E PER VALORE ENTRO FUNZIONI E SOTTOPROGRAMMI
I parametri formali devono sempre essere passati per valore a meno che non si vogliano cambiare i valori di variabili nel contesto chiamante. L'esempio che segue è scritto in MS Visual Basic, richiede l'aggiunta di un pulsante di comando con il nome predefinito e associa del codice al singolo clic su questo pulsante di comando.
Private Sub CommandButton1_Click() Dim s As String s = Cint(InputBox("Inserisci una parola")) s = f(s) MsgBox (s) End Sub Function f(ByRef z As String) As Integer Dim p As String, u As String p = Mid(z, 1, 1) u = Mid(z, Len(z),1) f = p & u End Function
- Trovare gli errori presenti.
- Cosa visualizza il msgbox inserendo la parola "Riferimento"?
- Cosa visualizza il msgbox inserendo la parola "Condensazione"?
- A cosa serve la funzione f? Come trasforma una stringa ricevuta come parametro formale?
[modifica] INVOCAZIONE DI SOTTOPROGRAMMI DAL CODICE DI ALTRI SOTTOPROGRAMMI
L'esempio che segue è scritto in MS VBA e richiede solo l'introduzione di una c.d. UserForm.
Option Explicit Private Sub UserForm_Click() Dim s As String s = InputBox("Parola da svocalizzare?") MsgBox (unVocalize(s)) End Sub Private Function isVocal(ByVal t As String) As Boolean isVocal = False isVocal = (t = "a") Or _ (t = "e") Or _ (t = "i") Or _ (t = "o") Or _ (t = "u") Or _ (t = "A") Or _ (t = "E") Or _ (t = "I") Or _ (t = "O") Or _ (t = "U") Or _ (t = "è") Or _ (t = "é") Or _ (t = "ò") Or _ (t = "à") Or _ (t = "ù") Or _ (t = "ì") End Function Private Function unVocalize(ByVal t As String) As String Dim nv As Integer, i As Integer, coft As String nv = 0 i = 1 Do coft = Mid(t, i, 1) If (isVocal(coft) = False) Then '(a) nota come dall'interno di una fun_ ' zione abbiamo l'invocazione di una funzione ' (b) nota come il contesto di invocazione è una pro_ ' posizione logica unVocalize = unVocalize & coft End If i = i + 1 nv = nv + 1 Loop While (nv < Len(t)) End Function
- Quante definizioni di funzioni abbiamo nel codice sopra?
- Quante definizioni di routine?
- Quale evento generato dall’utente avvia l’esecuzione del codice?
- Quante invocazioni della funzione unVocalize() abbiamo nella routine UserForm_Click()?
- Perché l’assegnazione: unVocalize = unVocalize & coftnon contiene nessuna invocazione della funzione unVocalize()?
- Se inserisco la parola "effetto" quante invocazioni di funzioni vengono eseguite nel codice?
- Se inserisco la stringa "£"$"?
- Quale formula lega il numero delle invocazioni e la lunghezza della stringa inserita?
- È possibile invocare una funzione dal codice di un’altra funzione?
[modifica] Archivi sequenziali
[modifica] Archivi ad accesso diretto
[modifica] Realizzazione di pagine web con HTML
[modifica] Progettazione dei dati
[modifica] Uso di SQL per la definizione dei dati
[modifica] Uso di SQL per la gestione dei dati
[modifica] Uso di SQL per le ricerche
N.B. La soluzione degli esercizi che seguono richiede le conoscenze acquisite ai punti progettazione dati, uso di sql per la definizione dei dati e uso di sql per la gestione dei dati.
A. Ogni vino di una certa annata viene vinificato da una cantina che lo produce partendo da una o più qualità di uva (uvaggi). Del vino interessano la gradazione alcolica legale e delle cantine il volume totale dei serbatoi. Dopo avere sviluppato il modello E-R relativo ai dati descritti, scrivere le istruzioni SQL che permettono di:
- Contare entro quanti vini entra ogni uvaggio.
- Elencare le cantine che vinificano un solo vino.
- Determinare la gradazione legale del vino che viene composto con il maggior numero di uvaggi.
- Determinare la quantità massima di ogni vino che può essere prodotto per ogni annata.
B. Riferendosi alla base di dati:
giornaleDiMagazzino(articolo, documento, carico, scarico,data) magazzino(cod, desc,sottoscorta,consistenza, pU, note, categoria) con il vincolo di integrità referenziale: giornaleDiMagazzino.articolo |--> magazzino.cod dove si immagina di specificare la deperibilità di un bene scrivendo tra le note "deperibile".
- Elencare gli articoli con prezzo maggiore del prezzo medio.
- Elencare gli articoli con pU maggiore del massimo pU degli articoli deperibili.
- Elencare gli articoli con pU maggiore di quello di almeno un articolo sottoscorta.
- Individuare la categoria del prodotto presente con il maggior numero di articoli.
- Elencare gli articoli che non sono stati movimentati nel Maggio 2007.
Soluzione.
SELECT DESC FROM magazzino WHERE (pU > (SELECT avg(pU) FROM magazzino)); SELECT * FROM magazzino WHERE (pU > (SELECT max(pU) FROM magazzino WHERE note = "deperibile")); SELECT * FROM magazzino WHERE pU > ANY (SELECT pU FROM magazzino WHERE (consistenza <= sottoscorta)); SELECT categoria, count(*) FROM magazzino GROUP BY categoria HAVING (count(*) >= ALL(SELECT count(*) FROM magazzino GROUP BY categoria)); SELECT * FROM magazzino WHERE cod NOT IN (SELECT cod FROM giornaleDiMagazzino WHERE (DATA >= "01/05/2007") AND (DATA <= "31/05/2007"));
C.Creare una base di dati che rappresenti le corse disputate, i cavalli che le hanno vinte e chi ne fosse il fantino. Dei cavalli interessa anche la scuderia di appartenenza, oltre al nome e all’anno di nascita; un cavallo appartiene ad una sola scuderia, non sono ammesse comproprietà. Delle scuderie interessano nome, nazionalità e domicilio. Dei fantini interessano nome, cognome, soprannome e anno di nascita. Ciascuna corsa viene disputata in un ippodromo con un certo nome in una tal data conferisce un trofeo. Al vincitore di ciascuna corsa è corrisposto un premio in denaro.
In seguito sviluppare le query in SQL che permettano di:
- Determinare il numero dei cavalli di ciascuna scuderia.
- Determinare il nome del cavallo che ha vinto il maggiore numero di corse.
- Determinare il nome del cavallo che ha vinto il minore numero di corse.
- Determinare il numero di vittorie di ciascuna scuderia.
- Individuare il fantino che ha guadagnato di più con i premi.
- Determinare il numero di vittorie di ciascuna nazione.
- Determinare l’ippodromo che ha ospitato più corse.
Soluzione:
Cavallo(id, scuderia, nome, anno) Fantino(cf, nome, cognome, soprannome, anno) Corsa(id, cavallo, fantino, data, ippodromo, premio, trofeo) Scuderia(id, nome, nazionalità, domicilio) Cavallo.scuderia|--> Scuderia.id Corsa.fantino|-->Fantino.cf Corsa.cavallo|-->Cavallo.id
SELECT Scuderia.nome, count(*) AS [Cavalli gestiti] FROM Scuderia, Cavallo WHERE (Scuderia.id = Cavallo.scuderia) GROUP BY Scuderia.nome; SELECT Cavallo.nome FROM Cavallo,Corsa WHERE (Cavallo.id = Corsa.cavallo) GROUP BY Cavallo.nome HAVING Count(*) >= ALL (SELECT Count(*) FROM Cavallo,Corsa WHERE (Cavallo.id = Corsa.cavallo) GROUP BY Cavallo.nome); SELECT Cavallo.nome FROM Cavallo,Corsa WHERE (Cavallo.id = Corsa.cavallo) GROUP BY Cavallo.nome HAVING Count(*) <= ALL (SELECT Count(*) FROM Cavallo,Corsa WHERE (Cavallo.id = Corsa.cavallo) GROUP BY Cavallo.nome); SELECT Scuderia.nome, Count(*) AS [Numero vittorie] FROM Scuderia, Cavallo, Corsa WHERE (Scuderia.id = Cavallo.scuderia) AND (Cavallo.id = Corsa.cavallo) GROUP BY Scuderia.nome; SELECT Fantino.nome, Fantino.cognome, Sum(premio) AS [Totale vincite] FROM Fantino, Corsa WHERE (Fantino.id = Corsa.fantino) GROUP BY Fantino.nome, Fantino.cognome HAVING Sum(premio) >= ALL (SELECT Sum(premio) FROM Fantino, Corsa WHERE (Fantino.id = Corsa.fantino) GROUP BY Fantino.nome, Fantino.cognome);
D. Ciascuno dei prodotti minerari estratti in varie regioni d’Europa deve essere sottoposto ad un ben determinato processo di raffinazione. Ciascun prodotto ha un certo costo al kg. In alcune regioni sono poi ubicati gli impianti entro ciascuno dei quali si effettuano uno o più di questi processi.
- Determinare quali minerali vengano estratti in una regione specificata dall’esecutore.
- Determinare il costo al grammo di tutti i minerali.
- Determinare in quali impianti si raffinano minerali il costo al kg dei quali sia superiore ad 1 euro.
E. Si costruisca il modello dei dati relativo alle vaccinazioni alle quali sono sottoposti i bambini di una città. Ogni vaccinazione viene somministrata da un medico ad un certo bambino. Rappresentare anche i genitori di tali bambini.
- Elencare il cognome e il luogo di nascita dei bambini di una certa età.
- Elencare tutte le vaccinazioni fatte da un certo bambino.
- Determinare i figli di un certo genitore.
- Contare i figli di ogni genitore.
- Contare da quanti medici sia stato vaccinato ogni bambino.
F.Ogni navigazione di una nave è caratterizzata da un porto di partenza e da uno di arrivo. Ignoriamo la possibilità di scali intermedi. In ogni navigazione vi sono dei passeggeri e delle merci trasportate in una certa quantità e di un certo valore.
- Contare il numero delle navigazioni effettutate da ogni nave.
- Determinare il valore totale delle merci di trasportate in una determinata navigazione.
- Determinare il valore medio delle merci trasportate.
[modifica] Progettazione di applicazioni

