# Find out if number is divisible by x

332 views (last 30 days)
Rose Potter on 8 Apr 2019
Answered: Uriel Serrato on 23 Jul 2020
I'm trying to write a function that determines if the input is a valid date, and for that I need a function that will tell me if an input number is divisible by 4 and at the same time not divisible by 100 (this has to do with leap years but I'm not supposed to use the special function for that). This is what I came up with but I can already see that it's not correct. In non-code language, I would like it to be something like "If divisors(year) contains the number 4 and does not contain the number 100, display the following..." but I did not know how to do this.
(This is just the part of code I'm struggling with, I didn't paste everything because it was quite a lot.)
Any tips on how I should fix it would be much appreciated!
function valid = valid_date(year,month,day)
if divisors(year) = 4 ~ 100
.
.
.
.
.
end
James Tursa on 8 Apr 2019
You're also going to need a divisible by 400 test.

Rose Potter on 9 Apr 2019
Edited: Rose Potter on 9 Apr 2019
Thank you for your help so far! So now I came up with this and it works with some dates but not with most; For example, I tried it with the input (2001,1,32) and it returns "1" although the input is not a correct date.
Also sometimes I'm getting the error message Output argument "valid" (and maybe others) not assigned during call to "valid_date".
I don't know what that message means and what else is wrong in my code, maybe someone can point out where the mistake is?
function valid = valid_date(year,month,day)
% leap year: divisible by 4, not by 100 -> February has 29 days
if mod(year,4) == 0 & mod(year,100) == ~0;
if month == 2;
if 1 <= day <= 29;
valid = true;
else
valid = false;
end
elseif month == 1 | 3 | 5 | 7 | 8 | 10 | 12;
if 1 <= day <= 31;
valid = true;
else
valid = false;
end
elseif month == 4 | 6 | 9 | 11;
if 1 <= day <= 30;
valid = true;
else
valid = false;
end
else
valid = false;
end
% leap year: divisible by 400 -> February has 29 days
elseif mod(year,400) == 0;
if month == 2;
if 1 <= day <= 29;
valid = true;
else
valid = false;
end
elseif month == 1 | 3 | 5 | 7 | 8 | 10 | 12;
if 1 <= day <= 31;
valid = true;
else
valid = false;
end
elseif month == 2 | 4 | 6 | 9 | 11;
if 1 <= day <= 30;
valid = true;
else
valid = false;
end
else
valid = false;
end
% normal year -> February has 28 days
else
if month == 2;
if 1 <= day <= 28;
valid = true;
else
valid = false;
end
elseif month == 1 | 3 | 5 | 7 | 8 | 10 | 12;
if 1 <= day <= 31;
valid = true;
else
valid = false;
end
elseif month == 4 | 6 | 9 | 11;
if 1 <= day <= 30;
valid = true;
else
valid = false;
end
else
valid = false;
end
end
end
##### 2 CommentsShowHide 1 older comment
Rose Potter on 9 Apr 2019
Thank you SO much for your time, this is very helpful and now the code is running without problems!

Steven Lord on 8 Apr 2019
Take a look at the rem and mod functions.
James Tursa on 8 Apr 2019
The = is an assignment operator in MATLAB. The == is the equality test operator. So
if mod(x,y) == 0

Uriel Serrato on 23 Jul 2020
function valid=valid_date(year,month,day)
if isscalar(year)==false || isscalar(month)==false || isscalar(day)==false
valid=false ;
return
end
if ((1<= month) && (month<= 12)) && ((1<= day) && (day<= 31)) && (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
valid=true;
elseif ((1<= month) && (month<= 12)) && ((1<= day) && (day<= 30)) && ((month==4||month==6||month==9||month==11))
valid=true;
elseif ((1<= month) && (month<= 12)) && ((1<= day) && (day<= 29)) && (month==2)&& (mod(year,4)==0 || mod(year,400)==0) && ~mod(year,100)==0
valid= true;
elseif ((1<= month) && (month<= 12)) && ((1<= day) && (day<= 28)) && (month==2)
valid=true;
else
valid=false;
end