12.17_学习Java的day03(详解)

流程控制语句结构:

1、顺序结构:从上至下依次执行
2、分支结构:一个、两个、多个的分支,有条件的有选择的执行
3、循环结构:重复执行某些语句

class Statement{
	public static void main(String[] args){
		//顺序结构是最基本的结构
		System.out.println("hello");
		System.out.println("world");
		
		//分支结构
		int age = 12;
		if(age > 18){
			System.out.println("成年");
		}else{
			System.out.println("未成年");
		}
		
		//循环结构
		for(int i=1; i<=5; i++){
			System.out.println("chailinyan is a beautiful girl.");
		}
	}
}

一、顺序结构

计算机的程序,在一个方法中,总体上来说都是顺序结构,从上往下执行。
即CPU是逐条执行指令。

两种特殊的顺序结构:

1、输出

System.out.println(x); 输出后换行
System.out.print(x); 输出后不换行

2、输入

键盘输入

步骤:
(1)准备键盘输入的文本扫描仪对象,我们指定它从键盘扫描

java.util.Scanner  input  = new java.util.Scanner(System.in);

类型 变量名 = 值;

说明

java.util.Scanner:文本扫描仪类型,固定写法
java.util是包,Scanner是类名(今天不讨论)
其中包名是全部小写,Scanner是类名,每一个单词的首字母都大写
input:变量,自己命名
这里命名为input,表示见名知意,是代表输入
③**=: 用=右边的xx为左边的input变量赋值。
new**:创建对象, 固定写法(今天不讨论)
java.util.Scanner(System.in):表示调用类型的构造器创建对象,固定写法(今天不讨论)
System.in:参数,代表的是键盘输入

System.out:代表标准输出
System.in:代表标准输入

(2)建议大家在接收键盘输入之前,给用户以提示
例如:System.out.print(“请输入年龄:”);
(3)接收用户键盘输入的内容
int age = input.nextInt();

各种数据类型的输入:
int类型: input.nextInt()
double类型:input.nextDouble()
boolean类型:input.nextBoolean()
字符串类型:input.next()
char类型:input.next().charAt(0)

nextInt()的I
nextDouble()的D
nextBoolean()的B
charAt()的A
都是大写的,因为他们是方法名的第二个单词。

标识符的命名规范:变量名、方法名是从第二个单词开始首字母大写

class Input{
	//不调用不执行
	public static void test(){
		System.out.println("hello");
	}
	
	//Java程序的入口。
	public static void main(String[] args){
		//System.out.println("world");
		//int age = 18;//硬编码
		//System.out.println("age = " + age);
		
		//(1)准备键盘输入的扫描仪对象
		java.util.Scanner  input  = new java.util.Scanner(System.in);
		
		//(2)提示并接收输入
		System.out.print("请输入年龄:");
		int age = input.nextInt();
		
		//(2)提示并接收输入
		System.out.print("请输入姓名:");
		String name = input.next();
		
		//(2)提示并接收输入
		System.out.print("请输入体重:");
		double weight = input.nextDouble();
		
		//(2)提示并接收输入
		System.out.print("请输入是否已婚:");
		boolean marry = input.nextBoolean();
		
		//(2)提示并接收输入
		System.out.print("请输入性别:");
		//input.next()把输入的性别当做字符串
		//charAt(0):取出字符串的第1个字符
		char gender = input.next().charAt(0);
		
		System.out.println("age = " + age);
		System.out.println("name = " + name);
		System.out.println("weight = " + weight);
		System.out.println("marry = " + marry);
		System.out.println("gender = " + gender);
		
	}
}

二、分支结构:

一个、两个、多个的分支,有条件的有选择的执行。
(一)条件判断:if…else
1、单分支
2、双分支
3、多分支
4、嵌套
(二)选择结构:switch…case

学习流程控制语句结构的要求:

(1)掌握它们的语法结构
(2)掌握它们的运行特点、运行过程

(一)条件判断:if…else

1、单分支

(1)语法结构
if(条件表达式){
当条件表达式为true时,需要执行的语句块;
}
(2)运行特点
当if(条件表达式)成立,就执行{}中的语句块,否则就不执行

(3)注意
①if(条件表达式)必须是boolean类型
②if(条件表达式){}的{}省略了,默认只带一句语句

class If{
	public static void main(String[] args){
		java.util.Scanner s = new java.util.Scanner(System.in);
		
		System.out.print("请输入年龄:");
		int age = s.nextInt();
		
		//如果年龄达到18岁(含),就允许进入我们的应用程序...
		//if(age >= 18);  注意空语句;的陷阱
		if(age >= 18){
			System.out.println("欢迎来到游戏中心!");
			System.out.println("祝你玩得愉快!");
		}
		
		//if(age = 18){//不兼容的类型: int无法转换为boolean
		//	System.out.println("欢迎来到尚硅谷游戏中心!");
		//}
		
		//boolean flag = false;
		//if(flag = true){//赋值,flag是boolean类型,它的值可以用作条件
		//	System.out.println("成立");
		//}
	}
}

2、双分支

(1)语法结构
if(条件表达式){
当条件表达式为true时,需要执行的语句块1;
}else{
当条件表达式为false时,需要执行的语句块2;
}

(2)执行特点
当条件表达式为true时,执行语句块1,否则执行语句块2

(3)注意
①if(条件表达式)必须是boolean类型
②不管是if还是else的{}省略了,默认只带一句语句

class IfElse{
	public static void main(String[] args){
		//从键盘输入一个整数,判断是奇数还是偶数,0算偶数
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("请输入一个整数:");
		int num = input.nextInt();
		
		if(num % 2 == 0){
			System.out.println(num + "是偶数");
		}else{
			System.out.println(num + "是奇数");
		}
	}
}

3、多分支

(1)语法格式
if(条件表达式1){
当条件表达式1为true时,需要的执行语句块1;
}else if(条件表达式2){
当条件表达式2为true时,需要的执行语句块2;
}else if(条件表达式3){
当条件表达式3为true时,需要的执行语句块3;
}
。。。

else{
当以上条件都不成立时,需要的执行语句块n+1;
}

中文【】表示这个部分可以缺省(没有)

(2)执行特点
①先判断条件表达式1,如果条件成立,直接执行对应的语句块1,后面其他的就不看了
②当条件表达式1不成立,接着判断条件表达式1,如果条件成立,直接执行对应的语句块2,后面其他的就不看了
③依次类推
④如果以上条件都不成立时,如果存在单独的else,需要的执行语句块n+1;

(3)注意
①if(条件表达式)必须是boolean类型
②不管是if还是else的{}省略了,默认只带一句语句
③当多个if条件的范围没有重叠部分,那么顺序可以随意;
当多个if条件的范围有重叠部分,那么范围小的在上,大的在下面

class IfElseIf{
	public static void main(String[] args){
		java.util.Scanner s = new java.util.Scanner(System.in);
		
		System.out.print("请输入年龄:");
		int age = s.nextInt();
		
		/*
		如果年龄达到150以上(含),输出妖精
		如果年龄[100,150),输出长寿
		如果年龄[60,100),输出老人
		如果年龄[40,60),输出中年人
		如果年龄[18,40),输出青壮年
		如果年龄[0,18),输出未成年
		如果年龄是负数的,输入有误		
		*/
		
		if(age >= 150){
			System.out.println("妖精");
		}else if(age>=100 && age<150){
			System.out.println("长寿");
		}else if(age>=60 && age<100){
			System.out.println("老人");
		}else if(age>=40 && age<60){
			System.out.println("中年人");
		}else if(age>=18 && age<40){
			System.out.println("青壮年");
		}else if(age>=0 && age<18){
			System.out.println("未成年");
		}else{
			System.out.println("输入有误");
		}
		
		
		if(age >= 150){
			System.out.println("妖精");
		}else if(age >= 100){
			System.out.println("长寿");
		}else if(age >= 60){
			System.out.println("老人");
		}else if(age >= 40){
			System.out.println("中年人");
		}else if(age >= 18){
			System.out.println("青壮年");
		}else if(age >= 0){
			System.out.println("未成年");
		}else{
			System.out.println("输入有误");
		}
	}
}

(二)选择结构:switch…case

1、语法格式

switch(表达式){
case 常量值1:
语句块1;
case 常量值2:
语句块2;

【default:
语句块n+1;

}

2、执行特点:

(1)入口
①:当switch(表达式)中表达式的值与 其中一个case 后面的常量值匹配(相等),就从这个case进入switch分支;
②:当switch(表达式)中表达式的值与 所有的case 后面的常量值都不匹配,就会从default进入

(2)出口
①自然出口:switch的结束}
②中断出口:break

(3)贯穿
从“入口”进入后,一直会贯穿整个switch,直到遇到“出口”

(4)结论
无论有没有default,不管default的位置在哪里,
switch(表达式)中表达式的值都是先和case后面的常量值进行匹配,
如果有匹配的,就从匹配的case进入,一直贯穿执行,直到遇到“出口”。
如果与所有的case都不匹配,才会找default进入,一旦进入,
也会贯穿执行,直到遇到“出口”

3、注意

(1)case后面必须是常量值或常量表达式,不能是变量
(2)case后面的常量值不能重复
(3)switch(表达式)中表达式值的类型必须是
①四种基本数据类型之一:byte,short,int,char
②两种引用数据类型:String(JDK1.7),枚举(JDK1.5)

class Switch{
	public static void main(String[] args){
		/*
		从键盘输入一个数字,代表星期的数字,输出对应的英语单词,
		例如:1-->Monday
		*/
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("请输入星期的值:");
		int week = input.nextInt();
		
		//int a = 1;
		switch(week){
			case 1:
				System.out.println("Monday");
				break;
			case 2:
				System.out.println("Tuesday");
				break;
			case 3:
				System.out.println("Wednesday");
				break;
			case 4:
				System.out.println("Thursday");
				break;
			case 5:
				System.out.println("Friday");
				break;
			case 6:
				System.out.println("Saturday");
				break;
			case 7:
				System.out.println("Sunday");
				break;
			default:
				System.out.println("输入有误!");
				break;
		}
	}
}

练习

1

根据用于指定月份,打印该月份所属的季节。
3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季

class Exer1{
	public static void main(String[] args){
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("请输入月份:");
		int month = input.nextInt();
		
		switch(month){
			case 3:
				System.out.println("春季");
				break;
			case 4:
				System.out.println("春季");
				break;
			case 5:
				System.out.println("春季");
				break;
			case 6:
				System.out.println("夏季");
				break;
			case 7:
				System.out.println("夏季");
				break;
			case 8:
				System.out.println("夏季");
				break;
			case 9:
				System.out.println("秋季");
				break;
			case 10:
				System.out.println("秋季");
				break;
			case 11:
				System.out.println("秋季");
				break;
			case 12:
				System.out.println("冬季");
				break;
			case 1:
				System.out.println("冬季");
				break;
			case 2:
				System.out.println("冬季");
				break;
			default:
				System.out.println("输入有误!");
		}
	}
}

2

从键盘分别输入年、月、日,判断这一天是当年的第几天 。先不考虑非法值输入
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
2)可以被400整除
例如:1900,2200等能被4整除,但同时能被100整除,但不能被400整除,不是闰年

class Exer2{
	public static void main(String[] args){
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("年:");
		int year = input.nextInt();
		
		System.out.print("月:");
		int month = input.nextInt();
		
		System.out.print("日:");
		int day = input.nextInt();
		
		/*
		判断这一天是当年的第几天
		思路:
			累加这一天-->1月1日的总天数
			分为两个部分:
			(1)第month个月的day天
			(2)[1月, month-1月]的满月天数
			例如:3月5日    第3月的5天  +  1和2月的满月天数	
			例如:1月5日    第1月的5天  +  0;
		*/
		//声明一个变量,表示/存储总天数
		int totalDays = 0;
		/*
		switch(month){
			case 1:
				totalDays += day;
			case 2:
				totalDays += day + 1月的满月天数;
			case 3:
				totalDays += day + 1月的满月天数 + 2月满月天数;
			case 4:
				totalDays += day + 1月的满月天数 + 2月满月天数 + 3月的满月天数;
		}
		*/
		switch(month){
			case 12:
				//totalDays += 11月的满月天数;
				totalDays += 30;
			case 11:
				//totalDays += 10月的满月天数;
				totalDays += 31;
			case 10:
				//totalDays += 9月的满月天数;
				totalDays += 30;
			case 9:
				//totalDays += 8月的满月天数;
				totalDays += 31;
			case 8:
				//totalDays += 7月的满月天数;
				totalDays += 31;
			case 7:
				//totalDays += 6月的满月天数;
				totalDays += 30;
			case 6:
				//totalDays += 5月的满月天数;
				totalDays += 31;
			case 5:
				//totalDays += 4月的满月天数;
				totalDays += 30;
			case 4:
				//totalDays += 3月的满月天数;
				totalDays += 31;
			case 3:
				//totalDays += 2月满月天数;
				totalDays += 28;
				//2月不一定是28天
				if(year%4==0 && year%100!=0 || year%400==0){//闰年
					totalDays++;
				}
			case 2:
				//totalDays += 1月的满月天数;
				totalDays += 31;
			case 1:
				totalDays += day;
		}
		System.out.println("这是这一年的第" + totalDays+"天");
	}
}

3

假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,
提示用户输入一个两位数,然后按照下面的规则判定用户是否能赢。
1)如果用户输入的数匹配彩票的实际顺序,奖金10 000美元。
2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金 3 000美元。
3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1 000美元。
4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。
5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。
提示:使用Math.random() 产生随机数
Math.random() 产生[0,1)范围的随机值
Math.random() * 90:[0,90)
Math.random() * 90 + 10:[10,100) 即得到 [10,99]
使用(int)(Math.random() * 90 + 10)产生一个两位数的随机数。

class Exer3{
	public static void main(String[] args){
		//随机地产生一个两位数
		int rand = (int)(Math.random() * 90  + 10);
		//System.out.println("rand = " + rand);
		
		java.util.Scanner input = new java.util.Scanner(System.in);
		System.out.print("请输入一个两位数[10,99]之间:");
		int num = input.nextInt();		
		
		int numGe = num %  10;
		int numShi = num / 10;
		int randGe = rand % 10;
		int randShi = rand / 10;
		
		if(num == rand){
			System.out.println("奖金10 000美元");
		}else if(numGe == randShi && numShi == randGe){
			System.out.println("奖金 3 000美元");
		}else if(numGe == randGe || numShi == randShi){
			System.out.println("奖金 1 000美元");
		}else if(numGe == randShi || numShi == randGe){
			System.out.println("奖金 500美元");
		}else{
			System.out.println("谢谢惠顾");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值