C语言学习与总结---第五章:循环结构程序设计

本文详细介绍了C语言中的循环结构,包括while、do-while和for循环的使用,以及循环的嵌套、continue和break语句的控制效果。同时,通过实例解析了各种循环在不同情况下的应用,如求和、矩阵打印、Fibonacci数列、素数判断等,帮助读者深入理解C语言循环机制。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

5.1 while语句

一般形式:

  while (表达式)
  {
    语句
  }

特点:先判断表达式,后执行语句。
在这里插入图片描述
例,求1到100的和

#include<stdio.h>  
int main()  
{  
    int i = 1, sum = 0;  
    while (i <= 100)  
    {  
        sum += i;  
        i++;  
    }  
    printf("sum = %d\n", sum);  
    return 0;  
} 

注意:
(1)循环体如果包含一个以上的语句,应该用大括弧括起来,以复合语句的形式出现。
(2)在循环体中应有使循环趋向于结束的语句。

5.2 do-while语句

一般形式:

 	 do 
  {
     循环体语句
  } while (表达式);

特点: 先执行循环体,然后判断循环条件是否成立。
在这里插入图片描述
例,求1到100的和

#include<stdio.h>  
int main()  
{  
    int i = 1, sum = 0;  
    do  
    {  
        sum += i;  
        i++;  
    } while (i <= 100);  
    printf("sum = %d\n", sum);  
    return 0;  
} 

5.3 for语句

一般形式:

 	for(表达式1;表达式2;表达式3)
      { 
         语句
      }

最简单的形式:

for(循环变量赋初值;循环条件;循环变量增值) 
{
	语句
} 

注:
(1) 与for语句等价的while语句的形式:

	表达式1;
	while(表达式2)
	{  
	     语句
	     表达式3;
	}

(2) for语句中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。
例如:

	for ( ;  i <= 100; i++)  sum = sum + i; 

注意: 表达式1后面的分号不能省略
(3) 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。即认为表达式2始终为真。例如:

for (i = 1;  ; i++)   sum = sum + i;     

(4) 表达式3也可以省略,但应该另外设法保证循环能正常结束。
例如:

 	for (i = 1; i <= 100; )
   	{ 
             sum = sum + i;
               i++;
    }     

(5) 可以省略表达式1和表达式3,只有表达式2, 即只给循环条件。
例如:

for (; i<=100; )                                 
{                                              
     sum = sum + i;                        
     i++;                                          
}                                     

相当于

while (i<=100)
 {
    sum = sum + i;
    i++;
 }

(6) 表达式1和表达式3可以是一个简单的表达式,也可以包含多个简单表达式,中间用逗号间隔。例如

for (sum=0, i=1; i<=100; i++)   sum = sum + i;
 

 for (i=1; i<=100; i++, i++)   sum = sum + i;

相当于

  for (i=1; i<=100; i=i+2)   sum = sum + i;

例:

for (   ; (c=getchar()) != ‘\n’;   )
printf(″%c″,c);

语句中只有表达式2,而无表达式1和表达式3。作用:每读入一个字符后立即输出该字符,直到遇到“换行”为止。

例,求1到100的和

#include<stdio.h>  
int main()  
{  
    int i, sum = 0;  
    for (i = 1; i <= 100; i++)  
        sum += i;  
    printf("sum = %d\n", sum);  
    return 0;  
}

5.4 循环的嵌套

一个循环体内又包含另一个完整的循环结构称为循环的嵌套。
三种循环(while循环、do-while循环和for循环)可以互相嵌套

例,输出一个矩阵
[ 2 3 4 5 3 4 5 6 4 5 6 7 ] \left[\begin{matrix} 2 & 3 & 4 & 5\\ 3&4&5&6\\ 4&5&6&7\\ \end{matrix} \right] 234345456567

#include<stdio.h>  
int main()  
{  
    int i, j;  
    for (i = 1; i <= 3; i++)  
    {  
        for (j = 1; j <= 4; j++)  
            printf("%d ", i + j);  
        printf("\n");  
    }  
    return 0;  
}

5.5 while与do-while的比较

在一般情况下,用while语句和用do-while语句处理同一问题时,它们的结果一样。但是如果while后面的表达式一开始就为假时,两种循环的结果是不同的。
例如下面两个程序

#include<stdio.h>  
int main()  
{  
    int i, sum = 0;  
    printf("please enter i: ");  
    scanf_s("%d", &i);  
    while (i <= 10)  
    {  
        sum += i;  
        i++;  
    }  
    printf("sum = %d\n", sum);  
    return 0;  
} 

运行结果
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>  
int main()  
{  
    int i, sum = 0;  
    printf("please enter i: ");  
    scanf_s("%d", &i);  
    do  
    {  
        sum += i;  
        i++;  
    } while (i <= 10);  
    printf("sum = %d\n", sum);  
    return 0;  
} 

运行结果
在这里插入图片描述
在这里插入图片描述

5.7 改变循环执行的状态

5.7.1 continue语句

结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
一般形式:

continue;

例,输出100~200之间的不能被3整除

#include<stdio.h>  
int main()  
{  
    for (int n = 100; n <= 200; n++)  
    {  
        if (n % 3 == 0) continue;  
        printf("%d ", n);  
    }  
    printf("\n");  
    return 0;  
} 

5.7.2 break语句

可以用来从循环体内跳出循环体,即提前 结束循环,接着执行循环下面的语句。
一般形式:

break;

注意: break语句只能用于循环语句和switch语句。

例,在全系1000名学生中进行募捐,当总数达到10万元时结束,统计此时捐款的人数,以及平均每人捐款的数目

#include <stdio.h>  
#define SUM 100000  
int main()  
{  
    float amount, aver, total;  
    int i;  
    for (i = 1, total = 0; i <= 1000; i++)  
    {  
        scanf_s("%f", &amount);  
        total = total + amount;  
        if (total >= SUM) break;  
    }  
    aver = total / i;  
    printf("num=%d\naver=%10.2f\n", i, aver);  
    return 0;  
} 

5.7.3 continue与break的区别

break语句则是结束整个循环过程,不再判断执行循环的条件是否成立

while(表达式1) 
 {
    …
    if(表达式2) break;
    …
 } 

在这里插入图片描述
continue语句只结束本次循环,而不是终止整个循环的执行

while(表达式1) 
 {
    …
    if(表达式2) continue;
    …
 } 

在这里插入图片描述
例,依次输出下列矩阵
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] \left[\begin{matrix} 1&2&3&4&5\\ 6&7&8&9&10\\ 11&12&13&14&15\\ 16&17&18&19&20\\ \end{matrix}\right] 1611162712173813184914195101520

[ 1 2 3 4 5 2 4 6 8 10 4 8 12 16 20 ] \left[\begin{matrix} 1&2&3&4&5\\ 2&4&6&8&10\\ &&&&\\ 4&8&12&16&20\\ \end{matrix}\right] 1242483612481651020

[ 1 2 3 4 5 2 4 6 8 10 6 9 12 15 4 8 12 16 20 ] \left[\begin{matrix} 1&2&3&4&5\\ 2&4&6&8&10\\ 6&9&12&15&\\ 4&8&12&16&20\\ \end{matrix}\right] 1264249836121248151651020

#include <stdio.h>  
int main()  
{  
    int i, j;  
    for (i = 1; i <= 20; i++)   //第一个矩阵  
    {  
        printf("%d\t", i);  
        if (i % 5 == 0) printf("\n");  
    }  
    printf("\n\n");  
    for (i = 1; i <= 4; i++)   //第二个矩阵  
    {  
        for (j = 1; j <= 5; j++)  
        {         
            if (i == 3)continue;  
            printf("%d\t", i * j);  
        }  
        printf("\n");  
    }  
    printf("\n\n");  
    for (i = 1; i <= 4; i++)  //第三个矩阵  
    {  
        for (j = 1; j <= 5; j++)  
        {  
            if (i == 3 && i * j == 3)continue;  
            printf("%d\t", i * j);  
        }  
        printf("\n");  
    }  
    printf("\n\n");  
    return 0;  
}

运行结果
在这里插入图片描述

5.8 程序应用

(1)用 公式 π 4 = 1 − 1 3 + 1 5 − 1 7 + . . . \frac{\pi}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+... 4π=131+5171+...
π \pi π的近似值,直到某一项的绝对值小于 1 0 − 6 10^{-6} 106 为止.

#include<stdio.h>  
#include<math.h>  
int main()  
{  
    int sign = 1;  
    double sum = 0.0, t = 1.0, i = 1.0;  
    while (fabs(t) >= 1e-6)  
    {  
        sum += t;  
        i += 2;  
        sign = -sign;  
        t = sign / i;  
    }  
    printf("%10.8f\n", 4 * sum);  
    return 0;  
}

运行结果:3.14159065

(2)求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:
F(1)=1 (n=1);F(2)=1 (n=2);F(n)=F(n-1)+F(n-2) (n≥3)

#include<stdio.h>  
int main()  
{  
    int f1 = 1, f2 = 1, i;  
    for (i = 1; i <= 20; i++)  
    {  
        printf("%12d%12d", f1, f2);  
        if (i % 2 == 0)printf("\n");  
        f1 = f1 + f2;  
        f2 = f2 + f1;  
    }  
    return 0;  
}  

运行结果
在这里插入图片描述
(3)输入一个整数n,判断n是否为素数。

#include<stdio.h>  
#include<math.h>  
int main()  
{  
    int i, n, k;  
    scanf_s("%d", &n);  
    if (n == 1) printf("%d不是素数", n);  
    else  
    {  
        k = sqrt(n);  
        for (i = 2; i <= k; i++)  
            if (n % i == 0)break;  
        if (i <= k)printf("%d不是素数\n", n);  
        else printf("%d是素数\n", n);  
    }  
    return 0;  
}

(4)输出100到200之间的素数

#include<stdio.h>  
#include<math.h>  
int main()  
{  
    int n, i, k, m = 0;  
    for (n = 101; n < 200; n += 2)  
    {  
        k = sqrt(n);  
        for (i = 2; i <= k; i++)  
        {  
            if (n % i == 0) break;  
        }  
        if (i >= k + 1)  
        {  
            printf("%5d", n);  
            m++;  
        }  
        if (m % 10 == 0) printf("\n");  //每输出10个换行  
    }  
    printf("\n");  
    return 0;  
}  

运行结果
在这里插入图片描述
(5)加法密码
将明文的每个字母向后移动三个,即A变成E,a变成e,W变成A,X变成B,从而实现明文的加密,输出密文。

1.	#include<stdio.h>  
2.	int main()  
3.	{  
4.	    char ch;  
5.	    while ((ch = getchar()) != '\n')  
6.	    {  
7.	        if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))  
8.	        {  
9.	            ch += 4;  
10.	            if ((ch > 'Z' && ch <= 'Z' + 4) || ch > 'z') ch -= 26;  
11.	        }  
12.	        printf("%c", ch);  
13.	    }  
14.	    printf("\n");  
15.	    return 0;  
16.	} 

这是针对单个字符的加密,可以将整个程序封装成函数,加密字符串、文本。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值