查找给定日期的一天

Eli*_*man 2 perl

#!/usr/bin/perl

@month = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
@week = ("Sunday", "Monday","Tuesday", "Wednesday","Thursday", "Friday", 
    "Saturday");

print "date:\n";
$date=<STDIN>;
print "mon:\n";
$mon=<STDIN>;
print "year:\n";
$year=<STDIN>;

if ( ($year % 400 == 0) || ($year % 4 == 0) && ($year % 100 != 0) )
{
    $month[1] = 29 ;
    for($i = 0 ; $i < $mon - 1 ; $i++)
    {       
        $s = $s + $month[$i] ;
        $s = $s + ($date + $year + ($year / 4) - 2) ;
        $s = $s % 7 ;
    }
}
print $week[$s+1] ;
Run Code Online (Sandbox Code Playgroud)

我一直在努力学习perl几天,然后我编写了代码来查找给定日期的那一天.实际上我从C代码转换了这个.但它不成功.输出始终是星期一.我在哪里弄错了?

mob*_*mob 5

正如@Chris Turner指出的那样,代码中没有路径可以处理不是闰年的情况.要解决此问题并实现既定目标,只需对代码进行一处小改动即可.

if( ($year % 400 == 0) || ($year % 4 == 0) && ($year % 100 != 0) ) {
   $month[1] = 29 ;
   for($i = 0 ; $i < $mon - 1 ; $i++) {
      ...
   }
}
print $week[$s+1] ;
Run Code Online (Sandbox Code Playgroud)

应该重写并重新缩进为

if( ($year % 400 == 0) || ($year % 4 == 0) && ($year % 100 != 0) ) {
   $month[1] = 29 ; 
}
for($i = 0 ; $i < $mon - 1 ; $i++) {
   ...
}
print $week[$s+1] ;
Run Code Online (Sandbox Code Playgroud)

因此$month[1]只会针对闰年进行更新,但for循环中的代码始终会运行.


经验丰富的Perl程序员也会建议您开始使用每个脚本

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

因为这些pragma促进了良好的编程实践,并有助于在开发早期发现许多错误.他们没有帮助解决这个问题,但如果你开始使用它们,他们将帮助解决下一个问题.