目录
引言
编程序就是为了解决重复的工作,所以就有了循环,程序里没有循环就没有灵魂,无论我们是实现基础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;
}
运行结果: