要求输入年、月、日得到星期几和该月的日历
做得自己都发觉很烂,不知道怎么改进,请达人指点import java.util.Scanner;
class  WNL2
{
public static void main(String[] args) 
{
Scanner sc=new Scanner(System.in);
int a=4,c=1970,d,x=0,b,m,q;
System.out.print("请输入大于1969年的年份:");
do{
b=sc.nextInt();
if (b<1970){
System.out.print("无效,请重新输大于1969的年份:");
}
}while(b<1970);
System.out.print("请输入月:");
do{
m=sc.nextInt();
if (m<1||m>12){
System.out.print("无效,请重新输1~12之间的月份:");
}
}while(m<1||m>12);
System.out.print("请输入日:");
do{
q=sc.nextInt();
if (q<1||q>31){
System.out.print("无效,请重新输1~31之间的日期:");
}
}while(q<1||q>31);
if (m==2&&q>28&&!((b%4==0&&b/100!=0)||b/400==0)){
System.out.print("无效,请重新输1~28之间的日期:");
q=sc.nextInt();
}
if (m==2&&q>29&&((b%4==0&&b/100!=0)||b/400==0)){
System.out.print("无效,请重新输1~29之间的日期:");
q=sc.nextInt();
}
System.out.println("--------------------------------------------------------------------------");
//以1970年1月1日星期4为参照;
d=b-c;
for (int i=0;i<d ;i++ ){
c++;
if ((c%4==0&&c/100!=0)||c/400==0){
x++; //x计数器为闰年增加的天数;
continue;
}
}
int z=(d+x)%7; //z为增加天数取模(一个星期为7天);
if ((c%4==0&&c/100!=0)||c/400==0){
z=(d+x-1)%7; //如果该年是闰年则要减去多加的一天;
}
int y=a+z; //y为4加上d年后多余的天数;
if (a+z>7){
y=a+z-7; //如果大于7则是下一个星期;
}
int s=0; //用一个数组定义12个月的天数;
int [] array=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
for (int j=0;j<m-1 ;j++ ){
if ((c%4==0&&c/100!=0)||c/400==0){
array[1]=29; //闰年则二月29天;
}
s+=array[j];
}
int w=(s+q)%7+y;
if (w>7){
w=w-7; //当w-7的值为1时,则为星期天;
}
switch(w){
case 2:System.out.println("您查询的日期是:星期一");break;
case 3:System.out.println("您查询的日期是:星期二");break;
case 4:System.out.println("您查询的日期是:星期三");break;
case 5:System.out.println("您查询的日期是:星期四");break;
case 6:System.out.println("您查询的日期是:星期五");break;
case 7:System.out.println("您查询的日期是:星期六");break;
case 8:System.out.println("您查询的日期是:星期天");break;
default :System.out.println("您查询的日期是:星期天");
}
System.out.println("--------------------------------------------------------------------------");
//================================================以上为查询某日星期几的代码;
System.out.println((m)+"月的所有日期为:");
int l=s%7+y;
if (l>7){
l=l-7;
} //l代表每个月1号星期几;
//System.out.println(l);
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
for (int e=0;e<1 ;e++ ){
int o=0;
for (int h=0;h<l ;h++ ){ //需输入空格的次数;
if (l==7) //当此月的第一天为星期一时,跳出;
{
break;
}
o++;
System.out.print("\t");
}
for (int p=1;p<=array[m-1] ;p++ ){ //从第几个开始输入日期(m-1)的意思为:在数组中存储的m月的天数下标是m-1;
System.out.print(p+"\t");
if (o+p==7||(o+p)%7==0){ //输到星期六则换行;
System.out.println();
}
}

}
}
}

解决方案 »

  1.   

    昏倒,你为什么不用java.util.Calendar来搞,查下API
      

  2.   

    问题偶是初学啊。。
      API现在都看不懂哦!!
    所以搞得我郁闷啊
      

  3.   

    太强了竟然可以自己算.
    推荐Calendar
      

  4.   

    新手写这么多挺有毅力了.看API是必须的,一开始很挣扎,都有个过程.推荐看英文的,技术想提高,必须多看英文书
      

  5.   

    谢谢你的建议!3Q
             tianyesky 
      

  6.   

    LZ非常有前途啊
    不过这样写有点像C了。
      

  7.   

    这是我写,参考一下。//PrintCalendar.java:Print a calendar for a given month in a year
    import javax.swing.JOptionPane;public class PrintCalendar{
    /**main method*/
    public static void main(String[] args){
    //prompt user to input year
    String yearString=JOptionPane.showInputDialog(null,"Enter full year (i.e. 2001)",
    "Example 4.6 Input",JOptionPane.QUESTION_MESSAGE);//convert yearString into a integer
    int year=Integer.parseInt(yearString);

    //prompt user to input month
    String monthString=JOptionPane.showInputDialog(null,"Enter month in number between 1 and 12",
    "Example 4.6 Input",JOptionPane.QUESTION_MESSAGE);//conbert monthString into a integer
    int month=Integer.parseInt(monthString);//print the calendar
    printMonth(year,month);

    }

    /**printMonth method*/
    static void printMonth(int year,int month){
    //print calendar title
    printMonthTitle(year,month);//getstartDay
    int startDay=getStartDay(year,month);//getnumOfDays
    int numOfDaysInMonth=getNumOfDaysInMonth(year,month);//print monthbody
    printMonthBody(startDay,numOfDaysInMonth);
    }

    /**get startDay*/
    static int getStartDay(int year,int month){
    int startDay1800=3;
    return (int)(startDay1800+getTotalNumOfDays(year,month))%7;
    }

    //get totalNumOfDays
    static long getTotalNumOfDays(int year,int month){
    long total=0;
    for(int i=1800;i<year;i++)
    if(isLeapYear(i))
    total+=366;
    else total+=365;for(int j=1;j<month;j++)
    total+=getNumOfDaysInMonth(year,j);
    return total;
    }

    //get numOfDaysInMonth
    static int getNumOfDaysInMonth(int year,int month){
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
    return 31;
    else if(month==4||month==6||month==9||month==11)
    return 30;
    else if(month==2)
         if(isLeapYear(year))
         return 29;
         else return 28;
     else return 0;    
         }
         
    //judge wether a year is l leapyear
    static boolean isLeapYear(int year){
    if((year%400==0)||((year%4==0)&&(year%100!=0)))
    return true;
    else
    return false;
    }     //print monthbody
    static void printMonthBody(int startDay,int numOfDaysInMonth){
    for(int i=0;i<startDay;i++)
    System.out.print("    ");
    for(int j=1;j<=numOfDaysInMonth;j++){
    if(j<10)
    System.out.print("   "+j);
    else
    System.out.print("  "+j);
    if((startDay+j)%7==0)
    System.out.println();
    }
    }

    //print printMonthTitle
    static void printMonthTitle(int year,int month){
    System.out.println("         "+getMonthName(month)+"  "+year);
    System.out.println("----------------------------");
    System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
    }

    //get monthName
    static String getMonthName(int month){
    String monthName=" ";
    switch(month){
    case 1:monthName="January";break;
    case 2:monthName="February";break;
    case 3:monthName="March";break;
    case 4:monthName="April";break;
    case 5:monthName="May";break;
    case 6:monthName="June";break;
    case 7:monthName="July";break;
    case 8:monthName="August";break;
    case 9:monthName="September";break;
    case 10:monthName="October";break;
    case 11:monthName="November";break;
    case 12:monthName="December";break;
    }
    return monthName;
    }
    }