Java基础已经更新完毕了,本次来更新一期我在学习中遇到的容易出错的题,或者是解题时有比较多想法的题目。容易出错的点还有想法涌现的地方我都会注释出来。
1.运算符问题,下面代码分别输出什么?
public static void main(String[] args) {
int i1 = 10, i2 = 10;
System.out.println("i1 + i2 = " + i1 + i2);//i1 +i2 = 1010 输出语句中的第二第三个+起到连接字符 串的功能,所以输出结果是字符串1010而不是数字20,这道题意在提醒+的两种功能用法 System.out.println("i1 - i2 = " + i1 - i2);//编译报错
System.out.println("i1 * i2 = " + i1 * i2);//100
System.out.println("i1 / i2 = " + i1 / i2);//1 }
2.class Test{
public static void main (String [] args) {
short a,b,C; a=1;//隐式转换 在给byte,short,char类型进行赋值时,在它们所能表 示的数字范围内,都存在隐式转换,可以将int类型的值赋给它们。
b=2;//隐式转换 C=a+b;
a += 2;//隐式转换
}
}
以上代码中,哪一句是错误的?
C=a+b;
a b为short类型,当short类型进行运算时,会默认转换为int类型进行运算,而C为short类型,数据类型不同,编译会报错。
3.下面程序运行的结果正确的是:
public class Demo{
public static void main (String args[]) {
int num=0;
for (int i=0;i<100;i++) {
num=num++;
}
System.out.println("num="+num);
}
}
num=0
本道题也是我在学习中思考较多的一道题,这道题与数据结构的知识点还是有关系的,数据结构中有栈这个概念,我们来看这道题,int num = 0;这条语句,的含义是说在局部变量表中,给num赋一个值为0,再看接下来的for语句,for语句中对num进行了操作,而这些操作都是在栈中进行的,此题先给num 进行了赋值 num =num,这项操作完成后,num进行了num++操作,但是此时num返回给局部变量表的值是num=num,所以此时num是为0的,并且因为for语句循环了100次,但是num的值是一直不变的,一直为0.
4.给定如下java代码,编译运行之后结果是:
class Demo{
public static void main(String args[]) {
for (int i=0;i<3; i++) {
System.out.print (i) ;//0 1 2
}
System. out. print (i);//编译报错 找不到变量i
}
}
这道题需要注意for语句定义变量是在()中,它定义的变量的作用域只有for语句{}内,而第二个输出语句明显是在for语句作用范围之外,所以第二个输出语句是会报错的,它找不到变量i。
二.编程题 1.判断某一年是否为闰年 通过Scanner 输入一个年份,然后判断概念是否是闰年 闰年判断标准(满足任何一个)
1.如果能够被4整除&&但是不能被100整除
2.能够被400整除
拿到这道题,根据题意要求直接就可以写,它的要求通过Scanner,那我们就按照要求来 Scanner s = new Scanner(System.in); int y = s.nextInt();这两条语句就满足了通过控制台输入年份的要求,我们再看题目第一条要求,if(y%4==0&&y%100!=0){System.uot.println(y+"年是闰年");}这样第一个要求就满足了,这里我们来提一下&和&&,这两个与操作都是可以用的,但是我们为了提升代码的运行速度,建议使用&&。接下来我们来看第二个要求,能够被400整除,else if(y%400==0){System.out.println(y+"年是闰年");}else {System.out.println(y+"不是闰年");}至此,按照题意我们就完成了这道题,下面是我按照以上思路的完整代码:
import java.util.Scanner; public class Year { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入年份:"); int y = s.nextInt(); if (y%4 == 0 && y%100 != 0){ System.out.println(y+"年是闰年"); } else if(y%400 == 0){ System.out.println(y+"年是闰年"); } else{ System.out.println(y+"年不是闰年"); } } }
按照题目我写完了之后开始思索,能否将代码简化,能否将两个条件用||连接起来,我做了以下尝试:
import java.util.Scanner; public class Year { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入年份:"); int y = s.nextInt(); /*if (y%4 == 0 && y%100 != 0){ System.out.println(y+"年是闰年"); } else if(y%400 == 0){ System.out.println(y+"年是闰年"); }*/ if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) { System.out.println(y + "年是闰年"); } else{ System.out.println(y+"年不是闰年"); } } }
这个代码也是可以用来判断闰年的,但是我在对条件进行判断时并未注意()问题,没有条件层次的,虽然我运行时并没有问题,但是不建议大家向我学习,下边的代码,是经过改进的,我想到的最简方法了。
public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("请输入年份:"); int y = s.nextInt(); if((y%4==0&&y%100!=0)||(y%400==0) ){ System.out.println(y+"年是闰年"); } else { System.out.println(y+"不是闰年"); } }
2.根据指定月份,打印该月份所属的季节,3,4,5春季 678夏季 9 10 11秋季 12 ,1,2 冬季
这道题就是简单的条件判断语句,我读完这道题首先想到的是switch语句,因为switch语句比较多用来写条件选项固定的判断语句,下边就是我最初的代码:
import java.util.Scanner; public class Month { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入一个月份:"); int m = s.nextInt(); switch(m){ case 1: System.out.println("冬季"); break; 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; case 9: System.out.println("秋季"); break; case 10: System.out.println("秋季"); break; case 11: System.out.println("秋季"); break; case 12: System.out.println("冬季"); break; default: System.out.println("请输入有效月份!"); } } }
我们可以很直观的看出,虽然switch语句可以实现这道题目,但是确实很繁琐,十二次case,一次default,代码冗余还是需要改进的,接下来我就想着是否可以使用if语句来实现,下边的代码就是我尝试的结果:
public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入月份:"); int m = s.nextInt(); if(m>=3&&m<=5){ System.out.println(m+"月是春季"); } else if(m>=6&&m<=8){ System.out.println(m+"月是夏季"); } else if(m>=9&&m<=11){ System.out.println(m+"月是秋季"); } else if(m==12||m<=2){ System.out.println(m+"月是冬季"); } else { System.out.println("请输入有效月份!"); } }
这段代码是我第一次使用if语句写的,很不幸我自己找到了漏洞,以上代码在我输入负数时,会输出冬季,也就说明我的条件并不完善,在此基础上我又做了修补,对冬季的判断又加了条件,以下是我新的代码:
import java.util.Scanner; public class Test2{ public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入月份:"); int m = s.nextInt(); if(m>=3&&m<=5){ System.out.println(m+"月是春季"); } else if(m>=6&&m<=8){ System.out.println(m+"月是夏季"); } else if(m>=9&&m<=11){ System.out.println(m+"月是秋季"); } else if(m==12||(m<=2&&m>0) ){ System.out.println(m+"月是冬季"); } else { System.out.println("请输入有效月份!"); } } }
这一次负数是无效数字,成功的改掉了这个错误。
3.我家的狗5岁了,5岁的狗相当于人的多大呢?,其实狗的前两年,每一年相当于人的10.5岁,之后每增加一岁就增加4岁, 那么5岁的狗相当于人的年龄就应该是10.5+10.5+4+4+4=33岁. 编写程序获取用户输入狗的年龄(整数),通过程序输出显示相当于人的年龄.如果为负数请提示.
关于狗狗年龄这道题,我在编写的时候也进行过很多尝试,第一次的想法是将狗狗前两年的年龄放在一起,这也是按照题目的思路在输出,可是很开我就发现了问题,当狗狗一岁时,输出为int类型,也就是说,10.5的0.5是不会输出的,这与题目要求并不符合,所以我又进行了思考和改进,我尝试将一岁直接输出10.5,没错,就是将10.5放在字符串内直接输出,然后,大于一岁利用公式输出,这一次也确实成功了。下面是我的代码:
import java.util.Scanner; public class Dog_age { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入狗狗的年龄:"); int y = s.nextInt(); if (y==1) { System.out.println("狗狗今年10.5岁了"); } else if(y>1){ y = 21+(y-2)*4; System.out.println("狗狗今年"+y+"岁了"); } else{ System.out.println("请输入有效数字!"); } } }
4.设计一个对银行账户余额操作的程序 假设账号: int account=666666 密码:int password=111111 余额:int balance=1000 进入程序输出选择操作选项: 1.存款,2.取款,3.查询余额 要求使用Scanner交互式操作. 存款,取款,查询均需要输入账号密码,验证没有问题即可操作. 可以多次重复操作
关于银行取款这道题,我们首先进行控制台输入的语法,然后利用switch语句,这样大体轮廓就已经出来了,我们再看要求,要进行验证账号密码,这样我们可以添加一个条件语句,if语句就可以判断是否可以进入存款,取款,查询,这样我们就只剩一个多次重复操作的问题了,我们之前提到过死循环,这里我们就可以用到死循环,当然我们也写到过如何结束一个循环,这里就不多加赘述了。下列代码就是我进行尝试和试错后的结果:
import java.util.Scanner; public class Bank { public static void main(String[] args) { Scanner s = new Scanner(System.in); int account=666666; int password=111111; int balance=1000; while (true) { System.out.println("请输入账号:"); int acc = s.nextInt(); System.out.println("请输入密码:"); int psd = s.nextInt(); if (acc == account & psd == password) { a:while (true) { System.out.println("1.存款,2.取款,3查询余额,4退出"); int x = s.nextInt(); switch (x) { case 1: System.out.println("请输入存款金额:"); int y = s.nextInt(); balance += y; System.out.println("您已成功存入" + y + "元,您的账户余额为:" + balance + "元"); break; case 2: System.out.println("请输入取金额:"); int m = s.nextInt(); if (m <= balance) { balance -= m;//现余额=原余额-取出金额 System.out.println("您已成功取出" + m + "元,您的账户余额为:" + balance + "元"); } else { System.out.println("您的账户余额不足" + m + "元"); } break; case 3: System.out.println("您的帐户余额为:" + balance + "元"); break; case 4: break a;//用标记的方法结束循环 default: System.out.println("请输入有效选项"); } } } else { System.out.println("账号或密码错误!"); } } } }
5.编程一个程序,计算今天是今年的第几天. 例如: 输入年 2022 输入月 4 输入天 17
这道今天是今年第几天的问题,是困扰我很长时间的一个问题,我一直在考虑二月该怎样输入天数,当然判断闰年上边已经解决问题了,我在考虑二月应该用怎样一个变量来表示,应该将这个变量放在什么位置。让我来分享一下这道题的思路吧,首先要有控制台输入,这个语法就不多加赘述,控制台输入后,就是月份了,十二个月,switch语句就可以很完美的解决这个问题,1 3 5 7 8 10 12这七个月是三十一天,4 6 9 11这四个月是三十天, 我们可以用if语句判断输入的数值是否正确,接下来我们来说一说2月,因为闰年的问题,我一开始是将闰年判断放在二月的if语句中,我发现这样并不能行的通,我又尝试将闰年判断放在switch语句外边,先进行判断闰年,在执行switch语句,这样二月就很好判断了,后来我又遇到了一个问题,二月的天数我该怎样表示,28 29 因为其他月份的固有思路,我直接给二月赋常量值,这样并不能行得通,我又尝试使用变量,在二月的判断中进行声明变量也是行不通的,这样,我便像判断闰年一样,在switch语句外边进行声明变量,这样就解决了我遇到的所有问题。下面是我的代码:
import java.util.Scanner; public class Date { /*编程一个程序,计算今天是今年的第几天. 例如: 输入年 2022 输入月 4 输入天 17 1 3 5 7 8 10 12 31 4 6 9 11 30 2(闰年) 29 2(平年) 28 */ public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入年份:"); int y = s.nextInt(); System.out.println("请输入月份:"); int m = s.nextInt(); System.out.println("请输入日期:"); int d = s.nextInt(); int sum; int n; if ((y%4==0&&y%100!=0)||(y%400==0)){ n = 29; } else{ n = 28; } switch (m){ case 1: if (d<=31&d>0) { sum = d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 2: if (d<=n&d>0) { sum = 31+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 3: if (d<=31&d>0) { sum = 31+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 4: if (d<=30&d>0) { sum = 31+30+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 5: if (d<=31&d>0) { sum = 31*2+30+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 6: if (d<=30&d>0) { sum = 31*3+30+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 7: if (d<=31&d>0) { sum = 31*3+30*2+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 8: if (d<=31&d>0) { sum = 31*4+30*2+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 9: if (d<=30&d>0) { sum = 31*5+30*2+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 10: if (d<=31&d>0) { sum = 31*5+30*3+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 11: if (d<=30&d>0) { sum = 31*6+30*3+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; case 12: if (d<=31&d>0) { sum = 31*6+30*4+n+d; System.out.println("今天是今年的第" + sum + "天"); } else{ System.out.println("请输入有效数字"); } break; default: System.out.println("请输入有效数字"); } } }
6.猴子吃桃问题。猴子第一天摘下若干个桃子,当时就吃了一半,还不过瘾, 就又吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第 10 天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?
猴哥吃桃问题,我们可以用一个for循环解决,先声明一个变量 sum=1,我们可以倒着来推,猴哥吃了九天,所以 int i=9,倒推最后一天就是第一天,所以i>=1,i进行自减,根据题意要求,使用公式我们就可以得到猴哥到底吃了多少桃。下边是我的代码:
public class Peach { public static void main(String[] args) { int sum = 1; for (int i = 9; i >=1 ; i--) { sum = (sum+1)*2; } System.out.println(sum); } }