01-Java语法基础(四)-案例

一,Java语法基础(四)-案例

1.1 数据交换程序
1.1.1 问题:

​ 实现两个变量间的数据交换,例如:有两个整数类型变量a和b,现需要使变量a的值和变量b的值进行交换。例如: a的原值为100,b的原值为200,交换后a的值为200,b的值为100。

1.1.2 方案:

系统使用中间变量的方式来解决上述问题。

步骤1:把a变量的值赋给中间变量,代码如下所示:

int temp=a;

步骤2:把b变量的值赋给a变量,代码如下所示:

a=b;

步骤3:把中间变量的值赋给b变量,代码如下所示:

b=temp;

最终实现了a变量的值和b变量的值的互换。如图所示:

在这里插入图片描述

1.1.3 参考代码:

在这里插入图片描述

1.1.4 扩展

不使用中间变量来实现数据交换程序,即实现两个变量值的交换。可以先把a+b值赋给a,接着把a-b的值赋给b,最后把a-b的值在赋给a,请看如下代码:

public class SwapExt{
    public static void main(String[] args){
        int a = 100;
        int b = 200;
        System.out.println("a="+a+",b="+b);
        a=a+b;
        b=a-b; 
        a=a-b; 
        System.out.println("a="+a+",b="+b);
    }
}

1.2 计算自由落体运动中物体的位移
1.2.1 问题:

​ 该系统使用交互的方式计算自由落体运动中物体的位置。用户从控制台输入自由落体的时间t,系统计算经过时间t物体的自由落体位移。计算结果保留一位小数并且输出到控制台。系统交互过程 如图所示

在这里插入图片描述

注:自由落体位移公式为: s = 1/2 × g × t*t ,其中:

s (位移(m)

t (时间(s)

g (重力加速度(9.8m/s2)

例如:从控制台接收到的时间t为10s,那么位移s=1/2 × 9.8 × 10 × 10=490.0

1.2.2 方案:

系统使用double类型接收控制台输入的时间数据t。调用Scanner的nextDouble()方法接收用户从控制台输入的时间数据,该方法的返回值为double类型。代码如下所示:

double t=scanner.nextDouble();

系统根据自由落体的位移公式计算出位移值s,s的类型为double,代码如下所示:

double s=0.5*g*t*t;

**系统为了确保小数点后保留一位小数可以使用如下方法: **

s=Math.round(10*s)/10.0;

Math的round(double s)方法用于实现四舍五入的计算,返回值为long类型的数据。

需要注意的是round(double s)返回值为long类型,要除以double类型的数据后,其结果才

会自动类型转换为double类型,因此被除数为double直接量10.0而不是int直接量10。

1.2.3 参考代码:
import java.util.Scanner;
public class FreeFall{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        double g=9.80; 
        System.out.println("请输入自由下落的时间(秒):");
        double t=scanner.nextDouble();
        double s=0.5*g*t*t;
        s=Math.round(10*s)/10.0;
        System.out.println(t+"秒后,物体自由下落了"+s+"米");
    }
}
1.2.4 扩展

​ 用户从控制台输入物体下落的距离(米),然后计算下落此距离所需要花费的时间(秒)。计 算结果需要保留一位小数,并且将结果输出到控制台。系统交互过程如图所示:

在这里插入图片描述

系统代码实现如下:

import java.util.Scanner;
public class FreeFallExt{
    
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        double g=9.80;
        System.out.println("请输入自由下落的距离(米):");
        double s=scanner.nextDouble();
        double t=Math.sqrt(2*s/g);
        t=Math.round(10*t)/10.0;
        System.out.println("物体下落"+s+"米,需要"+t+"秒");
    }
    
}

1.3 等额本息还款计算器
1.3.1 问题:

​ 系统使用交互的方式计算等额本息贷款的还款情况。用户从控制台输入贷款本金,贷款月利率和还款年数,系统根据上述信息计算每月还款金额,要求每月还款金额保留两位小数并且输出到控制台。

注:等额本息还款公式 :payment = (p × r × (1 + r)^m) / ((1 + r)^m - 1),

其中: p (贷款本金(元) r (贷款月利率 m (还款月数

系统交互过程如图所示:

在这里插入图片描述

1.3.2 方案:

**系统使用double类型定义贷款本金和贷款月利率,代码如下所示: **

double p=scanner.nextDouble()*10000;
double r=scanner.nextDouble()/1200;

**系统使用int类型定义还款年数,代码如下所示: **

int m=scanner.nextInt()*12

系统根据等额本息还款公式计算出还款情况,使用Math.pow(double a,double b)计算幂运算,该方法返回a的b次幂的值,代码如下所示:

double payment=(p*r*Math.pow((1+r),m))/(Math.pow(1+r,m)-1);

系统使用Math.round()方法确保还款金额保留两位小数,代码如下所示:

Math.round(payment*100)/100.0
1.3.3 参考代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EKBWwOS-1606814168521)(VIP%20%E7%BB%83%E4%B9%A0%E5%90%88%E9%9B%86.assets/image-20201129221843491.png)]

1.3.4 扩展

​ 计算使用等额本金方式还贷的情况。用户从控制台输入贷款本金,贷款月利率和还款年数,系统根据上述信息计算第一个月和第二个月的还款金额,要求每月还款金额保留两位小数并且输出到控制台。系统交互过程如图:
在这里插入图片描述

等额本金还款公式为 :每月还款额=贷款本金/贷款期月数+(本金-已归还本金累计额)×月利率

比如,贷款金额(即贷款本金)为30万元,贷款年利率为 6.14%,还款年数为 20年,则计算方式如下:

每月本金:300000/240 = 1250

月利率:6.14%/12

首月还款:1250 + 300000 * 6.14%/12 = 2785

第 2 月还款: 1250 + (300000 - 1250) * 6.14%/12 = 2778.60

注:第一个月已归还的本金1250 在第二个月就不用再计算利息。 系统代码实现如下:

import java.util.Scanner;

public class MonthlyPaymentExt {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入你的贷款本金:(万)");
		double p = scanner.nextDouble() * 10000;
		System.out.println("请输入你的贷款年利率:(%)");
		double r = scanner.nextDouble() / 1200;
		System.out.println("请输入你的还款年数:");
		int m = scanner.nextInt() * 12;
		scanner.close();
		double firstPayment = p / m + p * r;
		firstPayment = Math.round(firstPayment * 100) / 100.0;
		System.out.println("你的第一个月的还款金额为:¥"+ firstPayment); 
		double secondPayment=p/m+(p-p/m)*r; 
		secondPayment=Math.round(secondPayment*100)/100.0; 
		System.out.println("你的第二个月的还款金额为:¥"+ secondPayment);
	}

}

1.4 计算牛郎星到织女星的距离
1.4.1 问题:

​ 计算牛郎星到织女星的距离。牛郎星到织女星的距离为16.4光年,如果一只喜鹊的长度是0.46米,计算一下牛郎织女真的要会面需要动用多少只喜鹊。控制台输出信息如图所示:

在这里插入图片描述

注:

光速:299792458米/秒

1光年=(1 * 365 * 24 * 60 * 60 * 光速 / 1000)公里

1公里=1千米

1.4.2 方案:

使用double类型定义光年变量和喜鹊的长度变量,代码如下所示:

double dLightYear=16.4;
double dMagpie=0.46;

使用int类型定义光速变量,没有超过int的最大值,故使用int类型定义光速变量,代码如下所示:

int speedOfLight=299792458;

根据公式计算牛郎星到织女星的距离,使用long类型定义牛郎星到织女星的距离变量,代码如下所示:

long d=(long)(dLightYear*365*24*60*60*speedOfLight/1000);

根据公式计算出牛郎织女会面,搭起鹊桥需要的喜鹊只数,超过int类型的最大,但是小于long的最大值,故使用long类型定义需要喜鹊的只数变量,代码如下所示:

long numberOfMagpie=(long)(d*1000/dMagpie)
1.4.3 参考代码:

系统代码实现如下:

在这里插入图片描述

1.4.4 扩展:

​ 据称,一个人一生中要走的路加起来可以绕地球七十五圈,地球的平均半径为 6371.004 千米,而一个人走一步的步长大约是 60 厘米。请计算一个人一生中要走多少步?系统交互过程如图所示。

在这里插入图片描述

**系统代码实现如下: **

在这里插入图片描述


1.5 闰年判断程序
1.5.1 问题:

判断某年是否为闰年。根据用户在控制台输入的年份值,判断该年是否为闰年。系统交互情况如图所示:

在这里插入图片描述

1.5.2 方案:

使用数学运算符取余运算(%),关系运算符等于(==)和不等于(!=),逻辑运算符逻辑 与(&&)和逻辑或(||),来判断某年是否为闰年,判断的结果为boolean类型的值,如果为闰年 boolean类型的值为true,否则为false,代码如下所示:

boolean isLeapYear=(year%4==0&&year%100!=0)||year%400==0;

使用三目运算符,获取是否为闰年的String类型信息,输出到控制台,代码如下所示:

String msg=isLeapYear?year+"是闰年":year+"不是闰年";
1.5.3 参考代码:

在这里插入图片描述

1.5.4 扩展:

计算某年某月的天数。由用户在控制台输入年份和月份值,然后计算年该月的天数,并输出在控制台。系统交互情况如图所示:

在这里插入图片描述

注:大月有31天,小月有30天,闰年的2月有29天,非闰年的2月有28天。系统代码实现如下:

import java.util.Scanner;
public class LeapYear{ 
    public static void main(String[]args){ 
        Scanner scanner=new Scanner(System.in); 
        System.out.println("请输入年份(例如:2020)"); 
        int year=scanner.nextInt(); 
        System.out.println("请输入月份(例如:1)"); 
        int month=scanner.nextInt(); 
        scanner.close(); 
        //判断是否是闰年
        boolean isLeapYear=(year%4==0&&year%100!=0)||year%400==0; 
        //判断大月和小月,2月除外 
        boolean isLittleMonth=month==4||month==6||month==9||month==11; 
        boolean isLargeMonth=month==1||month==3||month==5||month==7||month==8||month==10||month==12; 
        //计算天数 
        int days=isLittleMonth?30:(isLargeMonth?31: (isLeapYear?29:28));
        //输出 
        System.out.println(year+"年"+month+"月有"+days+"天"); 
    }
}

1.6 数字排序程序
1.6.1 问题:

​ 系统使用交互的方式给三个数字进行排序。例如:接收用户输入的三个整数a,b,c,a的原值是20,b的原值是5,c的原值是10,排序后a的值为5,b的值为10,c的值为20。系统交互情况如 图所示:

在这里插入图片描述

1.6.2 方案:

系统使用if语句实现对三个数的排序,首先判断a和b的大小情况并进行交换,代码如下:

在这里插入图片描述

其次判断a和c的大小情况,并进行交换,代码如下:
在这里插入图片描述

最后判断b和c的大小情况,并进行交换,代码如下:

在这里插入图片描述

1.6.3 参考代码:
import java.util.Scanner;

public class MaxofThree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		System.out.println("请依次输入三个整数:a,b,c(以空格隔开)");
		int a=scanner.nextInt();
		int b=scanner.nextInt();
		int c=scanner.nextInt();
		scanner.close();
		System.out.println("a="+a+",b="+b+",c="+c);
		int temp=0;
		if(a>b) {
			temp = a;
			a = b;
			b = temp;
		}
		if(a>c) {
			temp = a;
			a = c;
			c = temp;
		}
		if(b>c) {
			temp = b;
			b = c;
			c = temp;
		}
		System.out.println("a="+a+",b="+b+",c="+c);
	}

}
1.6.4 扩展

用户在控制台输入 3 个数值,需要找出这 3 个数值中的最小值,要求使用 if 语句来实现。系统交互信息如图所示:

在这里插入图片描述

import java.util.Scanner;

public class MinofThree {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("请依次输入三个整数:a,b,c(以空格隔开)");
		int a=scanner.nextInt();
		int b=scanner.nextInt();
		int c=scanner.nextInt();
		scanner.close();
		
		int temp = a;
		if(temp>b) {
			temp = b;
		}
		if(temp>c) {
			temp = c;
		}
		System.out.println("最小值为:"+temp);
	}
}	



1.7 个人所得税计算器
1.7.1 问题:

计算个人所得税的缴纳情况。用户从控制台输入税前工资的金额,系统根据用户输入的工资金额计算应缴纳的税额,如图所示:

在这里插入图片描述

注:

工资个税的计算公式为:

应纳税额=(工资薪金所得-扣除数)×适用税率-速算扣除数

全月应纳税所得额=月工资薪金所得-扣除数

2011年 9月1日起执行7级超额累进税率:扣除数为3500元。

在这里插入图片描述

1.7.2 参考代码:
package day03;

import java.util.Scanner;

public class IncomeTax {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入你的工资的税前金额(¥):");
		double salary = scanner.nextDouble();
		double tax = 0.0;
		double taxIncome = salary-3500;
		if(taxIncome<=0) {
			tax = 0.0;
		}else if(taxIncome<=1500) {
			tax = taxIncome*0.03;
		}else if(taxIncome<=4500) {
			tax = taxIncome*0.10-105;
		}else if(taxIncome<=9000) {
			tax = taxIncome*0.20-555;
		}else if(taxIncome<=35000) {
			tax = taxIncome*0.25-1005;
		}else if(taxIncome<=55000) {
			tax = taxIncome*0.30-2755;
		}else if(taxIncome<=80000) {
			tax = taxIncome*0.35-5505;
		}else {
			tax=taxIncome*0.45-13505;
		}
		System.out.println("你应该缴纳的个人所得税是:¥"+tax);
		scanner.close();
	}
}

1.7.3 扩展:

​ 计算个人工资收入的保险缴纳情况以及个人所得税。用户从控制台输入税前工资的金额,系统根据用户输入的工资金额计算应缴纳的各项保险的总金额,并计算应该缴纳的税额。系统交互过程如图所示:

在这里插入图片描述

注:

工资个税的计算公式为:

应纳税额=(工资薪金所得-各项保险金额-扣除数)×适用税率-速算扣除数

全月应纳税所得额=月工资薪金所得-各项保险金额-扣除数

其中,各项保险金额的缴纳比例如下:

养老保险:月工资薪金所得 × 8%

医疗保险:月工资薪金所得 × 2%

失业保险:月工资薪金所得 × 0.2%

公积金:月工资薪金所得 × 12%

系统代码实现如下:

package day03;

import java.util.Scanner;

public class InsuranceTax {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入你的工资的税前金额(¥):");
		double salary=scanner.nextDouble();
		scanner.close();
		//计算各项保险金额
		double endowmentInsurance=salary*0.08;
		double medicalInsurance=salary*0.02;
		double unemploymentInsurance=salary*0.002;
		double accumulationFund=salary*0.12;
		double insurance=endowmentInsurance+medicalInsurance+unemploymentInsurance+accumulationFund;
		System.out.println("你应该缴纳的各项保险总金额为:¥"+insurance);
		//计算个税
		double tax=0.0;
		double taxIncome=salary-insurance-3500;
		if(taxIncome<=0) {
			tax = 0.0;
		}else if(taxIncome<=1500) {
			tax = taxIncome*0.03;
		}else if(taxIncome<=4500) {
			tax = taxIncome*0.10-105;
		}else if(taxIncome<=9000) {
			tax = taxIncome*0.20-555;
		}else if(taxIncome<=35000) {
			tax = taxIncome*0.25-1005;
		}else if(taxIncome<=55000) {
			tax = taxIncome*0.30-2755;
		}else if(taxIncome<=80000) {
			tax = taxIncome*0.35-5505;
		}else {
			tax=taxIncome*0.45-13505;
		}
		System.out.println("你应该缴纳的个人所得税是:¥"+tax);
		scanner.close();
	}
}


有疑问的同学可以QQ扫描下方二维码,寻求帮助

在这里插入图片描述

  • 15
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
1.1 Java语言发展简史2 1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 1.4.3 设置环境变量13 1.4.4 验证配置的正确性14 1.5 MyEcilpse工具介绍JavaSE环境安装和配置15 1.6 本章练习16 第2章 2.1 什么是程序18 2.2 计算机中的程序18 2.3 Java程序19 2.3.1 Java程序中的类型19 2.3.2 Java程序开发三步曲21 2.3.3 开发Java第一个程序21 2.3.4 Java代码中的注释23 2.3.5 常见错误解析24 2.4 Java类库组织结构和文档27 2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java中的八种基本数据类型34 3.2.2 普及二进制36 3.2.3 进制间转换37 3.2.4 基本数据类型间转换38 3.2.5 数据类型应用实例38 3.2.6 引用数据类型39 3.3 关键字.标识符.常量39 3.3.1 变量命名规范39 3.3.2 经验之谈-常见错误的分析与处理40 3.3.3 Java标识符命名规则41 3.3.4 关键字42 3.3.5 常量42 3.4 运算符43 3.4.1 算术运算符43 3.4.2 赋值操作符45 3.4.3 关系操作符47 3.4.4 逻辑操作符48 3.4.5 位操作符49 3.4.6 移位运算符49 3.4.7 其他操作符50 3.5 表达式52 3.5.1 表达式简介52 3.5.2 表达式的类型和值52 3.5.3 表达式的运算顺序52 3.5.4 优先级和结合性问题52 3.6 选择结构54 3.6.1 顺序语句54 3.6.2 选择条件语句54 3.6.3 switch结构59 3.6.4 经验之谈-常见错误的分析与处理65 3.6.5 Switch和多重if结构比较66 3.7 循环语句66 3.7.1 While循环67 3.7.2 经验之谈-常见while错误70 3.7.3 do-while循环72 3.7.4 for循环74 3.7.5 经验之谈-for常见错误76 3.7.6 循环语句小结78 3.7.7 break语句79 3.7.8 continue语句82 3.8 JavaDebug技术84 3.9 本章练习85 第4章 4.1 一维数组90 4.1.1 为什么要使用数组90 4.1.2 什么是数组91 4.1.3 如何使用数组92 4.1.4 经验之谈-数组常见错误97 4.2 常用算法98 4.2.1 平均值,最大值,最小值98 4.2.3 数组排序102 4.2.3 数组复制103 4.3 多维数组105 4.3.1 二重循环105 4.3.2 控制流程进阶107 4.3.3 二维数组111 4.4 经典算法113 4.4.1 算法-冒泡排序113 4.4.2 插入排序115 4.5 增强for循环116 4.6 本章练习117 第5章 5.1 面向过程的设计思想120 5.2 面向对象的设计思想120 5.3 抽象121 5.3.1 对象的理解121 5.3.2 Java抽象思想的实现122 5.4 封装124 5.4.1 对象封装的概念理解124 5.4.2 类的理解125 5.4.3 Java类模板创建125 5.4.4 Java中对象的创建和使用127 5.5 属性130 5.5.1 属性的定义130 5.5.2 变量131 5.6 方法132 5.6.1 方法的定义132 5.6.2 构造方法135 5.6.4 方法重载138 5.6.5 自定义方法138 5.6.6 系统提供方法139 5.6.7 方法调用140 5.6.8 方法参数及其传递问题144 5.6.9 理解main方法语法及命令行参数147 5.6.1 0递归算法147 5.7 this关键字148 5.8 JavaBean149 5.9 包150 5.9.1 为什么需要包?150 5.9.2 如何创建包151 5.9.3 编译并生成包:151
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听潮阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值