流程控制语句结构:
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("谢谢惠顾");
}
}
}