引言
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】系列第七篇,介绍C语言的循环结构,结合专题优质题目,带领读者从0开始,深度掌握知识点。
1️⃣ 概念介绍
循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。
它由循环体中的条件,判断继续执行某个功能还是退出循环。
根据判断条件,循环结构又可细分为以下两种形式:
先判断后执行的循环结构 和 先执行后判断的循环结构
举个例子:当我们计算阶乘3!时,可以看作初始值为1的i的自增再相乘,即i*(i+1)*(i+2)
如果计算2023!的时候,就不需要一直让程序直接计算1*2*3*4*5*6*......*2023
而这,就是循环结构的优势。
2️⃣代码过渡
在正式开始选择循环结构的代码实现之前,我们需要掌握一些运算符等的知识点。
自加、自减运算符
形式:前缀式 ++i, --i 后缀式 i++, i–
++i和i++都是自增,但a=++i表示先对i自增,再赋值给a
a=i++表示先将i赋值给a,i再自增
我们看以下代码
int i=3, j=3, x, y; x=++i; y=j--; printf(“%d,%d;%d,%d\n", i, x, j,y);
程序的结果是4,4,2,3
是因为x=++i中,i自增为4,再赋值给x,所以x也为4
y=–j中,j先赋值给y,所以y为3,j再自减,所以j最后为2
注意:仅当独立成句时,2者结果相同,即 i++ 与 ++i 得到的 i 是一样的
逗号运算符
形式与作用:
形式:表达式1 ,表达式2,…, 表达式n
作用:将多个表达式连接成一个表达式
求解顺序:式1->式2,最后求式n,以式n值为结果值。
如下
int i, j; j=( i=2, ++i ); printf( "i=%d,j=%d\n", i, j );
先计算i=2,即2,再计算++i,即3,所以最后j=3,程序输出3,3
3️⃣知识点讲解
这一节我们将细致讲讲while语句形式与执行过程、do while语句形式与执行过程、for语句形式与执行过程
while语句
基本形式:
while( 表达式 ) { 语句 }
举个例子:
int i=1; /*循环变量初值*/ while( i<=2 ) /*循环头,循环条件*/ { puts("$$$$"); //循环体 puts("$$$$"); //循环体 i++; /*使循环趋于结束的操作*/ }
当while表达式为真时,执行循环体内的语句,否则结束while语句并执行其后的语句。
什么意思呢?我们看上面这个例子:
一开始i为1,由于满足i<=2这个条件,所以进入while语句,输出两行的$$$$
,接着i自增,变为2。
i为2,满足i<=2这个条件,所以所以进入while语句,输出两行的$$$$
,接着i自增,变为3。
而i=3不满足i<=2这个条件,所以结束循环。
于是整个程序输出:
$$$$ $$$$ $$$$ $$$$
do while 语句
基本形式:
do { 循环语句 }while(表达式);
do while 语句最大的一个特点就是,不管表达式,先执行一次循环语句。再通过表达式判断需不需要执行循环语句。
看下面这个例子:
int i=1; do { puts("$$$$"); puts("$$$$"); i++; } while( i<=2 ); /*分号不能省*/
首先,不管怎样,都执行循环语句,所以输出$$$$
,并且i变为2
然后由于i=2,是满足i<=2这个条件的,所以执行循环语句,输出$$$$
,并且i变为3
接着,i=3不满足i<=2这个条件,所以结束循环。
注意: do-while循环1~n次,while通常循环 0~n次。
最后我们讲一下for循环
基本形式:
for( 表达式1; 表达式2; 表达式3 ) 循环体语句
表达式1初始化->式2条件->循环体语句->式3结束->式2
我们看这个例子:
int i; for( i=1; i<=2; i++ ) { puts("$$$$"); puts("$$$$"); }
for语句中,先将1赋值给i,然后判断i是否<=2,由于i满足该条件,所以执行循环体,输出两行的$$$$
,并且使i自增
i自增后变为2,满足i<=2,所以执行循环体,输出两行的$$$$
,并且使i自增。
i变为3,不满足循环条件,结束循环。
注意:for后的小括号内必须含2个分号
4️⃣编程实例
循环结构的主要形式、知识点、注意事项我们已讲解完毕。
接着我们通过编程实例,进行实战讲解。
1.题目要求:求1+2+…+100的值。
1.解题思路
我们对i初始化为1,并且对其自增,将每次自增的结果相加即可。
2.代码实现
int i=1, sum=0; /* i循环变量,sum累加结果*/ while( i<=100) /* 设定能进入循环的条件表达式*/ { sum=sum+i; /* 或 sum +=i;*/ i++; /* 使循环趋于结束的操作, 循环变量的步长=1*/ } printf("1+2+3+…+100=%d\n", sum);
3.添加预处理命令等,将代码格式化
#include <stdio.h> int main() { int i=1, sum=0; /* i循环变量,sum累加结果*/ while( i<=100) /* 设定能进入循环的条件表达式*/ { sum=sum+i; /* 或 sum +=i;*/ i++; /* 使循环趋于结束的操作, 循环变量的步长=1*/ } printf("1+2+3+…+100=%d\n", sum); return 0; }
编译运行结果:
注意:进行累加操作时,累加变量sum, i必须初始化,如果sum没有初始化,系统会自动将一个未知的值赋值给sum
2.题目要求:求999内的水仙花数
1.解题思路
我们先看看什么是水仙花数:
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。
例如153=1^3 + 5^3 + 3^3
2.代码实现
int x, g, s, b; /*x表示三位整数,g表示个位,s表示十位 b表示百位*/ x=100;//保证x为三位数 while( x<=999 ) { g=x%10; //计算个位数 s=(x/10)%10; //计算十位数 b=(x/100)%10; //计算百位数 if( x==g*g*g+s*s*s+b*b*b) printf("%6d", x); /*输出满足水仙花条件的数*/ x++; } printf("\n");
3.添加预处理命令等,将代码格式化
#include <stdio.h> int main() { int x, g, s, b; /*x表示三位整数,g表示个位,s表示十位 b表示百位*/ x=100; //保证x为三位数 while( x<=999 ) { g=x%10; //计算个位数 s=(x/10)%10; //计算十位数 b=(x/100)%10; //计算百位数 if( x==g*g*g+s*s*s+b*b*b) printf("%6d", x); /*输出满足水仙花条件的数*/ x++; } printf("\n"); return 0; }
编译运行结果:
注意:%6d表示按指定格式显示数据:6是输出数据应占据的最少位数。
当要显示的数据不足6位时,数据左边补空格;当要显示的数据位数超6位时,显示实际位数。
3.输入一个数,判断这个数是否为素数
解题思路:
先看看什么是素数:只能被1和它本身整除的正整数(1不是素数,2是最小的素数)
因此对于某个数x,只要判定这个数不能被2到x-1整除,就能证明该数字是素数。
2.代码实现
#include <stdio.h> int main() { int x; scanf("%d",&x); for(int i=2;i<=x-1;i++) { if(x%i==0) //一旦x能被其中一个数整除,就判断它不是素数 { printf("%d不是素数",x); } } //当x不能被所有数整除,就判断它为素数 printf("%d是素数",x); }
但是这个代码块出现了一个问题:不管怎么样,都会输出x是素数
而且,如果输入的数为12,会连续输出4个“12不是素数”
该添加什么条件来避免这个错误呢?
一旦满足 x%i==0
,则输出“x不是素数”并且跳出循环
当 i 自增到最后都不满足这个循环时, i 数值上变为x,以此来判断x为素数
for(i=2;i<=x-1;i++) { if(x%i==0) //一旦x能被其中一个数整除,就判断它不是素数 { printf("%d不是素数\n",x); break;//break跳出for循环 } } //当x不能被所有数整除,就判断它为素数 if(x==i) { printf("%d是素数",x); } }
3.添加预处理命令等,将代码格式化
#include <stdio.h> int main() { int x,i; scanf("%d",&x); for(i=2;i<=x-1;i++) { if(x%i==0) //一旦x能被其中一个数整除,就判断它不是素数 { printf("%d不是素数\n",x); break;//break跳出for循环 } } //当x不能被所有数整除,就判断它为素数 if(x==i) { printf("%d是素数",x); } }
编译运行结果:
至此,循环结构的编程实例已讲解完成,读者需要躬身实践来掌握C语言循环结构相关知识点。
5️⃣总结
此文为 【C语言必知必会】系列第七篇 ,带领读者掌握C语言的循环结构,带领读者从0开始,深度掌握知识点。
以题代练对于C语言的学习是十分重要的,所以专栏将提供优质C语言编程题,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。