30,336
社区成员
目的:掌握怎样使用 Scanner 类的对象从字符串中解析程序所需要的数据。
掌握 Date 类以及 Calendar 类的常用方法。
掌握 BigInteger 类的常用方法。
1、菜单的内容如下:
"北京烤鸭:189 元 西芹炒肉:12.9 元 酸菜鱼:69 元 铁板牛柳:32 元"
编写一个 Java 应用程序,输出菜单中的价格数据,并计算出菜
单的总价格。
import java.util.InputMismatchException;
import java.util.Scanner;
public class Example8_13{
public static void main(String[] args){
String menu="北京烤鸭189元,西芹炒肉12.9元,酸菜鱼69元,铁板牛柳32元";
Scanner scanner=new Scanner(menu);
scanner.useDelimiter("[^0123456789.]+");
double sum=0;
while(scanner.hasNext()){
try{
double price=scanner.nextDouble();
sum=sum+price;
System.out.print(price+"\n");
}
catch(InputMismatchException exp){
String t=scanner.next();
}
}
System.out.print("菜单总价格:"+sum+"元");
}
}
useDelimiter():
scanner.useDelimiter("[^0123456789.]+");
Scanner原本的分隔符是空格Tab或者是Enter,但现在是括号里面的东西。
括号里的是正则表达式,表示除了0123456789以及“.”的东西,一个或多个
hasNext():
while(hasNext())里hasNext()返回的是一个boolean值,
用法:
Scanner scanner=new Scanner(System.in);
//此句表示从控制台获取数据。
scan.hasNext(); //表示是否有输入数据。
若有,则为返回true。
try:
try是Java中的关键字,主要用于异常处理机制
try{
}用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
它一般与catch..finally组合使用块,用来引导第一部分的关键字,用于声明需要捕获指定语句块的异常。
catch可以出现0次、1次或多次,finally可以出现0次或1次,但是catch和finally不能同时不出现
(这是我从博主耿健桓那看到的,截取了几段话,想要详细了解的可以点击下方链接)
原文链接:https://blog.csdn.net/weixin_32424555/article/details/114620951
inputMismatchException exp:
当您使用Scanner类从用户那里获取输入时。如果传递的输入与方法不匹配,则引发InputMisMatchException。例如,如果使用该
nextInt()
方法和在String中传递的值读取整数数据,则会发生异常。所以 catch(InputMismatchException exp){
String t=scanner.next();
}是在判断输入是否异常,捕获异常。
2、编写一个 Java 应用程序,用户输入两个日期,程序将判断两个日期的大小关系,以及两
个日期之间的间隔天数。
package 实验五;
import java.util.*;
import java.time.*;
import java.time.temporal.ChronoUnit;
public class DATE {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入第一个年,月,日数据");
System.out.print("输入年份:");
int years1=scanner.nextInt();
System.out.print("输入月份:");
int months1=scanner.nextInt();
System.out.print("输入日期:");
int days1=scanner.nextInt();
System.out.println("输入第二个年,月,日数据");
System.out.print("输入年份:");
int years2=scanner.nextInt();
System.out.print("输入月份:");
int months2=scanner.nextInt();
System.out.print("输入日期:");
int days2=scanner.nextInt();
scanner.close();
LocalDateTime dateStart=LocalDateTime.of(years1, months1,days1,0,0,0);
LocalDateTime dateEnd=LocalDateTime.of(years2, months2,days2,0,0,0);
Calendar calendar=new GregorianCalendar();
calendar.set(years1,months1,days1);
Calendar calendar2=new GregorianCalendar();
calendar2.set(years2,months2,days2);
if(calendar.after(calendar2)) {
System.out.println("您输入的第二个日期小于第一个日期");
long days=dateEnd.until(dateStart, ChronoUnit.DAYS);
System.out.println(years1+"年"+months1+"月"+days1+"日和"+years2+"年"+months2+
"月"+days2+"日相隔"+days+"天");
}
else {
System.out.println("您输入的第一个日期小于第二个日期");
long days=dateStart.until(dateEnd, ChronoUnit.DAYS);
System.out.println(years1+"年"+months1+"月"+days1+"日和"+years2+"年"+months2+
"月"+days2+"日相隔"+days+"天");
}
//System.out.println(calendar.before(calendar2));输出的是true或false
}
}
这里主要用到的是日期比较的方法:Calendar类
System.out.println(calendar.before(calendar2));//输出的是true或false
计算两个日期相隔时间的方法:long days=dateEnd.until(dateStart, ChronoUnit.DAYS);
调用了ChronoUnit类,
如果想算这两个日期相差多少年,可以写:
long years=dateEnd.until(dateStart,ChronoUnit.YEARS);
//我这里之所以把dateEnd放在dateStart前面,是因为我要让它输出来的数字为正(此处dateEnd小于dateStart)
3.编写一个 Java 应用程序,计算了两个大整数的和、差、积和商,并计算出了一个大整数
的因子个数(因子中不包括 1 和大整数本身)。
我一开始是这样写的
package 实验五;
import java.math.*;
public class BigInteger_console {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger result=new BigInteger("0"),
one=new BigInteger("9876543210"),
two=new BigInteger("17637");
result=one.add(two);
System.out.println("和:"+result);
result=one.subtract(two);
System.out.println("差:"+result);
result=one.multiply(two);
System.out.println("积:"+result);
result=one.divide(two);
System.out.println("商:"+result);
System.out.println(two+"的因子有:");
for(BigInteger i=new BigInteger("2");i.compareTo(two)<0;i=new BigInteger("i++")) {
for(BigInteger j=new BigInteger("2");j.compareTo(two)<0;j=new BigInteger("j++")) {
if(i.multiply(j).equals(two)) {
System.out.println(i+" "+j+" ");
}
}
}
}
}
结果是这样的
现在改成这样:
package 实验五;
import java.math.*;
public class BigInteger_console {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger result=new BigInteger("0"),
one=new BigInteger("9876543210"),
two=new BigInteger("17637");
result=one.add(two);
System.out.println("和:"+result);
result=one.subtract(two);
System.out.println("差:"+result);
result=one.multiply(two);
System.out.println("积:"+result);
result=one.divide(two);
System.out.println("商:"+result);
System.out.println(two.toString()+"的因子有:");
BigInteger ONE=new BigInteger("1"),
TWO=new BigInteger("2"),
COUNT=new BigInteger("0");
for(BigInteger i=TWO;i.compareTo(two)<0;i=i.add(ONE)) {
for(BigInteger j=TWO;j.compareTo(two)<0;j=j.add(ONE)) {
if(i.multiply(j).equals(two)) {
System.out.print(i+" ");
COUNT=COUNT.add(ONE);
}
}
}
System.out.println(" ");
System.out.println(two.toString()+"一共有"+COUNT.toString()+"个因子");
}
}
这里我想了想,应该是,大数应该和大数放一起,例如,我要表达大数i在循环里不断加1,那么我除了要设置i是大数外,我还要将1以大数的形式设置,BigInteger ONE =new BigInteger("1"),
i=new BigInteger("2");
i.add(ONE);//要用BigInteger类的方法来加