多层for循环详解

引言

编程序就是为了解决重复的工作,所以就有了循环,程序里没有循环就没有灵魂,无论我们是实现基础C语言题目,例如打印一维数组、二维数组还是实现排序算法,例如,冒泡排序,直接选择排序,直接插入排序,这些程序的主干部分就是循环,可见循环在C语言中的重要性。在这篇文章里,我将对for循环进行详细的分析。

一维数组and单层for循环

题目:
打印1 2 3 到一个数组里,
算法设计:
遍历每一个元素,打印操作。
在这里插入图片描述
代码实现

 int main()
 {
     int arr[3] = { 0 };
     for (int i = 0; i < 3; i++) {
         arr[i] = i+1;
     }
     for (int i = 0; i < 3; i++) {
         printf("%d ", arr[i]);
     }
     return 0;
 }

运行结果:
在这里插入图片描述

二维数组and双层for循环

题目:
打印1 2 3 4 5 6 7 8 9 到一个二维数组里,
算法设计:

  • 遍历每一行元素
    • 遍历每一列元素
      • 打印操作

代码实现

 int main()
 {
     int count = 1;
     int arr[3][3] = { 0 };
     for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 3; j++) {
             arr[i][j] =count++;
         }
     }
     for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 3; j++) {
             printf("%d ", arr[i][j]);
         }
         printf("\n");
     }
     return 0;
 }

运行结果:
在这里插入图片描述

双层for循环的分析

双层for循环的原理分析图:

在这里插入图片描述
两层for循环

int main()
{
    for (int i = 1; i <= 3; i++) {
        printf("第%d次外层for循环\n", i);
        for (int j = 1; j <= 3; j++) {
            printf("第%d次内层for循环 ", j);
        }
        printf("\n\n");
    }
    return 0;
}

在这里插入图片描述
从运行结果上来看, 一共有十二个运行结果,也就是说这个程序执行了9次。而且每一行都是以外层循环开始,以内层循环结束,也就是说每执行一次外层for循环就要将内层for循环全部执行完成,然后外部循环变量加1,在进行判断,满足条件再进行内层循环。即将内层循环变量从初始值执行至最终值后跳出内层循环,继续执行外层循环,直至将外层循环变量从初始值执行至最终值

总结:每执行一次外层循环,要将内层循环全部执行完成,再进行第二次外层循环的执行

两层for循环,循环条件相关联

int main()
{
    for (int i = 1; i <= 3; i++) {
        printf("第%d次外层for循环\n", i);
        for (int j = 1; j <= i; j++) {
            printf("第%d次内层for循环 ", j);
        }
        printf("\n\n");
    }
    return 0;
}

运行结果
在这里插入图片描述
内层循环一共执行了六次,每一次内层的循环次数跟外层循环的次数有关。

三层for循环

int main()
{
    for (int i = 1; i <= 3; i++) {
        printf("第一层第%d次for循环\n", i);
        for (int j = 1; j <= 3; j++) {
            printf("第二层第%d次for循环\n ", j);
            for (int k = 1; k <= 3; k++) {
                printf("第三层第%d次for循环 ", k);
            }
            printf("\n");
        }
        printf("\n\n");
    }
    return 0;
}

在这里插入图片描述
最内层的代码执行次数为27次,都是从最内层的代码开始执行的,最内层的代码执行完毕后,中间层的循环变量加1,再继续执行最内层的代码,中间层的循环变量再加1。等到中间层的循环条件不满足时,最外层的循环变量加1,按照这个思路,一直往后执行。
三层for循环,循环条件相关联

int main()
{
    for (int i = 1; i <= 3; i++) {
        printf("第一层第%d次for循环\n", i);
        for (int j = 1; j <= i; j++) {
            printf("第二层第%d次for循环\n ", j);
            for (int k = 1; k <= j; k++) {
                printf("第三层第%d次for循环 ", k);
            }
            printf("\n");
        }
        printf("\n\n");
    }
    return 0;
}

在这里插入图片描述

双层for循环练习

打印正三角形、倒三角形、等边三角形、菱形,平行四边形

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
void tri1(int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j <= i; j++) {
			printf("*");
		}
		printf("\n");
	}
}

void tri2(int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n-i; j++) {
			printf("*");
		}
		printf("\n");
	}
}
void tri3(int n) {
	int i, j;
	for ( i = 1; i <= n; i++) {
		for (j = 1; j < i; j++) {
			printf(" ");
		}
		for ( j = n; j >=  i; j--) {
			printf("*");
		}
		printf("\n");
	}
}
void tri4(int n) {
	int i, j;
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= n - i; j++) {
			printf(" ");
		}
		for (j = 1; j <= i; j++) {
			printf("*");
		}
		printf("\n");
	}
}

void tri5(int n) {
	int i = 0, j = 0;
	for (i = 1; i <= n; i++) {
		for (j = n; j >= i; j--) {
			printf(" ");
		}
		for (j = 1; j <= i; j++) {
			printf("* ");
		}
		printf("\n");
	}
}
void tri6(int n) {
	int i = 0, j = 0;
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= i; j++) {
			printf(" ");
		}
		for (j = n; j >= i; j--) {
			printf("* ");
		}
		printf("\n");
	}
}
void tri7(int n) {
	int i = 0, j = 0;
	for (i = 1; i <= n; i++) {
		for (j = n; j >= i; j--) {
			printf(" ");
		}
		for (j = 1; j <= i; j++) {
			printf("* ");
		}
		printf("\n");
	}
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= i+1; j++) {
			printf(" ");
		}
		for (j = 1; j <= n-i; j++) {
			printf("* ");
		}
		printf("\n");
	}
}

void tri8(int n) {
	int i, j;
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= n - i; j++) {
			printf(" ");
		}
		for (j = 1; j <= i; j++) {
			printf("*");
		}
		printf("\n");
	}
	for (int i = 0; i < n-1; i++) {
		for (int j = 0; j < n - i-1; j++) {
			printf("*");
		}
		printf("\n");
	}

}
int main() {
	tri1(5); printf("\n");
	tri2(5); printf("\n");
	tri3(5); printf("\n");
	tri4(5); printf("\n");
	tri5(5); printf("\n");
	tri6(5); printf("\n");
	tri7(5); printf("\n");
	tri8(5); printf("\n");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

多层for循环练习

硬币之谜简化版

题目描述:
有不同面额的纸币,分别为10元 5元 1元,有多少种组合,可以组成35元

//穷举法,所有情况一一罗列,挑选出满足条件的组合
#include <stdio.h>
void show1() {
	int count = 0;
	for (int i1 = 0; i1 <=3; i1++) {
		for (int i2 = 0; i2 <= 7; i2++) {
			for (int i3 = 0; i3 <= 35; i3++) {
				if (i1 * 10 + i2 * 5 + i3 * 1 == 35) {
					count++;
					printf("第%d种组合为:%d张10元 %d张5元  %d张1元\n", count, i1, i2, i3);
				}

			}
		}
	}
}
int main() {
	show1();
	return 0;
}

在这里插入图片描述

乒乓球对手分配

题目再现:
两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。已知抽签决定比赛名单。有人向队员打听比赛名单,A说他不和X比,C说他不和X,Z比,请编程找出3对选手的比赛名单。
演算分析:
我们规定:char A = ‘X’;A的对手是X,XYZ刚好连续,所以遍历方便
A != ‘X’ && C != ‘X’ && C != ‘Z’ :A说他不和X比,C说他不和X,Z比
A != B && B != C && A != C :每个人的对手只能是一个人,不能一对多,只能一对一
在这里插入图片描述
代码实现:

#include <stdio.h>
void player() { //ABC   XYZ
	for (char A = 'X'; A <= 'Z'; A++) { //A 含义:A的对手是X,Y,Z
		for (char B = 'X'; B <= 'Z'; B++) {
			for (char C = 'X'; C <= 'Z'; C++) {
				if (A != 'X' && C != 'X' && C != 'Z' && A != B && B != C && A != C) {
					//每个人的对手只能是一个人,不能一对多,只能一对一
					printf("A的对手是%c\n B的对手是%c\n C的对手是%c\n", A, B, C);
					
				}
			}
		}
	}
	return;
}

int main() {
	show1();
	return 0;
}

运行结果:
在这里插入图片描述
变式:
两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。已知抽签决定比赛名单。有人向队员打听比赛名单,A说他不和X比,C说他不和Z比,请编程找出3对选手可能的比赛名单。
代码实现:


void player() { //ABC   XYZ  
	for (char A = 'X'; A <= 'Z'; A++) { //A 含义:A的对手是X,Y,Z
		for (char B = 'X'; B <= 'Z'; B++) {
			for (char C = 'X'; C <= 'Z'; C++) {
				if (A != 'X'  && C != 'Z' && A != B && B != C && A != C) {
					//每个人的对手只能是一个人,不能一对多,只能一对一 A != B && B != C && A != C
					printf("A的对手是%c\n B的对手是%c\n C的对手是%c\n", A, B, C);
					
				}
			}
		}
	}
	return;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值