2015-09-13 1 views
0

Итак, я написал этот маленький код матала для проверки даты, но я зациклился на том, как проверить високосный год.Застрял при проверке на високосный год и действительную дату

 date = '01/02/1990'; 
     display('hello') 
     a=strsplit(date,'/'); 
     day = a(1); 
     display(day); 

     %b=strsplit('/',date,'/'); 
     month = a(2); 
     display(month); 

     %c=strsplit('/','/',date); 
     year = a(3); 
     display(year); 

      if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) 
      if (day>=1&&day<=31) 

      display(' Its a valid date') 
     else 
      display(' Its NOT a valid date') 
       end 
      end 

ответ

1

Благодаря @gregswiss за указание моей ошибки в калькуляции високосного года. Это непосредственно включает в себя проверку в код, таким образом, вы не должны включать в себя априорный список високосных лет:

if (mod(year,4) == 0 && mod(year,100) ~= 0) || mod(year,400) == 0 
    disp('Leap year'); 
else 
    disp('Non-leap year'); 
end 

Просто включить это в вашем if заявления так же, как вы проверяете месяцы. Тогда, если ваш год имеет соответствующую запись в LeapYear это високосный год:

if sum(year==LeapYear) 
    disp('This is a leap year') 
end 

Причиной суммы является то, что year==LeapYear будет логический массивом, содержащий 30 значений, из которых 29 ноля и 1 один, если ваш year это действительно високосный год, или он будет содержать 30 нулей.

date = input('Please enter a date in the DD/MM/YYYY format ','s') 
    display('hello') 
    tmp=strsplit(date,'/'); 
    a(1) = str2num(tmp{1}); % Create an array out of your string 
    a(2) = str2num(tmp{2}); 
    a(3) = str2num(tmp{3}); 
    day = a(1); 
    display(day); 

    month = a(2); 
    display(month); 

    year = a(3); 
    display(year); 
    if (mod(year,4) == 0 & mod(year,100) ~= 0) | mod(year,400) == 0 
     disp('Leap year'); 
    else 
     disp('Non-leap year'); 
    end 
     if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) 
     if (day>=1&&day<=31) 

     display(' It is a valid date') 
    else 
     display(' It is NOT a valid date') 
      end 
     end 
+0

Я очень новичок в Matlab, не редактируя код для меня, пожалуйста. –

+0

и будет ли он проверять годы> 2016? –

+0

Ну, нет, но вы можете развернуть это до произвольной даты. Вы можете установить его между -2000 и +6000, если хотите. Я добавлю, как удалить millenia таким образом – Adriaan

2

Согласно Gregorian calendar rules правильный тест на високосный год:

if (mod(year,4) == 0 & mod(year,100) ~= 0) | mod(year,400) == 0 
    disp('Leap year'); 
else 
    disp('Non-leap year'); 
end 

Вы можете с учетом упаковки тест в функции «isLeap» или что-то подобное ...

+1

Хороший тест. Учитывая, что OP хотел, чтобы я написал полный код, я включил его в свой ответ, и теперь все работает отлично, спасибо. – Adriaan

+0

Вы можете использовать '&&' и '||', если хотите. –

0

Код можно сделать более надежным и простым с использованием функции datetime, которая будет обрабатывать разбор и выдавать ошибку, если дата недействительна.

date = '01/02/1990'; 
try 
    d = datetime(date, 'InputFormat', 'dd/MM/yyyy'); 
    % access day, month, year using: d.Day, d.Month and d.Year... 
    % ... 
    disp(' Its a valid date') 
catch 
    disp(' Its NOT a valid date') 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^