C语言基础5——控制语句2(循环)
循环语句
1 for循环
1.1 基本结构
for(表达式1;表达式2;表达式3){
语句块;
}
表达式1: 赋初值
表达式2: 循环的判断条件(满足条件则进入循环语句块,不满足则跳出循环)
表达式3: 增值或减值(循环条件的变换)
执行顺序: 首先执行表达式1赋值,然后执行表达式2进行判断,如果判断结果为真则进入循环执行语句块,再执行表达式3增值或减值语句,然后继续执行表达式2进行判断是否成立,直到表达式2不成立则退出循环。
【例】求5!
#include <stdio.h>int main()
{int s = 1 ;for (int i = 1 ; i <= 5 ; i ++){s *= i ;//s = s * i;}printf("%d\n", s);return 0;
}
与累加同理,以上例子是用for循环进行对一个数的累成。
1.2 嵌套结构
for(表达式1;表达式2;表达式3){
for(表达式4;表达式5;表达式6)
{
语句块
}
}
练习1:用for循环打印99乘法表(参考答案见文章最后)
i=1: 1*1=1
i=2: 1*2=2 2*2=4
i=3: 1*3=3 2*3=6 3*3=9
i=4: 1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1.3 变形
(1)变形一:
表达式1;
for(;表达式2;表达式3){
语句块;
}
(2)变形二:
表达式1;
for(;表达式2;){
语句块;
表达式3;
}
(3)变形三
for(;;) //死循环{
语句块;
}
*以上三种变换分别改变了三个表达式的位置,表达式1和表达式2可以分别放在循环语句外和循环语句内。如果不写表达式2,对应的整个for循环没有终止条件,此时便成为了一个死循环。
在编程的时候有时会借用死循环来完成一些操作,但在C语言中一般借助while实现死循环。
练习2:打印所有的水仙花数(答案见本文章最后)
水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数
【练习前例】打印以下图案:
要求行数从终端输入。
输入:5
输出以下:
#include<stdio.h>int main()
{int a ;scanf("%d", &a);for(int i = 1 ; i <= a ; i ++){for(int j = 1 ; j <= i ; j ++)printf("*");putchar(10);}return 0 ;
}
练习3:要求行数从终端输入。(答案见本文最后)
输入:5
输出以下:
解题思路:
用for循环嵌套实现外层循环控制行数,内层循环控制每行个数。
2 while循环
定义循环变量并赋值;while(判断条件)
{
语句块;
增值或减值语句;
}
执行顺序:首先定义循环变量并赋值,然后判断条件是否成立,如果成立则进入循环执行语句块以及增值或减值语句,然后继续判断,直到判断不成立则退出循环。
类似于for的变形。
【例】 1到100累加求和
##include<stdio.h>
int main()
{int sum = 0 ;int i = 1;while(i <= 100){sum += i ;//sum = sum +i ;i ++ ;}printf("%d\n", sum) ;return 0 ;
}
练习题:
练习4:有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( )(答案见本文最后)
A. 一次也不执行 B. 执行1次
C.有语法错,不能执行 D. 无限次
练习5:下列程序的输出结果是( )(答案见本文最后)
int main(void){
int Y = 100;
while(Y--);
printf("Y=%d", Y);
}
A. Y = 0 B. Y = 1 C. Y = -1 D. Y = 随机数
3 do_while语句
定义循环变量并赋值;do
{
语句块;
增值或减值语句;
}while(表达式);//只有do—while循环后面有分号
注意:do_while循环必须要先执行依次do后面的语句块且至少执行依次,而while循环只要条件不满足内部循环语句块可能一次都不执行。
练习6:实现1-100的和(答案见本文最后)
4 死循环
死循环(Infinite Loop)是指程序在运行过程中,因逻辑错误或设计缺陷,导致某个循环结构永远无法满足退出条件,从而无限重复执行,程序无法继续向下运行或正常终止。
以下三种方式都可以实现死循环
1——for(;;){}
2——while(1){}
// 让程序卡死在这等
3——while(1);
5 循环控制语句
break:直接结束循环
continue:结束本次循环,继续下次循环
使用场景:
使用在循环语句中,结束循环
使用时需要有判断条件
【例】(可自行分析以下break和continue在本程序中的作用)
#include <stdio.h>int main(int argc, char const *argv[])
{for(int i = 1; i <= 5; i++){if(i == 3)// break;continue;printf("%d\n", i);}return 0;
}
练习7:从终端上输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。(答案案见本文最后)
------------------------------------------------------这是一条分割线------------------------------------------------------
天才预设的上一篇跳转路径:
天才预设的下一篇跳转路径:未完待续~~~
练习答案
练习1:
用for循环打印99乘法表(参考答案见文章最后)
i=1: 1*1=1
i=2: 1*2=2 2*2=4
i=3: 1*3=3 2*3=6 3*3=9
i=4: 1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
#include <stdio.h>int main(int argc, char const *argv[])
{int i, j;for (i = 1; i <= 9; i++){for (j = 1; j <= i; j++)printf("%d*%d=%d ", j, i, i * j);printf("\n");}return 0;
}
打印一个九行九列的乘法表,初步认为内外层循环次数都为9,(注意for循环并不一定必须从0开始)for循环从1开始循环到9,对应的九九乘法表中每一个式子的元素,而九九乘法表是一个斜三角,于是分析内层循环要以外层循环的i值为结束值,然后在最内部执行打印语句。(注意可以用之前学到的格式化输出(m.n)或直接打印空格来调整间距)
练习2:
打印所有的水仙花数(答案见本文章最后)
水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数
#include<stdio.h>int main()
{int g , s , b , i ;for(int i = 100 ; i <= 999 ; i ++){g = i % 10 ;s = i / 10 % 10 ;b = i / 100 ;if(b * b * b + s * s * s + g * g * g == i)printf("%d\n", i)}return 0 ;
}
本练习比较简单,分别定义三个变量存取循环数的个位十位百位,然后用一个if判断语句来判断是否为水仙花数
练习3:
要求行数从终端输入。(答案见本文最后)
输入:5
输出以下:
解题思路:
用for循环嵌套实现外层循环控制行数,内层循环控制每行个数。
图案下面倒着的部分的规律:n=5
通过本图找到空格数与星星数的关系,然后确定循环的结束条件。
行数i | 空格数=i-1 | 星星数=n+1-i |
1 | 0=1-1 | 5=5-1+1 |
2 | 1=2-1 | 4=5-2+1 |
3 | 2=3-1 | 3=5-3+1 |
4 | 3=4-1 | 2=5-4+1 |
5 | 4=5-1 | 1=5-5+1 |
#include <stdio.h>int main(int argc, char const *argv[])
{int a;scanf("%d", &a);for (int i = 1; i <= a; i++){for (int j = 1; j <= i; j++)printf("*");printf("\n");}for (int i = 1; i <= a; i++) //外层循环每一行{//循环打印空格for (int j = 1; j < i; j++)printf(" ");//循环打印星星for (int k = 1; k <= a + 1 - i; k++)printf("*");//打印换行printf("\n");}return 0;
}
练习4:
有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( )
A. 一次也不执行 B. 执行1次
C.有语法错,不能执行 D. 无限次
注意:while内部并不是判断==,而是赋值=,实际上是对k进行一个赋值,且每次经理循环k值都会被改为1
练习5:
下列程序的输出结果是( )(答案见本文最后)
#include<stdio.h>int main(void)
{int Y = 100;while(Y--);printf("Y=%d", Y);
}
A. Y = 0 B. Y = 1 C. Y = -1 D. Y = 随机数
此循环要执行100此,while内部的判断语句非0则真,直到Y == 0的时候循环截至,但是因为Y--的缘故Y依旧要执行自减,最后值为-1
练习6:
实现1-100的和(答案见本文最后)
#include<stdio.h>int main()
{int i = 1 , sum = 0 ;do{sum += i ;i++ ;}while(i <= 100);return 0;
}
定义循环变量i求和变量sum,跟while循环逻辑相同,将i的值累加到sum上,区别就是在第一次判断循环条件之前先执行了一次累加
练习7:
从终端上输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。(答案案见本文最后)
#include <stdio.h>int main(int argc, char const *argv[])
{char ch;while (1){scanf(" %c", &ch);if(ch == 'q')break;printf("%c\n", ch);}return 0;
}
if语句判断输入的字符ch是否为q,若为q怎进入循环执行break,跳出整个循环,否则继续执行,因为本循环while内的条件是1,是一个死循环,所以只能通过break来跳脱整个循环。