Filter löschen
Filter löschen

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

25 Ansichten (letzte 30 Tage)
Elliot Ogbechina
Elliot Ogbechina am 28 Dez. 2019
Kommentiert: Walter Roberson am 17 Jul. 2020
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 Kommentare
Elliot Ogbechina
Elliot Ogbechina am 31 Dez. 2019
so what can i use in place of isinteger
Stephen23
Stephen23 am 31 Dez. 2019
Bearbeitet: Stephen23 am 31 Dez. 2019
"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.

Melden Sie sich an, um zu kommentieren.

Antworten (4)

aniket GIRI
aniket GIRI am 27 Mai 2020
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 am 1 Jun. 2020
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 Kommentare
MUHAMMAD USMAN BIN AHMED
MUHAMMAD USMAN BIN AHMED am 1 Jun. 2020
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

Melden Sie sich an, um zu kommentieren.


Jalaj Gambhir
Jalaj Gambhir am 31 Dez. 2019
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 Kommentare
Walter Roberson
Walter Roberson am 1 Jun. 2020
Anil Muradiya which code are you finding is failing, and what inputs are you finding that it is failing on?

Melden Sie sich an, um zu kommentieren.


Sravani Kurma
Sravani Kurma am 17 Jul. 2020
Bearbeitet: Sravani Kurma am 17 Jul. 2020
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

Community Treasure Hunt

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

Start Hunting!

Translated by