You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 15 Next »

Læringsmål:

  • Switch
  • fprintf
  • If-setninger
  • Funksjoner
  • For-løkker

Pensum:

  • Kap 4.1-4.4
  • Kap 3.3.2
  • Kap 3.7
  • Kap 5.4

I denne øvingen skal vi implementere funksjonen printCalendar. Den skal vise en gyldig månedskalender gitt månednummer og år som parameter. 
Om koden kjøres skal det se omtrent slik ut:

Oktober 2014
ma ti on to fr lo so
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Dette problemet må brytes ned i mindre oppgaver. Fra utskriften ser man at den består av tre deler:

  1. Månedsnavn og årstall. Første rad.
  2. Dagsnavn. Andre rad.
  3. Datoer for alle dager på riktig plass. Tredje til syvende rad. 

a) Månedsnummer må gjøres om til månedsnavn. Lag funksjonen getMonthName(monthNumber) som returnerer navnet på måneden gitt månedsnr. 


 

Andre rad er en enkel iterasjon gjennom en liste av navn på dagene. De siste radene er mer bry: Disse utgjør en 6x7 matrise hvor radene er uker og kolonnene er ukedager. Denne matrisen kan se slik ut: 

month =
0	0	1	2	3	4	5
6	7	8	9	10	11	12
13	14	15	16	17	18	19
20	21	22	23	24	25	26
27	28	29	30	31	0	0
0	0	0	0	0	0	0

Tallet 0 representerer dager som ikke finnes i måneden.
Neste steg er å definere en funksjon som lager denne matrisen. Det gjør følgende funksjon:

function calendar = getCalendar ( year , month )
	startDay = getMonthStartDay ( year , month );
	numDays = daysInMonth ( year , month );
	calendar = zeros ( 6, 7 );
	date = 0;
	for week = 1:6
		for day = 1:7
			if ( date == 0 )
				if ( week == 1 && day == startDay )
					date = 1;
				end
			else
				if ( date < numDays )
					date = date + 1;
				else
					date = 0;
				end
			end
			calendar (week , day ) = date ;
		end
	end
end

 

Her returnerer funksjonen daysInMonth antall dager i måned, getMonthStartDay returnerer nummeret på den første ukedagen i måneden (1 = Mandag, 2 = Tirsdag, ..., 7 = Søndag). I eksempelet med oktober 2014, returnerer daysInMonth 31 og getMonthStartDay 3.


b) 
Gitt startDay = 3 og numDays 31 i getCalendar-funksjonen over. Gå gjennom funksjonen over og skriv ned verdien til variablene week, day og date for hver iterasjon i den indre for-løkken.                                                                   Det holder å skrive ned de første 12 iterasjonene.

Iterasjonweekdaydate

1
2
...
12 

1
1
...
1
2
...
0
0
...
10 

 


 

Legg inn funksjonen getCalendar (se over). Denne krever at vi implementerer funksjonene daysInMonth og getMonthStartDay.                                                                                                                                                                    Du kan bruke filene daysInMonth.m og isLeapYear.m fra tidligere øvinger. 

For å kunne definere funksjonen getMonthStartDay trenger vi først å vite hvilken dag året starter på.

c) Lag funksjonen getYearStartDay(year). Funksjonen skal ta inn et årstall som parameter og returnere hvilken ukedag året starter på (1 = Mandag, 2 = Tirsdag, ..., 7 = Søndag). 
Tips: Året 1900 startet på en mandag. For hvert år flytter startdagen seg med en dag. Det vil si at 1901 startet på en tirsdag. Hvis året er et skuddår, flytter startdagen i neste år seg med to dager.

 For å teste denne funksjonen kan du kjøre følgende skript:

getYearStartDay (1900) % skal skrive ut 1
getYearStartDay (1901) % skal skrive ut 2
getYearStartDay (1902) % skal skrive ut 3
getYearStartDay (1903) % skal skrive ut 4
getYearStartDay (1904) % skal skrive ut 5
getYearStartDay (1905) % skal skrive ut 7
getYearStartDay (1906) % skal skrive ut 1
getYearStartDay (2012) % skal skrive ut 7


d) Lag funksjonen getMonthStartDay(year, monthNumber). Den skal ta inn et årstall og et månedsnummer som parameter (1 = Januar, 2 = Februar, ..., 12 = Desember). Funksjonen skal returnere hvilken ukedag måneden starter på (1 = Mandag, 2 = Tirsdag, ..., 7 = Søndag). 

getMonthStartDay (2012 , 0) % skal skrive ut 0
getMonthStartDay (2012 , 1) % skal skrive ut 7
getMonthStartDay (2012 , 2) % skal skrive ut 3
getMonthStartDay (2012 , 3) % skal skrive ut 4
getMonthStartDay (2012 , 4) % skal skrive ut 7
getMonthStartDay (2012 , 5) % skal skrive ut 2
getMonthStartDay (2012 , 6) % skal skrive ut 5
getMonthStartDay (2012 , 7) % skal skrive ut 7
getMonthStartDay (2012 , 8) % skal skrive ut 3
getMonthStartDay (2012 , 9) % skal skrive ut 6
getMonthStartDay (2012 , 10) % skal skrive ut 1
getMonthStartDay (2012 , 11) % skal skrive ut 4
getMonthStartDay (2012 , 12) % skal skrive ut 6
getMonthStartDay (2012 , 13) % skal skrive ut 0

 


 

Du har hittil brutt kalenderen ned i mindre funksjoner. Nå skal de settes sammen og en kalender skal vises. 
disp() er for enkel, derfor må fprintf() benyttes.  Se fprintf for bruk. 

Å vise matrisedelene av kalenderen bør være en egen funksjon.

e) Lag funksjonen printDays(days). Den skal ta inn matrisen som funksjonen i oppgave 3 lager som parameter, og skrive ut datoene som vist i toppen av øvingen. Denne funksjonen skal ikke returnere noen verdi. Funksjonshodet kan dermed se slik ut:

function printDays ( days )
	% Din kode
end

f) Lag funksjonen printCalendar(year, monthNumber). Parameterene er år og månedsnummer. Den benytter seg av getMonthName og getCalendar og printer ut de to første linjene av kalenderen før den kaller på printDays. Den skal ikke returnere noe, bare vise utskrift. 

  • No labels