Find out if number is divisible by x
213 次查看(过去 30 天)
显示 更早的评论
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
采纳的回答
RP
2019-4-9
编辑:RP
2019-4-9
2 个评论
Steven Lord
2019-4-9
There are a couple problems with your code.
if mod(year,4) == 0 & mod(year,100) == ~0;
mod(year, 100) == ~0 is true only when year is 1 greater than a multiple of 100, because the logical negation of 0 is true which is treated as equal to 1 in most circumstances. To test if two numbers are not equal, use the ~= operator.
5 ~= 5 % false
5 ~= 4 % true
The second problem is here:
if month == 2;
if 1 <= day <= 29;
If you've written this in the MATLAB Editor and you're using a release from the past year or two, you should have received a Code Analyzer warning message (a little orange line in the right gutter and an orange underline of some portion of this expression.) That if condition is always true, because it is interpreted as (1 <= day) <= 29. (1 <= day) will be either false (treated as 0) or true (treated as 1) both of which are less than or equal to 29. Code Analyzer will recommend the following:
(1 <= day) & (day <= 29)
Finally:
valid = true;
else
valid = false;
end
elseif month == 1 | 3 | 5 | 7 | 8 | 10 | 12;
If reached this elseif statement is always satisfied. This is not interpreted as "if month is one of 1, 3, 5, 7, 8, 10, or 12". It is interpreted as "if month is equal to 1 or 3 is nonzero or 5 is nonzero or ..." Since or (the | operator) requires at least one of its inputs to be true to return true and 3 is nonzero, the whole expression is true.
To determine if month is one of a set of numbers, you can either use switch or ismember.
ismember(4, [4 8 15 16 23 42]) % true
ismember(99, [4 8 15 16 23 42]) % false
x = 4; % Try redefining x to be 12 or 99 and rerun the switch
switch x
case {4 8 15 16 23 42}
disp('Yes!')
case {12 87}
disp('Brady and Gronk!')
otherwise
disp('No!')
end
Or you could hard-code a list of last days of the month and simply index into it, then treat February (which may have a different number of days) specially.
更多回答(2 个)
Steven Lord
2019-4-8
Take a look at the rem and mod functions.
5 个评论
James Tursa
2019-4-8
The = is an assignment operator in MATLAB. The == is the equality test operator. So
if mod(x,y) == 0
Uriel Serrato
2020-7-23
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
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!