Esercizi di MATLAB per il corso di Informatica B/C 2014/2015 · Corso di Informatica B/C 2015-16 1...

62
Corso di Informatica B/C 2015-16 1 Esercizi di MATLAB per il corso di Informatica B/C 2014/2015 èChapter 1 Introduzione ........................................................................................................................... 1-2 Chapter 2 Funzioni .................................................................................................................................. 2-20 Chapter 3 Ricorsione ............................................................................................................................... 3-42 Chapter 4 Accesso ai file ......................................................................................................................... 4-62 Chapter 5 Diagrammi .............................................................................................................................. 5-63

Transcript of Esercizi di MATLAB per il corso di Informatica B/C 2014/2015 · Corso di Informatica B/C 2015-16 1...

CorsodiInformaticaB/C2015-16 1

EsercizidiMATLABperilcorsodiInformaticaB/C

2014/2015

èChapter1Introduzione...........................................................................................................................1-2

Chapter2Funzioni..................................................................................................................................2-20

Chapter3Ricorsione...............................................................................................................................3-42

Chapter4Accessoaifile.........................................................................................................................4-62

Chapter5Diagrammi..............................................................................................................................5-63

CorsodiInformaticaB/C2015-16 2

Chapter1 Introduzione

1. ScrivereunprogrammachedataunamatriceaNxNcreaunanuovamatricebruotatadi90gradiinsensoantiorariorispettoada.SiconsideriN=4elamatriceainizializzataconivalori

[1234;2345;6789;0000]

Soluzione-script

N=4; a = [1 2 3 4; 2 3 4 5; 6 7 8 9; 0 0 0 0]; for x=1:N for y=1:N b(N+1-y,x)=a(x,y); end end %stampo la matrice originale a %stampo la matrice ruotata b

Soluzione-script

N=4; a=[1 2 3 4; 2 3 4 5; 6 7 8 9; 0 0 0 0]; %utilizzo la funzione di MATLAB rot90 a b=rot90(a)

CorsodiInformaticaB/C2015-16 3

2. SirealizziunoscriptinMatlabcherichiedal’inserimentodeitrecoefficientidiun’equazionedisecondogrado:

estampiilvaloredelleradicireali.

Suggerimento

Leradicidiun’equazionedisecondogradopossonoesserecalcolatemediantelaseguenteformula:

Soluzione-script

% Per risolvere l'esercizio bisogna calcolare il discriminante %dell'equazione con la formula b^2-4*a*c Se è positive abbiamo due %radici distinte, %Se è nullo le radici sono reali e coincidenti, %Se è negative le radici non sono reali. a = input('Inserire a: '); b = input('Inserire b: '); c = input('Inserire c: '); delta = b^2-4*a*c; if delta < 0 disp('L''equazione non ha soluzioni reali'); elseif delta==0 disp(['x=' num2str(-b/(2*a))]); else disp(['x1=' num2str((-b-sqrt(delta))/(2*a)) ' x2=' ... num2str((-b+sqrt(delta))/(2*a))]); end

ax

2 + bx+ c = 0

r =�b±

pb2 � 4ac

2

CorsodiInformaticaB/C2015-16 4

3. Realizzareunoscriptche,dataunamatricequadrata,

a. neestraggaladiagonaleprincipale. b. neestraggaladiagonalesecondaria.

c. eliminiladiagonaleprincipaleelasecondaria

Soluzione

a)

-primomodousarelamatricelogicacontruesulladiagonaleprincipale;possiamocostruireunamatricelogica B = logical(eye(N)) dove N è la dimensione della matrice di cui vogliamo estrarre ladiagonale

A(logical(eye(N))) -secondomodoutilizzandolafunzionediag:)

diag(A)

b)

-primometodo,utilizzandologicalerot90

A(logical(rot90(eye(N))))

-secondometodo,utilizzandodiagerot90

diag(rot90(A))

c)

-primometodo,usandologicaleeye

A(logical(eye(N))) = 0 % elimino la diagonale principale A(logical(rot90(eye(N)))) = 0 % elimino la diagonale secondaria

-secondometodousandodiag

A-diag(diag(A))%eliminoladiagonaleprincipaleA-fliplr(diag(diag(rot90(A))))%eliminoladiagonalesecondaria

CorsodiInformaticaB/C2015-16 5

4. Scrivere uno script che chieda un anno all’utente e stampi a video se l’anno è bisestile. Ilprogrammadeve continuarea chiedereall’utenteanni, finchégli anni inseriti sonobisestili.Stampareavideoilnumerototalediannibisestiliinseriti.

Soluzione

bisestili.m-script

clear clc bisestile = 1; counter = 0; while(bisestile)

n = input(['inserire anno ']); div_4 = (mod(n , 4) == 0); div_100 = (mod(n , 100) == 0); div_400 = (mod(n , 400) == 0); bisestile = ((div_4) && ~(div_100)) || (div_400); stringa_output = num2str(n); if(bisestile == 0)

stringa_output = [stringa_output , ' NON e'' ']; else

stringa_output = [stringa_output ,' e'' ']; counter = counter + 1;

end stringa_output = [stringa_output , 'bisestile']; disp(stringa_output);

end disp(['game over hai inserito esattamente ' , num2str(counter) , ' bisestili'])

CorsodiInformaticaB/C2015-16 6

5. Scrivereunoscriptcheanalizziivotidelprimocompitinodeglianniprecedenti,stampandoaschermo:

• mediadeivoti• lamediadeivotisufficienti• lavarianzadeivotisufficienti• ilnumerodipromossialprimocompitino

% A.A. 2012--2013 voti = [2 8 4 8.1 9.25 11.25 4.75 17 6.25 13 10 2 3.25 3.75... 8.5 16 8 1 2.5 12 10.75 6 12 10 11.75 3.5 10.5 8.5 14.25... 16.5 10.75 8 12 1 10 13 6.75 5.75 9.5 12.75 11 8.5 10.25... 14.5 4.25 5.5 9.75 16.5 13 15 13 13.75 13.5];

Soluzione

media.m-script

clearclc% A.A. 2012--2013voti=[2 8 4 8.1 9.25 11.25 4.75 17 6.25 13 10 2 3.25 3.75 8.5 16 8 1 2.5 12 10.75 6 12 10 11.75 3.5 10.5 8.5 14.25 16.5 10.75 8 12 1 10 13 6.75 5.75 9.5 12.75 11 8.5 10.25 14.5 4.25 5.5 9.75 16.5 13 15 13 13.75 13.5]; % calcolo media: soluzione "alla C" count = 0; tot =0; for ii = voti

tot=tot + ii; count = count + 1;

endmedia = tot/count;% oppure% soluzione alla MATLABmedia = mean(voti);disp(['media: ' , num2str(media)]);% calcolo media sufficienti: soluzione "alla C" count = 0; tot = 0; for ii = voti(voti >= 8)

tot=tot + ii; count = count + 1;

endmedia_suff = tot/count;

CorsodiInformaticaB/C2015-16 7

% oppure % soluzione alla MATLAB media_suff = mean(voti(voti >= 8)) disp(['media dei sufficienti: ' , num2str(media_suff)]); % calcolo della varianza dei voti sufficienti "alla C" count = 0; tot = 0; for ii = voti(voti >= 8)

tot = tot + (ii - media_suff).^2; count = count + 1;

end var_suff = tot/count; % oppure soluzione alla MATLAB var_suff = var(voti(voti >= 8)) disp(['varianza dei sufficienti: ' , num2str(var_suff)]); % numero di voti sufficienti: soluzione "alla C" n_suff = 0; for ii = (voti >= 18)

n_suff = n_suff + ii ; end % oppure % numero di voti sufficienti: soluzione "alla MATLAB" n_suff = sum(voti >= 18); disp(['numero di voti sufficienti: ' , num2str(n_suff)]);

6. Scrivereunoscript che leggauna frase in ingressoe la converta inalfabeto farfallino.Nota:nell’alfabeto farfallino ogni vocale viene sostituita dalla stringa 'vocale+f+vocale', cioè: 'a' ='afa','e'='efe','i'='ifi','o'='ofo','u'='ufu'

Soluzione

farfallino.m-script

clear clc frase = input(['inserire una stringa '] , 's'); far = [];for c = frase

far=[far,c]; if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')

far = [far ,'f' ,c]; end

end disp([frase , ' in alfabeto far diventa ' , far])

CorsodiInformaticaB/C2015-16 8

7. Scrivere un programma (script) che calcoli la sequenza di Fibonacci di lunghezza 20, poirichieda di inserire un numero 2 < n < 4180 e valuti se il numero è di Fibonacci. AltrimentirestituisceilnumerodiFibonaccipiùvicino.LasuccessionediFibonaccièdefinitacosì:

F(0)=0F(1)=1F(n)=F(n−1)+F(n−2),n>1

Cioèècompostadainumeri:0112358132134...

Soluzione

fibonacci.m-script

clear; clc;fibo = zeros(1,20); fibo(1) = 0; fibo(2) = 1; for i = 3:20

fibo(i) = fibo(i-1) + fibo(i-2); end fibo a = input('Inserire un numero: '); if sum(a == fibo) > 0

disp([num2str(a) 'e'' un numero di Fibonacci']); else

inferiori = fibo(fibo < a); inferiori = inferiori(end); superiori = fibo(fibo > a); superiori = superiori(1); if superiori - a < a - inferiori

vicino = superiori; else

vicino = inferiori;end disp(['Il numero didi Fibonacci piu'' vicino a ' num2str(a) ' e'' ' num2str(vicino)]);

end

CorsodiInformaticaB/C2015-16 9

8. Realizzareunoscriptchechiedaall’utentedueparoleestampiavideoseunaèanagrammadell’altra.

Soluzione

anagramma.m-script

clear clc parola1 = input('Inserire la prima parola: ','s'); parola2 = input('Inserire la seconda parola: ','s'); isto1 = zeros(1,256); isto2 = zeros(1,256); for ii = parola1

isto1(ii+1) = isto1(ii+1) + 1; end for ii = parola2

isto2(ii+1) = isto2(ii+1) + 1; end if sum(isto1 == isto2) == 256

disp('Le due parole sono una l''anagramma dell''altra'); else

disp('Le due parole non sono anagamma una dell''altra'); end

9. Utilizzandoilfattocheilquadratodinèugualeallasommadeipriminnumeridispari,creareunoscriptchecalcoliilquadratodiunnumeroinseritodautente(n<100).

Soluzione-script

clc clear N = input('Inserire il numero da elevare al quadrato (< 100): ' ); numeri = 2 * [0 : N - 1] + 1; c = 1; somma = 0; while c <= N

somma = somma + numeri(c); c = c + 1;

end fprintf('%d^2 = %d\n', N, somma);

CorsodiInformaticaB/C2015-16 10

10. RealizzareunoscriptMatlabper:

a. Creare una matrice M di dimensioni 7 × 5 contenente 0, 1, 2, che rappresenti unmomentodiunapartitadiforza4incorso.

b. Chiedere ai due giocatori, finchè uno di questi non inserisce la lettera ’q’ (quit), diinserirelacolonna(tra1e7)doveintendeinserirelapropriapedina.

c. InserirelapedinanellacolonnacorrettaevisualizzarelamatriceMcosìottenuta.

Soluzione

forza4.m-script

clear clc M = [ 0 0 0 0 0 0 0 ;...

0 0 0 0 0 0 0 ;... 0 0 0 0 0 0 0 ;... 0 0 0 0 0 0 0 ;... 0 0 0 0 0 0 0 ];

turno = 1; a = 6; while (a ~= 'q')

disp(['E'' il turno del giocatore ' num2str(turno)]); a = input('Inserire una giocata (numero di colonna 1-7) o uscire (q): '); if a~='q'

if (M(1,a) ~= 0) disp('Giocata illegale');

else indici = M(:,a) == 0; pos_libera = sum(indici); M(pos_libera,a) = turno; imagesc(M); if turno == 1

turno = 2; else

turno = 1; end

end end

end

CorsodiInformaticaB/C2015-16 11

11. Verificare se una matrice quadrata di dimensione arbitraria è un quadrato magico. Unquadrato è magico se la somma degli elementi sulle righe, sulle colonne e sulla diagonaleprincipaleèlastessa.

Soluzione

clearclcM = magic(4);%M = randi(4,3); [r c] = size(M); assert(r == c); %assert controlla se una condizione è vera. Altrimenti genera un errore somme = zeros(1,2 * r + 1); for ii = 1:r

somme(ii) = sum(M(ii,:)); end for ii = (r+1):2*r

somme(ii) = sum(M(:,ii-r));end somme(2*r+1) = sum(diag(M)); somme if sum(somme == somme(1)) == 2*r+1

disp('La matrice e'' un quadrato magico'); else

disp('La matrice non e'' un quadrato magico'); end

CorsodiInformaticaB/C2015-16 12

12. Data unamatrice 20 × 20 che rappresenta le partite di un campionato di calcio (con 0 pervittoriaincasa,1perpareggio2pervittoriaintrasfertacomerisultatipossibili).Calcolarelaclassificafinaleordinata.

Soluzione

clear clc squadre = { 'Atalanta' 'Cagliari' 'Cesena' 'Chievo' 'Empoli' ' Fiorentina' 'Genoa'... 'Verona' 'Inter' 'Juventus' 'Lazio' 'Milan' 'Napoli' ' Palermo' 'Parma' 'Roma'... 'Sampdoria' 'Sassuolo' 'Torino' 'Udinese' }; squadre_alt = squadre; risultati = randi(3,20)-1; for ii = 1:20

risultati(ii,ii) = -1; end % Versione facile punti = zeros(20,1); for ii = 1:20

punti(ii) = sum(risultati(ii,:) == 0) * 3 + sum(risultati( ii,:) == 1) + ... sum(risultati(:,ii) == 2) * 3 + sum(risultati(:,ii) == 1);

end %Versione difficile punti_alt = sum(risultati == 0,2) * 3 + sum(risultati == 1,2)+… sum(risultati' == 2,2) * 3 +sum(risultati' == 1,2); %assert controlla se una condizione è vera. Altrimenti genera un errore assert(sum(punti == punti_alt) == 20) %forii=1:20 % disp(['La squadra ' squadre{ii} ' ha totalizzato ' num2str(punti(ii)) ' punti.']); % end %Ordiniamole while (~isempty(punti))

maxi = max(punti); trovato = 0; counter = 1; while trovato == 0

if punti(counter) == maxi disp(['La squadra ' squadre{counter} ' ha totalizzato ' num2str(punti(counter)) ' punti.' ]); punti(counter) = []; squadre(counter) = []; trovato = 1;

else

counter = counter + 1; end

CorsodiInformaticaB/C2015-16 13

end end disp('-----------------------------------'); %Oppure chiediamo a MATLAB [punti_alt indici] = sort(punti_alt,'descend'); squadre_alt = squadre_alt(indici); for ii = 1:20

disp(['La squadra ' squadre_alt{ii} ' ha totalizzato ' num2str(punti_alt(ii)) ' punti.']);

end

13. Dataunamatricequadrata,leggerlaaspiraleemetterneilcontenutoinunvettore.

La lettura a spirale avviene andando a leggere la prima riga, poi l’ultima colonna, quindil’ultima riga ed infine la prima colonna. L’operazione si ripete per le colonne e righeprogressivamentepiùinterne.

Soluzione

clear clc %creo una matrice d’interi i cui valori sono generati randomicamente M = randi(10,7); M_old = M; riga = 1; colonna = 0; inizio = 1; fine = 0; vec = []; while(~isempty(M)) vec = [vec M(1,:)]; M(1,:) = []; if (~isempty(M)) vec = [vec M(:,end)']; M(:,end) = []; end if (~isempty(M)) vec = [vec M(end,end:-1:1)]; M(end,:) = []; end if (~isempty(M)) vec = [vec M(end:-1:1,1)']; M(:,1) = [];

CorsodiInformaticaB/C2015-16 14

end end %genero un errore se qualcosa non e’ andata bene assert(sum(vec) == sum(M_old(:)));

14. (TdE) Dopo una gara automobilistica si ha come risultato tre tabelle le cui colonnerappresentanoglinpartecipanti(numeratida1an)e lerigheglimgiridipistaeffettuati. Ilvalorediognigenericacella(i,j)delletabellerappresentailtempoimpiegatodalpartecipantejperpercorrereilgiroi.

Siscrivanoleistruzioniper:

• calcolare il tempototalemediocheèstato impiegatodaipartecipantipercompletare lagara;

• determinare il vincitore della gara (cioè il numero del partecipante il cui tempo dipercorrenzatotaleèminorediquellodeglialtripartecipanti);

• tracciare un grafico in cui l’asse delle x rappresenta i giri compiuti dal vincitore e l’assedelleyiltemponecessarioperpercorrereigiri.

Soluzione-script

clear clc n_piloti = 10; n_giri = 30; minuti = randi(2,n_piloti,n_giri); secondi = 60 * rand(n_piloti,n_giri); millesimi = 1000 * rand(n_piloti,n_giri); tempo_medio = mean(minuti * 60 + secondi + millesimi / 1000,2); tempo_vinc = min(tempo_medio); vinc = find(tempo_medio == tempo_vinc); disp(['Il vincitore e '' ' num2str(vinc)]); figure(); plot(1:n_piloti,tempo_medio); title('Tempo medio piloti'); xlabel('Numero pilota'); ylabel('Tempo medio');

15. (TdE)SiscrivaunoscriptinMatlabchesvolgaleseguentioperazioni:

CorsodiInformaticaB/C2015-16 15

• DefinisceunamatricequadratadiinterididimensioneN*N,conNparia5.• Acquisisce da tastiera una sequenza di valori interi che memorizza nella porzione

triangolare superiore della matrice. La parte triangolare superiore della matrice ècostituitadallecellepostesulladiagonaleprincipaleealdisopraditalediagonale.

• Copia in un array di dimensioni opportune tutti I valori della porzione triangolare dimatricechesonomaggioridi-10.

• Stampailcontenutodell’array.

Soluzione

N=5; for x=1:N for y=x:N M(x,y)=input(sprintf('M(%d,%d)= ',x,y)); end end %visualizza M M l=1; for x=1:N for y=x:N if(M(x,y)>-10) a(l)=M(x,y); l=l+1; end end end % oppure a = M(M>-10)' %visualizza a %così a %oppure utilizzando disp disp(a)

16. Scrivere uno script che acquisisce un numero e verifica se è primo omeno stampando unappositomessaggioavideo.

Soluzione

n = input('valore: '); d = 2:n/2; mod(n,d) if all(mod(n,d)) %alternativa: ~any(mod(n,d)==0) disp([num2str(n) ' è primo']); else disp([num2str(n) ' non è primo']); end

CorsodiInformaticaB/C2015-16 16

CorsodiInformaticaB/C2015-16 17

17. Si vuole realizzare uno script per analizzare i voti conseguiti da una serie di studenti in unesame, partendo dai punteggi conseguiti in ciascun esercizio. I dati di partenza sonomemorizzati in un file, il cui va chiesto il nome all'utente, e sono organizzati nel seguentemodo:laprimarigadelfilecontieneipuntimassimiperciascunodegliesercizidell'esameelesuccessiverigheipunteggiconseguitidaciascunodeglistudentichehapartecipatoall'esame.Unesempiodifileè:556428122222554428555325555121

dovel'esameeracompostoda6eserciziedèstatosostenutoda4studenti(glistudentisonoidentificaticonunindiceprogressivo,es:1,2,3,4).Loscriptdeveeseguireleseguentielaborazioni:• leggereidatiesalvarliinduematrici(unaperipuntimassimiedunaperipunteggidegli

studenti)• verificarecheipunteggisianoconsistenti:unpunteggiodiuneserciziononèconsistente

senon compreso tra 0 ed il punteggiomassimo conseguibile (per esempioper il primoeserciziodell'esempiosoprailpunteggiodeveesserecompresotra0e5,estremiinclusi).Unesempiodifileinconsistenteèilseguente:

556428722222554428555325

SEèstataidentificataalmenoun'inconsistenzariportare:• ilnumerodistudenticonalmenounpunteggioinconsistente• i dati degli studenti che presentano un'inconsistenza (in particolare visualizzare l'indice

dellostudenteedisuoipunteggi)ALTRIMENTIeseguireleseguentielaborazioni:• calcolareivoti• contareilnumerodistudentipromossi• calcolareivotimassimoeminimoconseguitidaglistudentipromossi• contare il numero di voti scarsi (cioè compresi nell'intervallo [18;21]), di voti mediocri

(votinell'intervallo[22;25])edivotibuoni(votinell'intervallo[26;30])• cercare e visualizzare gli indici gli studenti che hanno almeno un esercizio insufficiente

(sufficienzaal50%delpunteggiomassimo)• individuarequaleesercizio (o insiemediesercizi)èandato inmediapeggio (perciascun

eserciziobisognacalcolareilrapportotrailpunteggiomedioconseguitodaglistudentiedilpunteggiomassimo)

CorsodiInformaticaB/C2015-16 18

Soluzione

%caricare punteggi da un file di testo %(prima riga punteggi massimi poi punteggi di ciascuno studente %salvare in due strutture punteggi massimi da punteggi studenti nomefile=input('inserire nome file: ','s'); dati=load(nomefile); punti=dati(1,:); punteggi=dati(2:end,:); [nstudenti nesercizi]=size(punteggi); %controllare se ci sono voti inconsistenti %contare inconsistenze e stampare il seguente report: %numero inconsistenze e lista studenti con dati inconsistenti ninconsistenti=0; inconsistenti=[]; for ii=1:nstudenti if any(punti<punteggi(ii,:) | punteggi(ii,:)<0) ninconsistenti=ninconsistenti+1; inconsistenti(ninconsistenti)=ii; end end disp(['inconsistenti: ' num2str(ninconsistenti)]); if ninconsistenti>0 disp('max punti: '); disp(num2str(punti)); disp('report inconsistenti: '); for ii=1:length(inconsistenti) disp([num2str(inconsistenti(ii)) ': ' num2str(punteggi(ii,:))]); end else %se ok calcolare voti. contare max, min (non bocciato), numero bocciati %e fare statistiche sui presenti... voti=sum(punteggi'); votomax=max(voti); nbocciati=sum(voti<18); votomin=min(voti(voti>=18)); numscarsi=sum(voti>=18 & voti<22); nummedi=sum(voti>=22 & voti<26); numbuoni=sum(voti>=26); disp(['bocciati : ' num2str(nbocciati)]); disp(['max voto : ' num2str(votomax)]); disp(['min voto : ' num2str(votomin)]); disp(['scarsi: ' num2str(numscarsi) ', discreti: ' num2str(nummedi) ', buoni:' num2str(numbuoni) ]); %cercare gli studenti che hanno almeno un esercizio insufficiente %insufficienza: (punteggio<punteggio_massimo/2) nStudEsInsuf=0;

CorsodiInformaticaB/C2015-16 19

studEsInsuf=[]; for ii=1:nstudenti if any(punteggi(ii,:)<punti./2) nStudEsInsuf=nStudEsInsuf+1; studEsInsuf(nStudEsInsuf)=ii; end end disp(['studenti con almeno un es insuff: ' num2str(studEsInsuf)]); %vedere quale esercizio è andato in media peggio mediaPunteggi=sum(punteggi)./nstudenti; disp(['max punteggi: ' num2str(punti)]); disp(['media punteggi: ' num2str(mediaPunteggi)]); percPunteggi=mediaPunteggi./punti; percPeggio=min(percPunteggi); numeroEsercizio=1:nesercizi; numEsPeggio=numeroEsercizio(percPunteggi==percPeggio); disp(['esercizio peggiore: ' num2str(numEsPeggio)]); %in alternativa: %disp(['esercizio peggiore: ' num2str(find(percPunteggi==percPeggio))]); end

CorsodiInformaticaB/C2015-16 20

Chapter2 Funzioni

1. Realizzare uno script MATLAB che richieda all’utente l’inserimento due parole e stampi avideoseunaèanagrammadell’altra.

Soluzione

anagramma.m-script

% Anagramma: versione con funzioni. % leggere 2 parole da tastiera % [parola1, parola2] = leggi_parole(); % costruire gli istogrammi secondo l'alfabeto ASCII esteso (256 simboli) % h1 = calcola_istogramma(parola1); h2 = calcola_istogramma(parola2); % visualizzare gli istogrammi come grafici a barre % figure, bar(h1) figure, bar(h2) % calcolare se si tratta di anagrammi % anagrammi = sono_anagrammi(h1, h2); if (anagrammi) fprintf('Le due parole sono anagrammi\n'); else fprintf('Le due parole NON sono anagrammi\n'); end

leggi_parole.m-funzione

function [p1, p2] = leggi_parole() p1 = input('Inserici una parola o frase: ', 's'); p2 = input('Inserici una parola o frase: ', 's');

CorsodiInformaticaB/C2015-16 21

calcola_istogramma.m-funzione

function [h] = calcola_istogramma(parola) h = zeros(1, 256); for c = parola h(c+1) = h(c+1) + 1; end

sono_anagrammi.m-funzione

function [an] = sono_anagrammi(h1, h2) % assumo che gli istogrammi abbiano la stessa dimensione % soluzione alla C an = 1; %vero ii = 1; while an && ii < length(h1) an = h1(ii) == h2(ii); ii = ii + 1; end % soluzione alla MATLAB an = all(h1 == h2); % an = ~any(h1 ~= h2);

CorsodiInformaticaB/C2015-16 22

2. (TdE)Scrivereunprogrammache:1. acquisisca un numero da tastiera e continui a richiedere l'inserimento finché il numero

inseritocontinuianonessereinteropositivo2. verificareseilnumerointeropositivoacquisitoèperfetto,abbondanteodifettivo:

• Perfetto:numeroicuidivisoripositivi(esclusoilnumerostesso),sommanoalnumerostesso.

• Abbondante:numeroicuidivisoripositivi(esclusoilnumerostesso),sommanoadunnumeromaggioredelnumerostesso.

• Difettivo:senonèperfettoenonèabbondante.3. se il numero non è perfetto, controllare se è abbondante o difettivo e stampare un

messaggioavideochelodica.4. inoltre,nelcaso3.,richiedereancheunaltronumerointeropositivob,econtrollareseae

bsonoamici:• Amici: due numeri sono amici quando la somma dei divisori del primo (escluso il

numerostesso)coincidealsecondonumero;eviceversa.5. Scrivereunprogrammacheelenchiiprimiknumeriabbondanti,conkdefinitodall'utente.

Soluzione

divisori.m-script

clc clear % inserimento di un numero positivo % a = leggi_intero_positivo(); % a questo punto il numero inserito e` senz'altro positivo % calcolo se il numero e` perfetto, abbondante o difettivo [perfetto, abbondante] = numero_perfetto(a); % se perfetto, allora stampo che e` perfetto e concludo if (perfetto == 1) disp([num2str(a), ' e` perfetto']); else % altrimenti % controllo se e` abbondante o difettivo % if (abbondante == 1) disp([num2str(a), ' e` abbondante']); else disp([num2str(a), ' e` difettivo']); end % acquisisco un altro numero, riusando la funzione b = leggi_intero_positivo(); % a e b sono amici? amici = sono_amici(a, b); if (amici == 1)

CorsodiInformaticaB/C2015-16 23

disp([num2str(a), ' e ', num2str(b), ' sono amici']); else disp([num2str(a), ' e ', num2str(b), ' NON sono amici']); end end

leggi_intero_positivo.m-funzione

function [n] = leggi_intero_positivo() n = 0; while n <= 0 n = input('Inserisci un numero intero positivo: '); end

numero_perfetto.m-funzione

function [perfetto, abbondante] = numero_perfetto(n) % calcolo la somma dei divisori (escluso il numero stesso) somma = somma_divisori(n); % calcolo se la somma dei divisori coincide col numero stesso perfetto = (n == somma); % calcolo se il numero e` maggiore della somma dei suoi divisori (abbondante) abbondante = n > somma; % alla fine dell'esecuzione di questa funzione, le variabili 'perfetto' e 'abbondante' saranno disponibili al programma chiamante.

somma_divisori.m-funzione

function somma = somma_divisori(n) % soluzione alla C, non raccomandata somma = 0; for d = 1:n/2 if (~mod(n, d)) % mod(n, d) == 0 somma = somma + d; end end % soluzione alla MATLAB %

CorsodiInformaticaB/C2015-16 24

divisori = 1:n/2; resti = mod(n, divisori); divisori_interi = divisori(resti == 0); somma = sum(divisori); % soluzione compatta % somma = sum(divisori(mod(n, divisori) == 0));

sono_amici-funzione

function amici = sono_amici(a, b) amici = (somma_divisori(a) == b) && (somma_divisori(b) == a); % end funzione sono_amici

elenca_k_abbondanti-script

clear; clc; % inserimento di un numero positivo attraverso la chiamata della funzione % k = leggi_intero_positivo(); for i = 1:k [perfetto, abbondante] = numero_perfetto(i); if (abbondante) disp([ num2str(i), ' e'' abbondante']) end end

CorsodiInformaticaB/C2015-16 25

3. (TdE)Scrivereunafunzioneche,ricevendoiningressounamatriceMdinumeri,restituisceinuscitaunamatriceMR,ottenutadaMnelseguentemodo:• sicalcolalamediaaritmeticadeivaloridiM• perivaloricheinMsonominoridellamedia,inMRsiponenellaposizionecorrispondente

ilvalore-1,• perquellisuperioriallamediasiponeilvalore1,• perglialtri(quelliugualiallamedia)siponelostessovaloreinM.

Soluzione

transformMatrix.m-funzione

function [MR] = transformMatrix(M) media = mean(mean(M)); MR = M; MR(MR < media) = -1; MR(MR > media) = 1; % fine funzione transformMatrix % soluzione alla C [R, C] = size(M); media = 0; % somma di tutti gli elementi for r = 1:R for c = 1:C media = media + M(r,c); end end % calcolo media media = media / (R * C); % generazione MR elemento per elemento for r = 1:R for c = 1:C if M(r,c) < media MR(r,c) = -1; else if M(r,c) > media MR(r,c) = 1; else MR(r,c) = M(r,c); end end end end

CorsodiInformaticaB/C2015-16 26

4. (TdE) Scrivere un programma per la gestione di un magazzino dove ogni prodotto nelmagazzinoèunivocamenteidentificatodaunbarcode(unnumerointero)edaunatipologia(uncarattere).Ilsoftwaredigestioneassociaadogniprodottoduenumeri, ilprimocheindicailnumerodipezziinstockilsecondocheindicailnumerodipezziordinati.Si ipotizzi che barcode, tipo, stock, ordine siano 4 vettori, già popolati, contenenti tutte leinformazioninecessarieperlagestionedelmagazzino.(l'i-simoelementodistockediordinerappresentano lequantitàrelativealprodottoacuièassociatol'i-simoelementodibarcode).Adesempio:barcodes=[123;1312;12312;1231;99123];tipo=['A';'A';'X';'W';'W'];stock =[0;300;5;6;0];ordine =[23;100;2;100;0];Siscriva:

a. la funzione “ricerca” che prende in ingresso un barcode e restituisce unmessaggiocontenente il tipo di prodotto, il numero di pezzi in stock ed in ordine. In caso dimultipleoccorrenze,sceglierelaprima.

b. unesempiodichiamataallafunzione"ricerca".c. la funzione “ricercaMancanti” che, a seconda di un parametro P, restituisca al

programmachiamanteunvettorecontenenteIcodiciabarredeiprodotti:• (seP=0)nonpresentiinstockmainordine,• (seP=1)nonpresentiinstockchenonsononemmenoinordine,• (seP=2)percuicisonopiùpezziinordinecheattualmenteinstock.

d. ScrivereunesempiodichiamataallafunzionericercaMancanti.e. Siscrivalafunzione“aggiungiProdotto”,chepermettediaggiungerealmagazzinoun

nuovoprodotto(barcode+stock+ordine).f. ScrivereunesempiodichiamataallafunzioneaggiungiProdotto.

Soluzione

ricerca.m–funzione

% definizione funzioni function [msg] = ricerca (b, t, s, o, bc) bc_indici = find(b == bc); b = b(bc_indici(1)); t = t(bc_indici(1)); s = s(bc_indici(1)); o = o(bc_indici(1));

CorsodiInformaticaB/C2015-16 27

msg = ['il prodotto corrispondente al codice a barre ', num2str(bc), ' e` di tipo ',num2str(t), ' elementi in stock: ', num2str(s),' in ordine: ', num2str(o) ]; end

ricercaMancanti.m-funzione

function [prodotti] = ricercaMancanti(b, t, s, o, P) switch P case 0 bc_indici = find(s == 0 && o > 0); case 1 bc_indici = find(s == 0 && o == 0); case 2 bc_indici = find(o > s); end prodotti = b(bc_indici) end

aggiungiProdotto.m-funzione

function [b, t, s, o] = aggiungiProdotto(b, t, s, o, n_b, n_t ,n_s, n_o) b = [b; n_b]; t = [t; n_t]; s = [s; n_s]; o = [o; n_o]; end

Esempid’usodellefunzioni

% main barcodes = [123 ; 1312 ; 12312 ; 1231 ; 99123]; tipo = ['A' ; 'A' ; 'X' ; 'W' ; 'W' ]; stock = [0 ; 300 ; 5 ; 6 ; 0 ]; ordine = [23 ; 100 ; 2 ; 100 ; 0 ]; ricerca(barcodes, tipo, stock, ordine, 12312) ricercaMancanti(barcodes, tipo, stock, ordine, 0) ricercaMancanti(barcodes, tipo, stock, ordine, 1) ricercaMancanti(barcodes, tipo, stock, ordine, 2) [barcodes, tipo, stock, ordine] = aggiungiProdotto(barcodes, tipo, stop, ordine, 999, 'F', 3, 24)

CorsodiInformaticaB/C2015-16 28

5. Si scrivauna funzioneche leggaunaparolae restituisca1 se taleparolaèpalindroma, zeroaltrimenti.Fornireunesempiodichiamatadellafunzione.

Soluzione

palindroma.m-funzione

function [pal] = palindroma(par) % soluzione "alla C" len = size(par, 2); pal = 1; ii = 1; while((ii <= len / 2 ) && pal) if(par(ii) ~= par(end - ii + 1)) pal = 0; end ii = ii + 1; end % soluzione "alla MATLAB" parAlContrario = par(end : -1 : 1); corrispondenze = (par == parAlContrario); if(sum(corrispondenze == size(par, 2))) pal = 1; else pal = 0; end % alternativa super-compatta pal = sum(par == par(end : -1 : 1))== size(par, 2);

Esempiodichiamatadellafunzione–script

% acquisisco la parola% parola = input('inserire parola ' , 's'); % chiamo la funzione % pal = palindroma(parola); str = [parola]; if (pal) str = [str , ' è ']; else str = [str , ' NON è ']; end disp([str , ' palindroma']);

CorsodiInformaticaB/C2015-16 29

6. (TdE)Unamatricecontienenumeri interi.Sivuoleprogettareunafunzioneche,ricevendolamatrice e un array di numeri interi che rappresenta una sequenza, cerchi tale sequenzaall'interno della matrice. La sequenza cercata può essere disposta, nella matrice,verticalmentedall'altoversoilbassoodorizzontalmente,dasinistraversodestra.Lafunzionedeveaverelaseguenteintestazione:

function[riga,col,dir]=cerca_sequenza(matrice,seq)

se la sequenza è presente nella matrice allora `riga` e `col` indicano gli indici di riga e dicolonna del suo primo elemento, mentre `dir` viene posto uguale al carattere 'v' se lasequenzaèdispostaverticalmente,'o'seorizzontalmente(selasequenzaèpresenteripetutainpiùposizioni,ivalorirestituitipossonoesserequellirelativiaunaqualsiasidelleripetizioni);selasequenzanonèpresente,`riga`e`col`valgonoentrambi0edirvale'n'.

Percodificarelafunzioneinquestione,sisviluppiprimalaseguentefunzioneausiliaria

function[pres]=verifica_orizzontale_da_posizione(matrice,seq,riga,col)

chericerca lasequenzanellamatriceapartiredaunaposizioned’inizioprecisa, indirezioneorizzontale:rigaecolsonoilpuntodiinizio;ilrisultato[pres]vale1selasequenzaèpresente,0altrimenti.

Successivamentesiutilizzitalefunzionepercodificarelaseguente:

function[riga,col]=cerca_inizio_orizzontale(matrice,seq)

mentrelaversioneverticalepuòesserefacilmentederivatadallaprecedente

function[riga,col]=cerca_inizio_verticale(matrice,seq)

Questefunzionicercanolasequenzaintuttalamatricecondisposizioneorizzontaleeverticale,restituendo in riga e col le coordinate del punto d’inizio, se la sequenza viene trovata, o ilvalore0altrimenti.

Soluzione

verifica_orizzontale_da_posizione.m-funzione

function [pres] = verifica_orizzontale_da_posizione(matrice, seq, riga, col) len = length(seq); % calcolo la lunghezza della sequenza % estraggo una porzione di matrice a partire da riga,colonna fino a % riga,colonna+len-1 porzione = matrice(riga, col:col+len-1); % se la porzione coincide con la sequenza, la sequenza e` trovata pres = all(porzione == seq);

CorsodiInformaticaB/C2015-16 30

cerca_inizio_orizzontale.m-funzione

function [riga, col] = cerca_inizio_orizzontale(matrice, seq) [R, C] = size(matrice); len = length(seq); for r = 1:R % per ogni riga for c = 1:C-len+1 % per ogni colonna (tenendo conto della

% lunghezza della sequenza) % cerca la sequenza orizzontalmente pres = verifica_orizzontale_da_posizione(matrice, seq, r, c); % se trovata, salva riga e colonna, poi ritorna if pres riga = r; col = c; return; end end end

cerca_inizio_verticale.m-funzione

function [riga, col] = cerca_inizio_verticale(matrice, seq) [col, riga] = cerca_inizio_orizzontale(matrice', seq);

cerca_sequenza.m-funzione

function [riga, col, dir] = cerca_sequenza(matrice, seq) % non trovato riga = 0; col = 0; dir = 'n'; % ricerca orizzontale [r, c] = cerca_inizio_orizzontale(matrice, seq); if r ~= 0 riga = r; col = c; dir = 'o'; return; end % ricerca verticale [r, c] = cerca_inizio_verticale(matrice, seq); if r ~= 0 riga = r; col = c; dir = 'v'; return; end

CorsodiInformaticaB/C2015-16 31

8. InalgebralinearelamatricecompagnadiunpolinomiodigradoN:

èunamatricequadrataNxNavente:

• 1sullaprimasovra-diagonale• icoefficienti,cambiatidisegno,sull'ultimariga• 0(zero)altrove

Scrivereunafunzioneche,ricevutoiningressoilvettoredeicoefficienti

, restituiscalacorrispondentematricecompagna.

Soluzione

matriceCompagna.m–funzione

% function CP = matriceCompagna(coefficienti) % leggo la lunghezza del vettore n = length(coefficienti); % preparo una matrice NxN di zeri CP = zeros(n); % seleziono la sovradiagonale % % leggo la matrice per colonne: % * il primo elemento della sovra-diagonale e` n + 1 % * i successivi elementi sono tutti distanti n + 1 % * mi fermo alla fine della matrice CP(n+1:n+1:end) = 1; %oppure in maniera piu’ compatta CP = diag(ones(n-1,1), 1); % assegno all'ultima riga i coefficienti cambiati di segno CP(n,1:n) = -coefficienti;

c0 + c1x+ c2x2 + · · ·+ cN�1x

N�1

⇥c0 c1 c2 . . . cN�1

2

66664

0 1 0 · · · 00 0 1 · · · 0· · · · · · · · · · · · · · ·0 0 0 · · · 1

�c0 �c1 �c2 · · · �cN�1

3

77775

CorsodiInformaticaB/C2015-16 32

9. Siimplementilafunzione“calcolaRischio”,chericevainingresso:• unvettore“profiloArgine”checontienelealtezzedell’arginediunfiume,inmetririspetto

alfondodellettodelfiume;invaripuntidelcorsodelfiumeadistanzecrescenti.• l’altezza attuale del livello dell'acqua del fiume, inmetri rispetto al fondo del letto del

fiume.• imillimetri di incremento totale di altezza del fiume dovuti alla pioggia prevista per la

giornata.• Calcoliipuntidelprofiloarischioesondazione,cioèquellipercui:

profiloArgine<=altezzaFiume+(mmIncrementoPrevisto/1000)

Sirealizziunoscriptche

a) richiamilafunzionecalcolaRischiosviluppataalpuntoprecedente;b) visualizzisulloschermoungraficochemostri:

• l’andamentodelprofilodell’argine• illivelloattualedelfiume• ipuntidell’arginearischiodiesondazione

c) generi e visualizzi a video una tabella contenente i soli punti dell’argine a rischio diesondazione

• primacolonna:distanzadelpuntoarischioinmetridallafoce• secondacolonna:altezzadell’argineinquelpunto• terza colonna:minuti che passeranno tra il rilevamento e l’esondazione in quel

punto

minuti=(profiloArgine-altezzaFiume)*1000/(mmIncrementoPrevisto/24*60)]

Soluzione

calcolaRischio.m–funzione

function rischio = calcolaRischio(profiloArgine, altezzaFiume, mmIncrementoPrevisto) % % input: % profiloArgine: vettore contenente l’altezza dei punti dell’argine % altezzaFiume: scalare contenente il valore dell’altezza attuale del fiume % mmIncrementoPrevisto: scalare contenente il valore dell’incremento di altezza previsto del fiume rischio=find(profiloArgine<=altezzaFiume+(mmIncrementoPrevisto/1000));

argine.m–funzione

CorsodiInformaticaB/C2015-16 33

% dati di esempio profiloArgine = [10 10 10 9 8 8 7 10 11 14 20 12 3]; nCampioni = length(profiloArgine); % si supponga che il profilo sia già creato % leggiamo l'altezza altezzaFiume = input('Altezza attuale del fiume in metri: '); % dominio (in metri) x = 1:nCampioni; % costante, altezza del fiume yAltezza = zeros(1, nCampioni); % assegno il valore dell'altezza (supponiamo letto da tastiera) yAltezza(:) = altezzaFiume; % plot del profilo dell'argine plot(x, profiloArgine); hold on % plot dell'atezza (costante) plot(x, yAltezza); % plot dei punti a richio convertendo i mm in metri plot(puntiARischio, altezzaFiume + mmIncrementoPrevisto /1000, '*'); hold off % la tabella avrà [metri, profiloArgine, minuti] % metri metri = x; % minuti minuti = 1000 * 24 * 60 * abs(profiloArgine - altezzaFiume) / (mmIncrementoPrevisto); % creo la tabella tabella = [metri', profiloArgine, minuti]; % seleziono solo i punti a rischio (tutte le colonne) tabella = tabella(puntiARischio, :); % visualizzo disp(tabella);

CorsodiInformaticaB/C2015-16 34

10. La logisticmapèuna sequenzadi numeri reali x(0), x(1), x(2), ..., tali che, perogni numerointeronaturalen,sihache:

x(n+1)=r*x(n)*[1-x(n)]

dove0<x(0)<1er>0èunnumeroreale.

Per esempio, prendendo x(0) = 0.2 e r = 3.2, i primi quattro numeri della sequenza sono:0.20000.51200.79950.5129

Scriverelafunzioneconlaseguenteintestazione:

function[x,rip]=logisticMap(x0,r,lun)

che, ricevendo il primo valore x(0) della sequenza, il coefficiente r, e un valore lunrappresentante la possibile lunghezza di sequenza, calcola in successione gli elementi dellalogisticmap,finoaunnumeromassimodilunelementi,eliinseriscenelvettorex.

Durante lagenerazionedella sequenza, seprimadi raggiungere ilnumerodielementi lunsiottiene un elemento già generato in precedenza, allora il vettore x viene riempito con glielementi fino a quello ripetuto (incluso) e il parametro rip viene posto a 1. Se nessunelemento si ripete, il vettore x viene riempito con i primi lun elementi della sequenza, e ilparametroripvienepostoa0.

Peresempio,conlachiamata:

[ab]=logisticMap(0.3,2,10)

siottiene:

a=0.30000.42000.48720.4997,0.5000,0.5000 b=1

mentreconlachiamata:

[ab]=logisticMap(0.3,1.3,8)

siottiene:

a=0.30000.27300.25800.24890.24300.23910.23650.2348 b=0

CorsodiInformaticaB/C2015-16 35

Soluzione

logisticMap.m–funzione

function [x, rip] = logisticMap(x0, r, lun) x = x0; % continua mentre la lunghezza non e` stata raggiunta while length(x) < lun % l'elemento successivo al corrente e` determinato dalla formula % % con x(length(x)) prendiamo l'ultimo elemento x(n) % ovvero x(end), se preferite x1 = r * x(length(x)) * (1 - x(length(x))); % controllo se gia` generato if any(abs(x-x1) <= 0.0001) % riporto a 1 rip = 1; % inserisco l'elemento % % identico a x = [x, x1]; x(length(x) + 1) = x1; % ritorno immediatamente return; else % inserisco l'elemento % % identico a x = [x, x1]; x(length(x) + 1) = x1; end end % riporto a zero in tutti gli altri casi rip = 0; end

CorsodiInformaticaB/C2015-16 36

11. (TdE) Scrivere una funzione che prende come parametro due matrici A e B, delle stessedimensioni,erestituisceiseguenti3valori:

• Ilnumerototaledielementiugualiinposizionicorrispondenti.• IlnumerodielementidiAmassimaliperlamatriceB,cioèilnumerodiposizioni,nella

matriceA, incuièpresenteunnumerocheèmaggioreougualea tuttiglielementipresentinellamatriceB.

• IlnumeromassimodielementidiAmassimaliperlamatriceB(secondoladefinizioneprecedente)presentiinognicolonnadellamatriceA.

Soluzione

massimali.m-funzione

function [r1 r2 r3] = massimali(A, B) % r1 % elementi uguali in posizioni corrispondenti t1 = A == B; r1 = sum(sum(t1)); % r2 % cerchiamo il massimo in B M = max(max(B)); % i numeri di A maggiori di M saranno maggiori (o uguali) a % tutti gli altri elementi di B (in quanto M è il massimo) t2 = A >= M; r2 = sum(sum(t2)); % r3 % somma lungo le righe tutti gli elementi massimali sc = sum(t2); % cerco il massimo r3 = max(sc);

CorsodiInformaticaB/C2015-16 37

12. Sirichiedediprogettareescrivereunafunzioneche,datoNunnumerointeropositivo,senzafare usodi ricorsione e usando almassimoun ciclo (e.g., for,while) costruisca unamatricequadratadidimensioniN*2xN*2conilseguenteschema:(esempioperN=5)

Puntofacoltativo,ottenerelaseguentematrice:

Soluzione

frame.m–funzione

function [M] = frame(n) n = 2 * n; % raddoppio n M = zeros(n); % parto da una matrice di soli zeri" for ii = 1:n % per ogni sottomatrice "centrata M(ii:n-ii+1, ii:n-ii+1) = M(ii:n-ii+1, ii:n-ii+1) + 1; % alternativamente M(ii:n-ii+1, ii:n-ii+1) = ii; e non serve inizializzare a zeros(); % punto facoltativo, ritocco gli angoli M([ii, n-ii+1], [ii, n-ii+1]) = -1; end

2

666666666666664

1 1 1 1 1 1 1 1 1 11 2 2 2 2 2 2 2 2 11 2 3 3 3 3 3 3 2 11 2 3 4 4 4 4 3 2 11 2 3 4 5 5 4 3 2 11 2 3 4 5 5 4 3 2 11 2 3 4 4 4 4 3 2 11 2 3 3 3 3 3 3 2 11 2 2 2 2 2 2 2 2 11 1 1 1 1 1 1 1 1 1

3

777777777777775

2

666666666666664

�1 1 1 1 1 1 1 1 1 �11 �1 2 2 2 2 2 2 �1 11 2 �1 3 3 3 3 �1 2 11 2 3 �1 4 4 �1 3 2 11 2 3 4 �1 �1 4 3 2 11 2 3 4 �1 �1 4 3 2 11 2 3 �1 4 4 �1 3 2 11 2 �1 3 3 3 3 �1 2 11 �1 2 2 2 2 2 2 �1 1�1 1 1 1 1 1 1 1 1 �1

3

777777777777775

CorsodiInformaticaB/C2015-16 38

13. Il sig. Rossi ha ottenutoun finanziamentodi 100000 euro.Ha scelto una formula con tassofissoal5%,quindiognimese,perNanni,dovràpagareuna ratamensile. La ratamensileècompostadiunaquotacapitalepiùunaquotad’interessi.Laquotacapitaleèfissatainmodotale che la sommadi tutte lequote capitalidia l'ammontare finanziato,mentregli interessisono calcolati in base al residuo delmese precedente. Al primomese il residuo è il totalefinanziato.Iltassodatoèannuoevadivisoperilnumerodimesi.Implementarelaseguentefunzione(formulaammortamentoall'italiana):

[rataresiduointeressi]=calcola_amm(finanziamento,tasso,anni)

che calcola il piano di ammortamento su un numero di anni indicato come parametro (adesempio,anni=3).

Seadesempioilfinanziatoèparia500euro,conuntassoannuodel12%siottienein1anno:RataResiduoInteressi----------------------------------46.66667458.333335.0000046.25000416.666674.5833345.83333375.000004.1666745.41667333.333333.7500045.00000291.666673.3333344.58333250.000002.9166744.16667208.333332.5000043.75000166.666672.0833343.33333125.000001.6666742.9166783.333331.2500042.5000041.666670.8333342.083330.000000.41667

Esommandoleratesiottieneunimportototaledi532.50euro.

Soluzione

calcola_amm.m–funzione

function [rata residuo interessi] = calcola_amm(finanziamento, tasso, anni) % il tasso è da dividere per il numero di mesi in ogni anno, %perchè la rata è mensile tasso = (tasso/12)/100; % la quota capitale è fissa ogni mese n_rate = anni*12; qc = finanziamento/(n_rate); % il capitale residuo è pari, ogni mese, al finanziamento meno %k * qc, dove k è il numero del mese corrente residuo(1:n_rate) = finanziamento - [1:n_rate] * qc;

CorsodiInformaticaB/C2015-16 39

% gli interessi del primo mese sono basati sul finanziamento % iniziale interessi(1) = finanziamento * tasso; % mentre per i seguenti 2:n_rate-1 si prende semplicemente il % residuo e lo si moltiplica per il tasso interessi(2:n_rate) = residuo(1:n_rate-1) * tasso; % per la rata si somma quota capitale e interessi rata(1:n_rate) = qc + interessi(1:n_rate); end

14. Dataunaseriedimisurazioniicuivalorimisuratisonocontenutiinunvettorexeirelativipesisonocontenutiinunvettorew(dellestessedimensionidix),lamediapesatasicalcolacomesegue:

SirispondaaiseguentiquesitiutilizzandoillinguaggioMATLAB.

• Scrivere una funzione mediaPesata avente come argomenti i vettori x e w e comerisultatolamediapesata.

• Scrivere una funzione mediaPesataSpeciale con parametri analoghi allaprecedente,machecalcoli lamediapesataconsiderandocomezeri ipesi relativiallemisurazioniconilvaloreminimoeilvaloremassimo.

• SiconsideriunamatriceZdidimensione2xNprecedentementedefinitaincuilecolonnerappresentano leNmisurazioni, la prima riga contiene i valori di ognimisurazione e lasecondarigairelativipesi.Siscrivaunoscriptpertrovaregliindicidellemisurazioniconvalorecompresotralamediapesataelamediapesataspeciale(estremiinclusi).

Soluzione

% punto 1 function r = mediaPesata(x,w) r = sum(x.*w)/sum(w);

% punto 2 function r = mediaPesataSpeciale(x,w) % Creazione di un vettore logico che contiene true in corrispondenza % del valore minimo selmin = (min(x) == x); % Creazione di un vettore logico che contiene true in corrispondenza % del valore massimo selmax = (max(x) == x); % Metto a 0 il peso delle celle che contrengono il valore minimo o % quello massimo

x̄ =w1 ⇤ x1 + w2 ⇤ x2 + · · ·+ wn ⇤ xn

w1 + w2 + · · ·+ wn

CorsodiInformaticaB/C2015-16 40

w(selmin | selmax)=0; % Calcolo la media usando la funzione sviluppata al punto 1. % Avendo messo a 0 i pesi delle celle che non interessano sto % efffettivamente calcolando la media richiesta al punto 2. r = mediaPesata(x,w);

% punto 3 x = Z(1,:); % Selezione valore misurazioni w = Z(2,:); % Selezione pesi misurazioni mp = mediaPesata(x,w); mps = mediaPesataSpeciale(x,w); if mp <= mps % Selezione delle celle che hanno una misurazione compresa tra % media pesata e media pesata speciale sel = x >= mp & x <= mps; else % Selezione delle celle che hanno una misurazione compresa tra % media pesata speciale e media pesata (l'inverso del punto % precedente) sel = x >= mps & x <= mp; end % Selezione l'indice/posizione delle celle che soddisfano una delle %due situazioni analizzate nei passi precedenti find(sel)

15. Siscriva in linguaggioMATLABunafunzionecontrollaMultipli cheprende in ingressounamatriceMdinumeriinteristrettamentemaggioridizeroeunnumerointeropositivon,erestituisce al programma chiamanteun vettore colonnaV avente lo stessonumerodi righedella matrice M. La funzione determina, per ogni riga della matrice M, qual è il massimonumerodivalorimultiplidinchecompaionoconsecutivamenteincolonneadiacentidellarigadellamatriceMeassegnatalenumeroallaposizionecorrispondenteinV.Diconseguenza,l’i-esimoelementodelvettoreVconterrà ilmassimonumerodivalorimultiplidinconsecutivinell’i-esimarigadellamatriceM.

Adesempio:

La funzione restituisce questo particolare vettore V perché nella prima riga diM individuacomemultiplidi3trevalori(12,21,6),dicuidue(21e6)sonoconsecutivi,nellasecondariga

M =

2

6666664

12 19 4 21 69 18 6 5 183 11 9 3 911 12 5 6 413 1 4 23 17 12 4 9 18

3

7777775M =

2

6666664

12 19 4 21 69 18 6 5 183 11 9 3 911 12 5 6 413 1 4 23 17 12 4 9 18

3

7777775V =

2

6666664

233102

3

7777775n = 3

CorsodiInformaticaB/C2015-16 41

individuacomemultiplidi3quattrovalori(9,18,6,18),dicuitre(9,18,6)sonoconsecutivi,ecosi via fino all’ultima riga.Per determinare se un valore è multiplo di un altro si puòutilizzare la funzionemod che restituisce il resto della divisione intera tra due numeri (peresempio,mod(5,2)restituisce1).

Siscriva,inoltre,unoscriptchecreiunamatriceconivaloridell’esempioechiamilafunzionecontrollaMultiplipassandocomeparametrolamatricecreataeilvalore3.Sifacciainmodocheil risultatoottenutovengastampatoaschermo.

Soluzione

controllaMultipli.m-function

function V = controllaMultipli( M , n ) [nRighe, nColonne] = size(M); V = zeros(nRighe,1); for riga = 1:1:nRighe conta = 0; for colonna = 1:1:nColonne if mod(M(riga,colonna),n) == 0 conta = conta + 1; else conta = 0; end V(riga) = max([V(riga),conta]); end end end

script

M = [12 19 4 21 6; 9 18 6 5 18; 3 11 9 3 9; 11 12 5 6 4; 13 1 4 23 1; 7 12 4 9 18]; controllaMultipli(M,3)

CorsodiInformaticaB/C2015-16 42

Chapter3 Ricorsione

1. Si implementi una versione ricorsiva dell’algoritmo di Euclide per il calcolo del MinimoComuneDivisore(MCD)diduenumeriinteri,considerandoleseguientirelazioni:• sem=n,MCD(m,n)=m(casobase)• sem>n,MCD(m,n)=MCD(m-n,n)(ricorsione)• sem<n,MCD(m,n)=MCD(m,n-m)(ricorsione)

Soluzione

mcd.m-funzione

function [M] = mcd(m, n, passo) % la variabile "passo" non e` parte della soluzione. if m == n M = m; else if m > n M = mcd(m-n, n, passo+1); else M = mcd(m, n-m, passo+1); end end % ----------------------------------------------------------- % Da qui in poi il codice non fa parte della soluzione % ----------------------------------------------------------- % % Questo codice verra` eseguito solo quando si arrivera` al caso base, % quindi quando "passo" assumera` come valore il numero di passi di ricorsione. % % stampo "passi volte" il carattere TAB per "visualizzare" a che punto % della ricorsione mi trovo for ii = 1:passo fprintf('\t'); end % stampo l'invocazione corrente fprintf('|--> mcd: m = %d, n = %d, passo = %d\n', m, n, passo); % ----------------------------------------------------------- end

CorsodiInformaticaB/C2015-16 43

2. Scrivere una funzione che verifichi iterativamente se una stringa è palindroma. Scrivere poiunafunzionecheimplementilastessafunzionalitàinmodoricorsivo.

Soluzione

palindroma_iterativa.m-funzione

function [res] = palindroma_iterativa(par) res = 1; for ii = 1:length(par)/2 % questa linea non fa parte della soluzione fprintf('passo = %d: %c =?= %c\n',ii,par(ii),par(end-ii+1)); if par(ii) ~= par(end - ii + 1) res = 0; return; end end

palindroma_ricorsiva.m–funzione

function [res] = palindroma_ricorsiva(parola) % Caso base: stringhe di un carattere (o vuote sono palindrome) if length(parola) < 2 res = 1; else % controllo se gli estremi sono uguali % if parola(1) == parola(end) % Passo ricorsione: richiama palindroma_ricorsiva % su parola(2, end-1) res = palindroma_ricorsiva(parola(2:end-1)); % da qui, l'esecuzione e` bloccata fino a che la funzione % precedente non ritorna else res = 0; end end

CorsodiInformaticaB/C2015-16 44

main.m–scriptperprovarelefunzioni

% parola palindroma R = 'abbAbba'; % parola non palindroma P = 'abbiibaia'; fprintf('-----------------------------------------------------\n'); % invocazione funzione iterativa palindroma_iterativa(R); fprintf('-----------------------------------------------------\n'); palindroma_iterativa(P); fprintf('-----------------------------------------------------\n'); % invocazione funzione ricorsiva palindroma_ricorsiva(R, 1); fprintf('-----------------------------------------------------\n');

CorsodiInformaticaB/C2015-16 45

3. Siimplementiunafunzioneiterativa(eunasuaversionericorsiva)pertradurreicaratteridiunastringadaminuscoliamaiuscoli.Assumerechelafunzionericevainingressounastringadicaratteriminuscoli.La traduzione viene effettuata semplicemente sottraendo 32 al carattere da tradurre, eapplicandochar().

Adesempio:

>char('a'-32)

ans='A'

Soluzione

maiuscola_iterativa.m-funzione

function S = maiuscola_iterativa(s) for ii = 1:length(s) S(ii) = char(s(ii) - 32); % la linea successiva non fa parte della soluzione fprintf('passo iterativo = %d: %c -> %c\n',ii,s(ii),S(ii)); end end % Nota: % anche se in questo esercizio era richiesta esplicitamente una % versione % iterativa, sappiate che è possibile realizzare la stessa % operazione % con una sola chiamata a char(s-32), dove "s" è la stringa.

maiuscola_ricorsiva.m-funzione

function S = maiuscola_ricorsiva(s, passo) % % Passo è una variabile di supporto, per chiarire il concetto % di ricorsione; in particolare indica il passo ricorsivo % corrente (e.g., primo, secondo, terzo). % % Caso base: stringa di un carattere if length(s) < 2 S = [char(s(1) - 32)]; else S = [char(s(1) - 32) maiuscola_ricorsiva(s(2:end), passo+1)]; end

CorsodiInformaticaB/C2015-16 46

% Alternativamente: % ---------------- % % Caso base: stringa vuota % if ~length(s) % S = []; % else % ...idem... % end % ----------------------------------------------------------- % da qui in poi il codice non fa parte della soluzione % ----------------------------------------------------------- for ii = 1:passo fprintf(' '); end fprintf('|--> maiuscola_ricorsiva(%s, %d)\n', s, passo); % ----------------------------------------------------------- % fine

main.m-scriptperprovarelefunzioni

s = 'ciaocomestai'; fprintf('-----------------------------------------------------\n'); S = maiuscola_iterativa(s) fprintf('-----------------------------------------------------\n'); S = maiuscola_ricorsiva(s, 1) fprintf('-----------------------------------------------------\n');

CorsodiInformaticaB/C2015-16 47

4. Datounnumerorealepositivosirichiedediscrivereunafunzioneiterativaelasuaversionericorsivapertradurloinnotazionescientifica,ovveroinunnumerorealeeunapotenzadi10.Peresempio:12345.1diventa1.23451e10^4.

Soluzione

notazione_scientifica.m–funzione

function [num, exp] = notazione_scientifica(n) if n <=10 num = n; exp = 0; else c = 0; while n >= 10 n = n/10; % dividiamo il numero per 10 c = c + 1; end num = n; exp = c; end

notazione_scientifica_ricorsivia.m–funzione

function [num, exp] = notazione_scientifica_ricorsiva(n,c) % quando si richiama questa funzione bisogna passarle c = 0 if n <=10 num = n; exp = c; else if n >=10 n = n/10; [num, exp] = notazione_scientifica_ricorsiva(n, c+1) end end

CorsodiInformaticaB/C2015-16 48

5. Unmetodopercalcolareilvaloreapprossimatox(n)dellaradicequadratadiunnumerorealenonnegativoZ,dettometodobabilonese,utilizzalaseguenterelazionericorsiva:

con

Dove n è un intero non negativo arbitrario, mentre x(n) è l'approssimazione della radicequadratadiz.

Peresempio,sesivuolecalcolarelaradicequadrataapprossimatadiZ=2esiscegliedifarlocon n = 3, il valore di x(n=3) ottenuto con il metodo babilonese è 1.4142. Variando n siottengonodiverseapprossimazionidellaradicediz,mavariaancheilnumerodiricorsioniperotteneretaliapprossimazioni.

L'errore di approssimazione si ottiene con: e decresce alcresceredin.

• Scrivereunafunzionericorsivasqrt1(z,n)cherestituiscaun'approssimazionedellaradicequadrataedilrelativoerrore.Quandon=0siassumachel'erroresiapariainf.

• Scrivereuna funzionesqrt2(z,err) che,utilizzando la funzione sqrt1, restituiscaunvaloreapprossimatodella radicequadratadi z conunerroredi approssimazionenonsuperiorealvaloreerrfornitocomeparametro.

Soluzione

sqrt1.m-funzione

function [r err] = sqrt1(z, n) if n == 0 % caso base err = inf; r = 1; elseif n > 0 % ricorsione [r_temp err_temp] = sqrt1(z, n-1); % passo ricorsivo % calcolo di x(n) r = (r_temp + z / r_temp)/2; % x(n) = (x(n-1)+z/x(n-1))/2 % dove x(n-1) = r_temp % calcolo di err(n) err = abs(r - r_temp); % scostamento end

x(n) =1

2⇥ (x(n� 1) +

Z

x(n� 1))

x(0) = 1

err(n) = |x(n)� x(n� 1)|

CorsodiInformaticaB/C2015-16 49

sqrt2.m-funzione

function r = sqrt2(z, err) n = 0; err_temp = inf; % errore inizialmente infinito % cerco n tale che err_temp <= err while err_temp > err % condizione negata n = n + 1; [r err_temp] = sqrt1(z, n); end

6. Sidicacosacalcolalaseguentefunzionericorsiva:a. Quando si passano i parametri 7 e 8.b. In generale.

function z = mistero(x) if x >= 1 z = mod(x,2) + 10*mistero(floor(x/2)); else z = 0; end Soluzione

Lafiguraquisottomostracomeavvengonolechiamatericorsive.Inparticolarevienemostratoinogni

bloccol'ambientelocalediesecuzioneassociatoadognichiamata.

1. mistero(7)=111,mistero(8)=1000

2. mistero(x)calcolaunvalorenumericoinbase10lacuisequenzadicifrepuòessereinterpretatacomerappresentazionedelnumeronaturalexnelsistemabinario.

CorsodiInformaticaB/C2015-16 50

7. Sispieghicosafa laseguentefunzione, fornendo*anche*degliesempidioutputafrontedialcuniesempidiinput

Soluzione

function r = misteriosa(array) k = size(array, 2); % come se fosse length(array) % assumendo vettori riga if (k == 1) % caso base 1: se ha una sola cella r = 1; % ritorno 1 elseif (k == 2) % caso base 2: se invece ha due celle if (array(1) + array(2) == 10)

% se la prima e la seconda cella == 10 r = 1; % ritorna 1 else r = 0; % altrimenti ritorna 0 end else % se invece ha > 2 celle if (array(1) + array(k) == 10)

% se la prima + ultima cella == 10 r = misteriosa(array(2:k-1));

% passo ricorsivo sul vettore 2:k-1 else r = 0; % ritorna 0 end end % controlla se un vettore di interi, scansito dall'esterno verso % l'interno ha % tutte celle opposte che sommano a 10: se sì ritorna 1,altrimenti 0. misteriosa([1 9 3 2 8 7 1 9]) % ci aspettiamo 1 misteriosa([1 9 3 2 8 7 2]) % ci aspettiamo 0

function r = misteriosa(array) k = size(array, 2); if (k == 1) r = 1; elseif (k == 2) if (array(1) + array(2) == 10) r = 1; else r = 0; end else if (array(1) + array(k) == 10) r = misteriosa(array(2:k-1)); else r = 0; end end

CorsodiInformaticaB/C2015-16 51

misteriosa([1]) % 1 misteriosa([1 2]) % 0

8. (TdE)Siconsiderilaseguentefunzione:

function [ris] = s(n) if n<1 ris = -1; elseif n>=1 && n<=4 %* ris = n; %* else ris = s(n-2)*s(n-4); end

eloscriptchelarichiama:

% script s1 che richiama s for x = 1:8 fprintf('%d, ', s(x)); end

• Quali risultati vengono stampati a video? Si supponga di rimuovere le righe di codice evidenziate da un asterisco:

• La terminazione della ricorsione è ancora garantita per ogni valore dell’argomento n? In caso affermativo giustificare brevemente la risposta, in caso negativo riportare almeno un esempio di argomento in cui la ricorsione non termina.

• Con la modifica apportata quali risultati vengono stampati a video?

Si forniscano opportune giustificazioni per tutte le risposte.

Soluzione

Soluzione

• Perxcompresotra1ed8ilprogrammacalcolaestampalaseguentesequenzadinumeri1,2,3,4,3,8,9,32.Infatti:s(1)=1s(2)=2s(3)=3s(4)=4s(5)=s(3)*s(1)=3*1=3s(6)=s(4)*s(2)=4*2=8s(7)=s(5)*s(3)=3*3=9s(8)=s(6)*s(4)=8*4=32

• Laricorsioneterminasempre,datocheperqualsiasiargomentolafunzionevienerichiamatasuargomentisempreminorifinoaraggiungereilcasobase:unargomentominoreougualeazero

• Lanuovasequenzaè1,1,-1,-1,-1,-1,1,1.Infatti:

s(1)=s(-1)*s(-3)=(-1)*(-1)=1

CorsodiInformaticaB/C2015-16 52

s(2)=s(0)*s(-2)=(-1)*(-1)=1s(3)=s(1)*s(-1)=(1)*(-1)=-1s(4)=s(2)*s(0)=(1)*(-1)=-1s(5)=s(3)*s(1)=(-1)*(1)=-1s(6)=s(4)*s(2)=(-1)*(1)=-1s(7)=s(5)*s(3)=(-1)*(-1)=1s(8)=s(6)*s(4)=(-1)*(-1)=1

9. (TdE) Siconsiderinolafunzioneeloscriptseguenti:

function†[r]†=†MiaFunz(a,†b) if b == 0 r=1; else r = a * MiaFunz(a, b-1); end;

%script che chiama MiaFunz x=2; for y = 0:1:4 r = MiaFunz(x,y) end

• DescriverebrevementequalesialafunzionematematicacalcolatadallafunzioneMiaFunz.Giustificarelarisposta.

• Quali risultati vengono stampati a video? Non è necessario calcolare i valori numericiesatti, ma è sufficiente riportare le espressioni aritmetiche necessarie per calcolarli.Giustificarelarisposta.

Soluzione

LafunzionematematicacalcolatadallafunzioneMiaFunz(a,b)èab,sottol'ipotesicheb≥0Irisultatistampatiavideosono:20=1

21=2

22=4

23=8

24=16

CorsodiInformaticaB/C2015-16 53

10. Si consideri unamatrice triangolare T, rappresentante il famoso triangolo di Tartaglia, i cuivalori,identificatidalloronumerodirigaedicolonnaa>b,sonodefinitinelseguentemodo:

T(a,1) = 1 T(a,a) = 1 T(a,b)=T(a-1,b-1)+T(a-1,b) Adesempio,leprime5righedellamatricetriangolareTsonoleseguenti:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

Si scriva una funzione ricorsiva che, utiizzando la definizione sopra, permetta di calcolare ilvalorediungenericoelementodellamatriceT.

Soluzione

Lasoluzioneaquestoquesitopuo'esseredeterminatafacilmenteinquantodalladefinizionee'possibilericavareilcasobaseeilcasoricorsivodellaricorsione.

RappresentiamoT comeuna funzione cheha comeargomenti la riga e la colonnae come risultato ilvalorecontenutonellamatrice(chedobbiamocalcolare).

CASO BASE: T(a,1)=1 e T(a,a)=1

Questo caso base ci dice che se il secondo parametro della funzione e' uguale a 1, oppure uguale alprimoparametro,ilrisultatosara'1esiterminalaricorsione.

CASO RICORSIVO: T(a,b)=T(a-1,b-1)+T(a-1,b)

Questocasoricorsivocidicecheintuttiglialtricasi, ilrisultatosicalcolachiamandoricorsivamentelafunzione.

function ris = tartaglia(a,b) if b == 1 || a == b ris = 1; else ris = tartaglia(a-1,b-1)+tartaglia(a-1,b); end

CorsodiInformaticaB/C2015-16 54

11. SiscrivanoinlinguaggioMATLAB:• unafunzionericorsivachecalcoliilrisultatodelladivisioneinteraa/b.• unafunzionericorsivachecalcoliilrestodelladivisioneinteraa/b.• unafunzionericorsivachecalcolisiailrisultatosiailrestodelladivisioneinteraa/b.

Suggerimento:

a/b = 1+(a-b)/b

Soluzione

Caso1

function risultato = divisione(a,b) if a >= b risultato = 1 + divisione(a-b,b); else risultato=0; end

Caso2

function r = resto(a,b) if a >= b r = resto(a-b,b); else r = a; end

Caso3

function [risultato, resto] = divisioneresto(a,b) if a>=b [risultato1, resto1] = divisioneresto(a-b,b); risultato = risultato1 + 1; resto = resto1; else risultato=0; resto=a; end

CorsodiInformaticaB/C2015-16 55

12. SiscrivaunafunzioneinMATLABcheabbiacomeparametrodiingressounvettorecontenteuninsiemedivalori,estampituttelepermutazioniditalivalori.Adesempio,seivalorisono[123],considerandoquestoschema:

1 2 3 (primo numero) / \ / \ / \ 2 3 1 3 1 2 (possibili secondi numeri) | | | | | | 3 2 3 1 2 1 (possibili terzi numeri)

Le permutazioni di [1 2 3] sono:

[1 2 3], [1 3 2], [2 1 3], [2 3 1], [3 1 2], [3 2 1].

Soluzione

Osservando lo schema possiamo notare che abbiamo bisogno di due informazioni: 1) i valori giàconsiderati precedentemente nelle permutazioni (per non ripeterli) e i valori ancora disponibili (daaggiungere). Questo fa sì che la nostra funzione ricorsiva debba avere due parametri d’ingresso: 1)l'insiemedeivalorigiàinseritinellapermutazionee2)l'insiemedeivaloriancoradainserire.

Poiché'lafunzionerichiestadall'eserciziohaunsoloparametro,cioèl'insiemedeivaloridainserirenellapermutazione, avremo bisogno di creare due funzioni. La prima con un solo parametro contenente ivalorida inserire,e la secondacondueparametri contenenti i valori già inseritinellapermutazioneequelliancoradainserire.

Laprimafunzioneavràsololoscopodinascondereachilainvocachec’èunparametroinpiù.Questafunzionechiameràlasecondafunzionepassandouninsiemevuotocomevalorigiàinseriti,etuttiivaloridisponibilicomevaloridainserire.

Lafunzionericorsivasaràstrutturatainquestomodo:

CASOBASE

L'insiemedeivaloridainserireèvuoto:stamposemplicementeivalorigiàinseriti(primoparametro)etermino.

CASORICORSIVO

L'insiemedeivaloridainserirenonèvuoto:scandiscotuttiipossibilivaloriancoradainserireedeseguoun’invocazionericorsivadellafunzioneperognunodiquestivalori.Inquesteinvocazioniricorsivepassocomeprimoparametro i valori già inseriti dal chiamante, piùquello nuovo che sto scandendo. Comesecondoparametroinvecepassotuttiivaloriancoradainserire,eccettoquellochestoscandendo.

CorsodiInformaticaB/C2015-16 56

Codice

function p=permutazioni(m) permuta([],m);

function ris=permuta(p, m) if length(m)>0 for k=1:length(m) permuta([p m(k)], m([1:k-1 k+1:end])); end else p end

CorsodiInformaticaB/C2015-16 57

13. Il Sudokuèun giocodi logicanel quale al giocatore vienepropostaunagrigliadi 9×9 celle,ciascuna delle quali può contenere un numero da 1 a 9, oppure essere vuota; la griglia èsuddivisain9righeorizzontali,novecolonneverticaliein9"sottogriglie",chiamateregioni,di3×3cellecontigue.Scopodelgiocoèquellodiriempirelecasellebiancheconnumerida1a9,in modo tale che in ogni riga, colonna e regione siano presenti tutte le cifre da 1 a 9 e,pertanto,senzaripetizioni.L’esempiosottoriportatomostraunagrigliaSudokucorretta.

Sivuolerealizzareunprogrammaingradodiverificareseunagrigliaassegnatarispettaleregoledelgioco.

• Si implementi la funzione verificaBase, che prenda in ingresso una vettore riga Lafunzionerestituisca1seilvettorevcontienetuttiinumericompresitra1e9.

• Si implementi la funzione verificaRighe, che riceva in ingresso una matrice 9x9rappresentante una soluzione del Sudoku e restituisca 1 se le righe della matriceSudokupassatacomeparametrorispettanoleregoledelgioco.

• Si implementi la funzione verificaColonne, che riceva in ingresso una matrice 9x9rappresentante una soluzione del Sudoku e restituisca 1 se le colonne dellamatriceSudokupassatacomeparametrorispettanoleregoledelgioco.

• Si implementi la funzione verificaRegioni, che riceva in ingresso una matrice 9x9rappresentanteuna soluzionedel Sudoku e restituisca1 se le 9 regionidellamatricesudokupassatacomeparametrorispettanoleregoledelgioco.

• SiimplementiinfinelafunzioneverificaSudoku,,chericevainingressounamatrice9x9rappresentanteunasoluzionedelSudoku erestituisca1se lamatricesudokupassatacomeparametro,rispettatutteleregoledelgioco

Soluzione

1 2 3 4 5 6 7 8 94 5 6 7 8 9 1 2 37 8 9 1 2 3 4 5 6

2 3 4 5 6 7 8 9 15 6 7 8 9 1 2 3 48 9 1 2 3 4 5 6 7

3 4 5 6 7 8 9 1 26 7 8 9 1 2 3 4 59 1 2 3 4 5 6 7 8

CorsodiInformaticaB/C2015-16 58

verificaBase.m-funzione

function [ ris ] = verificaBase( v ) ris = 0; l = length(v); for ii =1:l if isempty(find(v==ii)) return ; end end ris =1;

CorsodiInformaticaB/C2015-16 59

verificaRighe.m–funzione

function [ ris ] = verificaRighe( sudoku ) [r c] = size(sudoku); for ii=1:r riga = sudoku(ii ,:); ris = verificaBase(riga); if ris == 0 return end end

verificaColonne.m–funzione

function [ ris ] = verificaColonne ( sudoku) ris = verificaRighe(sudoku');

CorsodiInformaticaB/C2015-16 60

verificaRegioni.m–funzione

function [ ris ] = verificaRegioni( sudoku ) [r c] = size(sudoku); for ii = 1:3:r-2 for jj =1:3:c -2 subM=sudoku(ii:ii+2, jj:jj+2); ris = verificaBase (subM(:) ) ; if ris == 0 return end end end

verificaSudoku.m–funzione

function [ ris ] = verificaSudoku( sudoku) ris = verificaRighe (sudoku) ; if ris==0 disp('La matrice viola le regole di riga'); return end ris = verificaColonne (sudoku) ; if ris==0 disp ('La matrice viola le regole di colonna') ; return end ris = verificaRegioni (sudoku) ; if ris==0 disp('La matrice viola le regole di regione'); return end disp('Matrice OK!');

CorsodiInformaticaB/C2015-16 61

Chapter4 Accessoaifile

1. Un'agenzia di viaggi possiede un proprio database di destinazioni e di acquisti effettuati. Ildatabasee'compostodaduefile:ilprimo‘dest.dat’inognirigahailnomedelladestinazionee il prezzo; il secondo ‘acquisti.dat’ in ogni riga ha il nome del cliente e il nome delladestinazionedell'acquistoeffettuato.

• Siscrivaunoscriptchecarichiildatabase.• Sistampiilfatturatogeneratodaognidestinazione.

Soluzione

% parte 1 [dest_nome, dest_costo] = textread('dest.dat','%s %f') [acquisti_nome, acquisti_dest]= textread('acquisti.dat','%s %s') % parte 2 for ii=1:size(dest_nome) fatturato=0; for jj=1:size(acquisti_dest) if strcmp(acquisti_dest(jj),dest_nome(ii)) % strcmp restituisce 1 se sono uguali, 0 se sono diversi % In C e' il contrario!!! fatturato = fatturato + dest_costo(ii); end end disp(['Fatturato per ', est_nome(ii), ': ', num2str(fatturato)]); end

CorsodiInformaticaB/C2015-16 62

Chapter5 Diagrammi1. Sidisegnilasuperficiedelparaboloideiperbolicodatodallaseguenteequazione:

z=x.^2-y.^2 per valori di x e y nell'intervallo [-5,+5]. Impostare titoli ed etichette.

Soluzione

Assegno innanzitutto(comeneigraficiaduedimensioni)varivalorinell'intervalloda-5a+5(separatidamicrointervallididimensioneopportuna)allevariabilixey.Piùpiccolisonotaliintervalliepiùdefinitosaràilgrafico.Dopodiché'creoconlafunzionemeshgrid lematricixx eyy contenentilaprimaivaloridixripetutilength(y)volte,lasecondaivaloridiy'ripetutilength(x)volte.Lacoppiadiquestematriciidentificalagrigliarettangolarechesaràutilizzatapermodellarelasuperficieidentificatadazz (piùpiccolisonogliintervallidixeyepiùfittasaràlagriglia).Lamatricezz sicalcoladaxxeyyutilizzandodirettamentel'equazionedellafunzioneaduevariabilidarappresentare(zz=xx2-yy2inquestocaso).Infine,letrematriciottenute(xx,yy,zz)sarannoiparametridell'istruzionemesh chedisegneràilgrafico.

x=-5:0.05:5; y=x; [xx yy]=meshgrid(x,y); zz=xx.^2-yy.^2; mesh(xx,yy,zz); title('Paraboloide iperbolico') xlabel('Asse x') ylabel('Asse y') zlabel('Asse z') Risultato