目录
一.单分支和双分支
(代码)绝对值
任务描述
输入一个整数,编程输出其绝对值。
解法1:条件运算符
#include<stdio.h>
int main()
{
int i;
scanf("%d",&i);
if (i >= 0)
{
printf("%d", i);
}
if (i < 0)
{
printf("%d", -i);
}
return 0;
}
代码分析
输出一个整数的绝对值,正象京剧《双阳公主》中“路现双岔”一样,需要判别区分两种情况。若为非负数(i>=0),输出i本身,否则输出i的相反数。以上代码利用条件运算符实现在两个表达式中选一个输出,这对于小白弟弟来说,一定是非常熟悉的了吧。其实,C语言为我们提供专门的选择结构语句来完成类似的工作,让我们先来了解一下if语句吧。
相关知识 if语句
1.双分支if选择结构
双分支if语句的一般形式是: if(表达式) 分支语句1; else 分支语句2;(1)if和else后面各有一个分支,每个分支只能是一个语句。如果想在某个分支中执行多个语句,必须用大括号{}将这些语句括起来,构成一个复合语句(也称为分程序)。(2)若表达式的值为真(非0),则执行分支语句1;若表达式的值为假(0),则执行分支语句2。当有一个分支被执行时,另一个分支就不再被执行。(3)if语句从整体上看是一个语句。
2.单分支if选择结构
单分支if选择结构的一般形式为: if(表达式) 分支语句;如果括号中表达式的值为真(非0),那么就执行分支语句,否则不执行。
解法2:单分支if语句
#include<stdio.h>
int main()
{
int i;
scanf("%d",&i);
if (i >= 0)
{
printf("%d", i);
}
if (i < 0)
{
printf("%d", -i);
}
return 0;
}
代码分析
代码中包含两个单分支if语句。第一个if语句:如果i>=0成立,输出i;第二个if语句:如果i<0成立,输出-i。请注意两个if语句的条件判断要覆盖所有情况并且没有交叉,这样不管输入什么数据,两个if语句中的条件有且只有一个是真的。请小白弟弟思考:如果两个if语句的条件中都包含等于,程序会是什么结果?如果都不包含呢?请到Dev-C++中执行并在PTA平台提交试一试。
解法3:单分支if语句
#include<stdio.h>
int main()
{
int i;
scanf("%d", &i);
if (i < 0) i = 0 - i;
{
printf("%d", i);
}
return 0;
}
解法4:双分支if语句
#include<stdio.h>
int main()
{
int i;
scanf("%d", &i);
if (i >= 0)
{
printf("%d", i);
}
else
{
printf("%d", -i);
}
return 0;
}
代码分析
代码中使用了一个双分支if语句,执行逻辑更加清晰:如果i>=0,那么就输出i,否则就输出-i。请思考:如果if语句的条件改成“<=”,程序还需要如何修改才能正确。
解法5:双分支if语句
#include<stdio.h>
int main()
{
int i, k;
scanf("%d", &i);
if (i >= 0)
{
k = i;
}
else
{
k = -i;
}
printf("%d", k);
return 0;
}
代码分析
代码中使用额外的一个变量k记录i的绝对值,双分支if语句的执行逻辑是:如果i>=0,那么就将i赋值给k,否则就将-i赋值给k。程序最后输出k的值。
二.多分支
①(代码)整数符号
任务描述
输入一个整数,请输出它的符号(正数输出+,负数输出-,零输出0)。
解法1:单分支if语句
#include<stdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a > 0)
{
printf("+");
}
if (a == 0)
{
printf("0");
}
if (a < 0)
{
printf("-");
}
return 0;
}
代码分析
不难看出,这是一个典型的三分支选择问题。所以,代码使用三个单分支if语句解决问题。三个if语句彼此独立,无从属关系,三个条件判别表达式要覆盖所有情况而且没有交叉。从此代码可以看出,多分支问题可以使用多个单分支解决,每个分支严格判别一种情况,所有的单分支中的条件判别要覆盖所有情况而且不能有交叉。但是对于复杂问题,精确判别每种情况会有困难,我们可以先把多分支问题看成双分支,然后再在某个分支中继续用双分支。
解法2:if语句的嵌套
#include<stdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a > 0)
{
printf("+");
}
else
{
if (a == 0)
{
printf("0");
}
else
{
printf("-");
}
}
return 0;
}
代码分析
这段代码是典型的if语句的嵌套形式,整体上是一个双分支if结构,如果a>0成立,那么输出“+”,否则进入else分支;在外层的else分支中,包含另一个双分支if结构,如果a==0成立,输出“0”,否则输出“-”。小白弟弟请思考:你还能写出其它的嵌套形式吗?
相关知识 多分支if选择结构
从整体上看,这是一个多分支选择结构,是一个语句。从上至下考察括号内的表达式,当某个表达式的值为真时,执行其对应的分支语句,其它分支就都不执行。若所有表达式的值均为假,则执行最后一个else分支的分支语句。也可以不加最后的else分支。
解法3:多分支if语句
#include<stdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a > 0)
{
printf("+");
}
else if (a == 0)
{
printf("0");
}
else
{
printf("-");
}
return 0;
}
代码分析
这段代码是典型的多分支if语句的形式,整体上是一个语句。如果a>0成立,那么输出“+”,否则如果a==0成立,那么输出“0”,否则输出“-”。
②(代码)一元二次方程的根(不考虑复根和考虑复根)
不考虑复根的代码
任务描述
编程输出一元二次方程ax2+bx+c=0 的根。已知系数a,b,c(实数)的值,要求按不同情况输出方程的两个不同的实根、两个相同的实根和方程没有实根的情形。
输入格式:
三个系数a,b,c的值。
#include<math.h>
int main()
{
double a, b, c, deta, x1, x2;
scanf("%lf %lf %lf", &a, &b, &c);
deta = b * b - 4 * a * c;
if (deta > 0)
{
x1 = (-b + sqrt(deta)) / (2 * a);
x2 = (-b - sqrt(deta)) / (2 * a);
printf("x1=%lf\n", x1);
printf("x2=%lf\n", x2);
}
else if (deta == 0)
{
printf("x1=x2=%lf", (-b) / (2 * a));
}
else
{
printf("This equation has no real root!");
}
return 0;
}
考虑复根的代码
共轭复根是一对特殊根。指多项式或代数方程的一类成对出现的根。若非实复数α是实系数n次方程f(x)=0的根,则其共轭复数α*也是方程f(x)=0的根,且α与α*的重数相同,则称α与α*是该方程的一对共轭复(虚)根。
共轭复根经常出现于一元二次方程中,若用公式法解得根的判别式小于零,则该方程的根为一对共轭复根。
输入样例:
1 -5 6
输出样例:
x1=3.000000,x2=2.000000
输入样例:
1 1 9
输出样例:
x1=-0.500000+2.958040i
x2=-0.500000-2.958040i
#include<stdio.h>
#include<math.h>
int main()
{
double a, b, c, deta, x1, x2, p, q;
scanf("%lf%lf%lf", &a, &b, &c); //输入一元二次方程的系数a,b,c
deta = b * b - 4 * a * c; //求出deta的值
if (deta == 0.0)
{
printf("x1=x2=%lf", -b / (2 * a));//输出两个相等的实根
}
else if (deta > 0)
{
x1 = (-b + sqrt(deta)) / (2 * a); //求出两个不相等的实根
x2 = (-b - sqrt(deta)) / (2 * a);
printf("x1=%lf,x2=%lf", x1, x2);
}
else
{ //deta<0
p = -b / (2 * a); //求出两个共轭复根的实部
q = sqrt(fabs(deta)) / (2 * a); //求出两个共轭复根的虚部
//fabs()函数是返回某一个值的绝对值的一个函数 例如,fabs(x)就是返回x的绝对值
printf("x1=%lf+%lfi\n", p, q);//输出两个复根
printf("x2=%lf-%lfi", p, q);
}
return 0;
}
③(代码)判断三角形
任务描述
输入三条线段的长度(整型),根据是否能组成三角形,输出以下结果之一:锐角三角形、直角三解形、钝角三角形、不能构成三角形。
输出格式:
锐角三角形输出:Acute triangle
直角三解形输出:Right triangle
钝角三角形输出:Obtuse triangle
不能构成三角形输出:Not triangle
#include<stdio.h>
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (a + b > c && a + c > b && b + c > a) //是三角形的条件
{
if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
{
printf("Right triangle");
}
else if (a * a + b * b > c * c && a * a + c * c > b * b && b * b + c * c > a * a) //根据余弦定理,此时三个余弦值都为整数
{
printf("Acute triangle"); //三个角都是锐角
}
else
{
printf("Obtuse triangle");
}
}
else
{
printf("Not triangle");
}
return 0;
}