题目集1~3的总结性Blog
(1)前言
题目集1主要是考察了我们的JAVA基础知识,例如题目集1 7-1
就是一个非常简单的只有输入输出还有一个很简单的求和语句的程序,题目集1题目难度从简单到中等,由易入难,难度逐渐上升,这一点很好,第二题除了输入输出以外还加入了判断条件
还是比较简单的。题目集1的难度总体上看。
题目集1,主要是考察我们,输入输出,判断条件方面的知识是否过关
到了题目集2,就开始考察我们更加复杂的输入输出以及判断条件了,输入32位数字字符串转为十进制格式表示的IP地址输出。合并两个升序排序的整型数组为一个新的升序整型数组并输出。还有经典题型,与日期相关的题目,等等。
题目集2总的还是考察我们输入输出,判断条件等知识点。相对题目集1来说难度高一点点。
题目集3的话,开始考察我们类的相关知识,自己定义一个类,定义类的属性,用自己定义的类来输入一个变量,对类的属性有get,set操作等等。
我个人觉得,题目难度适中,题目集的题目都是从简单到难,由简到难,题量适中。
(2)设计与分析
题目集1 7-1
源代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a = input.nextInt();
int b = input.nextInt();
int sum=a+b;
System.out.println(sum);
}
}
题目集1还是比较简单的,就只有三条关键语句,输入
int a = input.nextInt();
int b = input.nextInt();
求和
int sum=a+b;
输出
System.out.println(sum);
总的来说没什么难度。
题目集1 7-2
源代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String a = input.next();
char b =a.charAt(0);
if((b>='a'&&b<='z')||(b>='A'&&b<='Z'))
{
if(b>='a'&&b<='c'||b>='A'&&b<='C')
{
System.out.println("2");
}
if(b>='d'&&b<='f'||b>='D'&&b<='F')
{
System.out.println("3");
}
if(b>='g'&&b<='i'||b>='G'&&b<='I')
{
System.out.println("4");
}
if(b>='j'&&b<='l'||b>='J'&&b<='L')
{
System.out.println("5");
}
if(b>='m'&&b<='o'||b>='M'&&b<='O')
{
System.out.println("6");
}
if(b>='p'&&b<='s'||b>='P'&&b<='S')
{
System.out.println("7");
}
if(b>='t'&&b<='v'||b>='T'&&b<='V')
{
System.out.println("8");
}
if(b>='w'&&b<='z'||b>='W'&&b<='Z')
{
System.out.println("9");
}
}
else
{
System.out.println(a+" is an invalid input");
}
}
}
题目集1 7-2,主要是考察我们输入字符串的知识点,并且还要取输入字符串的第一个字母来判断。最后输出2-9
关键语句就是
String a = input.next();
char b =a.charAt(0);
第一条是输入字符串a的语句,第二条语句是取字符串a的第0个字符,并且赋值给b。
后面就是很简单的判断语句了,最后按照题目输出。
题目集1 7-3
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a = input.nextInt();
if(a>=0)
{
if(a<60)
{
System.out.println("E");
}
if(a>=60&&a<70)
{
System.out.println("D");
}
if(a>=70&&a<80)
{
System.out.println("C");
}
if(a>=80&&a<90)
{
System.out.println("B");
}
if(a>=90)
{
System.out.println("A");
}
}
else
{
System.out.println(a+" is an invalid input");
}
}
}
很简单的一个输入,判断,输出程序,没什么好说的。
题目集1 7-4
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
float c=0;
Scanner input = new Scanner(System.in);
int a = input.nextInt();//a为户型
double b = input.nextDouble();//b为应纳税所得额
if(b >= 0) {
if(a == 0)
{
if(b < 8350)
c = (float) (b * 0.1);
else if(b <= 33950)
c = (float) ((b - 8350) * 0.15 + 835);
else if(b <= 82250)
c = (float) ((b-33950) * 0.25 + 4675);
else if(b <= 171550)
c = (float) ((b - 82250) * 0.28 + 16750);
else if(b <= 372950)
c = (float) ((b - 171550) * 0.33 + 41754);
else
c = (float) (108216+(b-372950) * 0.35);
System.out.println(c);
}
else if(a == 1)
{
if(b <= 16700)
c = (float) (0.1 * b);
else if(b <= 67900)
c = (float) (1670 + 0.15 * (b - 16700));
else if(b <= 137050)
c = (float) (9350 + 0.25 * (b - 67900));
else if(b <= 208850)
c = (float) (0.28 * (b-137050) + 26637.5);
else if(b <= 372950)
c = (float) (0.33 * (b - 208850) + 46741.5);
else
c = (float) (0.35 * (b-372950) + 100894.5);
System.out.println(c);
}
else if(a == 2)
{
if(b <= 8350)
c = (float) (0.1 * b);
else if(b <= 33950)
c = (float) (0.15 * (b - 8350) + 835);
else if(b <= 68525)
c = (float) (0.25 * (b - 33950) + 4675);
else if(b <= 104425)
c = (float) (0.28 * (b - 68525) + 13318.75);
else if(b <= 186475)
c = (float) (0.33 * (b - 104425) + 23370.75);
else
c = (float) (0.35 * (b - 186475) + 50447.25);
System.out.println(c);
}
else if(a == 3)
{
if(b <= 11950)
c = (float) (0.1 * b);
else if(b <= 45500)
c = (float) (0.15 * (b - 11950) + 1195);
else if(b <= 117450)
c = (float) (0.25 * (b - 45500)+6227.5);
else if(b <= 190200)
c = (float) (0.28 * (b - 117450)+24215);
else if(b <= 372950)
c = (float) (0.33 * (b - 190200)+44585);
else
c = (float) (0.35 * (b - 372950)+104892.5);
System.out.println(c);
}
else
{
System.out.println("Wrong Format");
}
}
else
System.out.println("Wrong Format");
}
}
这个题目是有关于税率的一道题目,是分户型判断最后输出的题。还是比较简单的。
题目集1 7-5
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double m = input.nextDouble();
int a,b,c,d,e,f,g;
a=(int)(m/10);
b=(int)(m-a*10)/5;
c=(int)((m-a*10-b*5)/1);
d=(int)((m-a*10-b*5-c)/0.5);
e=(int)((m-a*10-b*5-c-0.5*d)/0.1);
f=(int)((m-a*10-b*5-c-0.5*d-0.1*e)/0.02);
g=(int)((m-a*10-b*5-c-0.5*d-0.1*e-0.02*f)/0.01);
System.out.println(a+" 张十元");
System.out.println(b+" 张五元");
System.out.println(c+" 张一元");
System.out.println(d+" 张五角");
System.out.println(e+" 张一角");
System.out.println(f+" 张贰分");
System.out.println(g+" 张壹分");
}
}
和前面几道题类似,输入,计算,输出。
题目集1 7-6
源代码
import java.util.Scanner;
public class Main {
public static double average(int[] arr) {
int sum = 0;
for(int i = 0; i < 5; i++) {
sum += arr[i];
}
return sum / 5;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] a = new int [5];
for(int i = 0; i < 5; i++) {
a[i] = input.nextInt();
}
double b = average(a);
System.out.println(b);
}
}
这个题是要求我们输入一串数字,存储到数组中,最后计算平均值输出,使用一个for循环变例数组相加就好了,最后返回平均值,输出平均值。
题目集1 7-7
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int i,j,k;
int n =input.nextInt();
int [] a = new int [n];
for(i=0; i<n; i++) {
a[i] = input.nextInt();
}
for(i=1;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(a[i]<a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
System.out.print("The sorted numbers are:");
for(i=0;i<n;i++)
{
System.out.print(a[i]+" ");
}
}
}
这是一道排序的题目,用户先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
我用的是冒牌排序,两个for循环嵌套,最后将数组从小到大排序,最后得到的数组再遍历输出。
for(i=1;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(a[i]<a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
题目集1 7-8
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double i =input.nextDouble();
double j =input.nextDouble();
double k =input.nextDouble();
if((i<=200&&i>=1)&&(j<=200&&j>=1)&&(k<=200&&k>=1))
{
if(i+k<=j||i+j<=k||j+k<=i)
{
System.out.println("Not a triangle");
}
else
{
if(i==j&&j==k)
{
System.out.println("Equilateral triangle");
}
else if(((i*i+j*j==k*k)||(i*i+k*k==j*j)||(j*j+k*k==i*i))&&((i==j)||(i==k)||(j==k)))
{
System.out.println("Isosceles right-angled triangle");
}
else if(((i==j)&&j!=k)||((i==k)&&(i!=j))||((j==k)&&(i!=j))&&(i*i+j*j!=k*k)&&(i*i+k*k!=j*j)&&(j*j+k*k!=i*i))
{
System.out.println("Isosceles triangle");
}
else if(((i*i+j*j==k*k)||(i*i+k*k==j*j)||(j*j+k*k==i*i))&&(i!=j)&&(i!=k)&&(j!=k))
{
System.out.println("Right-angled triangle");
}
else
{
System.out.println("General triangle");
}
}
}
else
{
System.out.println("Wrong Format");
}
}
}
这道题,判断条件比较复杂,各个三角形都有相交的部分,比如,等腰直角三角形既是等腰三角形也是直角三角形,也是一般三角形,但是输出只能是等腰直角三角形,不能输出别的。我觉得这道题我考虑的还是比较正确的,但是第14个要点还是错了我不知道哪里错了。
我先判断的是三条边,i,j,k是否都在1-200的区间内,如果不在的话直接输出Wrong Format,程序结束。如果都在区间内,则继续判断i,j,k能不能组成一个三角形,判断条件是i+k<=j||i+j<=k||j+k<=i,如果满足,直接输出Not a triangle,程序结束。如果i,j,k能构成一个三角形,则判断是否i==j&&j==k,如果满足,则输出Equilateral triangle,程序结束,
判断等腰直角三角形的判断条件((i*i+j*j==k*k)||(i*i+k*k==j*j)||(j*j+k*k==i*i))&&((i==j)||(i==k)||(j==k)),如果满足则输出,程序结束
如果不满足,再判等腰三角形的判断条件((i==j)&&j!=k)||((i==k)&&(i!=j))||((j==k)&&(i!=j))&&(i*i+j*j!=k*k)&&(i*i+k*k!=j*j)&&(j*j+k*k!=i*i),如果满足则输出,程序结束。
如果不满足,再判断直角三角形的判断条件((i*i+j*j==k*k)||(i*i+k*k==j*j)||(j*j+k*k==i*i))&&(i!=j)&&(i!=k)&&(j!=k),如果满足则输出,程序结束。
如果都不满足以上条件,但是满足在1-200的区间内,则输出"General triangle",程序结束。这道题我觉得我想的很周密了,但是我不知道为什么第14个判断点还是错了。

这是一组构成等边三角形的数据,等边三角形判断比较简单而且条件也能构成等腰三角形,所以判断条件我放在最前面,先判断数据是否满足1-200之间,再判断能否构成三角形,然后就判断能否构成等边三角形,如果是的话直接输出,不是再判断是否是别的类型的三角形。
if((i<=200&&i>=1)&&(j<=200&&j>=1)&&(k<=200&&k>=1))
{
if(i+k<=j||i+j<=k||j+k<=i)
{
System.out.println("Not a triangle");
}
else
{
if(i==j&&j==k)
{
System.out.println("Equilateral triangle");
}

这是一组能构成等腰三角形的数据
,判断等腰三角形的条件我放在,等边三角形,等腰直角三角形后面,因为等边三角形和等腰直角三角形都满足等腰三角形的判断条件,所以得放在他们后面,不然输入等边三角形和等腰直角三角形的数据的时候会输出等腰三角形,显然这是不符合题目要求的。
else if(((i==j)&&j!=k)||((i==k)&&(i!=j))||((j==k)&&(i!=j))&&(i*i+j*j!=k*k)&&(i*i+k*k!=j*j)&&(j*j+k*k!=i*i))
{
System.out.println("Isosceles triangle");
}

这是一组错误数据,即数据中有数据不满足1-200的范围,我把是否是错误数据的判断放在第一层,如果数据输入错误的话就不用判断是什么三角形了,直接输出wrong format
if((i<=200&&i>=1)&&(j<=200&&j>=1)&&(k<=200&&k>=1))

这是一组直角三角形的数据,如果满足两条边平方之和等于第三条边的平方且能构成一个三角形,那么输出直角三角形,直角三角形的判断条件放在等腰直角三角形之后,因为如果满足等腰直角三角形的判断条件的话,那么也满足直角三角形的判断条件,所以得先判断是否是等腰直角三角形

如果任意两边之和小于第三边的话那么不能构成一个三角形

普通三角形的判断条件放在所有特殊三角形的后面,最后来判断防止错误输出
题目集2 7-4
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int year,month,day;
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31)
{
if((!(year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>28)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>29)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==4||month==6||month==9||month==11)&&day>30)
{
System.out.println("Wrong Format");
System.exit(0);
}
// if((year%4==0&&year%100!=0)||year%400==0)
// {
// System.out.printf("%d is a leap year.\n",year);
// }
// else
// {
// System.out.printf("%d is not a leap year.\n",year);
// }
switch(month)
{
case 1:
if(day==31)
{
day=1;
month++;
}
else
day++;
break;
case 2:
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 3:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 4:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 5:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 6:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 7:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 8:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 9:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 10:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 11:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 12:
if(day==31)
{
year++;
month=1;
day=1;
}
else
{
day++;
}
break;
}
System.out.println("Next date is:"+year+"-" + month + "-" + day);
}
else
{
System.out.println("Wrong Format");
}
}
}
这个题目是求下一天,先输入年,月,日
int year,month,day;
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
再对输入的年月日进行判断,是否满足约束条件year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31
如果满足则继续
if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>28)
{
System.out.println("Wrong Format");
System.exit(0);
}
如果输入的年不是闰年但是输入2月的时候日期大于28,那输出Wrong Format,程序结束
如果满足输入条件则继续
if(((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>29)
{
System.out.println("Wrong Format");
System.exit(0);
}
如果输入的年是闰年但是输入2月的时候日期大于29,那输出Wrong Format,程序结束
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==4||month==6||month==9||month==11)&&day>30)
{
System.out.println("Wrong Format");
System.exit(0);
}
如果输入1,3,5,7,8,10,12月的时候输入的日期大于31,那输出Wrong Format,程序结束
输入4,6,9,11月的时候日期大于30,那输出Wrong Format,程序结束
判断下一天
switch(month)
{
case 1:
if(day==31)
{
day=1;
month++;
}
else
day++;
break;
我用了一个switch方法,
1月时,如果day==31,那么将月+1,day赋值为1,如果不是1月31号的话,day加1;
比较麻烦的就是2月了
case 2:
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
break;
如果是闰年,那么当day是29的时候,month变为3,day赋值为1
如果不是闰年,当day是28的时候,month变为3,day赋值为1
当day小于28的时候那么不用判断,直接将day加1
3-11月都和1月类似,这里不一一叙述了
case 12:
if(day==31)
{
year++;
month=1;
day=1;
}
else
{
day++;
}
break;
}
12月的时候,如果day==31,则year+1,month赋值为1,day赋值为1。如果day不等于31,则day++;
最后输出System.out.println("Next date is:"+year+"-" + month + "-" + day)。

输入2020 3 10,这个比较简单,下一天就是2020 3 11,在日上加一天就好,有关代码
case 3:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;

这是一组错误输入的数据,因为题目要求年份在1820-2020年之间,显然2025年超出了该范围,第一层判断直接过不去,输出wrong format
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31)

输入2019 2 29日会正确输出错误信息,因为2019年是平年没有29号
if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>28)
{
System.out.println("Wrong Format");
System.exit(0);
}

代码健壮性还是很好的,我考虑到了很多种情况,所以任何情况下都能正确的输出结果,平年2月28日下一天是平年的3月1日,闰年2月29日的下一天是闰年的3月1日

2000年是平年,没有29日

各种输入都是正确的
题目集2 7-5
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int year,month,day,n,m;
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
n = input.nextInt();
m=n;
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31&&n>=-10&&n<=10)
{
if((!(year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>28)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>29)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==4||month==6||month==9||month==11)&&day>30)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(n>0)
{
while(n!=0) {
switch (month){
case 1:
if(day==1)
{
year--;
month=12;
day=31;
}
else
{
day--;
}
break;
case 2:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
case 3:
if(day==1)
{
if(year%4==0&&year%100!=0)
{
month--;
day=29;
}
else if((!(year%4==0&&year%100!=0)))
{
month--;
day=28;
}
}
else
{
day--;
}
break;
case 4:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
case 5:
if(day==1)
{
month--;
day=30;
}
else
{
day--;
}
break;
case 6:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
case 7:
if(day==1)
{
month--;
day=30;
}
else
{
day--;
}
break;
case 8:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
case 9:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
case 10:
if(day==1)
{
month--;
day=30;
}
else
{
day--;
}
break;
case 11:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
case 12:
if(day==1)
{
month--;
day=30;
}
else
{
day--;
}
break;
}
n--;
if(n==0)
{
System.out.println(m+" days ago is:" + year + "-" + month + "-" + day);
System.exit(0);
}
}
}
if(n<0)
{
while(n!=0)
{
switch (month){
case 1:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 2:
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
else if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 3:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 4:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 5:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 6:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 7:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 8:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 9:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 10:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 11:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 12:
if(day==31)
{
year++;
month=1;
day=1;
}
else
{
day++;
}
break;
}
n++;
if(n==0)
{
System.out.println(m+" days ago is:" + year + "-" + month + "-" + day);
System.exit(0);
}
}
}
}
if(n==0)
{
System.out.println(m+" days ago is:" + year + "-" + month + "-" + day);
System.exit(0);
}
else
{
System.out.println("Wrong Format");
}
}
}
其他的都和上一题一样,这一题我在switch循环外加了一个while循环
if(n>0)
{
while(n!=0) {
switch (month){
n是用户输入的前n天或者后n天,如果n大于0的话,每次while循环后把n--,switch内,day减一天,如果是1月到1号的话
,就把month赋值为12,year减一,如果不是1月,但是day==1的话,把day设置为上一个月的最后一天,month减1。
最后n变为0的时候,输出year,month,day,就是需要的结果。
如果n<0的话,每次while循环后把n++就好了,其他的操作差和上一题一样。

2018 6 19 的前8天是2018 6 11 ,执行了8次
case 6:
if(day==1)
{
month--;
day=31;
}
else
{
day--;
}
break;
这个操作,因为8要进行8次n--操作才会等于零,不然while循环将会一直进行

有关代码
case 3:
if(day==1)
{
if(year%4==0&&year%100!=0)
{
month--;
day=29;
}
else if((!(year%4==0&&year%100!=0)))
{
month--;
day=28;
}
}
else
{
day--;
}
n大于0的时候是判断前几天,所以要在3月的时候判断,是否是闰年,如果是闰年,那么day=29,不是闰年,day=28

有关代码
case 2:
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
else if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
如果是n小于0,那么判断的是n天后的日期,在2月的时候进行判断,是否是闰年,如果是闰年那么在在29号的时候下一天才是3月1日,如果不是闰年那么在28号的时候下一天就是3月1日了
题目集3 7-2
源代码
import java.util.Scanner;
public class Main {
private int year;
private int month;
private int day;
int[] y= new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
public Main(){
this.year=0;
this.month=0;
this.day=0;
}
public Main(int year,int month,int day) {
this.year=year;
this.month=year;
this.day=year;
}
public int getYear(){
return this.year;
}
public void setYear(int year) {
this.year=year;
}
public int getMonth(){
return this.month;
}
public void setMonth(int month) {
this.month=month;
}
public int getDay(){
return this.day;
}
public void setDay(int day) {
this.day=day;
}
public boolean isLeapYear(int year) {
if((year%4==0&&year%100!=0)||year%400==0)
{
// System.out.printf("%d is a leap year.\n",year);
return true;
}
else
{
// System.out.printf("%d is not a leap year.\n",year);
return false;
}
}
public boolean checkInputValidity(int year,int month,int day) {
if(this.year>=1900&&this.year<=2000&&this.month>=1&&this.month<=12&&this.day>=1&&this.day<=31)
{
if((!isLeapYear(this.year))&&this.month==2&&this.day>=29)
{
System.out.println("Date Format is Wrong");
return false;
}
if(!(isLeapYear(this.year))&&this.month==2&&this.day>28)
{
System.out.println("Date Format is Wrong");
return false;
}
if((isLeapYear(this.year)&&this.month==2&&this.day>29))
{
System.out.println("Date Format is Wrong");
return false;
}
if((this.month==1||this.month==3||this.month==5||this.month==7||this.month==8||this.month==10||this.month==12)&&this.day>31)
{
System.out.println("Date Format is Wrong");
return false;
}
if((this.month==4||this.month==6||this.month==9||this.month==11)&&this.day>30)
{
System.out.println("Date Format is Wrong");
return false;
}
else
{
return true;
}
}
else
{
System.out.println("Date Format is Wrong");
return false;
}
}
public void getNextDate(int year,int month,int day) {
switch(this.month)
{
case 1:
if(this.day==31)
{
this.day=1;
this.month++;
}
else
this.day++;
break;
case 2:
if(((this.year%4==0&&this.year%100!=0)||this.year%400==0)&&this.day==29)
{
this.month++;
this.day=1;
break;
}
if(!((this.year%4==0&&this.year%100!=0)||this.year%400==0)&&this.day==28)
{
this.month++;
this.day=1;
break;
}
else
{
this.day++;
}
break;
case 3:
if(this.day==31)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 4:
if(this.day==30)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 5:
if(this.day==31)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 6:
if(this.day==30)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 7:
if(this.day==31)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 8:
if(this.day==31)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 9:
if(this.day==30)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 10:
if(this.day==31)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 11:
if(this.day==30)
{
this.month++;
this.day=1;
}
else
{
this.day++;
}
break;
case 12:
if(this.day==31)
{
this.year++;
this.month=1;
this.day=1;
}
else
{
this.day++;
}
break;
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Main date=new Main();
date.setYear(input.nextInt());
date.setMonth(input.nextInt());
date.setDay(input.nextInt());
int a=date.year;
int b=date.month;
int c=date.day;
if(date.checkInputValidity(date.year,date.month,c=date.day))
{
date.getNextDate(date.year,date.month,date.day);
System.out.println("Next day is:"+date.year+"-"+date.month+"-"+date.day);
}
}
}
private int year;
private int month;
private int day;
先定义三个私有变量,year,month,day。
public Main(){
this.year=0;
this.month=0;
this.day=0;
}
public Main(int year,int month,int day) {
this.year=year;
this.month=year;
this.day=year;
}
定义一个Main类,再设置Main类的属性,方便用该类定义一个Main(date)变量。
Main date=new Main();
这个就是定义一个date变量的语句。
public int getYear(){
return this.year;
}
public void setYear(int year) {
this.year=year;
}
public int getMonth(){
return this.month;
}
public void setMonth(int month) {
this.month=month;
}
public int getDay(){
return this.day;
}
public void setDay(int day) {
this.day=day;
}
这些是设置Main类属性的set方法以及得到属性值的get方法。
public boolean isLeapYear(int year) {
if((year%4==0&&year%100!=0)||year%400==0)
{
// System.out.printf("%d is a leap year.\n",year);
return true;
}
else
{
// System.out.printf("%d is not a leap year.\n",year);
return false;
}
}
这是判断是否是闰年的方法
if(this.year>=1900&&this.year<=2000&&this.month>=1&&this.month<=12&&this.day>=1&&this.day<=31)
{
if((!isLeapYear(this.year))&&this.month==2&&this.day>=29)
{
System.out.println("Date Format is Wrong");
return false;
}
if(!(isLeapYear(this.year))&&this.month==2&&this.day>28)
{
System.out.println("Date Format is Wrong");
return false;
}
if((isLeapYear(this.year)&&this.month==2&&this.day>29))
{
System.out.println("Date Format is Wrong");
return false;
}
if((this.month==1||this.month==3||this.month==5||this.month==7||this.month==8||this.month==10||this.month==12)&&this.day>31)
{
System.out.println("Date Format is Wrong");
return false;
}
if((this.month==4||this.month==6||this.month==9||this.month==11)&&this.day>30)
{
System.out.println("Date Format is Wrong");
return false;
}
else
{
return true;
}
}
else
{
System.out.println("Date Format is Wrong");
return false;
}
判断输入的日期是否正确
再对输入的年月日进行判断,是否满足约束条件this.year>=1900&&this.year<=2000&&this.month>=1&&this.month<=12&&this.day>=1&&this.day<=31
如果满足则继续
如果输入的年不是闰年但是输入2月的时候日期大于28,那输出Date Format is Wrong,程序结束
如果满足输入条件则继续
如果输入的年是闰年但是输入2月的时候日期大于29,那输出Date Format is Wrong,程序结束
如果输入1,3,5,7,8,10,12月的时候输入的日期大于31,那输出Date Format is Wrong,程序结束
输入4,6,9,11月的时候日期大于30,那输出Date Format is Wrong,程序结束
其他的都和题目集2,7-4一样。

这一题算法上来说还是比较简单的主要是想教我们如何去自己定义一个类,关键语句
public add(){
this.year=0;
this.month=0;
this.day=0;
}
public add(int year,int month,int day) {
this.year=year;
this.month=year;
this.day=year;
}
1912 12 25 下一天是1912 12 26 ,算法部分代码
case 12:
if(this.day==31)
{
this.year++;
this.month=1;
this.day=1;
}
else
{
this.day++;
}
break;
如果是31日的话,那么年+1,月变为1,日变为1,因为是12月,如果是12月31日的话,那么下一天就是下一年的1月1日了
其他情况只需要把日+1就好
这题没什么难度,主要还是想让我们练习如何定义一个类
题目集3 7-3
这题有点难,还在思考中,等想好以后补上。
(3)采坑心得
题目集1,7-2,判断条件
if((b>='a'&&b<='z')||(b>='A'&&b<='Z'))
{
if(b>='a'&&b<='c'||b>='A'&&b<='C')
{
中,a,和,z字符忘了大小写都算进去,并且忘了加‘’,引用单个字符的时候是要加‘’的,当时忘了加,导致运行错误。
题目集1 7-4,因为程序中计算结果的代码有错误,导致结果错误,这件事告诉我写代码过程中得细心,一个微小的错误都可能导致结果出错。一颗老鼠屎可以坏了一锅粥。
题目集1 7-7,最后的输出System.out.print(a[i]+" ");,忘了加“ ”,空格导致格式错误。
最后一题7-8判断条件麻烦点,而且需要区分输出,比如,等腰直角三角形既满足等腰三角形又满足直角三角形的判断条件,但是只能输出等腰直角三角形。
题目集1总的来说还是比较简单的。没什么难度。
题目集2 7-1 我源代码不知道去哪了,pta上的是我题目集2 7-3的代码。。。我7-1的那题我记得很清楚,我忘了加只能输入0和1的判断条件,我是遍历了存储32位二进制数的数组,如果有一个数组元素不等于0或者1的话就输出Wrong Format,程序结束。
题目集2 7-2
while(i<a&&j<b)
{
if(m[i]<n[j])
{
p[i+j]=m[i];
i++;
}
else
{
p[i+j]=n[j];
j++;
}
}
while(i<a)
{
p[i+j]=m[i];
i++;
}
while(j<b)
{
p[i+j]=n[j];
j++;
}
这道题具体细节忘了,好像是有些小错误,大体思路上是正确的,好像是最后输出的时候忘了加空格导致格式错误。
题目集2 7-3
if(((year%4==0&&year%100!=0)|year%400==0)&&month>=3)
{
t=t+1;
}
当时计算天数的时候忘了加这一条语句,如果最后一年是闰年的话,那么当月份大于3月的时候,天数是额外要加1的,因为2月份闰年比平年多了一天,当时忘了加这条判断语句,导致我最后输出的星期几错误。
题目集2 7-4
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
break;
关于2月的后一天,我折腾了好久,这个闰年和平年的判断条件,括号什么的老写多一个或者少一个,当时印象比较深刻,所以这一题过后我把闰年的判断条件写成了一个方法,需要的时候直接调用就好。
题目集7-5
case 3:
if(day==1)
{
if(year%4==0&&year%100!=0)
{
month--;
day=29;
}
else if((!(year%4==0&&year%100!=0)))
{
month--;
day=28;
}
}
else
{
day--;
}
case 2:
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
else if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
break;
前N天的话是在3月份的时候判断是不是闰年,后n天的话是在2月份的时候判断是不是闰年,一开始搞错了,不知道在哪个月份设置判断条件。
题目集3 7-1
public Main(){
this.id=0;
this.balance=0;
this.annualInterestRate=0;
}
public Main(int id,double balance,double annualInterestRate){
this.id=id;
this.balance=balance;
this.annualInterestRate=annualInterestRate;
}
提交的时候定义这个类忘了把Account忘了把类名也改成Main导致PTA过不了,气死了当时。
a=account.withDraw(a);
b=account.deposit(b);
调用这个方法的时候,忘了加account前缀导致调用不了,程序无法运行
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
忘了定义日期格式,输出的默认日期不满足题目要求
System.out.println("The Account'balance:"+String.format("%.2f",d));
System.out.println("The Monthly interest:"+String.format("%.2f",c));
忘了保留两位小数。
题目集3 7-2
date.setYear(input.nextInt());
date.setMonth(input.nextInt());
date.setDay(input.nextInt());
调用方法的的时候忘了加date前缀。
if(date.checkInputValidity(date.year,date.month,date.day))
{
date.getNextDate(date.year,date.month,date.day);
System.out.println("Next day is:"+date.year+"-"+date.month+"-"+date.day);
}
方法中参数我也忘了加date前缀,以后我知道访问变量属性得加前缀了,调用方法也得加。
题目集3 7-3
太难了,写不来,现在还在思考中
(4)改进建议
题目集2 7-4
对判断是否是闰年,设置一个方法,需要判断的时候直接调用该方法,不用写一大串的判断条件,很麻烦。
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31)
{
if((!(year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>28)
{
System.out.println("Wrong Format");
System.exit(0);
}
if(((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day>29)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
{
System.out.println("Wrong Format");
System.exit(0);
}
if((month==4||month==6||month==9||month==11)&&day>30)
{
System.out.println("Wrong Format");
System.exit(0);
}
(5)总结
对于输入,判断等基本操作,现在已经非常之熟练。通过对题目集3 7-1,我了解到了java日期类的使用,并且会更改日期格式了,保留两位小数,也知道怎么操作了。通过题目集3 7-2,我更加熟悉如何取定义一个类,并且用自己定义的类来定义一个变量,然后通过set,get方法设置和获取该变量的各个属性。

浙公网安备 33010602011771号