多重循环控制流程
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do-while均可作为外层循环和内层循环。建议一般使用两层,最多不要超过3层,否则代码的可读性很差
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。只有当内层循环的循环条件为false时,才完全跳出内层循环,才可结束外层循环的当次后循环,开始下一次循环
- 设外层循环次数为m次,内层为次,则内层循环体实际上需要执行m*n次
-
示例
for(int i = 0; i < 2; i++){ for(int j = 0; j < 3; j++){ System.out.println("i = " + i + ", j = " + j); } }
i = 0, j = 0 i = 0, j = 1 i = 0, j = 2 i = 1, j = 0 i = 1, j = 1 i = 1, j = 2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KZrNPOV-1682504434694)(C:/Users/苏逸云/AppData/Roaming/Typora/typora-user-images/image-20230424171842118.png)]
-
练习
- 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分(从键盘输入学生成绩)
- 统计3个班及格人数,每个班有5名同学
- 打印出九九乘法表
import java.util.Scanner;
public class MulForExercise01{
public static void main(String[] args) {
/*1. 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分(从键盘输入学生成绩)
2. 统计3个班及格人数,每个班有5名同学*/
//1.
Scanner myScanner = new Scanner(System.in);
double allSum = 0;
int classNum = 3;
int stuNum = 5;
double passScore = 60.0;
for (int i = 1; i <= classNum ; i++ ) {
System.out.println("请您输入 " + i +" 班的学生成绩:");
double sum = 0;
int passNum = 0;
//输入学生成绩
for (int j = 0; j < stuNum ; j++ ) {
double stu = myScanner.nextDouble();
sum += stu;
if(stu >= passScore){
passNum += 1;
}
}
allSum += sum;
double averageClass = sum / stuNum;
System.out.println(i + " 班的平均分为 " + averageClass + " 分");
System.out.println(i + " 班的及格人数为 " + passNum + " 个");
}
double averageAll = allSum / (stuNum * classNum);
System.out.println("年级的平均分为 " + averageAll + " 分");
}
}
public class MulForExercise02{
public static void main(String[] args) {
// 3. 打印出九九乘法表
for (int i = 1; i <= 9 ; i++ ) {
for (int j = 1; j <= 9 ; j++ ) {
//横着打印
//j快,所以是j * i ,按理说要打印81行,用j<=i节省一半重复打印
if (j <= i) {
System.out.print(j + " x " + i + " = " + i*j + "\t");
//当ji相等时,换行
if (j == i) {
System.out.print("\n");
}
}
}
}
//不知道怎么做出九排九列的效果?
//一个Systme.out默认是换行,不知道怎么把两个式子连起来
//解答:println是换行,想要横着加起来用print
}
}
- 编写一个程序,可以接受一个整数表示层数(totalLevel),打印出空心金字塔。
import java.util.Scanner;
public class MulForExercise03{
public static void main(String[] args) {
//编写一个程序,可以接受一个整数表示层数(totalLevel),打印出空心金字塔。
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入层数:");
int totalLevel = myScanner.nextInt();
//金字塔雏形
for (int i = 1; i <= totalLevel ; i++ ) {
for (int j = 1; j <= i ; j++ ) {
System.out.print("*");
}
System.out.print("\n");
}
//普通金字塔
for (int i = 1; i <= totalLevel ; i++ ) {
//前面的空格,遵守total - i 个
int q = totalLevel - i;
for (int p = 1; p <= q ; p++ ) {
System.out.print(" ");
}
//*号,遵守2i - 1
for (int j = 1; j <= (2 * i - 1 ) ; j++ ) {
System.out.print("*");
}
System.out.print("\n");
}
//空心金字塔(勤勤恳恳复杂版)
for (int i = 1; i <= totalLevel ; i++ ) {
//前面的空格,遵守total - i 个
int q = totalLevel - i;
for (int p = 1; p <= q ; p++ ) {
System.out.print(" ");
}
//第一个*
System.out.print("*");
//中间
if (i > 1 && !(i == totalLevel)) {
//中间的空格 2(i-1)-1 = 2i-3
for (int k = 1 ;k <= (2 * i - 3) ; k++) {
System.out.print(" ");
}
System.out.print("*");
}
//最后一行
if (i == totalLevel) {
//*号,遵守2i - 1,再减一是减去第一个*
for (int j = 1; j <= (2 * i - 1 )-1 ; j++ ) {
System.out.print("*");
}
}
System.out.print("\n");
}
//空心金字塔(举一反三灵活版)
for (int i = 1; i <= totalLevel ; i++ ) {
//前面的空格,遵守total - i 个
int q = totalLevel - i;
for (int p = 1; p <= q ; p++ ) {
System.out.print(" ");
}
//*号,遵守2i - 1
for (int j = 1; j <= (2 * i - 1) ; j++ ) {
//每行的第一个字符和最后一个字符,以及最后一行
if(j == 1 || j == (2 * i - 1) || i == totalLevel){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}
}
}
请输入层数:
5
*
**
***
****
*****
*
***
*****
*******
*********
*
* *
* *
* *
*********
*
* *
* *
* *
*********
- 编写一个程序,打印出空心菱形
import java.util.Scanner;
public class MulForExercise04{
public static void main(String[] args) {
//编写一个程序,可以接受一个整数表示层数(totalLevel),打印出空心菱形。
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入层数:");
int totalLevel = myScanner.nextInt();
//空心菱形
for (int i = 1; i <= totalLevel ; i++ ) {
//上面的三角形,空心三角形
if (i <= (totalLevel + 1) / 2) {
//前面的空格,遵守total - i 个
int q = totalLevel - i;
for (int p = 1; p <= q ; p++ ) {
System.out.print(" ");
}
//*号,遵守2i - 1
for (int j = 1; j <= (2 * i - 1) ; j++ ) {
//每行的第一个字符和最后一个字符
if(j == 1 || j == (2 * i - 1)){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}else{//下面的空心三角
//用k = (totalLevel + 1) % i把下面的层数和上面的层数联系起来
if ((totalLevel + 1) % i != 0){
int k = (totalLevel + 1) % i;
//前面的空格,遵守total - i 个
int q = totalLevel - k;
for (int p = 1; p <= q ; p++ ) {
System.out.print(" ");
}
//*号,遵守2i - 1
for (int j = 1; j <= (2 * k - 1) ; j++ ) {
//每行的第一个字符和最后一个字符
if(j == 1 || j == (2 * k - 1)){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}
}
}
}
}
请输入层数:
10
*
* *
* *
* *
* *
* *
* *
* *
* *
*