How to write a function to determine if a date entered is valid

조회 수: 22 (최근 30일)
Elliot Ogbechina
Elliot Ogbechina 2019년 12월 28일
댓글: Walter Roberson 2020년 7월 17일
I am to Write a function called valid_date that takes three positive integer scalar inputs year, month, day. If these three represent a valid date, return a logical true, otherwise false. The name of the output argument is valid. If any of the inputs is not a positive integer scalar, return false as well. Here is the code i have tried but keeps returning true for all dates, I have editted it a lot and now i just need a fresh eye to point out what i am doing wrong:
NB: I am not to use any built in MatLab function.
function valid = valid_date (year, month, date)
if (nargin==3)
valid=true;
elseif (isinteger(year)) && year>0 && (isscalar(year))
valid=true;
elseif (isinteger(month))&& month>0 && month <=12 && (isscalar(month))
valid=true;
elseif (isinteger(date)) && date > 0 && (isscalar(date))
valid=true;
elseif (month==1||month==3||month==5||month==7||month==8||month==10||month==12)&& date<=31
valid=true;
elseif date <=30
valid=true;
elseif (isinteger(year/4)) && month == 2 && (~(isinteger(year/100))||(isinteger(year/400))) && date <= 29
valid=true;
else
valid = false;
end
  댓글 수: 9
Elliot Ogbechina
Elliot Ogbechina 2019년 12월 31일
so what can i use in place of isinteger
Stephen23
Stephen23 2019년 12월 31일
편집: Stephen23 2019년 12월 31일
"so what can i use in place of isinteger"
Take a look at this answer you were given six hours ago:
Does it use isinteger? (hint: no)
What does it use? (hint: mod)
Also read my comment following that answer.

댓글을 달려면 로그인하십시오.

답변 (4개)

aniket GIRI
aniket GIRI 2020년 5월 27일
function isvalid = valid_date(y, m, d)
% Check if the inputs are valid
% Check that they are scalars
if ~(isscalar(y) && isscalar(m) && isscalar(d))
isvalid = false;
% Check that inputs are positive
elseif ~all([y, m, d] > 0)
isvalid = false;
% Check that inputs are integers (not the data type)
elseif any(rem([y, m, d], 1))
isvalid = false;
% Check that m and d are below the max possible
elseif (m > 12) || (d > 31)
isvalid = false;
% The inputs could be a valid date, let's see if they actually are
else
% Vector of the number of days for each month
daysInMonth = [31 28 31 30 31 30 31 31 30 31 30 31];
% If leap year, change days in Feb
if isequal(rem(y, 4), 0) && (~isequal(rem(y, 100), 0) || isequal(rem(y, 400), 0))
daysInMonth(2) = 29;
end
maxDay = daysInMonth(m);
if d > maxDay
isvalid = false;
else
isvalid = true;
end
end
end

MUHAMMAD USMAN BIN AHMED
MUHAMMAD USMAN BIN AHMED 2020년 6월 1일
function valid = valid_date(year,month,day)
if nargin ~=3
valid=false;
elseif ((~isscalar(year))||(mod(year,1)~=0)||year<=0)
valid=false;
elseif ((~isscalar(month))||(mod(month,1)~=0)||month<=0||month>12)
valid=false;
elseif ((~isscalar(day))||(mod(day,1)~=0)||day<=0)
valid=false;
elseif (any(month==[1,3,5,7,8,10,12]) && day>31)
valid=false;
elseif (any(month==[4,6,9,11]) && day>30)
valid=false;
else
valid=true;
if (rem(year,4)==0 && month==2 && day<=29)
valid=true;
if (rem(year,100)==0)
valid=false;
if rem(year,400)==0
valid=true;
return
end
end
elseif month==2 && day>28
valid=false;
end
end
end
  댓글 수: 4
MUHAMMAD USMAN BIN AHMED
MUHAMMAD USMAN BIN AHMED 2020년 6월 1일
function valid = valid_date_2(year,month,day)
if nargin ~=3
valid=false;
elseif ((~isscalar(year))||(mod(year,1)~=0)||year<=0)
valid=false;
elseif ((~isscalar(month))||(mod(month,1)~=0)||month<=0||month>12)
valid=false;
elseif ((~isscalar(day))||(mod(day,1)~=0)||day<=0)
valid=false;
elseif (any(month==[1,3,5,7,8,10,12]) && day>31)
valid=false;
elseif (any(month==[4,6,9,11]) && day>30)
valid=false;
else
valid=true;
if (rem(year,4)==0 && month==2 && day<=29)
valid=true;
if ((rem(year,100)==0)&& day>28)
valid=false;
if (rem(year,400)==0 && day<=29)
valid=true;
return
end
end
elseif month==2 && day>28
valid=false;
end

댓글을 달려면 로그인하십시오.


Jalaj Gambhir
Jalaj Gambhir 2019년 12월 31일
Hi,
You can try the following function and see if it works for you:
function valid = valid_date(year, month, date)
if(nargin ~= 3)
valid = false;
elseif (~(mod(year,1)==0) || (year<0) || ~isscalar(year))
valid = false;
elseif (~(mod(month,1)==0) || (month<=0) || (month>12) || ~isscalar(month))
valid = false;
elseif (~(mod(date,1)==0) || (date<=0) || ~isscalar(date))
valid = false;
elseif( (month==1||month==3||month==5||month==7||month==8||month==10||month==12)&& date>31 )
valid = false;
elseif ((month==4||month==6||month==9||month==11) && date>30)
valid = false;
elseif(~leapyear(year) && month==2 && date>28)
valid=false;
elseif(leapyear(year) && month==2 && date>29)
valid=false;
else
valid = true;
end
  댓글 수: 6
Walter Roberson
Walter Roberson 2020년 6월 1일
Anil Muradiya which code are you finding is failing, and what inputs are you finding that it is failing on?

댓글을 달려면 로그인하십시오.


Sravani Kurma
Sravani Kurma 2020년 7월 17일
편집: Sravani Kurma 2020년 7월 17일
function valid=valid_date(year,month,date)
if nargin == 3;
if ~isscalar(year) || year<1|| year~=fix(year)||~isscalar(month) || month<1|| month~=fix(month)||~isscalar(date) || date<1|| date~=fix(date);
valid=false;
else
if ((year/100)~=fix(year/100)&&(year/4)==fix(year/4))||((year/400)==fix(year/400));
%leap yr
valid=mmm(month,date);
else
%non leap year
valid=sss(month,date);
end
end
end
function valid=mmm(month,date)
m30=[4,6,9,11];
m31=[1,3,5,7,8,10,12];
m29=2;
m28=2;
if max((month==m31)')==1
valid=(date>=1)&&date<=31;
elseif max(( month==m30)')==1
valid=(date>=1)&&date<=30;
elseif max((month==m29)')==1
valid=(date>=1)&&date<=29;
else
valid=false;
end
function valid=sss(month,date)
m30=[4,6,9,11];
m31=[1,3,5,7,8,10,12];
m29=2;
m28=2;
if max((month==m31)')==1
valid=(date>=1)&&date<=31;
elseif max(( month==m30)')==1
valid=(date>=1)&&date<=30;
elseif max((month==m28)')==1
valid=(date>=1)&&date<=28;
else
valid=false;
end

카테고리

Help CenterFile Exchange에서 Calendar에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by