我上学的任务是在java中编写一个程序,接受来自System.in.read()的四位数条目;并计算它是否是闰年,然后告诉用户它是否是闰年,然后提供重启程序的选项。此外,如果用户在1582年之前输入一年,它将告诉他们错误,然后是程序重置选项。
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-34-c26e11f8fb81> in <module>()
----> 1 cur.execute(sql)
ProgrammingError: syntax error at or near "c"
LINE 1: COPY sept_2014 (easting,northing,texture) FROM c:\Users\dan\...
^
但出于某种原因,当我重新启动程序并输入一年时,无论如何都会在1582之前说出它,并显示所有行,直到重置提示不停止。
public class RevisedLeapYear {
public static void main(String args[])
throws java.io.IOException {
char restartChoice = 'y';
int readCh, year=0, i;
boolean isLeapYear;
while(restartChoice == 'y' || restartChoice == 'Y'){
System.out.print("Enter target year: ");
for(i = 0; i < 4; i++)//start for
{
readCh = (int)System.in.read();
switch(i) //start switch
{//converts in to 4 digits
case 0: year = (int)((readCh - 48) * 1000); break;
case 1: year = year + (int) ((readCh - 48) * 100); break;
case 2: year = year + (int) ((readCh - 48) * 10); break;
case 3: year = year + (int) (readCh - 48);
}//end switch
}//end for
isLeapYear = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
if(isLeapYear == true && year > 1581){
System.out.println(year + " is a Leap Year! What a time to be alive! \nPress Enter to continue.");
}
else if(isLeapYear == false && year > 1581){
System.out.println(year + " is not a Leap Year... how unfortunate. \nPress Enter to continue.");
}
else{
System.out.println("There are no leap years before 1582! \nPress Enter to continue.");
}
readCh = System.in.read(); // Clear the carriage return in the buffer
readCh = System.in.read(); // Clear the linefeed in the buffer
System.out.print("Reset program? y/n \n");
restartChoice=(char)System.in.read();
}
}
}
编辑:我自己修理了它。问题是这一年没有从缓冲区清除。我把它添加到最后一行。
Enter target year: 2004
2004 is a Leap Year! What a time to be alive!
Press Enter to continue.
Reset program? y/n
y
Enter target year: 2003
There are no leap years before 1582!
Press Enter to continue.
Reset program? y/n
n
BUILD SUCCESSFUL (total time: 21 seconds)
将此作为最终产品。
year=(int)System.in.read();
答案 0 :(得分:1)
你的问题在于处理行尾。
您忘记了用户输入的每个输入后面都是行尾。这可以是回车,回车和换行。
您的程序以四个字节读取。当用户输入这些字节时,他也按 Return 。这会在流中插入一个字节。
因为您告诉用户“按Enter继续”,用户再次按返回。这会在流中插入另一个字节。
然后从流中清除两个字节。您假设已删除回车符和换行符。但实际上你刚刚删除了一年后的回车,以及另外一个被按下的回车。
现在您要求用户y
或n
。但要输入,用户单击 y 和返回。所以他将两个字符输入到流中。 restartChoice
只获取其中一个 - y
或n
,但回车仍在输入流中。然后返回循环的头部,打印提示并启动for
循环。此时,您阅读了回车。只有这样,你才能在明年开始阅读。
因此,如果您的下一年字符串为2003
,那么您在循环中实际得到的是 CR 2 0 0 。您的年度计算变为(13-48)*1000 + (50-48)*100 + (48-48)*10 + (48-48)
- 这是一个非常小的数字,因为第一项是负数。
所以它告诉你你输入的年份是在1580年之前。
Reader
来阅读文字。不要尝试读取原始字节并自行转换它们。首先,您不知道您的机器是否只会在每行末尾输入一个返回或返回和换行。当您更熟练编程时,可以尝试为这些情况编写输入处理程序。但这并不是必需的 - 您已经拥有了可以使用的各种Reader
,或Scanner
这对初学者来说非常好。还有逻辑错误的问题。您不应该在for
内使用switch
。由于您已经在交换机中单独编写了每个操作,因此您可以完全删除该循环并直接检查字符:
System.out.print("Enter target year: ");
readCh = (int) System.in.read();
year = (int) ((readCh - 48) * 1000);
readCh = (int) System.in.read();
year = year + (int) ((readCh - 48) * 100);
readCh = (int) System.in.read();
year = year + (int) ((readCh - 48) * 10);
readCh = (int) System.in.read();
year = year + (int) (readCh - 48);
这不比循环中的开关简单吗?
答案 1 :(得分:0)
我稍微重新安排了您的代码,并将System.in.read()
替换为Scanner。之后一切正常。问题出在您的System.in.read()
声明中。
public static void main(String[] args)
{
char restartChoice = 'y';
int year=0;
boolean isLeapYear;
Scanner scn = new Scanner(System.in);
while(restartChoice == 'y' || restartChoice == 'Y'){
System.out.print("Enter target year: ");
year = Integer.parseInt(scn.nextLine());
isLeapYear = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
if(isLeapYear && year > 1581)
System.out.println(year + " is a Leap Year! What a time to be alive! \nPress Enter to continue.");
else if(!isLeapYear && year > 1581)
System.out.println(year + " is not a Leap Year... how unfortunate. \nPress Enter to continue.");
else
System.out.println("There are no leap years before 1582! \nPress Enter to continue.");
System.out.print("Reset program? y/n \n");
restartChoice = scn.nextLine().charAt(0);
}
}
答案 2 :(得分:0)
问题不在于你的if else语句,而在于System.in.read()是如何在第二次读取它的,因为它没有再次读取它。
您可能想了解如何使用扫描仪。