Gå til innhold
Trenger du skole- eller leksehjelp? Still spørsmål her ×

MatLab-hjelp


Anbefalte innlegg

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
Videoannonse
Annonse

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 av HansiBanzi
Lenke til kommentar

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

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 av emmen12
Lenke til kommentar

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

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 av mentalitet
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...