Altobelli Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Har en oppg. her jeg sliter med. Funksjonen skal ta inn årstall som parameter og returnere hvilken ukedag året startet på. (..vi får som hint at 1900 starter på en mandag) Jeg har i tillegg laget en hjelpefunksjon, isLeapYear som returnerer 0(false) om året ikke er skuddår og 1(true) om året er skuddår. Dette har jeg gjort: function StartDate = getYearStartDate(aar) StartDate = 0; for i = 1900:1:aar if isLeapYear(aar-1) == 1 StartDate = StartDate + 1; else StartDate = StartDate + 2; end end end --- Funksjonen kjører helt fint frem til 1905 - som jo er året etter et skuddår. Her får jeg 12 som output, mens det jeg egentlig vil ha er 7. Lenke til kommentar
HansiBanzi Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 (endret) Jeg skjønner ikke helt hva koden din gjør. Representerer StartDate ukedag som året starter på? Hvorfor øker denne med 2 hvis foregående år ikke var skuddår og med 1 om det var det?. Hvis problemet er at den teller lenger enn 7 kan du jo prøve: function StartDate = getYearStartDate(aar) StartDate = 0; for i = 1900:1:aar if isLeapYear(aar-1) == 1 StartDate = StartDate + 1; StartDate = StartDate - StartDate%7; else StartDate = StartDate + 2; StartDate = StartDate-StartDate%7; end end end EDIT: Glem det, jeg surra fælt. Endret 4. oktober 2013 av HansiBanzi Lenke til kommentar
Altobelli Skrevet 4. oktober 2013 Forfatter Del Skrevet 4. oktober 2013 (endret) Jeg skrev feil - det skal være motsatt. Altså året etter et skuddår øker startdatoen med 2, istedenfor 1. Og ja, StartDate repper ukedag året begynner på Endret 4. oktober 2013 av mentalitet Lenke til kommentar
Nebuchadnezzar Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Hvordan jeg løste oppgaven for mange herrens år siden. Bruk help weekday, osv for å finne ut hva funksjonene gjør. %Oppgave 4B a) function Y = aar12(f) b = num2str(f); s = weekday(['1-jan-',b])-1; if s==0 Y=7; else Y=s; end Oppgave 4B b) function Y = aar3(a,r) b = num2str(r); switch a case 1 c='january'; case 2 c='february;' case 3 c='march'; case 4 c='april'; case 5 c='may'; case 6 c='june'; case 7 c='july'; case 8 c='august'; case 9 c='september'; case 10 c='october'; case 11 c='november'; case 12 c='december'; otherwise return end c = weekday(['1-',c,'-',b])-1; if c==0 Y = 7; else Y = c; end Lenke til kommentar
emmen12 Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 (endret) Hei! Du kan prøve å bruke en If-løkke inne i for løkka til å fikse det problemet, feks: if StartDate = 8 StartDate = 1 elseif StartDate = 9 StartDate = 2 Så vil StartDate alltid vere [1,7] Endret 4. oktober 2013 av emmen12 Lenke til kommentar
Altobelli Skrevet 4. oktober 2013 Forfatter Del Skrevet 4. oktober 2013 Ok, takk. Men på måten jeg har gjort det på - er det ikke bare en liten modifikasjon som må til for at jeg iallefall får output 7 for ans=1905? Lenke til kommentar
emmen12 Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Du må ikke ha if year-1, men i -1, for year blir ikke endret, så da vil den legge til 2 hver når du skriver inn et skuddår+1 som year Lenke til kommentar
Altobelli Skrevet 4. oktober 2013 Forfatter Del Skrevet 4. oktober 2013 Ah, takk!! Da fikk jeg det til. Er dog litt usikker på hvordan jeg skal legge inn at funksjonen "restartes" når StartDate overstiger 7. Så hintet ditt, men fikk det ikke helt til. Lenke til kommentar
the_last_nick_left Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Ta resten når du deler på sju. Lenke til kommentar
Altobelli Skrevet 4. oktober 2013 Forfatter Del Skrevet 4. oktober 2013 Ah, da kan jeg vel bare bruke den innebygde Mod-funskjonen. Tenker det blir noe ala dette da: if StartDate > 7 mod(StartDate,7) Men hvor i funksjonen skal jeg legge inn denne betingelsen? Lenke til kommentar
emmen12 Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Skriv det inn på slutten av for-løkka, da vil den sjekke om StartDate >7 for hver nye verdi av i. Lenke til kommentar
emmen12 Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Eller så kan du lage en whileløkke etter for-løkken som trekker fra 7 fram til du har et tall som er mellom 1 og 7. Du vil ha et ganske stort tal som StartDate etter x antall år, og denne vil gjøre at StartDaten er mellom 1 og 7. - - while StartDate >7 StartDate = StartDate - 7; end %StartDate Lenke til kommentar
Altobelli Skrevet 4. oktober 2013 Forfatter Del Skrevet 4. oktober 2013 Tusen takk fikk det omsider til! Lenke til kommentar
Altobelli Skrevet 5. oktober 2013 Forfatter Del Skrevet 5. oktober 2013 (endret) Et lite spm til..Skal lage en funksjon som tar inn årstall og månedsnr. som parameter, som skal returnere hvilken ukedag året starter.Har så langt brukt getYearStartDate-funksjonen som jeg allerede har laget og fått den til å sjekke hvilket år jeg har med å gjøre, for så å utføre en switch for hver måned. Men dette blir jo vanvittig tungvint..(er bare et utdrag fra funksjonen, har ikke skrevet opp alle casene).: function MonthStart = getMonthStartDate(aar,maanedNr) if getYearStartDate(aar) == 7; switch maanedNr case 1 MonthStart = 7; case 2 MonthStart = 3; otherwise MonthStart = 0; end ....................... ............... ................. Endret 5. oktober 2013 av mentalitet Lenke til kommentar
emmen12 Skrevet 5. oktober 2013 Del Skrevet 5. oktober 2013 Mener du hvilken ukedag måneden i det bestemte året starter på? Det du prøver på er vannvittig tungvint, og vil etter 1. øyekast ikke funke for skuddår. Du vet hvilken dag januar starter på, og du vet hvor mange dager det er i hver måned, antatt du har en daysInMonth funksjon som gjør dette. Du kan på en eller annen måte telle alle dager fram til den gitte måneden, og så trekke fra 7 til du får ett tall mellom 1 og 7, som i den forrige funksjonen Evt. ligger det en fasit til øvingen på www.xlib.com Lenke til kommentar
Altobelli Skrevet 5. oktober 2013 Forfatter Del Skrevet 5. oktober 2013 Mener at funksjonen skal ta inn et årstall og månedsnr som parameter - og så returnere hvilken dag måneden i det gitte året starter på. -- Ser LF på xlib ja, men skulle gjerne ha prøvd å løst det uten weekday-funksjonen. Lenke til kommentar
Altobelli Skrevet 6. oktober 2013 Forfatter Del Skrevet 6. oktober 2013 Noen som har forslag til hvordan man kan gå frem uten weekday-funksjonen? Har prøvd meg på dette nå: function ms = gmsd(aar, maanednr) x = getYearStartDate(aar); switch maanednr case 1 ms = x; case 2 ms = x-3; case 3 if isLeapYear(aar) == 1; ms = x-3; else ms = x-4; ----(utdrag fra funksjonen) Men denne vil jo bare funke når x er større enn 5..noe jeg kan gjøre slik at jeg alltid får output i intervallet [1,7]? (om dette i det hele tatt er en løsning som vil funke..) Lenke til kommentar
the_last_nick_left Skrevet 7. oktober 2013 Del Skrevet 7. oktober 2013 Men denne vil jo bare funke når x er større enn 5..noe jeg kan gjøre slik at jeg alltid får output i intervallet [1,7]? (om dette i det hele tatt er en løsning som vil funke..) Du kan fortsatt bruke mod 7. Lenke til kommentar
Altobelli Skrevet 7. oktober 2013 Forfatter Del Skrevet 7. oktober 2013 Ok, takk. Fikk det til nå. Men må jeg legge inn denne betingelsen for hver eneste case? Når jeg plasserer den et annet sted fungerer det ikke. Lenke til kommentar
bublizz Skrevet 8. oktober 2013 Del Skrevet 8. oktober 2013 Tips til neste gang: piazza man får ganske fort svar der. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå