Java控制语句与循环类经典程序、猜价格小游戏

控制语句分为三类:顺序、选择和循环。

1. “顺序结构”代表“先执行 a,再执行 b”的逻辑。

2. “条件判断结构”代表“如果…,就…”的逻辑。

3. “循环结构”代表“如果…,就重复执行…”的逻辑。

条件判断结构(选择结构)

条件判断结构有:if 结构和 switch 结构。而 if 结构又可以分为 if 单分支结构、if-else 双分支结构、if-else if-else 多分支结构

if 单分支结构 

语法结构: 

if(布尔表达式){ 
    
    语句块 

}


   
 注意: 

    1. if 语句不写{},就只能作用于后面的第一条语句。 


if-else 双分支结构

语法结构: 

if(布尔表达式){ 

    语句块 1 

}else{ 

    语句块 2 

} 

当布尔表达式为真时,执行语句块 1,否则,执行语句块 2。也就是 else 部分。


if-else if-else 多分支结构


语法结构: 

if(布尔表达式 1) { 

    语句块 1; 

} else if(布尔表达式 2) { 

    语句块 2; 


}…… 

else if(布尔表达式 n){ 

    语句块 n; 


} else { 

    语句块 n+1; 


} 

当布尔表达式 1 为真时,执行语句块 1;否则,判断布尔表达式 2,当布尔表达式 2 为真时,执行语句块 2;否则,继续判断布尔表达式 3······;如果 1~n 个布尔表达式均判定为

假时,则执行语句块 n+1,也就是 else 部分。 

switch 语句


switch 多分支结构(多值情况) 

语法结构: 

Switch(变量)

{
    case 变量的取值(整数,char,字符串):
    
    break;当你执行完选项值后,就要退出,大部分情况结合break

    default:相当于else 

}  

 注意:
    
    1. switch 会根据表达式的值从相匹配的case标签处开始执行,一直执行到break处或者是switch的末尾。如果表达式的值与任一case值不匹配,则进入default语句。 

 底层原理:

switch(变量)-----字节码--hashCode()(顺序的结构表)

在case变量中使用equals

使用场景:只要可以限定if条件语句值,都可以使用switch,但如果区间,只能用if(> < >= <=),区间段的程序没有办法做switch

等于:凡是字符串使用equals,凡是数值就可以用等号。

当程序中出现的语句不停复制,粘贴,程序的代码出现重码率。

在程序执行过程中,出现语句重复,可以考虑java循环结构。包括3种结构

while 循环  


语法结构: 

while (布尔表达式) { 
    
    循环体; 


} 

1. 在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而对于后来每一次额外的循环,都会在开始前重新计算一次。 

2.语句中应有使循环趋向于结束的语句,否则会出现无限循环–––"死"循环。 
 


do-while 循环


语法结构: 

do { 

    循环体; 


} while(布尔表达式) ; 

do-while 循环结构会先执行循环体,然后再判断布尔表达式的值,若条件为真,执行循环体,当条件为假时结束循环。do-while 循环的循环体至少执行一次。 

 循环结构(for)语法结构:

for (初始表达式; 布尔表达式; 迭代因子) { 
    
    循环体; 


} 

 初始化部分设置:循环变量的初值 

 条件判断部分为:布尔表达式 

 迭代因子:控制循环变量的增减 

for 循环在执行条件判定后,先执行的循环体部分,再执行步进。 
 
注意:while和for的区别

for循环的语句一定循环变量的初值和终值的范围,使用for循环循环几次.

While(只有一个条件),只要条件满足就执行,有的时候,程序无法预测条件什么时间满足,这时使用while.

**********循环类的精典程序*********


1、百僧吃百膜


100个和尚吃了100个馒头 ,100和尚有大和尚和小和尚,一个大和尚能吃3馒头,三个小和尚吃1个馒头,问大和尚和小和尚有多少个?

public class HundredMonks {

    public static void main(String[] args) {

        //有 i 个大和尚,就有 100-i 个小和尚

        for(int i=1;i<100;i++){

            if (3*i+(100-i)/3==100){

                System.out.println("大和尚的数量为:"+i);

                System.out.println("小和尚的数量为:"+(100-i));

            }

        }

    }

}


2、水仙花数


三位数,每人数的立方和等于数字本身,给定区间,求区间内所有水仙花数。


 

import java.util.Scanner;

import static java.lang.StrictMath.pow;

public class Narcissistic {

    public static void main(String[] args) {

        //获取输入设备

        Scanner input=new Scanner(System.in);

        System.out.println("请输入一个三位数的区间:");

        int little=input.nextInt();

        int big=input.nextInt();

        System.out.print("该区间的水仙花数有:");

        for (int i=1;i<9;i++){//百位

            for (int j=0;j<9;j++){//十位

                for (int k=0;k<9;k++){//个位

                    int narcissistic=i*100+j*10+k;

                    if ((pow(i,3)+pow(j,3)+pow(k,3)==narcissistic)&&(narcissistic>=little)&&(n
arcissistic<=big)){

                        System.out.print(narcissistic+"\t");


                    }

                }
            }
        }
    }
}

3、猴子吃桃问题


一堆桃,猴子第一天吃一半多一个,第二天吃了剩下的一半多一个,依次类推,每天都吃剩下的一半多一个,到10天就剩下1个桃子。求这堆桃有多少个?

public class MonkeyEat {

    public static void main(String[] args) {

        //第十天剩余数量

        int peach=1;

        for (int i=0;i<10;i++){

            peach=peach*2+1;//计算前一天的桃子数量

        }

        System.out.println("这堆桃子一共有"+peach+"个");

    }
}


 


4、斐波那契数列(生兔子)


一对兔,3个月后生出一对小兔(假设:兔子永远都不死)

1 1 2 3 5


 

import java.util.Scanner;


public class Fibonacci {

    public static void main(String[] args) {

        //获取输入设备

        Scanner input = new Scanner(System.in);

        //输入要计算到几月

        int month = input.nextInt();

        //月份小于2输出

        switch (month){

            case 1:

                System.out.println(1);

                break;

            default:

                System.out.print(1+"\t"+1);


        }

        int fibonacci1 = 1;//第一个月

        int fibonacci2 = 1;//第二个月

        int fibonacci3 = 0;//第三个月

        for (int i = 3; i <= month; i++) {

            fibonacci3 = fibonacci1 + fibonacci2;

            fibonacci1 = fibonacci2;

            fibonacci2 = fibonacci3;

            System.out.print("\t"+fibonacci3);


        }
    }
}


*******************

做游戏逻辑


猜价格

在后台,系统随机产生价格数字,由用户通过平台猜,猜出一个数字后,系统机器人通知你信息,大了,小了。再说一个数字,直到数字跟系统随机数字一致就游戏结束。

分析逻辑:

系统产生随机数字一次

用户猜

Input.next()

系统判断数字是大了,还是小了 if


这里循环:next()输入语句需要循环,if判断需要循环

循环条件:当价格=系统产生的随机价格退出

循环:没有次数的说明,一般直接while循环

程序:完善(菜单--提示--参与)

  流程:

1、显示菜单

2、选择物品类型:家电 文具

3、用户输入用户名,参与游戏

4、系统根据类别产生随机数

5、用户循环输入数字,每一个数字都判断大,小。

6、结束循环条件:用户猜对数字

这里的价格用float型(两位小数)

分析全局变量

 这里用户名需要程序开始和结束都要显示出来.

 系统的随机数在程序中需要比较,这个随机数也是全局变量float

import java.util.Scanner;

public class test_guest_price {

    public static void main(String[] args) {

        //定义全局变量,username玩家参与名字,plan_price系统产生的价格

        String username;

        //float类型赋初值尾部一定要加上f,不然小数会报错

        float plan_price=0.00f;

        //定义菜单

        System.out.println("----------------------------");

        System.out.println(" 游戏: 幸运价格猜猜猜");

        System.out.println("                 作者:AnYi");

        System.out.println("                 版本:v1.0");

        System.out.println("----------------------------");

        //显示欢迎界面,当用户敲入回车,进入用户的用户名输入

        Scanner scanner = new Scanner(System.in);

        //先接收回车,在这步用户敲任何数据都不接收,这句没有接收,原因用户敲任何内容不需要保存

        scanner.nextLine();

        //输入用户名

        System.out.println("请输入用户名字");

        username=scanner.next();
        System.out.println(username+",欢迎进入游戏空间,现在请选择的价格猜猜猜商品的类别");
        System.out.println("***********************");
        System.out.println("1------家电(1000-2000)");
        System.out.println("2------文具(1-100)");
        System.out.println("***********************");
        String user_choice=scanner.next();
        switch(user_choice){
            case "1":
                plan_price=Math.round(Math.random()*1000+1000);
                break;
            case "2":
                plan_price=Math.round(Math.random()*99+1);
                break;
            default:
                plan_price=Math.round(Math.random()*10000);
        }
        //做用户输入价格的提示
        System.out.println("请用户输入猜猜猜的价格:");
        //用户猜数字,输入价格和判断是重复的步骤,while猜对,还有一个变量用户输入价格
        float user_price=scanner.nextFloat();
        //设定一个最终输出不同信息的标志位
        boolean flag=false;
        while(!(user_price==plan_price)){
            //进入到循环中,如果用户输入0或者负数,直接退出循环
            //这里的user_price是一个区间段,只能用if
            if(user_price<=0) {
                //没有完成,放弃了,flag=true
                flag=true;
                //退出循环程序使用break
                break;
            }
            //进入循环的条件没有等于,else中的意义:除了大于就是小于
            if(user_price>plan_price){
                System.out.println("猜大了");
            }else{
                System.out.println("猜小了");
            }
            //循环继续猜
            user_price=scanner.nextFloat();
        }
        if(flag){
            System.out.println("再接再励");
        }else{
            System.out.println("你真聪明");
        }
        System.out.println("对本系统的使用有什么宝贵意见,可以联系作者或者email");

    }
}


 


注意:

(1)编程中,常遇到循环里面满足某一条件退出循环,退出循环后根据循环中发生的不同情况进行不同的逻辑处理,这种编程一般采用标志位的方法处理.

方法:

1\先设置一个标志位boolean ,初始值为false

2\满足某一条件时,退出循环则为true

3\根据标志位的true和false,来输出不同的信息.   

(2)如果只是用户参与使用回车或者某个信息,但这个信息不做无意义的存储.

Scanner.nextLine() 语句即可

完整代码请关注我的Gitee仓库:AnYi的Java学习之路: 从零开始学Java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值