PTA-6-2 异常:方程求根

该博客介绍了一个函数,用于求解一次方程和二次方程的实数根。当二次项系数为0、无实数根或存在实数根时,函数会根据情况抛出不同的异常。在给定的测试程序中,通过输入不同的系数值,展示了函数如何处理各种异常情况,并输出相应的结果。异常处理使得代码更健壮,便于问题排查。

本题要求实现一个函数,可以求出一次方程和二次方程的实数根,若怖满足求根的条件则抛出相应的异常并显示。

函数接口定义:

在这里描述函数接口:
void root(double a,double b,double c,double& x1,double& x2);

在这里解释接口参数。其中a,b,c都是用户传入的参数,a为二次项系数,b为一次项系数,c为常数项,x1,x2 为欲求的实数根:

 

裁判测试程序样例:

在这里给出函数被调用进行测试的例子:
#include<iostream>
#include<cmath>
using namespace std;
void root(double a,double b,double c,double& x1,double& x2);

int main()
{
    double a,b,c;
    cin>>a>>b>>c;
    double x1,x2;
    try
    {
        root(a,b,c,x1,x2);
        cout<<"root:x1="<<x1<<",x2="<<x2<<endl;
    }
    catch(int)
    {
        cout<<"Not a equation!"<<endl;
    }
    catch(const char* msg)
    {
        cout<<msg<<endl;
    }
    catch(...)
    {
        cout<<"Other Error!";
    }
    return 0;
}
/* 请在这里填写答案 */

输入样例1:

在这里给出一组输入。例如:

0 0 1

输出样例1:

在这里给出相应的输出。例如:

Not a equation!

输入样例2:

在这里给出一组输入。例如:

3 3 4

输出样例2:

在这里给出相应的输出。例如:

No real root!

输入样例3:

在这里给出一组输入。例如:

1 0 -4

输出样例3:

在这里给出相应的输出。例如:

root:x1=2,x2=-2

 答案代码加注释如下:

void root(double a,double b,double c,double& x1,double& x2)
{
    if(a==0)     //二次项系数为0时的情况
    {
        int a=0;
        throw  a;   
    }
    else if(a!=0&&(b*b-4*a*c)<0)    //二次项系数不为0但是没有根的情况
    {
        const char*msg;
        msg="No real root!";
        throw msg;                 //和异常字符串的处理类似
    }
    else if(a!=0&&(b*b-4*a*c)>0)    //二次项系数不为0且有根的情况
    {
        x1=(-b+sqrt(pow(b,2)-4*a*c))/2*a;  //运用了求根公式,求得正确结果
        x2=(-b-sqrt(pow(b,2)-4*a*c))/2*a;
    }
}
//sqrt是模板库里的开方函数,pow(a,b)表示a的b次方,

其实异常本质上就是事先判断出有哪些情况会出现异常,然后我们针对这些异常提前给出解决方法,这样方便了我们去慢慢寻找出错原因。大家多写多体会即可

### Java 中自定义异常 `OverLoadException` 的实现 在 Java 中,可以通过继承 `Exception` 类来创建自定义异常。以下是基于用户需求设计的一个名为 `OverLoadException` 的自定义异常类的实现: #### 自定义异常类 `OverLoadException` ```java public class OverLoadException extends Exception { private static final long serialVersionUID = 1L; public OverLoadException() { super(); } public OverLoadException(String message) { super(message); } } ``` 此代码片段展示了如何通过扩展 `Exception` 来构建一个简单的自定义异常类[^3]。构造函数允许传递消息参数以便于调试。 #### 使用场景示例 下面是一个完整的例子,展示如何抛出并捕获该自定义异常: ```java public class LoadManager { private int maxLoad; private int currentLoad; public LoadManager(int maxLoad) { this.maxLoad = maxLoad; this.currentLoad = 0; } public void addLoad(int additionalLoad) throws OverLoadException { if (currentLoad + additionalLoad > maxLoad) { throw new OverLoadException("Exceeded maximum load capacity of " + maxLoad); } else { currentLoad += additionalLoad; System.out.println("Added load successfully. Current load is now: " + currentLoad); } } public static void main(String[] args) { LoadManager manager = new LoadManager(10); try { manager.addLoad(5); // 正常加载 manager.addLoad(7); // 超载情况 } catch (OverLoadException e) { System.err.println(e.getMessage()); } } } ``` 在此程序中,当尝试向负载管理器添加超出其容量范围的额外负载时,会触发 `OverLoadException` 并打印相应的错误信息[^4]。 #### 关键点解析 - **序列化版本 UID**: 定义了一个静态最终变量 `serialVersionUID`,这是为了确保对象能够被正确地反序列化。 - **无参与带参构造方法**: 提供两种不同的构造方式以满足不同调用者的需求。 - **逻辑控制中的异常处理**: 在业务逻辑里合理判断条件,在不满足预期的情况下主动抛出自定义异常---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值