• C语言学习(五)之循环


    一、 循环

    1.1 定义

    在程序中,某些代码会被一直重复循环的执行,直到满足一些条件时,就会退出,这部分的代码就包含在循环结构中。

    1.2 循环分类

    在C语言中,循环主要有三种,for循环、while循环和do…while()循环。下面会详细介绍。

    1、for()循环
    2、while()循环
    3、do...while()循环 
    
    • 1
    • 2
    • 3

    1.3 真假判断

    在介绍循环之前,先说明在C语言中对真假的判断。循环是在满足条件为真时,就会退出循环,所以知道对真假的判断就十分重要。在C语言中:

    1、非零即真
    2、0为假
    
    • 1
    • 2

    1.3.1 C语言中真假的示例

    #include 
    
    
    int main(){
    
        int num1 = 5;   // 5为非零数,则为真。-5时同样的结果
        int num2 = 0;   // 为0则为假
    
        int num3 = num1 && num2;    // 逻辑与同为真时则为真,有一个为假则为假,所以结果为 0
        int num4 = num1 || num2;    // 逻辑或同为假时则为假,有真则为1,所以输出结果为 1
       
       printf("%d\n", num3);  // 结果为:0
       printf("%d", num4);  // 结果为:1
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    二、for()循环

    2.1 语法

    for(exp1; exp2; exp3){
    		statement
    }
    
    • 1
    • 2
    • 3

    for循环后面的圆括号中有3个表达式,分别用分号隔开。其中:

    1、表达式1是初始化,只会在for循环开始时执行一次。
    2、表达式2是测试条件,在执行循环之前对表达式求值。如果表达式为假,则循环结束。
    3、表达式3是执行更新,在每次循环结束时求值。
    
    • 1
    • 2
    • 3

    2.2 示例程序

    2.2.1 for循环求和1-10

    # include 
    
    int main(void)
    //1-10的加法
    {
    	int i; // 定义i变量
    	int sum = 0;	// 定义并初始化求和结果的变量
    	for (i = 1; i <= 10; i++)//i=1为初始化i变量的值,i<=10为测试条
    	//件,在本例中当i=11时,表达式2为假,则跳出循环。i++为执行循环的更新
    	//条件,执行一次循环,i+1
    		sum = sum + i;
    	printf("sum = %d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.2.2 for循环求1-10的奇数和

    # include 
    
    int main(void)
    {
    	int i;
    	int sum = 0;
    	// 同上,当表达式3为i+=2时,循环每次的更新条件为i+2,就会过滤掉偶
    	// 数,从而奇数相加
    	for (i = 1; i <= 10; i+=2)
    			sum = sum + i;
    	printf("sum = %d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.2.3 for循环求1-100之间能被3整除数的和

    # include 
    
    int main(void)
    {
    	int i;
    	int sum = 0;
    	for (i = 1; i <= 100; ++i)
    	// if判断1-100之间的数,只有能被3整除时,才会被相加
    		if (i % 3 == 0)
    			sum = sum + i;
    		printf("sum = %d\n", sum);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.2.4 for循环求1-100之间的奇数之和,奇数的个数,奇数的平均值

    #include 
    
    // 求1-100之间的奇数之和,奇数的个数,奇数的平均值
    int main(void)
    
    {
    	int i, j = 0, sum_j = 0;
    	float aver_j;
    	for (i = 1; i <= 100; ++i)
    		if (i % 2 != 0)
    		{
    			sum_j = sum_j + i;
    			j++;
    			aver_j = sum_j / j;
    		}
    		printf("奇数个数为:%d 奇数之和为:%d 平均值为:%f\n", j, sum_j, aver_j);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2.2 for循环求1+1/2+…+1/100

    #include 
    
    int main(void)
    // 1+1/2+...+1/100
    {
    	int i;
    	float sum = 0;
    	for (i = 1; i <= 100; ++i)
    	{
    		sum = sum + 1 / (float)(i);//也可以写为sum = sum + 1.0/ i 
    	}
    	printf("%f\n", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.3 for循环嵌套

    for循环里面在套一层for循环,就构成了for循环嵌套。
    结构示例:

    for (int i = 0; i < count; i++) // 外层for循环
    {
        for (int j = 0; j < count; j++)	//内层for循环
        {
            /* code */
        }   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3.1for循环嵌套打印乘法表

    #include 
    
    int main(){
    
    int i, j;
    
    for (int i = 1; i < 10; i++)    // 外层循环
    {
        for (int j = 1; j <= i ; j++)   // 内层循环
        {
            printf("%d * %d = %d\t", i, j, i*j);
        }
         printf("\n");
    }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    三、while()循环

    3.1 语法

    while ( expression){
    		statement
    }
    
    1、statement部分可以是分号结尾的简单语句,也可以是花括号括起来的符合语句
    2、如果expression为真,执行statement部分一次,然后再次判断expression。在expression为假之前,循环的判断和执行一直重复执行。每一次的循环称为一次迭代
    3、while循环有一点非常重要:在构建while循环时,必须让测试表达式有所变化,表达式最终为假,否则,循环就不会终止。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.2 示例程序

    3.2.1 while循环求和1-100和

    #include 
    
    int main(void)
    
    {
    	// 定义自增变量
    	int i = 1;
    	// 定义求和结果变量
    	int sum = 0;
    	// while循环
    	while (i < 101)
    	{
    		sum = sum + i;
    		// 自增变量
    		++i;
    	}
    	printf("sum = %d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.3 for与while互相转换

    for(exp1; exp2; exp3){
    	statement
    }
    
    等价于:
    
    
    exp1;
    while(exp2){
    	statement;
    	exp3;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    while和for可以相互转化,但for的逻辑性更强,更不容易出错,推荐多使用for。

    四、do…while()循环

    for循环和while循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环,即在循环的每次迭代之后检查测试条件,这就保证了至少执行循环体中的内容一次。这种循环称为do…while循环。

    4.1 语法

    do
    {
    	statement;
    }while(expression);
    
    • 1
    • 2
    • 3
    • 4

    4.2 示例程序

    4.2.1 检查输入数字是否正确

    #include 
    
    int main(){
    
    // 定义并初始化只读变量
    const int secret_code = 11;
    // 定义输入的变量
    int enter_code;
    
    do
    {
    	// 先打印输出语句
        printf("please enter secret code:");
        // 接收键盘输入的数字
        scanf("%d", &enter_code);
        // 判断输入的数字是否和规定的相同,如果不相同,执行循环,如果相同,打印输出内容
    } while (secret_code != enter_code);
    printf("Congulation!");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    do…while并不等价于for,也不等价于while。

    五、 break和continue

    一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue和break可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环。

    5.1 break

    程序执行到循环中的break语句时,会终止包含它的循环,并执行下一阶段的程序。

    5.1.1 示例程序

    #include 
    
    int main(){
    
    int ret = 3;
    
    for(int i = 0; i < 5; i++){
    	// 判断i的值是否等于ret,如果等于则跳出循环
        if (i == ret)
        {
            break;  
        }
        printf("hello world\n");  // 输出三句hello world
    }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.1.2 注意事项

    1、break如果用于循环是用来终止循环。
    2、break如果用于switch,则是用来终止switch。
    3、break不能直接用于if,除非if属于循环内部的一个子句。
    4、在多层循环嵌套中,break只能终止距离它最近的循环。
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在这里插入图片描述

    5.2 continue

    3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。如果continue语句嵌套在循环内,则只会影响包含该语句的内层循环。

    5.2.1 for示例程序

    #include 
    
    int main(){
    
    for(int i = 0; i <= 5; i++){
       
    	// 当i等于3时,跳过i=3的本次循环
        if (i == 3)
        {
            continue;
        }
        printf("i=%d hello world\n", i);
        }
        return 0;
    }
    
    // 输出结果:
    // i=0 hello world
    // i=1 hello world
    // i=2 hello world
    // i=4 hello world
    // i=5 hello world
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    5.2.2 while示例程序

    #include 
    
    int main(){
    
    int i = 0;
    
    while (i < 5)
    {
    	// 当i=3时跳过本次循环,但注意,在跳过之前需要将i+1,
    	// 否则i会始终等于3,而不能退出循环
        if (i == 3){
            i++;
            continue;        
        }     
        printf("i=%d Hello world\n", i);
        i++;
    }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    MFC web文件 CHttpFile的使用初探
    线程强制执行join
    C语言代码优化的艺术:深度探索与实践策略
    磁选机是什么?
    姓祝男孩名字简单大气
    深入理解操作系统——cpu处理机调度详解
    【面经】美团大数据开发面经
    Type-challenges题目(第三部分)
    anaconda+tensorflow+sklearn,安装过程的一些问题
    0002 嵌入式开发带你从小白到大佬系列之——Linux文件系统、常用文件操作命令(一)及用户权限
  • 原文地址:https://blog.csdn.net/qq_46292926/article/details/127568810