1.流程控制
1.1 流程控制的定义
流程控制是用来控制程序中各语句的执行顺序
流程图:逐步解决指定问题的步骤和方法的一种图形化表示方法
1.2选择结构
1.2.1定义
选择结构是根据条件判断结果选择不同的处理
1.2.2语法
语法:if(表达式){},表达式必须是布尔值
1.2.3示例
Q1:张浩Java成绩大于90分,老师奖励他iPhoneX ,该怎么做呢?(基本if)
Scanner s = new Scanner(System.in);
System.out.print("请输入成绩:");
double javaScore = s.nextDouble();
if(javaScore > 90){
//代码块
System.out.println("奖励爱疯X");
}
System.out.println("奖励之后");
Q2:张浩Java成绩大于90分,并且音乐成绩大于80分时,或者Java成绩等于100分,音乐成绩大于70分时,老师奖励他,该怎么做呢?(复杂条件下的if选择结构)
Scanner s = new Scanner(System.in);
System.out.print("请输入JAVA成绩:");
double javaScore = s.nextDouble();
System.out.print("请输入C++成绩:");
double cScore = s.nextDouble();
if((javaScore > 90 && cScore > 80) || (javaScore == 100 && cScore > 70)){
//代码块
System.out.println("奖励爱疯X");
}
System.out.println("奖励之后,洗洗睡吧");
结合运算符的优先级编写条件
最高的优先级:( )
最低的优先级:=
优先级:!> 算术运算符 > 关系运算符 > && > ||
复杂条件使用括号提高可读性
Q3:如果张浩Java考试成绩大于90分,老师就奖励他一个iPhone5 ,否则老师就罚他蹲马步(使用if-else选择结构)
Scanner s = new Scanner(System.in);
System.out.print("请输入成绩:");
double javaScore = s.nextDouble();
if(javaScore > 90){
//代码块
System.out.println("奖励爱疯X");
}else{
System.out.println("罚在学校门口抱电线杆,大叫我是笨蛋");
}
System.out.println("奖励之后");
只有一条语句时,建议不省略{ }
Scanner s = new Scanner(System.in);
System.out.print("请输入成绩:");
double javaScore = s.nextDouble();
if(javaScore > 90)
System.out.println("奖励爱疯X");
else
System.out.println("罚在学校门口抱电线杆,大叫我是笨蛋");
System.out.println("奖励之后");
Q1:对学员的结业考试成绩评测,成绩>=80 :良好 ,成绩>=60 :中等,成绩<60 :差(多重if结构)
多重if选择结构中各个条件的顺序可以任意排列吗?
Note:
- 使用多重if选择语句处理问题时需要注意顺序,从大到小或者从小到大
- If只能在第一位,且必须有一个
- Else只能在最后一位,且最多一个
- Else if在中间,可以有若干个(0-n)
- If-else if-else:是由上往下依次判断,匹配第一个结果为true的,执行该代码块,代码块执行完毕后,跳出。
- If嵌套:是为了让代码的可读性更高,逻辑更清楚
- 在单个代码块当中,某一次嵌套,最好不要超过三层,如果超过,检查逻辑
Scanner s = new Scanner(System.in);
System.out.print("请输入成绩:");
double javaScore = s.nextDouble();
//
if(javaScore>75 && javaScore <= 90){//冗余代码
System.out.println("良好");
}else if(javaScore>90){
System.out.println("优秀");
}else if(javaScore>=60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
Q5:学校举行运动会,百米赛跑跑入10 秒内的学生有资格进决赛,根据性别分别进入男子组和女子组 (嵌套if)
嵌套if控制语句可以通过外层语句和内层语句的协作,增强程序的灵活性
Scanner s = new Scanner(System.in);
System.out.print("请输入成绩:");
int time = s.nextInt();
System.out.print("请输入性别:");
String sex = s.next();
//1.先判断性别
// if("男".equals(sex)){
// if(time < 10){
// System.out.println("男子决赛");
// }
// }else{
// if(time < 10){
// System.out.println("女子决赛");
// }
// }
//2.请问,这么写对吗?
// if("男".equals(sex) && time < 10){
// System.out.println("男子决赛");
// }else if("女".equals(sex) && time < 10){
// System.out.println("女子决赛");
// }else{
// System.out.println("淘汰");
// }
//3.逻辑清晰明了(if嵌套---->三目)
if(time < 10){
// if("男".equals(sex)){
// System.out.println("男子决赛");
// }else{
// System.out.println("女子决赛");
// }
String r = "男".equals(sex)?"男子决赛":"女子决赛";
System.out.println(r);
}else{
System.out.println("淘汰");
}
Q6:韩嫣参加计算机编程大赛,如果第一名,参加麻省理工大学组织的1个月夏令营,如果第二名,奖励惠普笔记本电脑一部,如果第三名,奖励移动硬盘一个,否则,不给任何奖励 (Switch结构)
解决方法:使用多重if选择结构实现,缺点:结构复杂,啰嗦;使用switch选择结构解决,特点:条件为等值判断
Switch的注意点:
- 条件不是布尔类型,除了long以外的整形+枚举+(JDK1.7以后的String)+char
- 比较的一定常量等值判断,且常量不可重复
- Break:防止穿透
- 每一个case是一个独立的作用域
- 无需依次比较,一次找到目标
- Default:当所有条件都不满足的时候,执行default,可以有,也可以没有;可以在任何位置;但是通常来说,我们习惯性将其放在首位或者末尾;如果不是末尾,一般需要加上break;
Scanner s = new Scanner(System.in);
System.out.print("请输入名次:");
//优雅的switch
int num = s.nextInt();
switch(num){
default:
System.out.println("奖励早点回家");
break;
case 1:
System.out.println("奖励夏令营");
break;
case 2:
// int i = 1;
System.out.println("奖励笔记本");
break;
case 3:
System.out.println("奖励手机");
break;
}
// if(num == 1){
// int i = 1;
// }else if(num == 2){
// int i = 1;
// }else if(num == 3){
// int i = 1;
// }else{
// int i = 1;
// }
比较switch和多重if选择结构:
- 相同点:都是用来处理多分支条件的结构
- 不同点:switch选择结构:只能处理等值条件判断的情况;多重if选择结构:没有switch选择结构的限制,特别适合某个变量处于某个连续区间时的情况
1.3循环结构
1.3.1循环的作用
案例1:张浩Java考试成绩未达到自己的目标。为了表明自己勤奋学习的决心,他决定写一百遍“好好学习,天天向上!”
//固定次数的
int i = 0;//初始化变量
while(i < 100){//判断条件
System.out.println("第"+i+"次");//循环体
i ++;//迭代
}
//0-99次:希望大家开始习惯从0开始数数
案例2:打印50份试卷,10000米赛跑,做100道编程题
1.3.2循环的四要素
① 初始化变量:从哪开始
② 判断条件:到哪结束
③ 循环体:是循环执行的主要内容
④ 迭代:无限向目标趋近
1.3.3while循环
while循环,当条件不满足时,一次也不执行;先判断,再执行。
1.3.1do-while循环
当条件不满足时,至少执行一次;先执行,再判断。
int i = 100000;//初始化变量
do{
System.out.println("第"+i+"次");//循环体
i ++;//迭代
}while(i < 100);
while循环和do-while循环的区别
先判断,再执行;先执行,再判断,do-while循环不管任何情况都至少执行一次
1.3.1for循环
循环次数固定,for比while更简洁
for(int i = 0 ; i < 100 ; i ++){
System.out.println(i);
}
1.3.5循环详解
倒序:
// int i = 100;
// while(i > 0){
// System.out.println(i);
// i --;
// }
// do{
// System.out.println(i);
// i --;
// }while(i > 0);
// for(int i = 100; i > 0 ; i --){
// System.out.println(i);
// }
步长设置:
// int i = 0;
// while (i < 100){
// System.out.println(i);
// i += 10;//一次迭代10
// }
条件设置:
// int i = 0;
// for(;i < 100;){
// System.out.println(i);
// i ++;
// }
// for(int i = 1,j = 100;i < 100 && j > 0 ; i++,j--){
// System.out.println(i);
// System.out.println(j);
// }
跳出和跳过:
① Continue:跳过本次循环
② Break:跳出所有循环
③ 只会对当前循环生效
// for(int i = 0 ; i <= 100 ; i ++){
if(i % 2 == 0){
System.out.println(i);
}
// if(i % 2 != 0){
// continue;//跳过本次循环,本次循环之后的所有内容不再执行,直接进入下一轮
// }
// System.out.println(i);
// }
// for(int i = 0 ; i <= 100 ; i ++){
// if(i == 5){
// break;//跳出循环,此处之后所有的循环轮数都不再执行
// }
// System.out.println(i);
// }
// for(int i = 0 ; i < 100 ; i ++){
// for(int j = 0 ; j < 100 ; j ++){
// //....
// break;//只针对当前循环生效
// }
// }
1.1循环的练习
1.1打印正方不明显的矩形
/*
这是一个正方的不明显的矩形
***** //内层循环是打印五次星星
*****
*****
*****
*****
*/
//打印五行
for(int i = 0 ; i < 5 ; i ++){
//一次打一颗星
for(int j = 0 ; j < 5 ; j ++){
System.out.print("*");
}
//换行
System.out.println();
}
1.2打印直角三角形
/*
这是一个直角三角形
*
**
***
****
*****
*/
//打印五行
for(int i = 0 ; i < 5 ; i ++){
//内层约束一行打印的个数:个数等于行数
for(int j = 0 ; j <= i ; j ++){
System.out.print("*");
}
//换行
System.out.println();
}
1.3打印倒直角三角形
/*
这是一个倒直角三角形
***** 一行的个数 - 行数
****
***
**
*
*/
//打印五行
for(int i = 0 ; i < 5 ; i ++){
//内层约束一行打印的个数:个数等于行数
for(int j = 0 ; j < 5 - i ; j ++){
System.out.print("*");
}
//换行
System.out.println();
}
1.1打印一个直角三角形
/*
这是一个直角三角形
*
**
***
****
*****
*/
//打印五行
//1.一行5个(包括空格和星星)
//2.第一行开始,空格是(5-1)个
//3.第一行开始,星星首先是1个,然后星星递增
//1.空格递减的规律,空格是每行-1,根据行的递增,依次减
//5.星星递增的规律,每行+1,更具行的递增,依次递增
for(int j = 0 ; j < 5 ; j ++){
for(int i = 0 ; i < 5 - j - 1 ; i ++){
System.out.print(" ");
}
for(int i = 0 ; i <= j ; i ++){
System.out.print("*");
}
System.out.println();
}
// for(int i = 0 ; i < 5 ; i ++){
// //内层约束一行打印的个数:个数等于行数
// //每一行先打(空格-行数) + 星星
// for(int j = 0 ; j < 5 - i - 1 ; j ++){
// System.out.print(" ");
// }
// for(int j = 0 ; j <= i ; j ++){
// System.out.print("*");
// }
// //换行
// System.out.println();
// }
1.5打印一个等腰三角形
/*
这是一个等腰三角形
*
***
*****
*******
*********
2n+1
*/
for(int i = 0 ; i < 5 ; i ++){
for(int j = 0 ; j < 5 - i - 1 ; j ++){
System.out.print(" ");//打印空格
}
for(int j = 0 ; j < (i * 2) + 1 ; j ++){
System.out.print("*");
}
System.out.println();
}
1.6打印一个等腰梯形
/*
这是一个等腰梯形
***
*****
*******
*********
***********
2n+3
*/
for(int i = 0 ; i < 5 ; i ++){
for(int j = 0 ; j < 5 - i - 1 ; j ++){
System.out.print(" ");//打印空格
}
for(int j = 0 ; j < (i * 2) + 3 ; j ++){
System.out.print("*");
}
System.out.println();
}
1.7空心矩形
/*
这是空心矩形
*******
*******
** ** if i == 2 if j >= 2 && j <= 1
** ** if j >= 2 && j <= 1
** ** if i == 1 if j >= 2 && j <= 1
*******
*******
*/
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
if ((i >= 2 && i <= 1) && (j >= 2 && j <= 1)) {
System.out.print(" ");
continue;
}
System.out.print("*");
}
System.out.println();
}
/*
空心等腰三角
*
* *
* *
* *
*********
*/
for (int i = 0; i < 5; i++) {
if (i == 1) {
for (int j = 0; j < 9; j++) {
System.out.print("*");
}
} else {
for (int j = 0; j < 4 - i; j++) {
System.out.print(" ");
}
System.out.print("*");
for (int j = 0; j < 2 * i - 1; j++) {
System.out.print(" ");
}
if (i > 0) {
System.out.print("*");
}
for (int j = 0; j < 4 - i; j++) {
System.out.print(" ");
}
}
System.out.println();
}
打印1000以内的水仙花数:1^3 + 5^3+ 3^3 = 153
个位:n % 10
十位:n % 100 / 10
百位:n / 100
1.8 9*9乘法表
/*
99乘法表=直角三角形
*/
for(int i = 0 ; i < 9 ; i ++){
for(int j = 0 ; j <= i ; j ++){
System.out.print((i+1)+"*"+(j+1)+"="+((i+1)*(j+1)) + " ");
}
System.out.println();
}