虽然这个日历表是我自己写的,但是里面有一处逻辑我还是不懂,能正确运行时初次运行后根据错误改的,不懂的那个地方里面已经特别标注了,还望前辈能指点一二。代码如下(没有数据库,复制粘贴到eclipse下就能直接运行):import java.util.Scanner;
public class Daqing7 { /**
 * @param args
 */
public static void main(String[] args) {
int i=0;
int day=0,day1=0,day2=0,day3=0,day4=0,day5=0;
int mon1=31;
int mon2=0;
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
System.out.println("请输入年份:");
int year=input.nextInt();
System.out.println("请输入月份:");
int mon=input.nextInt();
        for(int year1=1900;year1<year;year1++)
        {
         if((year1%4==0&&year1%100!=0)||year1%400==0)//判断是不是闰年
         {
         day=366;//是闰年这一年有366天
         }
         else
         day=365;//不是闰年有365天
         day1=day1+day;//累加  1900年到你输入的年份的前一年有多少天,譬如你输入1902年,这个天数就是1900年和1901年的天数
        }
        for(mon1=0;mon1<mon;mon1++)
        
        {
         mon2=mon1+1;
         switch(mon2)
         {
         case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day5=31;
break;
case 4:
case 6:
case 9:
case 11:day5=30;
break;
case 2:
if((year%4==0&&year%100!=0)||year%400==0)
{
day5=29;
}
else
day5=28;
break;
default:break;
        
         }
         // for(mon1=0;mon1<mon;mon1++)
         switch(mon1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day4=31;
break;
case 4:
case 6:
case 9:
case 11:day4=30;
break;
case 2:
if((year%4==0&&year%100!=0)||year%400==0)
{
day4=29;
}
else
day4=28;
break;
default:break;
}
day2+=day4;//累加你输入的那一年中你输入的月份之前几个月的天数;
        }
        day3=day1+day2;//计算1900年一月一号到你输入的那一年(那一月之前)的天数;
        System.out.println("你输入的这个月距离1900年"+day3+"天");
i=(day3+1)%7;//得到你输入的那个月的一号对应星期几;
System.out.println("你输入的这个月的第一天对应星期:"+i);
System.out.println("日\t一\t二\t三\t四\t五\t六");
for(int j=1;j<=i;j++)
{
System.out.print("\t");//打印空格,日期的第一行对应星期几就打印及格空格;
} for(int k=1;k<=(7-i);k++)//打印日期的第一行,7-i是限制第一行打印从1到几;
{
System.out.print(k+"\t");
}
System.out.println();//第一行打印结束,打印换行;
int p=7-i;

for(int m=8-i;m<=day5;m++)//(8-i)指第二行的第一个数字是几;
/******************************************************************************
 * *******************************************************************************
 * *******************************************************************************
 * *******************************************************************************
 * *******************************************************************************
这里用day5而不用day4是我运行后试出来的,到现在我也弄不懂这里的逻辑,有没有高手解答下
*******************************************************************************
*******************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
*/
{
System.out.print(m+"\t");//打印的是第二行和第二行以后的剩余的天;
for(int n=1;n<=4;n++)//因为从第二行往后,最多还有五行可打印,只需要打印四行换行,所以n<=4;
{
if(p+7*n==m)//如果第一行的最后一个数加上7的整数倍(也就是这一行已经打印7个了)等于当前刚刚打印完的数,则打印换行;
//可以这样理解:当打印到某个数字后,如果这个数字比第一行的最后一个数字大7,或者大14,或者大21,或者大28,就换行;
System.out.println();
}

}
}}

解决方案 »

  1.   

    大概看了一下,你这里day5表示的是当前月份的天数,day4是用来统计当前的年份在当前月份之前有多少天的一个临时变量,最后输出格式的时候当然用的是当前月份的天数day5不是
      

  2.   

    1L已经说了
    day5是统计mon2的天数,mon2=mon1+1,mon1是统计到当前月的前面的月,那么mon1+1就是统计到当前月,而打印的是当前月的天数,所以就是用day5
      

  3.   

    1L正解,day5为当前月份的天数,day4只是用来统计当前月份的之前有多少天看这几行:
     mon2=mon1+1;
    switch(mon2){ day5 }
    switch(mon1){ day4 }