13.1 Esercizi Esercizio 13.1 Si consideri una versione semplificata della battaglia navale in cui le navi possono essere posizionate solo in orizzontale e ogni riga può contenere al massimo una nave. Il campo di gioco di un singolo giocatore può essere rappresentato tramite la matrice CampoGioco di dimensione 5 5 in cui ogni cella della matrice può assumere solo il valore 0 o 1. Il valore 0 rappresenta la presenza del mare e il valore 1 la presenza di un pezzo di nave. Le navi possono essere lunghe una, due, tre, quattro o cinque celle. Ad esempio la seguente istanza della matrice CampoGioco: 0 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 rappresenta un campo di gioco in cui sono presenti 4 navi: una nave lunga 4 nella prima riga, una nave lunga 1 nella terza riga, una nave lunga 2 nella quarta riga e una nave lunga 4 nella quinta riga. Si realizzi uno script MATLAB che: chiede all utente di inserire il contenuto della matrice CampoGioco; per ogni riga che contiene una nave visualizza a video il numero di riga e la lunghezza della nave presente al suo interno; visualizza a video inoltre le seguenti statistiche: il numero di navi presenti sul campo di gioco, la lunghezza della nave più corta presente sul campo di gioco, la lunghezza della nave più lunga presente sul campo di gioco, il numero di navi trovate per ogni lunghezza possibile. Per esempio, nel campo di gioco presentato sopra avremo: 1
1 La riga 1 contiene una nave lunga 4 2 La riga 3 contiene una nave lunga 1 3 La riga 4 contiene una nave lunga 2 4 La riga 5 contiene una nave lunga 4 5 Sono presenti 4 navi 6 Lunghezza nave più corta trovata: 1 7 Lunghezza nave più lunga trovata: 4 8 Numero di navi lunghe 1: 1 9 Numero di navi lunghe 2: 1 10 Numero di navi lunghe 3: 0 11 Numero di navi lunghe 4: 2 12 Numero di navi lunghe 5: 0 Esercizio 13.2 Si implementi in MATLAB una funzione combinamatrici che svolga ricevute in ingresso due matrici A e B aventi le stesse dimensioni, produce una terza matrice C. Essa viene ottenuta da A e B mettendo nelle posizioni (r, c) in cui B(r, c) è minore del minimo di A, il valore di A(r, c), altrimenti l elemento (r, c) assume il valore di B(r, c). Per minimo di A si intende il più piccolo elemento della matrice A. Si scriva la funzione combinamatrici sfruttando le caratteristiche di sintesi del linguaggio MATLAB (possibilmente evitando l utilizzo di cicli). Si scriva una funzione combinamatricisup simile alla precedente, ma con le seguenti differenze. La funzione combinamatricisup riceve in ingresso le due matrici A e B, e un function handle f. La funzione restituisce una matrice C i cui elementi nelle posizioni (r, c) in cui B(r, c) è minore di f applicato al minimo di A, C assumono il valore di A(r, c), altrimenti assumono il valore di B(r, c). Si scriva una chiamata a combinamatricisup passando come argomenti: A: la matrice identità 3 3; B: una matrice di dimensione 3 3 contenente numeri interi casuali tra 10 e 10; f: la funzione che restituisce la differenza tra seno e coseno di un numero. Esercizio 13.3 Le strade della città di Grigliopoli sono organizzate come una griglia (alcune strade attraversano la città da est a ovest e altre da nord a sud). Dati due incroci che distano X isolati lungo l asse est-ovest della città e Y isolati lungo l asse nord-sud, si vuole calcolare il numero di percorsi a distanza minima che collegano i due incroci. A.A.2016 2017 Informatica B (081369) - Politecnico di Milano Pag. 2
Implementare una funzione ricorsiva calcola in MATLAB che ricevuti X e Y in ingresso restituisce il numero di percorsi trovati in uscita. Suggerimento: Quando X = 0 o Y = 0, c è soltanto un cammino a distanza minima che collega i due incroci. Altrimenti, esiste più di un cammino minimo dal momento che è possibile sia avvicinarsi alla destinazione lungo l asse est-ovest (riducendo quindi la distanza X) oppure avvicinarsi lungo l asse nord-sud (riducendo la distanza Y ). Esercizio 13.4 In un cinema di Milano sono stati installati dei pannelli fotovoltaici; due sensori monitorano la loro produzione di energia elettrica e i consumi elettrici della sala, rilevando per ciascuno un valore ogni minuto. I valori letti vengono troncati a due cifre decimali, inseriti rispettivamente nei vettori prodotta e consumata e salvati in un file dati di MATLAB chiamato log.mat. Un esempio di valori contenuti nel file log.mat è il seguente: 1 prodotta = [180.00 195.00 200.00 226.00 200.00 205.00]; 2 consumata = [160.00 165.00 185.00 220.00 247.50 210.50]; Nei minuti durante i quali l energia consumata è minore di quella prodotta, il cinema riceverà un compenso pari a prezzoenergia al minuto; viceversa quando ilq consumo di energia è superiore o uguale all energia prodotta, il cinema dovrà pagare prezzoenergia al minuto. Scrivere in MATLAB una funzione calcolacosto che riceve in ingresso due vettori energiaprodotta ed energiaconsumata, ed un valore prezzoenergia, che indica il costo al minuto dell energia elettrica e restituisca il costo totale costototale per l energia elettrica del cinema (positivo se il cinema spende più di quanto guadagna, negativo in caso contrario) e un vettore media di due elementi contenente la media dell energia elettrica prodotta e la media di quella consumata. Ad esempio, nel caso in cui la funzione calcolacosto riceva in ingresso i valori di energia elettrica prodotti e consumati contenuti nel file log.mat dell esempio sopra riportato e un valore di prezzoenergia pari a 10, restituirà un costototale pari a 20, che indica che il cinema ha guadagnato 20 (avendo prodotto energia maggiore di quella consumata per 4 minuti e avendo prodotto meno energia di quella consumata per 2 minuti), e un vettore di due elementi [201 198]; A.A.2016 2017 Informatica B (081369) - Politecnico di Milano Pag. 3
Scrivere poi uno script che legga dal file log.mat i valori di energia elettrica prodotta e consumata contenuti nei vettori prodotta e consumata, legga da tastiera il valore della variabile prezzoenergia, crei un vettore x che indichi i minuti in cui sono state effettuate le misurazioni. Si disegni su di uno stesso grafico (con titolo del grafico e dei due assi) l andamento dell energia elettrica prodotta e di quella consumata al variare del tempo, evidenziando sul grafico stesso i minuti nei quali l energia prodotta è superiore o uguale a quella consumata con asterischi rossi sui valori dell energia prodotta (senza congiungere i punti). Infine, si stampi a video il costototale dell energia elettrica e i due valori medi di energia prodotta e consumata. Esercizio 13.5 Scrivere uno script in MATLAB che esegua le seguenti operazioni: 1. Legge da tastiera due valori positivi minori di 100 che vengono memorizzati in due variabili m e n; 2. Genera una matrice A di dimensioni m n di numeri casuali tra 5 e 10; 3. Costruisce una matrice P contenente solo le righe con indice pari della matrice A e una matrice D contenente solo le righe con indice dispari della matrice A; 4. se le matrici P e D hanno le stesse dimensioni, calcola anche la matrice somma. Esercizio 13.6 Implementare una funzione cerchio che riceve in ingresso due vettori X e Y di uguale dimensione che rappresentano le ascisse e le ordinate di un insieme di punti nel piano cartesiano, un valore rg che rappresenta il raggio di una circonferenza centrata sull origine del piano cartesiano e restituisce un vettore logico is_out, di lunghezza pari quella dei vettori in ingresso, tale che l i-esimo elemento di r è 1 se il punto definito dalle i-esime coordinate si trova all esterno della circonferenza di raggio rg e centro (0, 0), altrimenti 0. Si scriva una funzione retta che dati due parametri coefficiente angolare m e ordinata all origine q ed un numero di punti N restituisca un vettore contenente le ascisse X e le ordinate Y dei punti corrispondenti alle prime primi N ascisse intere. Ad esempio con N = 5 e per la retta y = 2x + 1 avremo come risultatox = [1 2 3 4 5] e Y = [3 5 7 9 11]. Infine, scrivere uno script che valuti per i punti la cui ascissa è pari ai primi N = 20 interi della retta y = 4x + 2 se essi sono esterni alla circonferenza di raggio 30. Dopodichè, disegnare sullo stesso grafico i punti precedentemente calcolati ed esterni alla circonferenza con punti rossi e i restanti con asterischi verdi. A.A.2016 2017 Informatica B (081369) - Politecnico di Milano Pag. 4
Esercizio 13.7 Si scriva una funzione ricorsiva pallinaric che stampa a schermo una sequenza di caratteri che rappresenta uno spostamento di una pallina da sinistra a destra dello schermo. L effetto che si vuole ottenere è il seguente: 1 o------ 2 -o----- 3 --o---- 4 ---o--- 5 ----o-- 6 -----o- 7 ------o 8 ------- La funzione pallinaric prende in ingresso il parametro n, che rappresenta il numero di caratteri in ogni riga, e pos, che indica la posizione attualmente occupata dalla pallina. Ae esempio, la visualizzazione sopra riportata è stata ottenuta dall invocazione di pallinaric(7, 1). 1. Si definisca la funzione pallinaric: si specifichi il caso base, cioè quello che determina la terminazione della ricorsione e il caso ricorsivo; 2. Si modifichi la funzione pallinaric per creare la funzione pallinaricconrit, per fare in modo che la pallina ritorni alla posizione iniziale. Ad esempio, dall invocazione di pallinaricconrit(7, 1) si dovrà quindi ottenere: 1 o------ 2 -o----- 3 --o---- 4 ---o--- 5 ----o-- 6 -----o- 7 ------o 8 ------- 9 ------o 10 -----o- 11 ----o-- 12 ---o--- 13 --o---- 14 -o----- 15 o------ A.A.2016 2017 Informatica B (081369) - Politecnico di Milano Pag. 5