我正在创建此程序,该程序将打印用户输入的日期的日历。在我的方法“ dayOfWeek()”中,该公式采用日月和年份的两种类型,并计算介于0到6之间的数字,该数字等于星期几。 但是我的方法总是返回2,经过一些测试,我发现没有任何get方法(getDay(),getMonth(),getYear())都返回值。
命令行输入为“ dd / mm / yyyy”,分为主要部分。在dayofweek()方法中,它总是返回2或星期一(因为它是分配给2的值)。但是,在定义变量q,m,K和J时,它们都设置为0
谁能看到逻辑错误? (编辑,某些缩进有些偏离)
class MyCalendar
{
private MyDate myDate;
private Day day;
int dayofmonth, month, year;
public static void main(String[] args)
{
String userinput = args[0];
String[] splitdate = userinput.split("/");
int dayofmonth = Integer.parseInt(splitdate[0]);
int year = Integer.parseInt(splitdate[2]);
int month = Integer.parseInt(splitdate[1]);
if (month <= 2)
{
month = month + 12;
}
MyDate myDate = new MyDate(dayofmonth, month, year);
MyCalendar mycal = new MyCalendar(myDate);
Scanner scanner = new Scanner(System.in);
while (myDate.isDateValid() == false)
{
System.out.print("Date is not valid. Please input a valid date: ");
userinput = scanner.nextLine();
splitdate = userinput.split("/");
dayofmonth = Integer.parseInt(splitdate[0]);
year = Integer.parseInt(splitdate[2]);
month = Integer.parseInt(splitdate[1]);
if (month <= 2)
{
month = month + 12;
}
myDate.isDateValid();
}
System.out.println(myDate.getDay() + " " + myDate.getMonth() + " " + myDate.getYear() + " " + mycal.dayOfWeek());
}
public MyCalendar(MyDate myDate)
{
this.myDate = myDate;
}
public Day dayOfWeek()
{
MyDate Date = new MyDate(dayofmonth, month, year);
Day myDay = Day.Sunday;
int q = Date.getDay();
int m = Date.getMonth();
int K = (Date.getYear()%100);
int J = (Date.getYear()/100);
int h = ((q + ((13*(m+1))/5) + K + (K/4) + (J/4) + 5*J)%7);
System.out.println(h + " " + q + " " + m + " " + K + " " + J);
if (h == 0){
myDay = Day.Saturday;
return myDay;
}
if (h == 1){
myDay = Day.Sunday;
return myDay;
}
if (h == 2){
myDay = Day.Monday;
return myDay;
}
if (h == 3){
myDay = Day.Tuesday;
return myDay;
}
if (h == 4){
myDay = Day.Wednesday;
return myDay;
}
if (h == 5){
myDay = Day.Thursday;
return myDay;
}
if (h == 6){
myDay = Day.Friday;
return myDay;
}
System.out.println(q + " " + m + " " + K + " " + J);
return myDay;
}
public int weekOfMonth()
{
int week = 0;
return week;
}
public void printCalendar()
{
}
}
class MyDate
private int day;
private int month;
private int year;
public MyDate(int day, int month, int year)
{
this.day = day;
this.month = month;
this.year = year;
}
public int getDay()
{
return day;
}
public int getMonth()
{
return month;
}
public int getYear()
{
return year;
}
答案 0 :(得分:1)
让我们这样思考:
1)MyDate
代码很简单。构造函数和获取器。我看不到任何错误。
2)MyDate
实例的创建和使用方式如下:
MyDate Date = new MyDate(dayofmonth, month, year);
Day myDay = Day.Sunday;
int q = Date.getDay();
int m = Date.getMonth();
int K = (Date.getYear()%100);
int J = (Date.getYear()/100);
此处存在一些令人震惊的样式错误(Date
应该是date
,以此类推),这使得这很难理解。有经验的Java程序员在看到Date.getDay()
之后会做一番尝试。但这是一条红鲱鱼。
3)真正的问题是dayofmonth
,month
和year
的值从哪里来?答案:它们被声明为MyCalendar
的字段。
int dayofmonth, month, year;
4)它们在哪里初始化?答:无处!您似乎正在尝试通过main
方法初始化它们,如下所示:
int dayofmonth = Integer.parseInt(splitdate[0]);
int year = Integer.parseInt(splitdate[2]);
int month = Integer.parseInt(splitdate[1]);
但是请仔细看!您实际上是在声明和初始化局部变量 ...而不是MyCalendar
实例的实例字段。因此,信息不会到达您的代码需要的地方。
您需要重新设计您的代码。例如,问自己为什么MyCalendar
既有myDate
字段又有dayofmonth
,month
和year
字段?
仔细研究信息流。
@ScaryWombat恰当地评论:
是的...您需要一些思考和发展。
(理论上,我们可以为您重写代码,但是您自己动手即可学到很多东西。特别是“思考”部分。)