前言
这两天闲着无聊,把Java学学。全程跟着how2j的教学走,相关链接:https://how2j.cn/k/control-flow/control-flow-practise/656.html 。毕竟以前学过,基础部分还是很简单。
ifelse
练习一:BMI肥胖指数
题目描述:肥胖指数BMI等于体重(kg)/(身高*身高)(m)
参考答案:
点我查看
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入身高(m):");
float hight=sc.nextFloat();
System.out.println("请输入体重(kg):");
float weight=sc.nextFloat();
float BMI=weight/(hight*hight);
if(BMI<18.5){
System.out.println("当前的BMI是:"+BMI);
System.out.println("身体状态是:体重过轻");
}
else if(BMI<24&&BMI>=18.5){
System.out.println("当前的BMI是:"+BMI);
System.out.println("身体状态是:体重正常");
}
else if(BMI<27&&BMI>=24){
System.out.println("当前的BMI是:"+BMI);
System.out.println("当前的身体状态是:体重过重");
}
else if(BMI<30&&BMI>=27){
System.out.println("当前的BMI是:"+BMI);
System.out.println("当前的身体状态是:轻度肥胖");
}
else if(BMI<35&&BMI>=30){
System.out.println("当前的BMI是:"+BMI);
System.out.println("当前的身体状态是:中度肥胖");
}
else if (BMI>=35){
System.out.println("当前的BMI是:"+BMI);
System.out.println("当前的身体状态是:过度肥胖");
}
else{
System.out.println("你输入的信息有误");
}
sc.close();
}
}
注:如果使用VSCode练习的话,有GBK相关报错可以去更改默认的编码方式为GBK,加载后直接在终端运行java 编译后的类名
即可,如java test
,不然Scanner这个地方无法使用键盘输入
练习二:闰年
题目描述:
判断某一年是否为闰年
通过Scanner 输入一个年份,然后判断该年是否是闰年
闰年判断标准(满足任何一个)
- 如果能够被4整除,但是不能被100整除
- 能够被400整除
参考答案:
点我查看
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
System.out.println("请输入年份:");
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
sc.close();
if(num%4==0&&num%100!=0||num%400==0){
System.out.println(num+"是闰年");
}
else{
System.out.println(num+"不是闰年");
}
}
}
switch
根据输入的月份判断季节
参考答案:
点我查看
import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
System.out.println("请输入月份:");
Scanner sc=new Scanner(System.in);
int season=sc.nextInt();
sc.close();
switch (season) {
case 2:
case 3:
case 4:
System.out.println("春天");
break;
case 5:
case 6:
case 7:
System.out.println("夏天");
case 8:
case 9:
case 10:
System.out.println("秋天");
case 11:
case 12:
case 1:
System.out.println("冬天");
default:
System.out.println("请输入正确的月份~");
break;
}
}
}
switch可以使用byte,short,int,char,String,enum
注: 每个表达式结束,都应该有一个break;
注: String在Java1.7之前是不支持的, Java从1.7开始支持switch用String的,编译后是把String转化为hash值,其实还是整数
注: enum是枚举类型,在枚举章节有详细讲解
while
示例
1、while(){}
2、do{} while循环
1只有括号里的条件为true时才会执行,2是先执行一次再判断条件
练习:阶乘
点我查看
import java.util.Scanner;
public class test4 {
// 阶乘
public static void main(String[] args) {
System.out.println("请输入一个数:");
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
sc.close();
int i=1,j=1;
while(i<num){
i=i+1;
j=j*i;
//System.out.println("过程为"+j);
}
System.out.println(num+"的阶乘是"+j);
}
}
问题: 洪乞丐干10天,收入是多少?
参考答案:
点我查看
public class test5 {
public static void main(String[] args) {
int sum=0;
for(int i=1;i<=10;i++){
int money=(int)Math.pow(2, i-1);
sum+=money;
}
//知道求和公式还写个锤子for循环 int a=(int)Math.pow(2, 10)-1;
System.out.println("乞丐十天的收入是"+sum);
}
}
continue
示例
//打印单数
for (int j = 0; j < 10; j++) {
if(0==j%2)
continue; //如果是双数,后面的代码不执行,直接进行下一次循环
System.out.println(j);
练习:忽略倍数
题目描述:打印 1-100 之间的数,如果这个数,要么是3,要么5的倍数,就忽略掉
参考答案:
点我查看
public class test6 {
public static void main(String[] args) {
// 忽略倍数
for(int i=1;i<100;i++){
if(i%3==0||i%5==0)
continue;
System.out.println(i);
}
}
}
break
示例
//打印单数
for (int j = 1; j < 10; j++) {
if(0==j%2)
break; //如果是双数,直接结束循环
System.out.println(j);
输出:1
练习:百万富翁
题目描述:
假设你月收入是3000,除开平时花销,每个月留下1000块钱进行投资。
然后你认真的钻研了 《股票和基金 21天从入门到精通》,达到了每年20%的投资回报率。
那么问题来了,以每个月投资1000块钱的节奏,持续投资多少年,总收入达到100万
(复利计算按照每年12000投入计算,不按照每月计息)
复利公式:
F = p* ( (1+r)^n );
F 最终收入
p 本金
r 年利率
n 存了多少年
假设情景一:
p = 10000
r = 0.05
n = 1
解读:
本金是10000
年利率是5%
存了一年 1次
复利收入 10000*( (1+0.05)^1 ) = 10500
假设情景二:
p = 10000
r = 0.05
n = 2
解读:
本金是10000
年利率是5%
存了两年
复利收入 10000*( (1+0.05)^2 ) = 11025
提示:
第一年收入120001.2
第二年收入120001.21.2(第一年本息)+120001.2
第三年收入120001.21.21.2(第一年本息)+120001.21.2(第二年本息)+120001.2
以此类推
参考答案:
点我查看
public class test7 {
public static void main(String[] args) {
// 百万富翁
// 本质还是等比数列求和
double j;//每年收入
double sum=0;//总收入
double target=1000000;//目标
for(int i=1;i<100;i++){
j=Math.pow(1.2, i)*12000;
sum=sum+j;
if (sum>target)
break;
System.out.println("第"+i+"年收入:"+sum);
}
}
}
结束外部循环
break只能结束当前循环
示例一:使用boolean变量结束外部循环
public class HelloWorld {
public static void main(String[] args) {
boolean breakout = false; //是否终止外部循环的标记
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println(i + ":" + j);
if (0 == j % 2) {
breakout = true; //终止外部循环的标记设置为true
break;
}
}
if (breakout) //判断是否终止外部循环
break;
}
}
}
示例二:使用标签结束外部循环
public class HelloWorld {
public static void main(String[] args) {
//打印单数
outloop: //outloop这个标示是可以自定义的比如outloop1,ol2,out5
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println(i+":"+j);
if(0==j%2)
break outloop; //如果是双数,结束外部循环
}
}
}
}
综合练习
练习一:黄金分割点
题目要求:
寻找某两个数相除,其结果 离黄金分割点 0.618最近
分母和分子不能同时为偶数
分母和分子 取值范围在[1-20]
参考答案:
点我查看
public class test9 {
public static void main(String[] args) {
final float a=0.618f;
float x=0f;//因为i和j都是整型,再与a计算后会进行损失精度,因而用x存储(float)i/(float)j
float b=0f;//用于存储|x-a|,表示i/j与a的接近程度
float temp=1f;//用于临时存放较小的b,定义成1是因为0<b<1,且便于把初次的b赋值给temp及后续比较找出较小的b
int c=0;//用于记录找出较小b时的i,以便于输出
int d=0;//用于记录找出较小b时的j,以便于输出
for(int i=1;i<=20;i++) {
for(int j=1;j<=20;j++) {
x=(float)i/(float)j;
b=x>=a?x-a:a-x;//保证输出b=|x-a|
if(b<temp) {
temp=b;//将较小的赋值给temp,直到最小的b,代表着最接近0.618
c=i;
d=j;
}
}
}
System.out.println("在[1~20]范围内"+c+"和"+d+"两数相除为:"+((float)c/(float)d)+
",最为接近黄金分割点0.618。");
}
}
练习二:水仙花数
题目要求:
水仙花数定义:
- 一定是3位数
- 每一位的立方,加起来恰好是这个数本身,比如153=111+555+333
寻找所有的水仙花数
参考答案:
点我查看
public class test011 {
public static void main(String[] args) {
// 寻找所有的水仙花数
int a;//个位
int b;//十位
int c;//百位
for(int i=100;i<1000;i++){
a=i%10;
b=i/10%10;
c=i/100;
if(i==a*a*a+b*b*b+c*c*c){
System.out.println(i);
}
}
}
}
练习三:小学算术题
题目要求:
提示使用多层循环嵌套解决
参考答案:
点我查看
public class test012 {
public static void main(String[] args) {
{
int a,b,c,d;
for(a=0;a<9;a++)
{
b=8-a;
c=14-a;
d=10-8+a;
if((c-d)==6)//这不就变成一元一次方程了吗
{
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
}
}
}