绝对零基础的C语言科班作业⑤选择结构(一元二次方程和判断三角形)

目录

一.单分支和双分支

(代码)绝对值

解法1:条件运算符

相关知识 if语句

解法2:单分支if语句

解法3:单分支if语句

解法4:双分支if语句

解法5:双分支if语句

二.多分支

①(代码)整数符号

解法1:单分支if语句

解法2:if语句的嵌套

相关知识 多分支if选择结构

解法3:多分支if语句

②(代码)一元二次方程的根(不考虑复根和考虑复根)

③(代码)判断三角形


一.单分支和双分支

(代码)绝对值

任务描述

输入一个整数,编程输出其绝对值。

解法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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值