直到型循环的实现
特点:先执行,后判断,不管条件是否满足,至少执行一次。
**代表:**do…while,goto(已经淘汰,不推荐使用)
do…while
语法:
循环变量;
do
{循环体;
}while(循环条件);
说明:
①循环条件
的返回值必须是逻辑值(0和非0(计算机返回1))
②{}
包起来的内容称之为循环体
③我们要在循环体
中控制循环条件
的变换,否则会产生死循环。
流程图
**特点:**先执行,后判断,不管是否满足条件,循环体语句至少执行一次
案例
-
需求:求1~100以内的偶数和
-
分析
- 创建一个变量,用来存储sum,sum=0
- 创建一个循环变量,i=2
- 创建一个do.while循环,在循环体中,校验i%2==0,如果满足,就实现sum+=i
- 计算完成,在循环体的末行,对循环变量进行更新i++
- 限制循环的出口:i <= 100
- 限制循环的出口:i <= 100
- 循环结束,打印输出sum的值
-
代码
/*************************************************************************> File Name: demo06.c> Author: 小刘> Description: 用do..while..累加1~100中的偶数> Created Time: 2025年05月09日 星期五 14时30分41秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {// 创建一个变量,存储偶数和int i = 2;// 创建一个循环变量int sum = 0;// 创建一个循环,实现偶数和的计算do{// 校验偶数if(i % 2 == 0)// 更新循环变量,逼近出口sum += i;i ++;}while(i <= 100);// 打印输出sumprintf("1~100以内的偶数和是%d\n",sum);return 0; }
案例:
- 需求:用C语言编写简单猜数字游戏代码。游戏规则是程序随机生成一个1到100之间的数字,玩家通过输入猜测数字,程序会提示猜测是太大还是太小,直到玩家猜中为止。
- 代码:
/*************************************************************************> File Name: demo07.c> Author: 小刘> Description: > Created Time: 2025年05月09日 星期五 14时39分37秒************************************************************************/#include <stdio.h>
#include <stdlib.h>//
#include <time.h>//随机种子int main(int argc,char *argv[])
{int guess;int number ;int count = 0;srand(time(NULL));number = rand() % 100;printf("--------------------------\n");printf("-----猜数字小游戏---------\n");printf("--------------------------\n");printf("我已经想了0~99之间的数字,你猜猜是多少");do{printf("请输入你猜的数字:\n");int result = scanf("%d",&guess);if(result != 1){while(getchar() != '\n');printf("请输入数字!\n");continue;}count ++;if(guess > number)printf("太大了,再猜一次。\n");else if(guess < number)printf("太小了,在猜一次");else{printf("恭喜你,猜对了!\n");printf("你一共猜了%d次。\n",count);}}while(guess != number);return 0;
}
运行结果:
goto
语法:
goto 标签(labe1)
标签:标明目标代码的位置,是一个不加 ""
的字符串。
案例:
- 需求:1~100以内的偶数和
- 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{//创建一个变量,用来存放偶数和int sum = 0;//创建一个循环变量int i = 2;//定义goto标签,名字自己取,符合标识符命名即可loop://过滤偶数if (i % 2 == 0) sum += i; // 偶数和计算i++;//更新循环变量//循环条件if (i <= 100)gotoloop;//标签loop由goto触发printf("1~100以内的偶数和是%d\n",sum);return 0;
}
-
注意事项
1.可读性:
goto
语句会破坏代码的结构和可读性,使得代码难以理解和维护。因此,应尽量避免使用。2.替代方案:大多数情况下,可以使用循环、条件语句、函数等结构来替代
goto
语句,使代码更加清晰和易于管理。3.嵌套限制:虽然
goto
语句可以跨函数跳转(即跳转到另一个函数中的标签),但这种用法是不合法的,并且会导致编译错误。goto
语句只能在同一函数内部跳转。4.错误处理:在某些情况下,
goto
语句可以用于错误处理,例如从嵌套的多层循环中跳出。但即使在这种情况下,也应谨慎使用,并考虑是否有更好的替代方案。
总结
虽然goto
语句在C语言中是合法的,并且有时可能看起来很方便,但过度使用或不当使用会导致代码质量下降。因此,建议尽量避免使用goto
语句,而是采用更结构化和可维护的编程方法。
循环化的嵌套
3种循环(while、for、do.while)可以相互嵌套的。在前一个循环结构中又嵌套一个循环结构。例如:
案例:
-
需求:九九乘法表
-
分析:
-
我们发现九九乘法表整体其实就是一个9行的直角三角形、
-
同时发现:每一行显示的列数最多不超过行,第1行1列,第2行2列…第9行9列
假定:行用i表示,列用j表示,i和j的关系:j<=i
-
-
在实现的时候,我们发现需要同时控制行和列的变化,在编程中,行列式需要通过for双层嵌套实现(双重for循环)
-
代码:
/*************************************************************************> File Name: demo09.c> Author: l小刘> Description: 求100~200之间的素数> Created Time: 2025年05月09日 星期五 15时57分37秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{int num = 100;int i=2;while(num <= 200){for (i = 2;i < num / 2;i ++){if(num % i == 0){break;}}printf("%d\n",num);num += 1;}return 0;
}
- 运行结果:
案例:
- 需求:
循环结构的典型应用场景
- 求累和:举例:
1+2+3..+100的和,sum = 0
- 求累积:举例:
1*2*3..*100的积,result = 1
- 求均值:举例:
(1+2+3...+100)/100的值
- 求极值:举例:
12,34,56,67中的最大值、最小值
- 元素遍历:常用于数组元素的遍历。
- …
基础算法模型
1.累加和
- 定义一个变量(sum),并赋初值为0;
- 该变量累加(+=)每一个数据项(i);
- 当访问完每一个数据项,此时该变量的取值就是累加和的结果。
- 累乘
- 定义一个变量,并赋初值为1;
- 用该变量累乘(*=)每一个数据项;
- 当访问完每一个数据项,此时该变量的取值就是累乘的结果。
3.极值(多应用于数组)
- 定义一个变量,并赋初值为第一个数据项;
- 从第二个数据项开始,依次于该变量进行比较,如果大于/小于该变量,则将当前数据项的 数据赋值给该变量。
- 当访问完每一个数据项,此时该变量的取值就是求极值的结果。