for 循环
/*
while (条件表打死){
代码块
}
for(初始化表达式;条件表达式;循环后增量表达式){
代码块
}
条件表达式:只有条件满足时,代码块中的内容才会执行,
初始化表达式:在整个 for 循环的生命周期中,初始化表达式只会执行一次
循环后增量表达式:会在每次循环完成之后调用一次
for 循环执行流程:
1,初始化条件表达式(只执行了一次)
2,条件表达式是否满足
3,满足执行代码块中的代码
4,循环后增量表达式
5,条件表达式是否满足-->代码块代码-->循环后增量表达式....
*/
// 继续打子弹
// int num = 100; // 定义的这个 num 变量是遇到大括号才会结束,那么就会占用很长一段时间的内存空间
// while (num>0) {
// printf("num = %i\n",num);
// num--;
// }
// 如果定义的变量仅仅是用于控制循环什么时候结束,j循环结束之后就不使用了,那么可以使用 for 循环
// 1 2/5 4/7
for (int value = 100; value > 0; value--) { // value 的生命周期是在 for 循环中,出了 for 循环变量就释放了
// 3/6
printf("value = %i\n",value);
}
for循环和 while循环的对比
- 什么时候用 while 循环呢?
- 如果用于控制循环的增量表达式在循环执行完成之后还需要使用,那么可以使用 while
int num = 100;
while (num > 0) {
printf("num = %i\n",num);
num--;
}
printf("还剩下多少发子弹:%i\n",num); // 此时还使用 num 的值
- 什么时候用 for 循环呢?
- 如果用于控制循环的增量b比导师在循环执行完成后不需要使用的话,就用 for 循环吧
for (int value =100; value>0; value--) {/ 这个n value 是在 for 循环的内存空间中定义的,for 循环结束,value 的内存空间也就释放了
printf("value = %i\n",value);
}
// printf("还剩下多少发子弹:%i\n",value); // 此时 value 报错显示没有被定义
for 循环注意点
- 1,任何数值都有真假性
for(;1;){
printf("你好");
}// 此时条件表达式一直为真,会一直执行
-
2,for 循环也可以省略大括号
-
3,省略大括号只会执行离他最近的第一条语句
/*
for (; 1; )
printf("nihao");
printf("jieshu");
for (; 0; )
printf("nihao");
printf("jieshu");
*/
- 作用域混乱
for (; 1; )
int num = 0;
printf("jieshu");
- 空语句
for (; 1; );{ // 分号为空语句
printf("nihao");
}
printf("jieshu");
- 初始化表达式和增量表达式语句可以写多条语句,语句之间用逗号连接
for (int i = 0 ,j =0; i<3; i++,j++) {
printf("i = %i ",i);
printf("j = %i\n",j);
}
- 作用域问题
for (int i = 0; i<3; i++) {
int i = 5;
printf("i = %i\n",i); // 此时输出的是 5,这个 i 是在大括号中定义的
}
-
-
作用域问题 2
for (int i = 0; i < 3; j++) { int j = 0;// i = 0,小于 3 成立执行 int j = 0 初始化,然后执行增量表达式j++,但是此时有定义 j 么?初始化 j 后h执行了大括号,此时 j 的这个变量就释放了 }
-
最简单的死循环
for(;1;); printf("你好"); for(;;) printf("nihao");// for 循环中默认条件表达式为真
循环嵌套
- 什么是循环嵌套
- 在一个循环结构中嵌套另一个循环结构
- 如:while 循环中写 for,for 循环中再写一个 for 循环等等
// 循环嵌套
// 问题:会打印几次
// 分析:外循环执行两次,但是内循环每次执行三次,所以需要执行六次
// 结论:循环j嵌套的次数 = 外循环的执行次数 * 内循环的执行次数
/*
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("i = %i, j = %i\n",i,j);
}
}
*/
// 什么时候会用到循环嵌套呢?
/*
好友列表 1
好友 1
好友 2
好友列表 2
好友 1
好友 2
好友列表 3
好友 1
好友 2
*/
/*
printf("好友列表 1\n");
printf(" 好友 1\n");
printf(" 好友 2\n");
printf("好友列表 2\n");
printf(" 好友 1\n");
printf(" 好友 2\n");
printf("好友列表 3\n");
printf(" 好友 1\n");
printf(" 好友 2\n");
*/
// 哇塞我是不是这样打印就好了,哈哈哈哈,但是发现很多代码都是重复的
/*
for (int i = 1; i<=3; i++) {
printf("好友列表 %i\n",i);
printf(" 好友 1\n");
printf(" 好友 2\n");
}
*/
// 但是此时还是有问题,好友 1,好友 2,是不是也是重复的也可以用循环搞定
for (int i = 1; i<=3; i++) {
printf("好友列表 %i\n",i);
for (int j = 1; j<=4; j++) { // 此时我只需要改动条件表达式,就可以控制好友的个数
// printf("好友列表 %i\n",i);
printf(" 好友 %i\n",j);
}
}
循环嵌套练习题
/*
打印以下的图形
***
**
*
// 分析:这个图形是有三行的,所以外循环控制行数,通过发现每一列随着行数的减少而减少,第一行是有三个星星,第二行是有两个星星,第三行是有一个星星
*/
/*
int count = 3;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= count; j++) {
printf("*");
}
printf("\n");
count--;
}
int count1 = 1;
for (int i = 1; i <= 3; i++) {
for (int j = count1; j <= 3; j++) {
printf("*");
}
printf("\n");
count1++;
}
*/
// 优化一下既然定义的 count 值与 i 的值是一样的,并且 i 与 count 的值每次内循环结束后都会进行自增
/*
for (int i = 1; i <= 3; i++) {
for (int j = i; j <= 3 ; j++) {
// 第一行打印三个星星,j 应该小于等于 3--->第一行需要打印三次*--->j=i 时,内循环执行三次打印了三个星星
// 第二行打印两个星星,j 应该小于等于 2
// 第三行打印一个星星,j 应该小于等于 1
printf("*");
}
printf("\n");
}
*/
/*
打印以下的图形
*
**
***
分析:图形有三行,外循环需执行三次,条件控制语句小于 3,第一行打印一个星星,第二行打印两个星星,第三行打印三个星星.
*/
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0 ; j <= count;j++) {
printf("*");
}
printf("\n");
count++;
}
// 优化后条件表达式的 count 替换成 i
for (int i = 1; i <= 3 ; i++) {
for (int j = 1 ; j <= i; j++) { // 此时不固定写死条件表达式,写死就没内循环每次执行三次,让条件表达式跟随 i 的值进行变化
printf("*");
}
printf("\n");
}
- 总结规律
- 尖尖朝上:修改内循环的条件表达式
- 尖尖朝下:修改内循环的初始化表达式
/*
打印 以下图形
1
12
123
*/
for (int i = 0; i < 3; i++) {
for (int j = 0; j <= i; j++) {
printf("%i",j+1);
}
printf("\n");
/*
打印以下u图形
1
22
333
*/
for (int i = 0; i < 3; i++) {
for (int j = 0; j <= i ; j++) {
printf("%i",i+1);
}
printf("\n");
}
/*
打印以下图形
--*
-***
*****
分析:看这个图形可以拆分出两个图形
-- *
- ***
*****
这两个图形拼在一起就是上面的图形
*/
// 图形有三行,
/*
for (int i = 0; i < 3; i++) {
for (int j = i; j < 3; j++) {
printf("-"); //此时打印的-第一行有三个
}
for (int x = 0; x <= i; x++) {
printf("*");
}
printf("\n");
}
打印出了这个图形,跟需求有一些出入
---*
--**
-***
*/
for (int i = 0; i < 3; i++) {
for (int j = i; j < 2; j++) {
printf("-");
}
for (int x = 0; x <= i * 2; x++) {
printf("*"); // 此时发现需求第一行是一个,第二行是三个,第三行是五个,那么肯定不能是小于等于 i 了,需要让他第二行循环三次,第三行循环无次,那么将 i 乘以 2即可
}
printf("\n");
}
- 九九乘法表
/*
打印c九九乘法表
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
....
*/
// 尖尖朝上,总共有九行
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%i * %i = %i",j,i,i*j);
printf("\t");
}
printf("\n");
}