控制语句分为三类:顺序、选择和循环。
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