Du lager et program for å håndtere tippingkuponger for fotballresultat. En tippekupong representeres med en 12 x 3 matrise med sannhetsverdier, hvor hver rad er en kamp og en kolonne angir om spilleren har tippet hjemmeseier, uavgjort eller borteseier for kampen.

Du ønsker å kunne analysere tippekuponger, og finne ut om en kupong er gyldig utfylt og hvor mange rett den har. Du har allerede laget et script opprett_kuponger.m som lager en rekke testkuponger og en fasitkupong du kan bruke til testing.

Skriv en funksjon som tar inn to tippekuponger, en gjetning og en med korrekte resultat, som returnerer en logisk variabel som sier om kupongen er gyldig, en liste over kampene hvor tippingen var korrekt, og antall korrekte resultat.

Utdelt kode

opprett_kuponger.m
kupong1 = [ true false false;
            false true false;
            true false false;
            true false false;
            false false true;
            false true false;
            false true false;
            false true false;
            false false true;
            true false true;
            false false true;
            true false false ];
        
kupong2 = [ false true false;
            false true false;
            true false false;
            false false true;
            false true false;
            false true false;
            true false false;
            false true false;
            false true false;
            false false true;
            false false true;
            true false false ];
        
kupong3 = [ true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true ];

fasit_kupong = [ false true false;
                 false true false;
                 true false false;
                 false false true;
                 false false true;
                 false false true;
                 false false true;
                 true false false;
                 false true false;
                 true false false;
                 true false false;
                 false false true ];
             
assert(all(size(kupong1) == [12, 3]));
assert(all(size(kupong2) == [12, 3]));
assert(all(size(kupong3) == [12, 3]));
assert(all(size(fasit_kupong) == [12, 3]));
 

Videoforklaring (33:08)

Del 1 (8:14)Del 2 (4:29)Del 3 (8:14)Del 4 (12:11)
Introduksjon av problemet, om retur av flere parametre,
og konstruksjon av funksjonens ytre.
Problemoppdeling, bruk av lokale funksjoner/hjelpefunksjoner til å
gjenspeile dette, og løsning av hovedfunksjonen.
 Kode for å avgjøre om en kupong er gyldig eller ikke.

Kode for å avgjøre på hvilke rader en kupong treffer en fasit, og test av
hele funksjonen. 


Løsningsforslag

analyser_tippekupong.m
function [ er_gyldig, treff, antall_treff ] = analyser_tippekupong(gjetninger, fasit)
    er_gyldig = er_kupong_gyldig(gjetninger);
    treff = finn_treff(gjetninger, fasit);
    antall_treff = length(treff);
end
   
function retur = er_kupong_gyldig(kupong)
    %% Vektorisert løsning
    antall_kryss_per_rad = sum(kupong, 2);
    er_rad_gyldig = antall_kryss_per_rad == 1;
    retur = all(er_rad_gyldig);
    
    %% Uvektorisert kan den skrives slik:
    % for i = 1:size(kupong, 1)
    %    n_kryss = 0;
    %    for j = 1:size(kupong, 2)
    %        if kupong(i, j)
    %            n_kryss = n_kryss + 1;
    %        end
    %    end
    %    if n_kryss ~= 1
    %        retur = false;
    %        return;
    %    end
    % end
    % retur = true;
end
   
function retur = finn_treff(kupong, fasit)
	%% Vektorisert kan den skrives slik:
    % retur = find(any(kupong & fasit, 2));
    
    %% Uvektorisert kode følger.
    retur = [];
    for i = 1:size(kupong, 1)
        for j = 1:size(kupong, 2)
            if kupong(i, j) && fasit(i, j)
                retur(end+1) = i;
            end
        end
    end
end 
  • No labels