Classi e Namespace
- Modellizzare tramite classi e namspace: Figure geometriche
- Modellizzare tramite classi e namspace: Regni dei viventi
- Modellizzare tramite classi e namspace: Discipline matematiche
- Modellizzare tramite classi e namspace: Mezzi di trasporto
Operazioni numeriche e lettura da tastiera
- Dato un numero intero, restituire il suo successivo.
- Dato un numero razionale, restituire il suo doppio.
- Dato un numero reale, restituire la radice quadrata.
- Dato un numero complesso, restituire la radice quadrata.
Costrutti di selezione
- Scrivere un programma che richieda come input una stringa e visualizzare un messaggio di errore nel caso questa stringa sia diversa dalla parola "Ornitorinco".
- Scrivere un programma che, richiesto un numero da tastiera, visualizza se tale numero è pari o dispari.
- Scrivere un programma che, dati due numeri a e b, indichi se a è multiplo di b.
- Scrivere un programma il più breve possibile che, immesso N da tastiera, visualizzi un messaggio
nel caso N soddisfi la condizione: ((A e B) o C) e (non D). Dove:
- A : N > 0
- B : N <= 100
- C : N è multiplo di 7
- D : N è multiplo di 3
Costrutti iterativi
- Scrivere un programma che richieda i voti di un quadrimestre (max 10) e calcolarne la media senza usare un ciclo For.
- Ripetere il punto precedente usando un For. Cosa cambia?
- Scrivere un programma che, inserito un numero intero N da tastiera, calcoli la somma di tutti i numeri naturali compresi tra 1 e N. Ricordarsi di controllare che N sia maggiore di 1 e visualizzare un messaggio di errore in caso contrario.
- Scrivere un programma che, inserito N da tastiera, calcoli N!
- Scrivere un programma che, inserito un intero N da tastiera, stampi a video tutta la successione di Fibonacci fino a N.
- Scrivere un programma che verifichi se un numero intero N inserito da tastiera sia primo.
- Riscrivere il programma precedente in modo che vengano eseguite al più sqrt(N)/2 iterazioni per ogni controllo, senza trattare casi particolari (ossia senza controllare se il numero sia 1 o 2 o 3, eccetera...).
Array
- Scrivere un programma che accetti in ingresso al più 10 stringhe. Una volta terminato l'inserimento, visualizzare tutte le stringhe immesse, dall'ultima alla prima.
- Ripetere il primo esercizio del paragrafo precedente memorizzando i dati in un array.
- Scrivere un programma che, dati in ingresso al più 50 numeri reali, ne calcoli la varianza.
- Scrivere un programma che, data una stringa in input, verifichi se essa sia palindroma.
- Scrivere un programma che crei un array a due dimensioni (matrice) e vi inserisca, richiedendoli da tastiera, numeri reali qualsiasi. Calcoli quindi la somma di tutti i dati immessi.
- Scrivere un programma che, inserita una matrice di reali, determini se essa sia simmetrica e/o diagonale. In caso contrario, stamparne la trasposta.
- Scrivere un programma che, immessi N interi, stampi a video solo i numeri non ripetuti.
- Scrivere un programma che costruisca un array di X elementi, con X inserito da tastiera, che richieda l'immissione di questi, sempre da tastiera, e che li ordini, quindi, senza usare alcuna funzione fornita dal Framework.
- Modificare il programma del punto precedente in modo che, nell'ipotesi che gli elementi siano numeri interi compresi tra a e b (immessi da tastiera), calcoli la frequenza relativa e assoluta di ogni elemento e ne restituisca la media pesata.
- È data in ingresso una matrice (di dimensioni note, decidete voi quali) di interi compresi
tra 0 e 9. Scrivere un programma che trovi tutti i picchi della matrice. Per picco si intende un valore che è circondato da altri
valori strettamente minori. Ad esempio, nella matrice seguente, 8 (sulla prima riga), 9 (sulla seconda) e 7 (sulla quarta) sono picchi:
1 8 1 2 6 2 7 4 5 9 3 1 3 2 8 0 0 7 0 0
- È data in ingresso una matrice di interi contenente solo 0 e 1. Scrivere un programma che determini se gli 1 formino un percorso continuo che porti da sinistra a destra.
Strutture
- Scrivere una struttura che rappresenti un generico oggetto di massa e volume noti. Calcolarne quindi la densità mediante interazione con l'utente.
- Scrivere un programma che memorizzi più alunni mediante un array di strutture. Ogni struttura rappresenta un alunno e contiene Nome, Cognome e un l'elenco dei voti ottenuti. Il programma offre la possibilità di: calcolare la media e la deviazione standard (facoltativa) di uno solo o tutti gli alunni, od, eventualmente, di un gruppo ristretto di questi.
- Creare una matrice di strutture. Questa matrice rappresenta la disposizione di un territorio di costruzione e ogni suo elemento costituisce un lotto edificabile: dato che la posizione varia e con essa anche i vantaggi possibili, richiedere di immettere in ogni posto della matrice queste informazioni raggruppate sottoforma di struttura: Valore (valore del lotto), Superficie (area di terreno occupata), Clienti (il numero di persone che desiderano acquistare il lotto), Tempo (il tempo, in mesi, che occorre per costruire un edificio su tutta la superficie disponibile), CostoEdificio (il costo per la realizzazione vera e propria della costruzione sul lotto). Una volta ottenuti i dati, calcolare la media dei valori, il tempo teorico che si impiegherebbe a edificare l'area intera, il costo totale per la costruzione dei lotti. Inoltre, rilevare in quali strutture si hanno i Valori e i Costi più alti e riferire se essi sono vicini oppure sparsi per il territorio.
Metodi
- Scrivere una funzione che, dato un numero intero come parametro, restituisca questo elevato alla sesta potenza.
- Scrivere una procedura che pulisca lo schermo console (usare il metodo Console.Clear()) e visualizzi il messaggio "Premere un pulsante per continuare...".
- Scrivere una funzione che, dato un qualsiasi numero di parametri di tipo Single, ne calcoli la deviazione standard.
- Scrivere una funzione che, data una stringa, restituisca la stessa stringa, ma invertita. Suggerimento: una stringa può essere considerata e usata come un array di caratteri.
- Scrivere una funzione che restituisca le soluzioni di un'equazione di secondo grado, una volta forniti i coefficienti come parametri (di cui gli ultimi due opzionali).
- Scrivere una funzione ricorsiva che calcoli la potenza di esponente intero o frazionario (sia positivo che negativo) di un numero reale.
- Scrivere una versione ricorsiva e una ciclia di funzioni che, dato in ingresso X (intero o reale a seconda dei casi) restituiscano: X!, l'X-esimo numero della serie di Fibonacci, eX, il risultato della funzione f(n) citata nella congettura di Collatz, l'X-esimo numero primo. È possibile scrivere entrambe le versioni della funzione per ogni problema proposto? Per quelle in cui è possibile, come varia, asintoticamente, il tempo di risoluzione rispetto alla dimensione dei dati?
- Calcolare il determinante di una matrice quadrata di ordine N, con N immesso da tastiera.
- Scrivere una funzione che, data un stringa s e un qualsiasi carattere c restituisca un array di sottostringhe di s separate da c. Se questa funzione si chiama Explode, avrete, ad esempio, che Explode("Questa è una stringa", " ") restituisce l'array {"Questa", "è", "una", "stringa"}. Non potete usare la funzione String.Split.
- Scrivere un programma di simulazione circuitale usando il metodo dell'analisi nodale modificata.
Classi e proprietà
- Scrivere una classe che rappresenti un cliente di una videoteca. Ricordarsi di usare sempre proprietà per esporre campi pubblici.
- Scrivere una classe che rappresenti un libro.
- Scrivere un programma che, similmente a quelli già mostrati, memorizzi alunni e voti e permetta di calcolare la media e la moda. Stavolta, però, anziché usare array e strutture, disporre l'applicazione in modo da impiegare classi e liste. Per calcolare la media e la moda, utilizzare funzioni definite come membri di classe.
- Scrivere una classe che rappresenti una frase (stringa). La classe dovrà mettere a disposizione
almeno questi membri:
- Una proprietà che restituisca l'insieme delle parole presenti nella stringa. Suggerimento: considerare teoricamente che ogni parola è seprata dalle altre da spazi
- Due proprietà che restituiscano rispettivamente la parola più lunga e quella più corta presenti nella stringa
- Una funzione che, accettando un parametro di tipo char, calcoli il numero di volte che quel carattere appare nella stringa
- Una funzione che restituisca la stringa invertita
Metodi factory e scope
- Considerando la classe Libro, creata nell'esercizio numero 2 del paragrafo precedente, scrivere una classe factory che crei oggetti Libro, precludendo, nello stesso tempo, all'utente la possibilità di istanziare nuovi oggetti Libro senza usufruire della classe factory
- Definire l'utilità dell'utilizzo degli specificatori di accesso Private, Friend, Protected e Public su un costruttore, ed esemplificare un caso particolare per ognuno, in cui sia evidente il vantaggio offerto rispetto agli altri casi
Operatori
- Creare una semplice struttura Int32Array, che contenga come unica proprietà un array di Int32, quindi creare l'operatore +, che sommi due di queste strutture e ne restituisca una terza contenente come proprietà un array dato dalla concatenazione dei due array esposti dagli operandi
- Creare una struttura che rappresenti un numero complesso, e definire in essa tutte le operazioni aritmetiche e di confronto possibili
- Creare una struttura che rappresenti uno spazio vettoriale e definire in essa le operazioni unione, somma e intersezione.
- Creare una classe che rappresenti un polinomio, dunque esporre tutti gli operatori artimetici consentiti tra polinomi, concentrandosi in modo particolare sulla moltiplicazione e sulla divisione. Suggerimento.
- Creare una struttura che rappresenti un qualsiasi numero intero, ma con una peculiarità
questo numero non deve avere limitazioni di range. Infatti, i comuni tipi esposti dal framework (Int16, Int32, Int64, Decimal) posso assumere
valori che variano tra un minimo e un massimo (da -2n-1+1 a +2n-1-1, dove n è il numero di bit di memoria
occupati dal dato). Questa struttura non deve avere tali limitazioni, e deve perciò essere descritta da una stringa, che ha lunghezza
teoricamente illimitata (in realtà può arrivare fino a un massimo di oltre 2 miliardi di caratteri). Ad esempio, si potrà
assegnare un valore alla struttura così
Dim Num As New Numero("6790512639") 'oppure Num.Value = "6790512639"A questa struttura aggiungere, poi:- Tutti gli operatori aritmetici
- Tutti gli operatori di confronto numerici
- Tutti gli operatori di conversione da e verso i tipi Int16, UInt16, Int32, UInt32, Int64 e UInt64
- Tutti gli operatori di conversione da e verso i tipi Single, Double e Decimal
Programmazione ad oggetti
- Qual è l'output del seguente listato?
Module Module1 Class Base Overridable Sub Write() Console.WriteLine("Base") End Sub End Class Class Derivata Inherits Base Overrides Sub Write() Console.WriteLine("Derivata") End Sub End Class Sub Main() Dim D As New Derivata() Dim B As Base = D B.Write() End Sub End Module - Applicare l'ereditarietà per scrivere una classe derivata da Person che rappresenti un libero professionista
- Applicare il polimorfismo a questa classe per modificare la proprietà FullName ponendo come prefisso ad essa l'abbreviazione onorifica della professione (es.: "dott.", "ing.", "avv.", "on.", ...)
- Applicare l'overloading per definire, sempre in questa classe, alcune nuove versioni di ToString, ad esempio consentendo di inserire una stringa di formato, o di scegliere se visualizzare o no l'abbreviazione della professione
- Scrivere una classe derivata da ArrayList che permetta la gestione di una collezione di Person.
Questa classe espoerrà, tra le sue proprietà pubbliche, anche le seguenti:
- AverageAge : restituisce l'età media di tutte le persone nella lista
- Youngest : restituisce la Person più giovane della collezione
- Oldest : restituisce la Person più vecchia della collezione
- MostCommonName : restituisce il nome più comunemente usato per le persone nella lista
- Applicare il polimorfismo a quest'ultima classe per modificare i seguenti metodi:
- Add : in modo che consenta di aggiungere una nuova persona inserendo nome, cognome e data di nascita direttamente come parametri
- Remove : in modo che consenta di rimuovere una persona specificando solo nome e cognome tra i parametri
- Contains, IndexOf : in modo che consentano l'individuazione di una persona specificando solo nome e cognome tra i parametri
- ToString : in modo che trasformi la lista di Person in una stringa a più righe, ognuna individuante una persona
- Applicare l'overloading al caso precedente, rendendo i metodi ausiliari anziché obbligatori. Aggiungere, inoltre, due funzioni di nome Recount, sottoposte a overloading: l'una accetterà come parametro un intero, rappresentante un anno, e restituirà il numero delle persone nate in quell'anno; l'altra accetterà come parametro una stringa, e restituirà il numero delle persone il cui nome contiene quella stringa (senza far differenza tra maiuscole e minuscole).
- Scrivere delle classi che rappresentino le seguenti figure geometriche: triangolo, triangolo isoscele, triangolo equilatero, parallelogramma, rettangolo, rombo, quadrato. Legare queste classi tramite relazioni di ereditarietà, quindi definire mediante polimorfismo, in ogni classe, una funzione per calcolarne l'area. Opzionalmente, inserire in ogni classe delle proprietà distintive della figura (es.: lato, altezza, diagonale, eccetera...).
- Scrivere un sistema di lettura e scrittura dei tag ID3 v2.3, basato sulle classi, utilizzando ereditarietà e, dove occorre, polimorfismo e overloading.
Delegate
- Scrivere una funzione che esegua la stessa operazione matematica su tutti gli elementi di una array di Single, e restituisca l'array modificato. L'operazione da eseguire deve, ovviamente, essere rappresentata da un delegate
- Riptere lo stesso esercizio, ma su un array di stringhe
- Implementare il metodo dicotomico
- Creare un programma di gestione files che possa modificare, copiare, spostare e rinominare elementi in massa
Algoritmi
- In una fabbrica ci sono 5 macchine diverse deputate alla lavorazione di 5 tipi di tondini, ognuno con caratteristiche proprie. In un certo giorno di lavoro, la macchina 1 deve lavorare 10 pezzi grezzi, la 2 6 pezzi, la 3 12 pezzi, la 4 20 pezzi e la 5 4 pezzi. La macchina i-esima richiede i minuti di lavoro e si suppone che le si possa attivare simultaneamente. Dato che il proprietario non vuole spendere troppo per automatizzare i vecchi macchinari, ognuno deve essere caricato e attivato da uno o più operai. Comunque, una macchina non può passare a lavorare il pezzo successivo senza aver terminato il precedente. Sapendo che in ogni istante di tempo solo 3 delle 5 macchine possono essere in funzione, determinare quale sia l'ordine di caricamento e attivazione che permette di finire prima tutto il lavoro.
- Sono dati in un file di testo dei range di ip, nella forma:
x.x.x.x - y.y.y.y
Scrivere un programma che preso in input il percorso del file di testo, produca in output tutte le sequenze di ip tali che: tutti gli ip presenti nel file di testo siano compresi anche nelle sequenze prodotte; non esistano range di ip ripetuti; non esistano range di ip sovrapposti o adiacenti; i range siano ordinati in modo crescente. Esempio:Input: 127.0.0.1 - 128.0.0.1 210.11.23.45 - 230.0.0.0 208.0.229.1 - 228.199.22.2 58.0.0.0 - 62.0.0.0 128.0.0.2 - 129.150.140.130 Output: 58.0.0.0 - 62.0.0.0 127.0.0.1 - 129.150.140.130 208.0.229.1 - 230.0.0.0
- Sia f una funzione booleana a n ingressi e una uscita, ossia del tipo y = f(a1, a2, ..., an), dove ogni ai è a sua volta una variabile
booleana che può assumere valori 1 (true) o 0 (false). Siano dati in ingresso tutti i mintermini della funzione, ossia quegli insiemi
X = {xi : 1 < i < n, f(x1, x2, ..., xn) = 1}
Per compattezza, al posto di inserire tutti i valori come una stringa di bit (es. "1001"), se ne inserisce il valore in decimale (es. "9"). Scrivere un programma che calcoli l'espressione analitica di f ridotta in forma SoP minima.
Esempio di input:0 2 5 7 11 13 15
Esempio di output (ho chiamato i parametri della funzione a, b, c e d):!a!b!d + bd + acd
- È data in input una matrice n x n che rappresenta le connessioni tra i nodi di un grafo orientato. L'elemento aij vale k se è possibile andare dal nodo i al
nodo j, con k che indica quanto tempo si impiega a percorrere tale arco, oppure 0 se i due nodi non sono collegati. Scrivere un programma che calcoli il cammino, se esiste, che porta dal nodo 0 al nodo n-1 nel minor tempo
possibile. Possibile aggiunta: modificare il programma in modo da trovare, sempre se esiste, il cammino che porta dal nodo 0 al nodo n-1 nel minor tempo possibile e attraversando il minor numero di nodi (nodi attraversati
e tempo impiegato hanno la stessa importanza ai fini delle prestazioni calcolate).
Esempio di input:0 3 0 5 0 0 0 0 0 0 2 7 0 0 2 0 0 0 0 0 0 0 0 4 0 0 5 9 0 0 0 0 0 8 0 9 0 0 0 0 0 7 0 0 0 0 0 0 0
Esempio di output:Percorso tempo minimo: 0, 1, 3, 6 (14 secondi) Percorso tempo e passi minimi: 0, 1, 3, 6 (14 secondi e 4 nodi)
- Asdrubale è un infaticabile e puntiglioso topo di biblioteca e si è messo in testa di volersi studiare la matematica che non ha studiato al liceo per conto proprio. Per fare ciò ha
preso in prestito dalla biblioteca i seguenti libri, che deve restituire entro un tempo specificato:
Titolo Disponibilità (in giorni) Pagine Pagine studiate in 1 ora Elementi di equazioni differenziali alle derivate parziali 20 226 21 Statistica Fisheriana 30 561 33 Fondamenti di algebra lineare 18 201 19 Topologia applicata 60 379 23 Game Theory for Dummies 36 444 11
Tenendo conto che può dedicarsi allo studio solo 2 ore al giorno, determinare la sequenza di libri che deve studiare per rendere minimo il tempo di studio impiegato, e indicare se riuscirà o meno a restituire in tempo tutti i libri che ha preso in prestito. - Scrivere un programma che classifichi le immagini dell'utente in base alla tonalità di colore prevalente.
- È dato in input N, naturale positivo non nullo e composito. Fattorizzare N.
Esercizi