MATLAB Answers

Find out if number is divisible by x

332 views (last 30 days)
Rose Potter
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
  1 Comment
James Tursa
James Tursa on 8 Apr 2019
You're also going to need a divisible by 400 test.

Sign in to comment.

Accepted Answer

Rose Potter
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 Comments
Rose Potter
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!

Sign in to comment.

More Answers (2)

Steven Lord
Steven Lord on 8 Apr 2019
Take a look at the rem and mod functions.
  5 Comments
James Tursa
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

Sign in to comment.


Uriel Serrato
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

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by