第五章 选择控制结构
5.1 生活中与计算机中的问题求解方法
1 分治策略是指将原始问题逐步分解为一些易于解决的子问题,然后再将子问题逐个击破。
2 预定义的指令集就是所谓的计算机程序。
3 机器语言是计算机能理解的语言,由一系列二进制0和1组成,程序设计语言是由计算机指令表示的特殊语言,属于高级语言。
4 由高级语言形式转换成机器语言形式需要由编译器完成。
5.2 算法的概念及其描述方法
1 算法是为解决以一个具体问题二采取的确定、有限、可执行的操作步骤。
2 对于面向过程的语言,有以下公式成立:
数据结构+算法=程序
3 数据结构是计算机存储、组织数据的方式。算法是对操作步骤的描述。
4 算法可以分为数值算法和非数值算法。
5 算法的五大基本特性:有穷性、确定性、有效性(可行性)、一个或多个输出、没有或多个输入。
6 算法的描述方法有:自然语言描述、流程图描述、NS结构化流程图描述、伪码描述。
5.3 关系运算符与关系表达式
1C语言的三大程序结构为:选择、控制、循环(6章详解)。
2 顺序结构只能自顶向下,按代码书写先后顺序执行。如,赋值和数据的输入输出,都主要由表达式语句组成。
3 选择结构(分支控制结构)适合需要分情况处理的问题,需要涉及到条件判断。
4 简单的判断条件可以用关系表达式来表示,复杂的判断条件可以用逻辑表达式来表示。
5常用的关系运算符:
6 语法错误会导致编译错误,判断条件不正确会导致运行时错误。
7 条件判断的结果只有“真”和“假”两种可能,C语言中,用非0值(包括负数)表示真,0值表示假。
8 所有关系运算符优先级低于所有算术运算符。
5.4 用于单分支控制的条件语句
1 选择结构可分为单分支、双分支和多分支选择结构。
2 if语句可实现单分支选择结构:
If(表达式) 语句
表示如果表达式为真,则执行该语句。
代码5.1见文末
5.5 用于双分支控制的条件语句
1 if-else语句可以用于解决双分支选择问题,一般形式为:
If(表达式) 语句1
else 语句2
表示如果表达式为真,则执行语句1;表达式为假,则执行语句2。
代码5.2见文末
5.6 条件运算符和条件表达式
1 条件运算符是C语言中唯一一个三元运算符,需要三个操作数,一般形式为:
表达式1?表达式2:表达式3
表示如果表达式1为真,则该条件表达式的值是表达式2的值,否则是表达式3的值。
代码5.3见文末
5.7 用于多分支控制的条件语句
1 else-if语句可以解决多分支选择问题,一般形式为:
if(表达式1) 语句1
else if(表达式2) 语句2
……
else if(表达式m) 语句m
else 语句m+1
表示表达式几为真,就执行表达式几,如果前面几条语句都不为真,则执行else下的语句。
2 条件语句在语法上只允许执行一条语句,因此如果处理的问题需要多个语句才能解决,可以用花括号将所有语句括起来,形成复合语句,一个复合语句是一个逻辑整体。
例5.4见文末
3 函数exit()的作用是终止整个程序的执行,强制放回操作系统。exit(0)表示程序正常结束,使用该函数需要包含头文件<stdlib.h>。
4 浮点数并且真正意义上的实数,而是在某些范围内的近似。因此只能用近似的方法将实数与0比较。
5.8 用于多路选择的switch语句
1 开关语句可以代替条件语句来简化程序,适用于需要讨论的情况较多的问题,一般形式为:
switch(表达式)
{
case 常量1: 可执行语句序列1
case 常量2: 可执行语句序列2
……
case 常量n: 可执行语句序列n
default: 可执行语句序列n+1
}
2 用break语句可以跳出switch结构,若case后的语句省略不写,则表示当前case与后续case执行相同语句。
5.9 逻辑运算符和逻辑表达式
1 数学上正确的表达式在C语言的逻辑中不一定正确,表达一些复杂的逻辑关系常常会用到逻辑运算符。
2 逻辑运算符优先级从高到低为:!(逻辑非); &&(逻辑与); ||(逻辑或)。
3 逻辑运算符连接操作数形成逻辑表达式,逻辑表达式的运算结果只有真和假两个值。
4 逻辑与运算的特点是两个操作数都为真,运算结果才为真,只要有一个为假,运算结果就为假。(有假则假)
5 逻辑或运算的特点是两个操作数只要有一个为真,运算结果就为真。(有真则真)
6 逻辑非运算的特点是总与操作数的值相反。
7 学习了这么多运算符,他们的优先级必需牢记,优先级从高到低为:一元运算符、算术运算符、关系运算符、逻辑运算符、赋值运算符。(一算关逻富:一个算命的关注了一个姓罗的富豪)
8 适当的时候可以用圆括号使表达式更加清晰。
9 运算符&&和||具有“短路特性”,即含有这两个运算符的表达式,如果通过左边已经能得出表达式结果,右边则不会被计算。
代码
5.1
//5.1 使用单分支的条件语句编程,计算并输出两个整数的最大值
#include<stdio.h>
int main(void)
{
int a,b,max;
printf("Input a,b:");//提醒用户输入
scanf("%d,%d",&a,&b);//用户输入,注意输入时中间用逗号隔开
if(a>b)//此处无符号
max=a;// if到这是一条语句
if(a<=b)//无符号
max=b;
printf("%d",max);
return 0;
}
5.2
//5.2使用双分支条件语句编程,计算并输出两个整数的最大值
#include<stdio.h>
int main(void)
{
int a,b,max;
printf("Input a,b:");//提醒用户输入
scanf("%d,%d",&a,&b);//用户输入
if(a>b)
max=a;// 如果a>b,则把a的值赋值给maxb变量
else //这里同样无符号
max=b;//否则,把b的值赋值给max变量
printf("%d",max);
return 0;
}
5.3
//5.3使用条件运算符编程,计算并输出两个整数的最大值
#include<stdio.h>
int main(void)
{
int a,b,max;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
max=a>b?a:b;//表达式1为a>b,当a>b为真时,条件表达式的值为a,否则为b,最后把条件表达式的结果赋值给max
printf("%d",max);
return 0;
}
5.4
/*5.4 从键盘上任意输入a,b,c的值,编程计算并输出一元二次方程的根,当a等于0时,输出“该方程
不是一元二次方程”,当a不等于0时,根据判别式,分情况计算并且输出方程的根。
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define EPS 1e-6
int main(void)
{
float a,b,c,disc,p,q;//disc是判别式
printf("Please enter the coefficients a,b,c;");
scanf("%f,%f,%f",&a,&b,&c);
if(fabs(a)<=EPS)//通过近似原理,将浮点数与0比较,此时无根
{
printf("It is not a quadratic equation!\n");
exit(0);//程序正常结束
} //这是情况一
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(fabs(disc))/(2*a);
if(fabs(disc)<=EPS)//此时有两相等实根
{
printf("x1=x2=%.2f\n",p);
}//这是情况二
else//根据就近未匹配原则,这个else对于的是情况二的if
{
//在该else下嵌套了一个if-else语句
if(disc>EPS)
{
printf("x1=%.2f,x2=%.2f\n",p+q,p-q);
}//这是情况三下的第一种情况,此时有两不等实根
else{
printf("x1=%.2f+%.2fi,",p,q);
printf("x1=%.2f-%.2fi\n",p,q);
}//是情况三下的第二种情况,此时有两共轭复根
}//这是总的情况三
return 0;
}
5.5
//例5.5 用switch编程实现简单的计算器功能
#include<stdio.h>
int main(void)
{
int data1,data2;
char op;
printf("Please enter an expression:");
scanf("%d%c%d",&data1,&op,&data2);
switch(op)//op为字符型
{
case'+'://因此case后也跟字符型
printf("%d+%d=%d\n",data1,data2,data1+data2);
break;//遇到break,跳出switch
case'-':
printf("%d-%d=%d\n",data1,data2,data1-data2);
break;
case'*':
printf("%d*%d=%d\n",data1,data2,data1*data2);
break;
case'/':
if(0==data2)//把0放在前面是为了防止不小心写成=,变成赋值运算
printf("Division by zero!\n");//除数不能为0
else
printf("%d/%d=%d\n",data1,data2,data1/data2);
break;
default://赋值输入其他非法字符
printf("Invalid operator!\n");
}
return 0;
}