C语言入门Day_16 循环的嵌套

news2024/9/24 11:29:52

目录

前言

1.循环的嵌套

2.循环和判断相互嵌套

3.易错点

4.思维导图


前言

我们已经知道如何通过循环结构来遍历一个一维数组,访问里面的每一个元素。

我们用循环里面的计数器,来作为数组的下标,就可以简单的遍历数组里面的每一个元素。

那我们怎么遍历一个二维数组呢?可以通过循环的嵌套来实现。

1.循环的嵌套

1.1

我们可以用两个for循环嵌套,外层的for循环的计数器是二维数组的第一个下标,内测的for循环的计数器是二维数组的第二个下标

这里就有两层for循环,来遍历访问一个二维数组:

int doouble_list[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;i++){
    for(int j=0;j<3;j++) {
        printf("%d\n",double_list[i][j]) ;
    }
}

1.定义一个二维数组    int double_list[3][3] ={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

2.外层的for循环,里面的i会作为二维数组的第一个下标   for(int i=0;i<3;i++){

3.内层的for循环,里面的j会作为二维数组的第二个下标   for(int j=0;j<3;j++){

int doouble_list[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;i++){
    for(int j=0;j<3;j++) {
        printf("%d\n",double_list[i][j]) ;
    }
}

4.打印单个二维数组的元素   printf("%d\n",double_list[i][j]);

5.二维数组的第一个下标   [i]

6.二维数组的第二个下标   [j]

1.2

外层for循环一共会执行三次,分别是i = 0i = 1i = 2的时候。

i = 3的时候,循环条件不符合,就不会执行了。

内层的for循环会执行9次,当i=0的时候,会执行j=0j=1j=2这3次;

i=1i=2的时候也会分别执行3次;

一共9次。

1.3

循环嵌套的代码执行顺序也是一层一层深入,外层循环判断以后,会完整执行内层循环的判断和代码块;

然后再回到外层循环进行判断,以及继续进入内层循环来执行。

1.4 

eg:

int double_list[2][2]={{1,2},{3,4}};
for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
    printf("%d\n",double_list[i][j])
    }
}

1.首先定义二维数组   int double_list[2][2] ={{1, 2}, {3, 4}};

2.执行外层循环的判断,判断条件为真,进入循环内部   for(int i=0;i<2;i++){

3.进入内层循环,判断条件为真,进入printf()代码   for(int j=0;j<2;j++){

4.执行printf()代码   printf("%d\n",double_list[ i ][ j ]);

int double_list[2][2]={{1,2},{3,4}};
for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
    printf("%d\n",double_list[i][j])
    }
}

5.再进行内层循环的判断,判断为真,继续printf()代码   for(int j=0;j<2;j++){

6.继续printf()   printf("%d\n",double_list[ i ][ j ]);

7.再一次进行内层循环的判断,判断条件为假,退回到外层循环   for(int j=0;j<2;j++){

8. i = 1外层循环条件判断为真,继续进入内层循环   for(int i=0;i<2;i++){

 

int double_list[2][2]={{1,2},{3,4}};
for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
    printf("%d\n",double_list[i][j])
    }
}

9. j 重新等于0,内层循环重新开始,执行printf()   for(int j=0;j<2;j++){

10.执行printf()代码   printf("%d\n",double_list[ i ][ j ]);

11.再一次内层循环的判断   for(int j=0;j<2;j++){

int double_list[2][2]={{1,2},{3,4}};
for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
    printf("%d\n",double_list[i][j])
    }
}

12.判断条件为真,执行printf()代码   printf("%d\n",double_list[ i ][ j ]);

13.此时j=2,内层判断不成立,退回到外层   for(int j=0;j<2;j++){

14.外层循环判断条件也不成立,循环执行结束   for(int i=0;i<2;i++){​​​​​​​

1.5

由于外层循环判断以后,会执行数次内层循环,所以我们又习惯于把外层循环叫做大循环,内层循环叫做小循环

一个大循环对应多个小循环,而且每次小循环都是从头开始

我们可以看到,小循环都会重新定义 j,所以每次大循环进入小循环以后,都会从新定义j,也就是从0开始:

int double_list[2][2]={{1,2},{3,4}};
   for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
    printf("%d\n",double_list[i][j]);
  }  
}

 

1.6

while循环也是类似的执行顺序——外层循环到内层循环,只不过在代码的写法上面略有不同。

int double_list[2][4]={{1,2,3,4},{5,6,7,8}};
int i=0;
int j=0;
while(i<2){
     j=0;
     while(j<4){
        printf("%d\n",int double_list[i][j]);
        j++;    
    }
    i++;
}

1.定义二维数组double_list和计数器i和j   

int double_list[2][4] ={{1, 2, 3, 4}, {5, 6, 7, 8}};

int i = 0;

int j = 0;

2外层循环

while(i<2){

j = 0;

j++;

}

3.内层循环

while(j<4){

printf("%d\n",double_list[i][j]);

j++;

}

4.while循环需要自己实现计数器的清零,和迭代自增

5.打印数组元素 

 printf("%d\n",double_list[ i ][ j] );

1.7

while循环的嵌套和for循环的嵌套之间的细微差别主要在于,for循环可以在循环框架内实现的变量定义和自增,while循环需要自己实现

这也是用while循环很容易出错的地方,尤其需要注意。

这里的循环嵌套只有两层,只要你愿意,你可以嵌套无数层循环,但我们不建议嵌套太多。

一来这样会把代码的执行顺序搞得很复杂,二来很容易让循环的次数指数级别的上升,最后导致程序运行时间很长。

除了判断嵌套判断,和循环嵌套循环以外,

我们还可以灵活的让判断和循环相互嵌套,以实现一些复杂的代码逻辑。

2.循环和判断相互嵌套

2.1

比如我们要输出一个长度为10的数组里面的所有大于0的正数:

int number_list[10] = {4, 5, -1, -5, 0, 2, 10, 8, -2, 9};
for(int i = 0;i < 10; i++){
    if(number_list[i] > 0){
        printf("%d\n", number_list[i]);
   }
}

1.定义一个一维数组    number_list   int number_list[10] = {4, 5, -1, -5, 0, 2, 10, 8, -2, 9};

2.在外层我们循环遍历整个数组    for(int i = 0;i < 10; i++){

3.在内层我们对数组的元素进行判断是否大于0    if(number_list[i] > 0){   }

4.大于零的值我们就进行打印输出    printf("%d\n", number_list[i]);

仍然是外层循环先遍历所有的数组元素,然后每个值我们都进行了一次判断,大于0的就进行输出。

2.2

我们看看代码的执行顺序:

int number_list[4]={4,5,-1,-5};
for(int i=0;i<4;i++){
    if(number_list[i]>0){
       printf("%d\n",number_list[i]);
    }
}

1.定义一个数组   

number_list   int number_list[4] = {4, 5, -1, -5};

2.执行外层的循环   

 for(int i = 0;i < 4; i++){

3.判断number_list[0]是4,大于0,进行输出   

if(number_list[ i ] > 0){

printf ("%d\n", number_list[ i ]);

}

4.执行外层的循环 

 for(int i = 0;i < 4; i++){

5.判断number_list[1]是5,大于0,进行输出

if(number_list[i] > 0){

printf("%d\n", number_list[i]);

}

int number_list[4]={4,5,-1,-5};
for(int i=0;i<4;i++){
    if(number_list[i]>0){
       printf("%d\n",number_list[i]);
    }
}

6.执行外层的循环   

for(int i = 0;i < 4; i++){

7.判断number_list[2]是-1,小于0,不进行输出 

  if(number_list[i] > 0){

8.执行外层的循环 

  for(int i = 0;i < 4; i++){

9.判断number_list[3]是-5,小于0,不进行输出 

  if(number_list[i] > 0){

2.3

我们可以看到代码的执行顺序仍然是从外到内层层递进,然后根据循环结构的执行顺序和判断结构的执行顺序,一步一步的执行。

除了循环嵌套判断,我们同样可以判断来嵌套循环。

bool today_is_sat = true;
if(today_is_sat){
	for(int i=0; i<5; i++){
		printf("运动一次\n");
	}
}else{
	for(int i=0;i < 2;i++){
        printf("运动一次\n");
    }
}

1.定义布尔变量 

  bool today_is_sat = true;

2.外层的判断

if(today_is_sat){

}else{

}

3.内层的循环,这里会循环执行5次

for(int i=0; i<5; i++){

printf("运动一次\n");

}

4.内层的循环,这里会循环执行2次

for(int i=0;i < 2;i++){

printf("运动一次\n");

}

2.4

同样的,不管怎么嵌套,我们都一层一层按照代码的执行顺序去分析就可以了

理论上,我们可以无限嵌套到无限深,但是同样我们要考虑代码的复杂度和可读性

所以我们建议最多不要超过两层,这样代码结构会清爽很多。

3.易错点

 下面这段代码,会输出什么?

int i = 0, j = 0;
while (i < 3) {
  do {
    printf("%d, %d\n", i, j);
    j++;
  } while (j < 2);
  i++;
}

在这段代码中,一定要搞清楚do-while是先执行再判断:

第一次输出:

  • i = 0,j = 0;
  • 满足外层循环条件 i < 3,然后紧接着进入内层循环输出0,0

第二次输出:

  • 然后 j++--> j = 1,小于2,满足条件,继续内层循环,输出0,1
  • 然后 j++ --> j = 2,不满足小于2,跳出内层循环;

第三次输出:

  • 然后 i++ --> i = 1,满足外层循环条件i<3,然后进入内层循环,先do,输出1,2
  • 然后 j++,j=3,不满足小于2,跳出内层循环;

第四次输出:

  • 然后 i++ --> i = 2,满足外层循环条件 i<3 ,然后进入内层循环,先do,输出2,3
  • 然后 j++ --> j=4,不满足小于2,跳出内层循环;

接着 i++ --> i = 3,不满足外层循环条件,跳出外层循环,整个循环结束。

因此,输出结果为:

0, 0
0, 1
1, 2
2, 3

循环嵌套中,循环的顺序选择是至关重要的。选择正确的循环顺序可以避免逻辑错误和重复计算。

循环嵌套可能导致性能问题,特别是在处理大规模数据集时。要注意避免不必要的重复计算或循环次数过多的情况,可以考虑优化循环结构或使用其他数据结构来提高性能。

嵌套的循环控制变量不能相同

外层循环可包含两个以上内循环,但不能相互交叉。

4.思维导图

​​​​​​​

在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识蒸馏学习

知识蒸馏----教师和学生模型&#xff1a;将已训练完善的模型作为教师模型&#xff0c;通过控制“温度”从模型的输出结果中“蒸馏”出“知识”用于学生模型的训练&#xff0c;并希望轻量级的学生模型能够学到教师模型的“知识”&#xff0c;达到和教师模型相同的表现。 本质上属…

嵌入式开发-11 Linux下GDB调试工具

目录 1 GDB简介 2 GDB基本命令 3 GDB调试程序 1 GDB简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说&#xff0c;GDB主要帮助你完成下面四个方面的功能&#xff1a; 1、启动你的程序&#xff0c;可以按照你的自定义的要求随心所欲的运行程序&#…

从Matrix-ResourceCanary看内存快照生成-ForkAnalyseProcessor(1)

前文看到AutoDumpProcessor的处理逻辑主要是生成&#xff0c;裁剪hprof文件并回调到PluginListener中&#xff0c;接下来我们来看下ForkAnalyseProcessor的处理逻辑。 ForkAnalyseProcessor public class ForkAnalyseProcessor extends BaseLeakProcessor {private static fi…

$nextTick属性使用与介绍

属性介绍 $nextTick 是 Vue.js 中的一个重要方法&#xff0c;之前我们也说过$ref 等一些重要的属性&#xff0c;这次我们说$nextTick&#xff0c;$nextTick用于在 DOM 更新后执行回调函数。它通常用于处理 DOM 更新后的操作&#xff0c;因为 Vue 在更新 DOM 后不会立即触发回调…

【0906 C高级day1】 Linux中的文件相关指令

一、使用cut截取出Ubuntu用户的家目录&#xff0c;要求&#xff1a;不能使用":"作为分割 grep "ubuntu" /etc/passwd | cut -d "/" -n -f 2-3 | cut -c 1-11 二、思维导图 文件相关指令&#xff1a;

【Java Web】Servlet规范讲解

目录 一、前言 二、Servlet规范介绍 2.1 常见版本及新功能 2.2 Servlet的作用 2.3 Servlet的本质 三、Servlet接口和实现类 3.1 Servlet接口 3.2 Servlet接口实现类示例 3.3 Servlet接口实现类开发步骤 3.3.1 关键点 3.3.2 引入Servlet源码包 1、描述 Servlet接口…

LeetCode 725. Split Linked List in Parts【链表】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【python手写算法】逻辑回归实现分类(含公式推导)

公式推导&#xff1a; 代码实现&#xff1a; # codingutf-8 import matplotlib.pyplot as plt import numpy as npdef f(w1,x1,w2,x2,b):zw1*x1w2*x2breturn 1/(1np.exp(-z)) if __name__ __main__:X1 [12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,2.1…

优先发展非化石能源

生态兴则文明兴。面对气候变化、环境风险挑战、能源资源约束等日益严峻的全球问题&#xff0c;中国树立人类命运共同体理念&#xff0c;促进经济社会发展全面绿色转型&#xff0c;努力推动本国能源清洁低碳发展。 智慧光伏遮阳伞&#xff0c;搭配座椅设置智能补给休息区&#x…

数据结构--- 树

(一)知识补充 定义 树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。​ 它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点;每一个非根…

unipush2.0实现APP消息推送(1)

一、 基础概念 1.1 首先理解什么是消息推送&#xff1f; 比如&#xff1a;你手机收到未读消息后会在通知栏显示&#xff0c;该条消息便是某APP的消息推送。多用于有需要从服务端主动发出消息提醒到客户端的场景。 1.2 uniPush & 个推 & 厂商推送的区别 方式个推uni…

js摄像头动态检测

利用摄像头每一秒截图一次图像。然后计算2次图像之间的相似度。 如果相似度低于98%就会报警。 var video document.getElementsByClassName(inputvideo)[0]; video.innerHTML "<video classinput_video idcamera autoplay width640px height380px></video>…

LeetCode 1123. Lowest Common Ancestor of Deepest Leaves【树,DFS,BFS,哈希表】1607

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

2023高教社杯数学建模C题思路模型 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

X86_64函数调用汇编程序分析

X86_64函数调用汇编程序分析 1 X86_64寄存器使用标准2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a…

【工作技术栈】【源码解读】一次springboot注入bean失败问题的排查过程

目录 前言现象分析原因解决方法思考感悟 前言 对这次的过程排查如果要形容的话&#xff0c;我觉得更像是悬疑剧&#xff0c;bean not found 这种错误&#xff0c;已经看腻了&#xff0c;甚至有时候都看不起这种错误&#xff0c;但是似乎这个想法被springboot听见了&#xff0c…

spring-security-源码解析+自定义拓展

1.参考文档 https://docs.spring.io/spring-security/reference/5.7/servlet/architecture.html 1.1.各种filterchain 1.1.1.SecurityFilterChain 1.1.2.springSecurityFilterChain 1.1.3.Security Filters 2.几个重要的注解 2.1.EnableXXX EnableWebMvcSecurity–deprecate…

C语言之初阶总结篇

目录 NO.1 NO.2 NO.3 NO.4 NO.5 NO.6 NO.7 NO.8 NO.9 NO.10 NO.11 NO.12.概念tips NO.13.求最小公倍数 NO.14.最大公因数 NO.15.输入读取字符串 NO.16.倒置字符串 今天是一些C语言题目&#xff0c;最近天气炎热&#xff0c;多喝水。 NO.1 下面程序执行后&am…

浅谈泛在电力物联网、能源互联网与虚拟电厂

导读&#xff1a;从能源互联网推进受阻&#xff0c;到泛在电力物联网名噪一时&#xff0c;到虚拟电厂再次走向火爆&#xff0c;能源领域亟需更进一步的数智化发展。如今&#xff0c;随着新型电力系统建设推进&#xff0c;虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…

LLMs之Baichuan 2:《Baichuan 2: Open Large-scale Language Models》翻译与解读

LLMs之Baichuan 2&#xff1a;《Baichuan 2: Open Large-scale Language Models》翻译与解读 导读&#xff1a;2023年9月6日&#xff0c;百川智能重磅发布Baichuan 2。科技论文主要介绍了Baichuan 2&#xff0c;一个开源的大规模语言模型&#xff0c;以及其在多个领域的性能表现…