第五章 选择控制结构

分治策略:任务分解细化

程序设计语言:为了让计算机执行由高级语言编写的程序指令,必须把这些指令从高级语言形式转换成计算机能理解的机器语言形式,这种转换是由编译器来完成的

算法:为解决一个具体问题而采取的确定、有限、有序、可执行的操作步骤

数据结构+算法=程序(这个公式仅对面向过程的语言成立)

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合

算法是对操作或行为的描述,算法代表着用系统的方法描述解决问题的策略

算法的描述方式:

  1. 自然语言描述(通俗易懂;冗长,不易直接转化为程序)
  2. 流程图描述(形象直观、一目了然,易于理解和发现程序中存在的错误;所占篇幅较大)
  3. NS结构化流程图描述
  4. 伪码描述

关系运算符

  • <
  • >
  • <=
  • >=
  • ==
  • !=

注意:==是比较,=是赋值,将“==”误写为“=”在C语言语法上是允许的,不会提示错误,但将导致错误的运行结果

条件表达式:用非0值表示“真”,用0值表示“假”

//L5-1(单分支控制)

  1. #include <stdio.h>
  2. main()
  3. {
  4. int a, b, max;
  5. printf("Input a, b:");
  6. scanf("%d,%d", &a, &b);
  7. if (a > b) max = a;
  8. if (a <= b) max = b;
  9. printf("max = %d\n", max);
  10. }
  1. //运行结果
  2. Input a, b:3,5
  3. max = 5

//L5-2(双分支控制)

  1. #include <stdio.h>
  2. main()
  3. {
  4. int a, b, max;
  5. printf("Input a, b:");
  6. scanf("%d,%d", &a, &b);
  7. if (a > b) max = a;
  8. else max = b; /* 相当于a<=b的情况 */
  9. printf("max = %d\n", max);
  10. }

//L5-3(条件运算符)

  1. #include <stdio.h>
  2. main()
  3. {
  4. int a, b, max;
  5. printf("Input a, b:");
  6. scanf("%d,%d", &a, &b);
  7. max = a > b ? a : b;/* 用条件表达式计算两整数的最大值*/
  8. printf("max = %d\n", max);
  9. }

用一对花括号将一组逻辑相关的语句括起来,称为复合语句(类似于Verilog中的begin end)

//L5-4

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define EPS 1e-6
  5. main()
  6. {
  7. float a, b, c, disc, p, q;
  8. printf("Please enter the coefficients a,b,c:");
  9. scanf("%f,%f,%f", &a, &b, &c);
  10. if (fabs(a) <= EPS) /* a=0时,输出"不是二次方程" */
  11. //浮点数并非真正意义上的实数,只是其在某种范围内的近似,因此也就只能用近似的方法将实数与0进行比较
  12. {
  13. printf("It is not a quadratic equation!\n");
  14. exit();//exit是C语言提供的标准库函数,作用是终止整个程序的执行,强制返回操作系统
  15. //调用函数exit()需要在程序开头包含头文件<stdlib.h>
  16. }
  17. disc = b * b - * a * c; /* 计算判别式 */
  18. p = - b / ( * a);
  19. q = sqrt(fabs(disc)) / ( * a);
  20. if (fabs(disc) <= EPS) /* 判别式等于0时,输出两相等实根 */
  21. {
  22. printf("x1 = x2 = %.2f\n", p);
  23. }
  24. else
  25. {
  26. if (disc > EPS) /* 判别式大于0时,输出两不等实根 */
  27. {
  28. printf("x1 = %.2f, x2 = %.2f\n", p+q, p-q);
  29. }
  30. else /* 判别式小于0时,输出两共轭复根 */
  31. {
  32. printf("x1 = %.2f+%.2fi, ", p, q);
  33. printf("x2 = %.2f-%.2fi\n", p, q);
  34. }
  35. }
  36. }

用于多路选择的switch语句(类似于Verilog中的case语句)

//L5-5

  1. #include <stdio.h>
  2. main()
  3. {
  4. int data1, data2;
  5. char op;
  6. printf("Please enter an expression:");
  7. scanf("%d%c%d", &data1, &op, &data2); /* 输入运算表达式 */
  8. switch (op) /* 根据输入的运算符确定执行的运算 */
  9. {
  10. case '+': /* 加法运算 */
  11. printf("%d + %d = %d \n", data1, data2, data1 + data2);
  12. break;//只有switch语句和break语句配合使用,才能形成真正意义上的多分支
  13. case '-': /* 减法运算 */
  14. printf("%d - %d = %d \n", data1, data2, data1 - data2);
  15. break;
  16. case '*': /* 乘法运算 */
  17. printf("%d * %d = %d \n", data1, data2, data1 * data2);
  18. break;
  19. case '/': /* 除法运算 */
  20. if ( == data2) /* 为避免除0错误,检验除数是否为0 */
  21. printf("Division by zero!\n");
  22. else
  23. printf("%d / %d = %d \n", data1, data2, data1 / data2);
  24. break;
  25. default: /* 处理非法运算符 */
  26. printf("Invalid operator! \n");
  27. }
  28. }

每个case后常量的次序发生改变时,不影响程序的运行结果,但不能有重复的case出现

从执行效率角度考虑,一般将发生频率高的情况放在前面

//L5-6

  1. #include <math.h>
  2. #include <stdio.h>
  3. main()
  4. {
  5. float data1, data2;
  6. char op;
  7. printf("Please enter the expression:\n");
  8. scanf("%f %c%f", &data1, &op, &data2); /* %c前有一个空格 */
  9. switch (op)
  10. {
  11. case '+':
  12. printf("%f + %f = %f \n", data1, data2, data1 + data2);
  13. break;
  14. case '-':
  15. printf("%f - %f = %f \n", data1, data2, data1 - data2);
  16. break;
  17. case '*':
  18. case 'x':
  19. case 'X':
  20. printf("%f * %f = %f \n", data1, data2, data1 * data2);
  21. break;
  22. case '/':
  23. if (fabs(data2) <= 1e-) /* 实数与0比较 */
  24. printf("Division by zero!\n");
  25. else
  26. printf("%f / %f = %f \n", data1, data2, data1 / data2);
  27. break;
  28. default:
  29. printf("Invalid operator! \n");
  30. }
  31. }

逻辑运算符

  • !:逻辑非
  • &&:逻辑与
  • ||:逻辑或

运算符&&和||都具有“短路”特性

程序测试:

  • 程序测试是确保程序质量的一种有效手段
  • 穷尽测试、抽样检查
  • 程序测试只能证明程序有错,而不能证明程序无错
  • 程序测试的目的是为了尽可能多的发现程序中的错误

测试用例:

  • 白盒测试(结构测试):测试程序的内部结构已知,按程序的内部逻辑设计测试用例
  • 黑盒测试(功能测试):不考虑程序内部的逻辑结构和处理过程,只检查程序的功能是否符合它的功能说明
  • 结合使用:选择有限数量的重要路径进行白盒测试,对重要的功能需求进行黑盒测试

//L5-7

  1. #include <stdio.h>
  2. #include <math.h>
  3. #define EPS 1e-1
  4. main()
  5. {
  6. float a, b, c;
  7. int flag = ;
  8. printf("Input a,b,c:");
  9. scanf("%f,%f,%f", &a, &b, &c);
  10. if (a+b>c && b+c>a && a+c>b)
  11. {
  12. if (fabs(a-b)<=EPS && fabs(b-c)<=EPS && fabs(c-a)<=EPS)
  13. {
  14. printf("等边"); /* 等边 */
  15. flag = ; /* 置标志变量flag为0值 */
  16. }
  17. else if (fabs(a-b)<=EPS || fabs(b-c)<=EPS|| fabs(c-a)<=EPS)
  18. {
  19. printf("等腰"); /* 等腰 */
  20. flag = ; /* 置标志变量flag为0值 */
  21. }
  22. if (fabs(a*a+b*b-c*c)<=EPS || fabs(a*a+c*c-b*b)<=EPS
  23. || fabs(c*c+b*b-a*a)<=EPS)
  24. {
  25. printf("直角");
  26. flag = ;
  27. }
  28. if (flag)
  29. {
  30. printf("一般");
  31. }
  32. printf("三角形\n");
  33. }
  34. else
  35. {
  36. printf("不是三角形\n");
  37. }
  38. }
  1. //测试结果
  2. Input a,b,c:3,4,5
  3. 直角三角形
  4. Input a,b,c:4,4,5
  5. 等腰三角形
  6. Input a,b,c:,3,4,6
  7. 不是三角形
  8. Input a,b,c:349
  9. 不是三角形
  10. Input a,b,c:10,10,14.14
  11. 等腰直角三角形
  12. Input a,b,c:4,4,4
  13. 等边三角形

边界测试:

在选用测试用例时,不仅要选用合理的输入数据,还应选用不合理的以及某些特殊的输入数据或者临界的点,对程序进行测试,称为边界测试

//L5-8

  1. #include <stdio.h>
  2. main()
  3. {
  4. int score, mark;
  5. printf("Please enter score:");
  6. scanf("%d", &score);
  7. if (score< || score>)
  8. {
  9. mark = -;
  10. }
  11. else
  12. {
  13. mark = score / ;
  14. }
  15. switch (mark)
  16. {
  17. case :
  18. case :
  19. printf("%d--A\n", score);
  20. break;
  21. case :
  22. printf("%d--B\n", score);
  23. break;
  24. case :
  25. printf("%d--C\n", score);
  26. break;
  27. case :
  28. printf("%d--D\n", score);
  29. break;
  30. case :
  31. case :
  32. case :
  33. case :
  34. case :
  35. case :
  36. printf("%d--E\n", score);
  37. break;
  38. default:
  39. printf("Input error!\n");
  40. }
  41. }

//5-9

  1. #include <stdio.h>
  2. main()
  3. {
  4. int a, b, max;
  5. printf("Input a, b:");
  6. scanf("%d,%d", &a, &b);
  7. max = a > b ? a : b;
  8. printf("max = %d\n", max);
  9. }

//5-10

  1. #include <stdio.h>
  2. main()
  3. {
  4. int a, b, max, ret;
  5. printf("Input a, b:");
  6. ret = scanf("%d,%d",&a, &b); /* 记录scanf函数的返回值 */
  7. if (ret != ) /* 根据scanf函数返回值,判断输入数据个数或者格式是否错误 */
  8. {
  9. printf("Input data quantity or format error!\n");
  10. while(getchar() != '\n'); /* 清除输入缓冲区中的错误数据 */
  11. }
  12. else /* 此处可以是正确读入数据后应该执行的操作 */
  13. {
  14. max = a > b ? a : b;
  15. printf("max = %d\n", max);
  16. }
  17. }

虽然函数scanf()不进行参数类型匹配检查,但是通过检验scanf()的返回值是否为应读入的数据项数,可以判断输入的数据项数和格式(包括输入格式错误、存在非法字符、无数据可读等)是否正确

位运算符:

  • 位运算就是对字节或字内的二进制数位进行测试、抽取、设置或移位等操作
  • 其操作对象不能是float、double、long double等其他数据类型,只能是char和int类型
  • ~:按位取反
  • <<,>>:左移位、右移位(无论是左移位还是右移位,从一端移走的位不移入另一端,移出的位的信息都丢失了)
  1. 算术移位
  2. 逻辑移位
  • &:按位与,可用于对字节中的某位清零
  • ^:按位异或,可用于对字节中的某位置1
  • |:按位或

注意:按位取反是用补码进行计算的。

如12为0000000000001100,取反得到补码1111111111110011,反码为1111111111110010,原码为1000000000001101,即为-13

//L5-11

  1. #include <stdio.h>
  2. main()
  3. {
  4. int x=12, y=8;
  5. printf("\n%5d%5d%5d", !x, x||y, x&&y);
  6. printf("\n%5u%5d%5d", ~x, x|y, x&y);
  7. printf("\n%5d%5d%5d\n", ~x, x|y, x&y);
  8. }
  1. //运行结果
  2. 0 1 1
  3. 4294967283 12 8
  4. -13 12 8

 
 
 
 
 

C语言程序设计(五) 选择控制结构的更多相关文章

  1. 160809208沈昊辰c语言程序设计实验选择结构设计

    <C语言程序设计>实验报告 学 号 160809208 姓 名 沈昊辰 专业.班 计科16-2班 学    期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C区二层机房 ...

  2. C语言程序设计入门学习五步曲(转发)

    笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...

  3. 160809209_李梦鑫_C语言程序设计实验2+选择结构程序设计_进阶

    <C语言程序设计>实验报告 学 号 160809209 姓 名 李梦鑫 专业.班 计科16-2班 学    期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C05 机 ...

  4. 《C语言程序设计教程》学习笔记

    <C语言程序设计教程>--朱鸣华.刘旭麟等 第一章 C语言概述 1.C语言的特点: 1)兼具高级.低级语言的双重能力(C语言允许直接访问物理地址,能够进行位操作,能实现汇编语言的大部分功能 ...

  5. C语言程序设计第4堂作业

    大家注意:本次作业稍有增加,由于放假期间大家空闲时间比较充足,将之前学习过程中遗留的问题必须在假期解决.   本次课学习主要内容: 分支结构中的二分支结构.多分支结构和else-if语句 掌握字符型数 ...

  6. 《C语言程序设计》编程总结汇总

    <C语言程序设计>编程总结汇总 院系: 专业年级: 班级名称: 学号: 姓名: 指导教师: 完成时间: 自我评价: 计算机科学与技术专业教研室 2018 年秋季学期 第四周编程总结 题目4 ...

  7. C语言程序设计50例(经典收藏)

    本篇文章是对C语言程序设计的50个小案例进行了详细的分析介绍,需要的朋友参考下 [程序1]题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十 ...

  8. 《C语言程序设计(第四版)》阅读心得(一)

    本篇开始写我个人觉得谭浩强老师的<C语言程序设计(第四版)>中之前没有认识到,或者忘了的知识.因为本科学过,所以有些简单的东西就没有放进来了,所以可能并不是太全面. 第一章程序设计与语言 ...

  9. 2019年春季学期《C语言程序设计II》课程总结

    2019年春季学期<C语言程序设计II>课程总结 1.课程情况 教学内容 课堂小结 作业安排 优秀作业 备注 1.开学谈心 2.测验数据类型.运算符与表达式的自学情况,并讲解测验题目3.第 ...

随机推荐

  1. 常用的SQL优化

    转自:https://www.cnblogs.com/Cheney222/articles/5876382.html 一.优化 SQL 语句的一般步骤 1 通过 show status 命令了解各种 ...

  2. [LC] 28. Implement strStr()

    Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...

  3. nodejs 模块变量 应用

    exports.allcodeandname=(function(){ var fs = require('fs'); var data = fs.readFileSync(__dirname+'/a ...

  4. Warning: $HADOOP_HOME is deprecated. hadoop解决方法补充版

    下面的解决方案我亲自试了没有问题:可行,但是对于初学者来说肯定会有一个疑问:这个.bash_profile文件到底在哪呢:其实很简单: 当前用户的.bash_profile在/home/用户/下,系统 ...

  5. 20180105关于课题所用的labview的改进随笔

    在原有的工程上1.写入60个不同的数字~顶层,看测量次数是1.2.3.4.5.6.7.8.9的时候文件记到几次的数,一次的话,从接受命令到全部写到文件最短需要等多久.写入固定的数,通过startfla ...

  6. 求最长公共子序列-DP问题

    Longest common subsequence problem The longest common subsequence (LCS) problem is the problem of fi ...

  7. Flask向模板中JS传值简便方式

    后台传值: return render_template('statistics/numberofuserlogin/login_number.html', result_json = json.du ...

  8. jmeter+ant+jenkins 接口自动化测试持续集成(送源码)

     9.1  安装和介绍 JMeter 安装文件路径:https://pan.baidu.com/s/1kVJdnuv. JMeter 是轻量级的开源且稳定的自动化测试工具. 思路:在接口说明文档中整理 ...

  9. jquery和zepto的异同

    相同点 相同点: zepto: 是jquery 的 阉割版 是为移动端开发的库 jQuery的轻量级替代品.文件大小比较小 只有8k左右 ,是目前功能库中最小的一个,尽管不大,zepto 所提供的工具 ...

  10. json_encode在设计api时需要注意的问题

    1. 在设计api时我们经常会使用关联数组,例如:我要返回给客户端主题信息和主题包列表 原始数组格式 $arr = array( 100=>array('themeName'=>'a',' ...