要求: 薪水计算器
(1)通过键盘输入用户月薪,每年是几个月的月薪
(2)输出用户的年薪
(3)输出一行字:如果年薪超过10万,输出“恭喜你超越90%的国人”,如果年薪超过20万,输出“恭喜你超越98%的国人”
(4)直到键盘键盘输入“exit”,则退出程序(使用break退出循环)
(5)输入中途,键盘输入next,则这个用户退出计算不显示“恭喜…”,算下一个用户的年薪
- 本文包括四个部分
1、问题版(问题+原因+解决方案)
2、最终版
3、完成效果
4、问题总结 - 问题版
/*
* 薪水计算器
* (1)通过键盘输入用户月薪,每年是几个月的月薪
* (2)输出用户的年薪
* (3)输出一行字:如果年薪超过10万,输出“恭喜你超越90%的国人”,如果年薪超过20万,输出“恭喜你超越98%的国人”
* (4)直到键盘键盘输入“exit”,则退出程序(使用break退出循环)
* (5)输入中途,键盘输入next,则这个用户退出计算不显示“恭喜...”,算下一个用户的年薪
* */
package test;
import java.util.Scanner;
public class Test15 {
public static void main(String[]args) {
while(true) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入月薪");
double monthSalary=scanner.nextDouble();//输入月薪
System.out.println("请输入每年是几个月的月薪");
int months=scanner.nextInt();//输入每年是几个月的月薪
System.out.println("用户年薪为:"+(monthSalary*months));//输出用户年薪
//直到键盘键盘输入“exit”,则退出程序(使用break退出循环)
//输入中途,键盘输入next,则这个用户退出计算不显示“恭喜...”,算下一个用户的年薪
System.out.println("是否继续?(输入exit退出计算器,输入next进行下一个用户的计算,输入其他字符可继续显示当前用户信息...");
String input=scanner.nextLine(); //问题1:不停顿来获取字符串? 原因:nextInt()只读走了数字,留下了回车 解决方式1:在本行前加"scanner.nextLine();"读取缓冲区留有的回车 解决方式2:用"String input=scanner.next();"代替"String input=scanner.nextLine();"
if(input=="next")//问题3:未正常执行判断。 解决方式:input=="字符串"改为"字符串".equals(input)
continue;
if(input=="exit")
break;
/*
* equals()方法 比较的是两个值(只针对String类型)
* ==操作对于基本数据类型比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同
*
* 基本数据类型只有8种,可按照如下分类
①整数类型:long、int、short、byte
②浮点类型:float、double
③字符类型:char
④布尔类型:boolean
* 引用数据类型:
引用数据类型非常多,大致包括:
类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型
* String类型不属于基本数据类型,属于引用型变量
* */
//输出一行字:如果年薪超过10万,输出“恭喜你超越90%的国人”,如果年薪超过20万,输出“恭喜你超越98%的国人”
if(monthSalary*months>100000) //问题2:需要小于20w的条件
System.out.println("恭喜你超越90%的国人");
if(monthSalary*months>200000)
System.out.println("恭喜你超越98%的国人");
}
}
}
- 最终版
/*
* 薪水计算器
* (1)通过键盘输入用户月薪,每年是几个月的月薪
* (2)输出用户的年薪
* (3)输出一行字:如果年薪超过10万,输出“恭喜你超越90%的国人”,如果年薪超过20万,输出“恭喜你超越98%的国人”
* (4)直到键盘键盘输入“exit”,则退出程序(使用break退出循环)
* (5)输入中途,键盘输入next,则这个用户退出计算不显示“恭喜...”,算下一个用户的年薪
* */
package test;
import java.util.Scanner;
public class test {
public static void main(String[]args) {
while(true) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入月薪");
double monthSalary=scanner.nextDouble();//输入月薪
System.out.println("请输入每年是几个月的月薪");
int months=scanner.nextInt();//输入每年是几个月的月薪
System.out.println("用户年薪为:"+(monthSalary*months));//输出用户年薪
//直到键盘键盘输入“exit”,则退出程序(使用break退出循环)
//输入中途,键盘输入next,则这个用户退出计算不显示“恭喜...”,算下一个用户的年薪
System.out.println("是否继续?(输入exit退出计算器,输入next进行下一个用户的计算,输入其他字符可继续显示当前用户信息...");
scanner.nextLine();
String input=scanner.nextLine();
//String input=scanner.next(); //可替代Line30、31
if("next".equals(input)) {
System.out.println("进行下一个用户年薪计算");
continue;
}
if("exit".equals(input)) {
System.out.print("程序终止");
break;
}
//输出一行字:如果年薪超过10万,输出“恭喜你超越90%的国人”,如果年薪超过20万,输出“恭喜你超越98%的国人”
if(monthSalary*months>100000 && monthSalary*months<200000) //问题2:需要小于20w的条件
System.out.println("恭喜你超越90%的国人");
if(monthSalary*months>200000)
System.out.println("恭喜你超越98%的国人");
}
}
}
- 完成效果
- 问题总结:
1、在Scanner类中的nextInt()后使用nextLine()无法获取键盘字符:
原因:nextInt()只读取了数字,留下了回车,回车存于缓冲区,会被下一个nextLine()直接读取。
解决方案:
①在输入字符串之前先将缓冲区的换行符都去掉(即在“String input=scanner.nextLine();”前一行添加“scanner.nextLine();”
②用next()取代nextLine()
2、进行String的比较时应使用"字符串".equals(变量名)。
equals()方法 比较的是两个值(只针对String类型),而==操作对于基本数据类型比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同。
3、使用if语句判断时,注意判断区间的上下限