MATLAB Answers

If else problem for year

121 ビュー (過去 30 日間)
RAHUL ANTIL
RAHUL ANTIL 2019 年 6 月 13 日
コメント済み: Rik 2021 年 1 月 16 日
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. Note that every year that is exactly divisible by 4 is a leap year, except for years that are exactly divisible by 100. However, years that are exactly divisible by 400 are also leap years. For example, the year 1900 was not leap year, but the year 2000 was.
valid = valid_date(2018,4,1)
valid = valid_date(2018,4,31)

  6 件のコメント

表示 3 件の古いコメント
RAHUL ANTIL
RAHUL ANTIL 2019 年 6 月 14 日
Here is my function-
I need help that if non-scalar value is used then ouput is false.
function valid = valid_date(year,month,day)
if (isinteger(year/4) || ~isinteger(year/4)) && ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12)) && (day>0 && day<=31)
valid = true;
elseif (isinteger(year/4) || ~isinteger(year/4)) && ((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day>0 && day<=30)
valid = true;
elseif mod(year, 400) == 0 && month == 2 && (day>0 && day<=29)
valid = true;
elseif mod(year, 4) == 0 && mod(year, 100) ~= 0 && month == 2 && (day>0 && day<=29)
valid = true;
elseif ~(mod(year, 400) == 0) && month == 2 && (day>0 && day<=28)
valid = true;
elseif ~(mod(year, 4) == 0 && mod(year, 100) ~= 0) && month == 2 && (day>0 && day<=28)
valid = true;
else
valid = false;
end
Matthew Myers
Matthew Myers 2021 年 1 月 16 日
Hello everyone, I wanted to post my attempt at this and try to understand my mistakes in writing my code.
I notice that during the function, the month does not trigger the "limit" variable that I have set and I cannot understand why. I would appreciate any help with this.
I tried to take your advice Rik in takling each issue one at a time, but I didn't go about it in the right way
function[out] = valid_date(year,month,day)
out = false
if nargin<3
return
elseif ~isscalar(year) || year<1 || year ~= fix(year)
return
elseif ~isscalar(month) || month<1 || month>12 || month ~= fix(month)
return
end
persistent limit;
if isempty(limit), limit = 0;end
if month == (1:2:11)
limit = 31;
elseif month == (4:2:12)
limit = 30;
elseif month == 2
limit = 28;
end
%leap year part. Month must be february
if year == (0:4:3000) && month == 2
limit = 29;
elseif year == (0:100:3000) && month == 2
limit = 28;
else year == (0:400:3000) && month == 2
limit = 29;
end
if ~isscalar(day) || day<1 || day>limit|| day ~= fix(day)
return;
end
if isscalar(day) && day>=1 && day<=limit
out = true;
end
end
Rik
Rik 2021 年 1 月 16 日
I don't understand your indentation and why you are using a persistent variable. I would also suggest to always make sure that conditionals are scalar. I would also suggest making sure your code can handle dates beyond the year 3000.
Did you use the debugger to step through your code line by line?

サインインしてコメントする。

採用された回答

James Tursa
James Tursa 2019 年 6 月 14 日
編集済み: James Tursa 2019 年 6 月 14 日
All of those if-elseif blocks make the code difficult to read, and difficult to debug as well. I would advise against that approach, and instead tackle each issue one at a time and code only for that issue. That makes the logic of each test much easier to read and to debug. For example, here is an outline of what the code could do using words:
function valid = valid_date(year,month,day)
valid = false; % Set a default return value
% Check for positive integer scalar inputs
if( the year is not a positive integer scalar )
return;
end
if( the month is not a positive integer scalar )
return;
end
if( the day is not a positive integer scalar )
return;
end
% Check for proper month
if( the month is not between 1 and 12 inclusive )
return;
end
% Construct an array of the number of days in each month
days_in_month = a 12-element array of the number of days in each month;
% Check to see if this is a leap year
is_leap_year = (you put some code here to determine if the year is a leap year)
% If it is a leap year, change February number of days to 29
if( is_leap_year )
Change the days_in_month value for February to 29
end
% Check to see if the day number is valid
if( the day is greater than the number of days in the month )
return;
end
% Passed all of our checks, so the date must be valid
valid = true;
return;
end
Once you are satisfied that the words do what you want (you should check this yourself ... maybe I missed something that needs to be checked), then you need to write actual code for all of the worded places. The code you write for this outline will in many places be pieces of the code you have already written in your if-elseif blocks above.

  11 件のコメント

表示 8 件の古いコメント
Adonis Thirafi Hugo Mafaza
Adonis Thirafi Hugo Mafaza 2020 年 10 月 31 日
Hello @Rik, I still don't get why we need to assign valid = false right after and below after we define the function valid_date(...). Could you please explain it?
Rik
Rik 2020 年 10 月 31 日
You don't need to, it is just an easy method. If you do assign false as a kind of default value, you can simply use return to exit the function and say the date is invalid.
Rik
Rik 2020 年 12 月 18 日
You are actually explicitly writing on the public internet that you want to cheat? I admire your courage.
You are correct: it would be much faster to copy code by someone else. However, you would not learn. Next time you will need someone else to make your homework again. If you are in a hurry, that probably means you delayed doing your homework. Why should others come to your rescue?

サインインしてコメントする。

その他の回答 (4 件)

Muthu Dhanush Santh Nagarajan
Muthu Dhanush Santh Nagarajan 2020 年 4 月 9 日
編集済み: Rik 2020 年 4 月 9 日
I have tried this program and i got all the answers correct. Please check
function valid=valid_date(y,m,d)
valid = false;
if(((isscalar(y) && y>=1 && y==fix(y))&& (isscalar(m) && m>=1 && m==fix(m) && m<=12)...
&& (isscalar(d) && d>=1 && d==fix(d) && d<=31))==1)
c1= (ismember(m,[4,6,9,11]) && ismember(d,[1:30]));
c2=(ismember(m,[1,3,5,7,8,10,12]) && ismember(d,[1:31]));
if ((c1==1 || c2==1)==1)
valid = true;
else
if ((mod(y,4)==0&&mod(y,100)~=0 || mod(y,400)==0&&mod(y,100)==0)==1)
if (ismember(d,[1:29])==1)
valid = true;
end
return;
else
if (ismember(d,[1:28])==1)
valid = true;
end
return;
end
end

  2 件のコメント

Rik
Rik 2020 年 4 月 9 日
This function is missing documentation.
And what are the exact requirements of your assignment? You should try to create a test-suite that contains syntaxes that should work and return truie or false, and sytaxes that should return an error.
Also, do you have a question? Because you posted this in the answer section.
Mohammad Aiyoob Rahmani
Mohammad Aiyoob Rahmani 2020 年 6 月 18 日
this code is right
it is working properly

サインインしてコメントする。


Salman P H
Salman P H 2020 年 4 月 28 日
function valid = valid_date(x,y,z)
t = (isscalar(x) && isscalar(y) && isscalar(z));
if t==false
valid = false;
return;
end
if (x<=0 || y<=0 || z<=0)
valid = false;
return;
end
if any(rem([x, y, z], 1))
valid = false;
return;
end
if (((rem(x,4)==0) && (rem(x,100)~=0)) || (rem(x,400)==0))
a=1;
else
a=0;
end
if (x>0) && a==1
if (y==1 || y==3 || y==5 || y==7 || y==8 || y==10 || y==12) && (z>0 && z<=31)
valid = true;
elseif (y==4 || y==6 || y==9 || y==11) && (z>0 && z<=30)
valid = true;
elseif (y==2 && (z>0 && z<=29))
valid = true;
else
valid = false;
end
elseif x>0 && a==0
if (y==1 || y==3 || y==5 || y==7 || y==8 || y==10 || y==12) && (z>0 && z<=31)
valid = true;
elseif (y==4 || y==6 || y==9 || y==11) && (z>0 && z<=30)
valid = true;
elseif (y==2 && (z>0 && z<=28))
valid = true;
else
valid = false;
end
end

  0 件のコメント

サインインしてコメントする。


Rik
Rik 2019 年 6 月 13 日
You can do this two ways:
Option 1 is to do the actual work. Is the input correct? Does the month entered actually have at least as many days as the day input (taking leap years into account)?
Or option 2: cheat by using the builtin functions to convert your input to a datetime scalar, and extract the year,month,day numbers from that. If those match the input, your date is valid. You should still put in a check if the inputs are positive scalars.

  4 件のコメント

表示 1 件の古いコメント
Rik
Rik 2019 年 6 月 24 日
Why are you using neither my suggestion, nor James's?
Also, this is input checking, which you should do before any other processing. Read about the numel function
Divya Nangaru Sudhakar
Divya Nangaru Sudhakar 2019 年 6 月 24 日
I tried executing that function explained by James's, I dint get the output. Can you please help me with this function.
Thank you
Rik
Rik 2019 年 6 月 24 日
James didn't provide a full function, because it is a homework exercise. If you want me to make your homework, first make sure I'll get the points from your teacher. (You can find guidelines for posting homework on this forum here.)
Did you read the documentation for numel? And how did you try to implement either my solution or the solution by James?

サインインしてコメントする。


MOHD FARHAN
MOHD FARHAN 2020 年 6 月 7 日
Can anyone please give me the correct and accepted ans of this question please

  1 件のコメント

Rik
Rik 2020 年 6 月 7 日
Why should other people do your homework?
Also, why did you post this in the answer section?

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by