Post on 16-Feb-2019
transcript
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 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