前言

这两天闲着无聊,把Java学学。全程跟着how2j的教学走,相关链接:https://how2j.cn/k/control-flow/control-flow-practise/656.html 。毕竟以前学过,基础部分还是很简单。

ifelse

练习一:BMI肥胖指数

题目描述:肥胖指数BMI等于体重(kg)/(身高*身高)(m)
image.png

image.png

参考答案:

点我查看
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 输入一个年份,然后判断该年是否是闰年

闰年判断标准(满足任何一个)

  1. 如果能够被4整除,但是不能被100整除
  2. 能够被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);
    }
}
## for ### 练习:乞丐 题目描述: 天朝有一个乞丐姓洪,去天桥要钱 第一天要了1块钱 第二天要了2块钱 第三天要了4块钱 第四天要了8块钱 以此类推

问题: 洪乞丐干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);
    }
}
注:math.pow(a,b)默认double类型,需要强制转换为int;a是底数,b是指数

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
第二年收入12000
1.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。");
    }
}

练习二:水仙花数

题目要求:
水仙花数定义:

  1. 一定是3位数
  2. 每一位的立方,加起来恰好是这个数本身,比如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);
            }
        }
    }
}

练习三:小学算术题

题目要求:
提示使用多层循环嵌套解决
image.png

参考答案:

点我查看
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);
				}
			}
		}
	}
}

此时相望不相闻,愿逐月华流照君。