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
62
Embed
Esercizi di MATLAB per il corso di Informatica B/C 2014/2015 · Corso di Informatica B/C 2015-16 1 Esercizi di MATLAB per il corso di Informatica B/C 2014/2015 èChapter 1 Introduzione
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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)
% 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
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.
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
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)]);
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
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
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.
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.']);
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.
• 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
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
%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
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 %
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
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
% 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
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:
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'.
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
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
% 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;
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
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
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.
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:
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);
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
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):
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
• 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
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).
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
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');
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
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.
• 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
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.
• Quali risultati vengono stampati a video? Non è necessario calcolare i valori numericiesatti, ma è sufficiente riportare le espressioni aritmetiche necessarie per calcolarli.Giustificarelarisposta.
10. Si consideri unamatrice triangolare T, rappresentante il famoso triangolo di Tartaglia, i cuivalori,identificatidalloronumerodirigaedicolonnaa>b,sonodefinitinelseguentemodo:
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.
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.
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.
• 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.
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.
% 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