【C语言必知必会| 第七篇】循环结构入门,这一篇就够了

简介: 【C语言必知必会| 第七篇】循环结构入门,这一篇就够了

引言

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语言,读者可订阅专栏持续跟进。

目录
相关文章
|
2月前
|
C语言
王桂林C语言从放弃到入门课程
课程目标16天,每天6节课,每节40分钟课堂实录,带你征服C语言,让所有学过和没有学过C语言的人,或是正准备学习C语言的人,找到学习C语言的不二法门。适用人群所有学过和没有学过C语言的人,或是正准备学习C语言的人!
26 2
王桂林C语言从放弃到入门课程
|
2月前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
11天前
|
存储 自然语言处理 编译器
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
|
8天前
|
编译器 C语言
函数深入解析(C语言基础入门)
函数深入解析(C语言基础入门)
|
8天前
|
C语言
数组深入剖析(C语言基础入门)
数组深入剖析(C语言基础入门)
|
11天前
|
算法 C语言 芯片
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)
|
23天前
|
存储 编译器 程序员
c语言入门篇
c语言入门篇
27 0
|
2月前
|
存储 编译器 C语言
【C语言】求任意两整数的和入门详解
【C语言】求任意两整数的和入门详解
7 0
|
2月前
|
编译器 程序员 C语言
【C语言】“hello world!”程序入门详解
【C语言】“hello world!”程序入门详解
9 0
|
2月前
|
编译器 C语言
C语言入门之变量、常量、字符串、转义字符
C语言入门之变量、常量、字符串、转义字符