• C语言的程序流程控制


    目录

    顺序控制

    分支控制

    if-else(单分支)

    求二次元方程是否有解

    if-else(多分支)

    嵌套分支

    switch分支结构

    细节讨论

    switch和if的比较

    for循环控制

    注意事项和细节说明

    练习题

    While循环控制

    do-while循环控制

    多重循环控制

    跳转控制语句-break

    跳转控制语句-continue

    跳转控制语句

    循环控制练习

    调和级数相加

    顺序控制

    程序从上到下逐行地执行,中间没有任何判断和跳转

    分支控制

    if-else(单分支)

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. void main() {
    4. int x = 4;
    5. int y = 1;
    6. if (x > 2) {
    7. if (y > 1) {
    8. printf("x+y=%d", x + y);
    9. }
    10. printf("我爱中华");
    11. }
    12. else {
    13. printf("x is =%d", x);
    14. }
    15. getchar();//我爱中华
    16. }

    求二次元方程是否有解

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. //求的是二次元方程是否有解
    5. void main() {
    6. double a = 0;
    7. double b = 0;
    8. double c = 0;
    9. printf("请输入a的值:");
    10. scanf("%lf", &a);
    11. printf("请输入b的值:");
    12. scanf("%lf", &b);
    13. printf("请输入c的值:");
    14. scanf("%lf", &c);
    15. double z = b * b - 4 * a * c;
    16. double x1 = 0;
    17. double x2 = 0;
    18. if (z >= 0) {
    19. x1 = -b + sqrt(z) / 2 * a;
    20. x2 = -b - sqrt(z) / 2 * a;
    21. printf("方程的两个解分别为:%.lf,%.lf", x1, x2);
    22. }
    23. else {
    24. printf("方程无解");
    25. }
    26. getchar();
    27. getchar();
    28. }

    if-else(多分支)

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. void main() {
    4. double score = 0.0;
    5. printf("请输入小明的C二级考试成绩:");
    6. scanf("%lf", &score);
    7. if (score == 100) {
    8. printf("奖励一台宝马");
    9. }
    10. else if (score>80&&score<100){
    11. printf("奖励一部苹果手机");
    12. }
    13. else if (score >= 60 && score <= 80) {
    14. printf("奖励一个ipad");
    15. }
    16. else {
    17. printf("什么奖励都没有");
    18. }
    19. getchar();//得到的回车
    20. getchar();//控制台暂停
    21. }

    嵌套分支

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. //参加百米运动会,如果用时8秒以内进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。
    4. void main() {
    5. double time = 0.0;
    6. char gender = ' ';
    7. printf("请输入百米运动会成绩(s):");
    8. scanf("%lf", &time);
    9. if (time < 8) {
    10. printf("请输入同学性别(m/f):");
    11. scanf("%c", &gender);//接收到上次回车
    12. scanf("%c", &gender);
    13. if (gender == 'f') {
    14. printf("进入女子组决赛");
    15. }
    16. else {
    17. printf("进入男子组决赛");
    18. }
    19. }
    20. else {
    21. printf("淘汰");
    22. }
    23. getchar();
    24. getchar();
    25. }

    switch分支结构

    细节讨论

    • switch语句中的表达式是一个常量表达式,必须是一个整数(char、short、int、long)或枚举类型
    • case子句中的值必须是常量,而不能是变量
    • default子句是可选的,当没有匹配的case时,执行default
    • break语句用来执行完一个case分支后使程序跳出switch语句块
    • 如果没有写break,会执行下一个case语句块,直到遇到break或者执行到switch结尾,这个现象称为穿透
    1. double score = 0.0;
    2. printf("请输入学生成绩(满分100分):");
    3. scanf("%lf", &score);
    4. switch ((int)(score / 60)) {
    5. case 0:
    6. printf("不合格");
    7. break;
    8. case 1:
    9. printf("合格");
    10. break;
    11. default:
    12. printf("输入成绩有误");
    13. }

    switch和if的比较

    • 如果判断的具体数值不多,而且符合整型、枚举类型,此时建议使用switch语句
    • 对区间判断,对结果为真假的判断,使用if

    for循环控制

    注意事项和细节说明

    • 循环条件是返回一个表示真假的表达式
    • for(;循环判断条件;)中的初始化和变量迭代可以不写
    • 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开

    练习题

    1. #include
    2. void main() {
    3. //打印1-100之间所有是9的倍数的整数的个数及总和
    4. int count = 0;
    5. int sum = 0;
    6. for (int i = 1; i <= 100; i++) {
    7. if (i % 9 == 0) {
    8. count++;
    9. sum += i;
    10. }
    11. }
    12. printf("1-100之间是9的倍数的整数有%d个,\n",count);
    13. printf("1-100之间是9的倍数的整数总和是%d,", sum);
    14. int j = 0;
    15. printf("请输入一个整数:");
    16. scanf("%d", &j);
    17. for (int i = 0; i <= j; i++) {
    18. printf("\n %d + %d = %d", i, j - i, j);
    19. }
    20. getchar();
    21. }

    While循环控制

    1. #include
    2. #include
    3. void main() {
    4. //不断输入姓名,直到输入 "exit" 为止[使用while完成]
    5. //分析
    6. //1. 需要接受用户的输入,字符串[字符数组]
    7. //2. 提示: 有一个strcmp 函数,判断两个字符串是否相同
    8. // int strcmp(const char *str1, const char *str2) // 返回0 表示相等,非0表示不相等
    9. char name[10] = "";
    10. while( strcmp(name,"exit") != 0) { // exit = > 0 != 0
    11. printf("\n请输入名字");
    12. scanf("%s", name); // 这里不需要 加 &name, 因为 数组的名称就是地址
    13. printf("\n你输入的名字是=%s", name);
    14. }
    15. printf("退出while");
    16. getchar(); //过滤 回车
    17. getchar(); // 暂停控制台
    18. }

    do-while循环控制

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. void main() {
    4. //打印1-100的和
    5. int i = 0;
    6. int j = 100;
    7. int sum = 0;
    8. do {
    9. sum += i;
    10. i++;
    11. } while (i <= j);
    12. printf("1-%d的和为:%d", j, sum);*/
    13. //统计1-200之间能被5整除但不能被3整除的个数
    14. int count = 0;
    15. int j = 200;//区间的最大值
    16. int i = 1;
    17. do {
    18. if (i % 5 == 0 && i % 3 != 0) {
    19. count++;
    20. }
    21. i++;
    22. }while (i <= j);
    23. printf("1-200之间能被5整除但不能被3整除的个数:%d个", count);
    24. //如果老公同意老婆购物,则老婆将一直购物;
    25. //直到老公说不同意为止[printf("老婆问:我可以继续购物吗?y/n")]
    26. char answer = ' ';
    27. do {
    28. printf("老婆问:我可以继续购物吗?(y/n)\t");
    29. scanf("%c", &answer); // 获取用户输入
    30. getchar(); //过滤掉 回车符
    31. } while (answer == 'y');//严格大小写
    32. printf("老婆终于退出购物~~~~");
    33. getchar();
    34. }

    多重循环控制

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. void main() {
    4. //统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
    5. //1. 各个班的平均分
    6. //2. 所有班级的平均分, 得到所有班级的总分 allClassTotalScore
    7. //3. 定义变量表示 班级个数 classNum , 定义变量表示 学生个数 stuNum
    8. //4. 定义变量 classTotalScore 每个班级总分
    9. //5. 定义变量 score , 接收学生成绩
    10. //6. 使用两层for循环
    11. int classNum = 3;
    12. int stuNum = 5;
    13. double score = 0.0;
    14. double classTotalScore = 0.0;
    15. double allClassTotalScore = 0.0;
    16. int count = 0;//每班不及格人数
    17. int count1 = 0;//全部班不及格人数
    18. int i = 0;
    19. int j = 0;
    20. //每次给一个班级输出成绩时,需要清零
    21. classTotalScore = 0.0;
    22. for (int i = 1; i <= classNum; i++) {
    23. count = 0;
    24. for (int j = 1; j <= stuNum; j++) {
    25. printf("请输入第%d个班的第%d个的同学的成绩:", i, j);
    26. scanf("%lf", &score);
    27. if (score < 60) {
    28. count++;
    29. }
    30. classTotalScore += score;
    31. }
    32. count1 += count;
    33. allClassTotalScore += classTotalScore;
    34. printf("第%d个班的总成绩为%.2lf,平均分为%.2lf\n", i, classTotalScore, classTotalScore / stuNum);
    35. printf("第%d个班不及格的人数为%d\n", i, count);
    36. }
    37. printf("全部班级学生的总成绩为%.2lf,平均分数为%.2lf\n", allClassTotalScore, classTotalScore / stuNum * classNum);
    38. printf("全部班不及格的人数为%d",count1);
    39. getchar();
    40. getchar();
    41. }

    跳转控制语句-break

    • break语句用于终止某个语句块的执行,一般使用在switch或者循环中
    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. #include
    6. void main() {
    7. //int i;
    8. //for(i = 0; i < 10; i++) {
    9. // if(i == 3) {
    10. // break; //当执行到break 时,就会退出for循环
    11. // }
    12. // printf("i=%d\n", i); // 0 - 9
    13. //}
    14. //100以内的数求和,求出当和第一次大于20的当前数
    15. /*int i = 1;
    16. int sum = 0;
    17. for (i = 0; i < 100; i++) {
    18. sum += i;
    19. if (sum > 20) {
    20. break;
    21. }
    22. }
    23. printf("i=%d\n", i);*/
    24. //实现登录验证,有三次机会,如果用户名为”张无忌” ,密码”888”提示登录成功,
    25. //否则提示还有几次机会,请使用for 循环完成
    26. //分析
    27. //1. 首先要定义一个变量,保存登录的机会(次数) chance
    28. //2. 定义两个字符数组,接收 用户名和密码
    29. //3. 使用for循环+break , 如果登录成功,就提前退出
    30. //int chance = 3;
    31. //int loginCount = 3;//登录次数
    32. //char name[10] = " ";
    33. //char pwd[10] = "";
    34. //int i;//循环变量
    35. //for (int i = 1; i <= loginCount; i++) {
    36. // printf("请输入用户名:");
    37. // scanf("%s", name);
    38. // printf("请输入密码:");
    39. // scanf("%s", pwd);
    40. // //判断字符串相等使用strcmp
    41. // if (strcmp("张无忌", name) == 0 && strcmp("888", pwd) == 0) {
    42. // printf("\n登陆成功!");
    43. // break;
    44. // }
    45. // else {
    46. // //机会次数-1
    47. // chance--;
    48. // printf("你还有%d次登陆机会\n", chance);
    49. // }
    50. //
    51. //}
    52. //getchar();
    53. //getchar();
    54. //出现随机数97的次数
    55. //int num = rand() % n + a
    56. //a是起始值,n-1+a是终止值,n是整数的范围
    57. //srand((unsigned)time(NULL));
    58. int i;
    59. for (i = 1; i < 1000; i++) {//生成1000个随机数
    60. int num = rand() % 100 + 1;
    61. printf("num=%d\t%d\n", num,i);
    62. if (num == 97) {
    63. break;
    64. }
    65. }
    66. printf("出现随机数97需要的次数为%d", i);
    67. }

    跳转控制语句-continue

    • continue语句用于结束本次循环,继续执行下一次循环
    • continue语句,只能配合使用循环语言使用,不能单独和switch/if使用
    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. void main() {
    4. //从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,
    5. //输入为0时结束程序【使用for循环 ,break, continue完成】 【positive 正数,negative】
    6. //1. 定义变量 positive 保存正数的个数
    7. //2. 定义变量 negative 保存负数的个数
    8. //3. 使用for + break + continue
    9. int positive = 0;
    10. int negative = 0;
    11. int num = 0;//接收从控制台输入的数
    12. for (; ;){//死循环,永远不退出
    13. printf("请输入数字:");
    14. scanf("%d", &num);
    15. if (num == 0) {
    16. break;//跳出for
    17. }
    18. if (num > 0) {
    19. positive++;
    20. continue;
    21. }
    22. negative++;
    23. }
    24. printf("正数有%d个\n",positive);
    25. printf("负数有%d个\n", negative);
    26. getchar();
    27. //某人有100000元, 每经过一次路口,需要交费, 规则如下:
    28. //当现金>50000时,每次交5%
    29. //当现金<=50000时,每次交1000
    30. //编程计算该人可以经过多少次路口,使用 while break方式完成
    31. //小于1000时,就不能再过路口了
    32. double money = 1000;
    33. int count = 0;
    34. while (1) {
    35. if (money < 1000) {
    36. break;
    37. }
    38. if (money > 50000) {
    39. money = money * 0.95;
    40. count++;
    41. continue;
    42. }
    43. else if(money<=50000){
    44. money = money - 1000;
    45. count++;
    46. }
    47. }
    48. printf("该人一共能经过%d次路口.剩余%d元", count,money);
    49. getchar();
    50. }

    跳转控制语句

    • C语言的goto语句可以无条件地转移到程序中指定的行
    • goto语句通常与条件语句配合使用。可以来实现条件转移,跳出循环体等功能
    1. #include
    2. void main() {
    3. //定义标签
    4. printf("start\n");
    5. goto label1;
    6. printf("ok1\n");
    7. printf("ok2\n");
    8. label1://下边就是对label标签的定义
    9. printf("ok3\n");
    10. printf("ok4\n");
    11. getchar();
    12. }

    循环控制练习

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. void main() {
    5. /*int num = 0;
    6. printf("请输入一个整数:");
    7. scanf("%d", &num);
    8. if (num > 0) {
    9. printf("该数大于0");
    10. }
    11. else if (num < 0) {
    12. printf("该数小于0");
    13. }
    14. else {
    15. printf("该数等于0");
    16. }
    17. getchar();*/
    18. //判断一个年份是否是闰年
    19. int year = 0;
    20. printf("请输入一个年份:");
    21. scanf("%d", &year);
    22. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
    23. printf("%d年是闰年", year);
    24. }
    25. else {
    26. printf("%d年是平年", year);
    27. }
    28. getchar();
    29. //判断一个整数是否是水仙花数
    30. int num;
    31. printf("请输入一个整数:");
    32. scanf("%d", &num);
    33. int a = num / 100;//百位
    34. int b = num % 100 / 10;//十位
    35. int c = num % 10;//个位
    36. if (num = a * a * a + b * b * b + c * c * c) {
    37. printf("%d是水仙花数", num);
    38. }
    39. else {
    40. printf("%d不是水仙花数", num);
    41. }
    42. int m = 0, n = 3;
    43. if (m > 0) {
    44. if (n > 2) {
    45. printf("A");
    46. }
    47. else {
    48. printf("B");
    49. }
    50. }
    51. //保存用户名和密码,判断用户名是否为“张三”,密码是否为1234
    52. char name[10] = "";
    53. char pwd[10] = "";
    54. printf("请输入用户名:");
    55. scanf("%s", name);
    56. printf("请输入密码:");
    57. scanf("%s", pwd);
    58. if (strcmp("张三", name) == 0 && strcmp("1234", pwd) == 0) {
    59. printf("登陆成功");
    60. }
    61. else {
    62. printf("登陆失败");
    63. }
    64. //根据输入的月份和年份,求出该月的天数
    65. int year;
    66. int month;
    67. printf("请输入当前的年份:");
    68. scanf("%d", &year);
    69. printf("请输入当前的月份:");
    70. scanf("%d", &month);
    71. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
    72. if (month == 2) {
    73. printf("当前月份为29天");
    74. }
    75. }
    76. else {
    77. if (month == 2) {
    78. printf("当前月份为28天");
    79. }
    80. }
    81. if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
    82. printf("当前月份为31天");
    83. }
    84. if (month == 4 || month == 6 || month == 9 || month == 11) {
    85. printf("当前月份为30天");
    86. }
    87. }

    调和级数相加

    1. //求出1-1/2+……-1/100的和
    2. double sum = 0.0;
    3. int i;
    4. for (i = 1; i <= 100; i++) {
    5. if (i % 2 != 0) {
    6. sum += 1.0 / i;
    7. }
    8. else {
    9. sum -= 1.0 / i;
    10. }
    11. sum += 1.0 / i;
    12. }
    13. printf("调和级数的和为%.6f", sum);
  • 相关阅读:
    在byrut下载过游戏的可能会中挖矿病毒导致常见杀软无法安装
    JAVA知识管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
    【uniapp小程序下载】调用uni.uploadfile方法在调试工具里是没有问题的,但是线上版本和体验版就调用不成功,真机调试也没问题
    Xilinx XC7Z020双核ARM+FPGA开发板试用
    ssm+java+vue基于微信小程序的新生自助报到系统#毕业设计
    Python自学教程2:大牛们怎么写注释
    MYSQL 基本操作 (2)
    【教3妹学算法-每日一题】竞赛题:6171. 和相等的子数组
    【入门Flink】- 05Flink运行时架构以及一些核心概念
    centos7安装mysql8
  • 原文地址:https://blog.csdn.net/qq_47896523/article/details/126237859