程序控制结构(下)
1.1🍏多重循环的定义
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内
层循环,才可结束外层的当次循环,开始下一次的循环[听不懂,走案例]。- 设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n
代码实现
public class MulFor01 {
public static void main(String[] args) {
for (int i = 0 ; i < 2 ; i++){
for (int j = 0 ; j < 3 ; j++){
System.out.println("i = "+i +" j = "+j); // 0,0|0,1|0,2|1,0|1,1|1,2
}
}
}
运行结果
1.2🥜多重循环练习题
- 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
- 统计三个班及格人数,每个班有 5 名同学。
代码实现
import java.util.Scanner;
public class MulForExercise01 {
public static void main(String[] args) {
// 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
// 统计三个班及格人数
Scanner myScanner = new Scanner(System.in);
double sum = 0.0d;
double score = 0.0d;
double totalSum = 0.0d;
int passPeople = 0;
for (int i = 1 ; i<=3 ; i++) {
sum = 0.0d;
for (int j = 1; j <= 5; j++) {
System.out.println("请输入第"+(i)+"个班第"+ (j) + "个同学的成绩:");
score = myScanner.nextDouble(); // 记录每一位同学的成绩
if (score>=60){
passPeople++;
}
sum += score; // 记录每个班的总成绩
}
System.out.println("第"+(i)+"班的平均分为:"+(sum/5));
totalSum += sum; // 记录所有学生的总成绩
}
System.out.println("3个班总成绩为:"+(totalSum/15));
System.out.println("3个班及格总人数为:"+passPeople);
}
}
运行结果
代码实现
打印出九九乘法表
for(int i = 1 ; i<=9 ;i++){
for(int j = 1 ; j<=i ; j++){
System.out.print(j+"*"+i+" = "+(i*j)+"\t");
}
System.out.println();
}
运行结果
打印金字塔
代码实现
for (int i = 1 ; i<=5 ; i++){
for (int j = 1 ; j <=i ;j++ ){
System.out.print("*");
}
System.out.println();
}
运行结果
代码实现
for (int i = 1 ; i<=6 ; i++){
for (int j = 6 ; j>i ; j--){ // for(int j = 1 ; j<=(6-i) ;j++)
System.out.print(" ");
}
for (int k = 2*i-1 ; k>=1 ; k--){
System.out.print("*");
}
System.out.println();
}
运行结果
代码实现
int totalLevel = 10; // 这里可以手动输出层数
for (int i = 1 ; i<=totalLevel ; i++){
for (int j = totalLevel ; j>i ; j--){
System.out.print(" ");
}
// 当打印第1行和最后1行时全部输出,其他是打印第1个和最后1个时打印*
// 否则打印空格
for (int k = 2*i-1 ; k>=1 ; k--){
if(i==totalLevel || k==2*i-1 || k==1){
System.out.print("*");
}
else{
System.out.print(" ");
}
}
System.out.println();
}
运行结果
打印空心菱形
代码实现
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入层数");
int totalLevel = myScanner.nextInt(); // 11/2 = 5
for (int i = 1 ; i<=totalLevel/2 ; i++){
for (int j = totalLevel/2 ; j>=i ;j--){
System.out.print(" ");
}
for (int k = 1 ; k<=2*i-1 ; k++){
if (k==2*i-1 || k==1){
System.out.print("*");
} else{
System.out.print(" ");
}
}
System.out.println();
}
for (int i = totalLevel/2+1 ; i>=1 ; i--){ // 11/2+1 = 6
for (int j = totalLevel/2+1 ; j>i ; j--){
System.out.print(" ");
}
for (int k = 2*i-1 ; k>=1 ; k--){
if (k==2*i-1 || k==1) {
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
运行结果
2.1🥯break介绍
先来看一个案例
Math.random() -> 返回 [0,1) -> *100+1 -> [1,100)
Math.random()返回浮点数
代码实现
public class break01 {
public static void main(String[] args) {
for (int i = 1 ; i<=10 ; i++){
// Math.random() -> 返回 [0,1) -> *100+1 -> [1,101)
// Math.random()返回浮点数
System.out.println((int)(Math.random()*100+1));
}
}
}
运行结果
随机生成 1-100 的一个数,直到生成了 97 这个数,看看你一共用了几次?
代码实现
int count = 0;
while(true){
int r = (int)(Math.random()*100+1);
count++;
System.out.println(r);
if (r==97){
break;
}
}
System.out.println("为了生成97,共循环了"+count+"次");
运行结果
2.2🌰 break细节说明
代码实现
// 求输出结果
label1:
for(int i = 0 ; i < 4 ; i++){
label2:
for(int j = 0 ; j < 10 ; j++){
if (j == 2){
break label2 /*label1*/;
}
System.out.println("j = " + j);
}
}
运行结果
代码实现
运行结果
2.3🥕break练习题
- 1-100 以内的数求和,求出 当和 第一次大于 20 的当前数
- 实现登录验证,有 3 次机会,如果用户名为"丁真" ,密码"666"提示登录成功,否则提示还有几次机会,请使用 for+break
代码实现
//1-100 以内的数求和,求出 当和 第一次大于 20 的当前数 【for + break】
int s = 0;
int n = 0;
for (int i = 1; i <= 100; i++) {
s += i;
if (s > 20) {
System.out.println("当和>20时,当前数为"+i);
n = i;
break;
}
}
System.out.println("s=" + s);
System.out.println("当和>20时,当前数为"+n);
运行结果
在写第2题前先引出一个常用的函数 -> equals()
代码实现
String name = "小李";
System.out.println(name.equals("小王"));
System.out.println(name.equals("小李"));
// 两种写法 这里可以避免空指针,下面写法更好
System.out.println("小王".equals(name));
System.out.println("小李".equals(name));
运行结果
代码实现
Scanner myScanner = new Scanner(System.in);
int chance = 3;
for (int i = 1 ; i<=3 ;i++){
System.out.println("请输入用户名和密码");
String name = myScanner.next();
String password = myScanner.next();
if ("丁真".equals(name) && "666".equals(password)){
System.out.println("登录成功~");
break;
}else{
chance--;
System.out.println("你还有"+(chance)+"次登录机会");
}
}
运行结果
3.1🍭continue介绍
- continue 语句用于结束本次循环,继续执行下一次循环。
- continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的
使用的规则一样.
3.2🍨continue细节
代码实现
int i = 1;
while(i<=4){
++i;
if(i==2){
continue;
}
System.out.println("i = "+ i);
}
运行结果
代码实现
label1:
for(int j = 0 ; j < 2;j++){
label2:
for(int a = 0 ; a<10 ; a++){
if(a == 2){
// 默认跳转最近的循环体
// continue; -> 2组 |0,1,3,4,5,6,7,8,9
// continue label2; -> 2组 |0,1,3,4,5,6,7,8,9
continue label1; //-> 2组 | 0,1
}
System.out.println("a = "+ a);
}
}
运行结果
4.1🌮return说明
代码实现
for(int i = 1 ; i<=5 ; i++){
if(i==3){
System.out.println("你好 "+i);
return; // 直接退出程序,也就是退出main方法
}
System.out.println("Hello");
}
System.out.println("程序继续...");
运行结果
注意
5.1🍬本章练习题
- 某人有100000元 ,每经过一次路口,需要交费
(1)当现金>50000,每次交5%
(2)当现金<=50000时,每次交1000
该人可以经过多少路口?
分析有3种情况
(1) money > 50000
(2) money >= 1000 && money <= 50000)
(3) money < 1000
代码实现
double money = 100000;
int count = 0;
while (true) {
if (money > 50000) {
money *= 0.95; // money = money-money*0.05;
count++;
} else if (money >= 1000 /* && money<=50000 */) {
money -= 1000;
count++;
} else { // 钱不够了
break;
}
}
System.out.println("共经过" + count + "个路口");
运行结果
判断闰年
代码实现
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入年份:");
int year = myScanner.nextInt();
if(year % 400==0 || year%100!=0 && year % 4==0){
System.out.println(year+"是闰年");
}
else{
System.out.println(year+"是平年");
}
运行结果
水仙花数
代码实现
System.out.println("输入3位数判断是否为水仙花数:");
Scanner myScanner = new Scanner(System.in);
int flower = myScanner.nextInt();
int ge = flower%10;
int shi = flower%100/10;
int bai = flower/100;
int s = ge*ge*ge+shi*shi*shi+bai*bai*bai;
if (s==flower){
System.out.println("该数是水仙花数");
}else {
System.out.println("不是水仙花数");
}
运行结果
练习题
输出1-100之间的不能被5整除的数,每五个一行
代码实现
int count = 0;
for (int i = 1; i <= 100; i++) {
if (i % 5 != 0) {
count++; // 如果满足条件就加加
System.out.print(i + " ");
if (count % 5 == 0) {
System.out.println();
}
}
}
System.out.println("共"+count+"个数");
运行结果
输出小写的a-z以及大写的A-Z
小写:97 ~ 122
大写:65 ~ 90
代码实现
for (char i = 97 ; i<=122 ;i++){
System.out.print(i+" ");
}
System.out.println("\n====================================================");
for (char i = 90 ; i>=65 ;i--){
System.out.print(i+" ");
}
运行结果
求出1-1/2+1/3-1/4…1/100的和
代码实现
int a = 1; // 控制正负
double s = 0;
for (int i = 1 ; i<=100 ;i++){
s += 1.0/(i*a);
a *= -1;
}
System.out.println("和为:"+s);
运行结果
1 + (1+2) + (1+2+3) + (1+2+3+4) + … + (1+2+3+4+…+100)
代码实现
// i可以表示第几项,同时也是当前项的最后一个数
int s = 0;
for (int i = 1 ; i<=100 ; i++){
for (int j = 1 ; j<=i ; j++){ // 内存1~i进行循环
s += j;
}
}
System.out.println(s);
运行结果