描述
编写一个程序,实现求解形如ax^2 + bx + c = 0的二次方程的根。要求使用三个函数分别计算b^2 - 4ac大于0、等于0和小于0时的根,并在主函数中输出结果。
输入
输入三个浮点数a、b和c,分别表示二次方程的系数。
输出
输出二次方程的根,格式为两个浮点数,用空格隔开。
输入样例 1
5 -4 -1
输出样例 1
x1=1.000 x2=-0.200
#include
#include //需要用到sqrt函数
#include //需要用到保留几位小数当中
#include //需要用到pair
using namespace std;
pair dayu(float a, float b, float c)
{
float t = sqrt(b * b - 4 * a * c);
float x1, x2;
x1 = (-b + t) / (2 * a);
x2 = (-b - t) / (2 * a);
pairresult;
result = make_pair(x1, x2);
return result; //此处需要返回两个值
}
float dengyu(float a, float b, float c)
{
float x1, x2;
x1 = x2 = (-b) / (2 * a);
return x1;
}
float xiaoyu(float, float, float)
{
return 0;
}
int main()
{
float a, b, c;
cin >> a >> b >> c;
float t = b * b - 4 * a * c;
float x1, x2;
if (t > 0)
{
pair result = dayu(a, b, c);
cout << fixed << setprecision(3) << "x1=" << result.first;
cout << " ";
cout << fixed << setprecision(3) << "x2=" << result.second;
}
else if (t == 0)
{
x1 = x2 = dengyu(a, b, c);
cout << fixed << setprecision(3) << "x1=" << x1 << " x2=" << x2;
}
else
{
xiaoyu(a, b, c);
cout << "此方程无解!";
}
return 0;
}
问题点:
目录
①:函数模版
②:函数的重载
③:pair的用法
1)C++中的pair是一个模板类,用于存储两个不同类型的值。它将两个值组合在一起,可以用来表示一个键值对或者简单的有序组。
2)pair 实际上可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下:
3)pair 中只有两个元素,分别是 first 和 second ,只需要按正常结构体的方式去访问即可。
④:“std::”是什么?
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。
凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。
#include
using namespace std;
template
//模板声明,其中的T为类型参数 T max(T a,T b,T c)
{
if(b>a) a=b;
if(c>a) a=c;
return 0;
}
int main( )
{
int i1=1,i2=3,i3=3,i;
double d1=1.1,d2=2.2,d3=3.3,d;
long g1=24324,g2=876775,g3=5465646,g;
i=max(i1,i2,i3); //调用模板函数,此时T被int取代
d=max(d1,d2,d3); //调用模板函数,此时T被double取代
g=max(g1,g2,g3); //调用模板函数,此时T被long取代
cout<
return 0;
}
定义函数模板的一般形式为:
template
通用函数定义
//或
template
通用函数定义
template的含义是“模板”,尖括号中先写关键字typename(或class),后面跟一个类型参数T,这个参数实际上是一个虚拟的类型名,表示模板中出现的T是一个类型名,但是现在并未指定它是哪一种具体的类型。
类型参数可以不止一个,可以根据需要确定个数,如:
template
用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数体相同,函数的参数个数相同而数据类型不同的情况。如果参数个数不同,则不能用函数模板。
C++中允许用同一函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。这就是函数的重载,即对一个函数名重新赋予它新的含义,使一个函数名可以多用。所谓重载,其实就是“一物多用”。 函数可以重载,运算符也可以重载,例如:运算符“<<”和“>>”既可以作为位移运算符,又可以作为输出流中的插入运算符和输入流中的提取运算符。
重载函数的参数个数、参数类型或参数顺序三者必须至少有一种不同,函数返回值类型可以相同也可以不同。
在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,易使人莫名其妙。
要使用 pair,应先添加头文件 #include
,并在头文件下面加上 " using namespace std; " ,然后就可以使用了。 注意:由于 map 的内部实现中涉及 pair,因此添加 map 头文件时会自动添加 utility 头文件,此时如果需要使用 pair ,就不需要额外再去添加 utility 头文件了。
struct pair
{
typeName1 first;
typeName2 second;
};
// pair 有两个参数,分别对应 first 和 second 的数据类型,它们可以是任意基本数据类型或容器。
pairname;
// 想要定义参数为 string 和 int 类型的 pair,如下:
pairp;
//如果想在定义 pair 时进行初始化,只需要跟上一个小括号,里面填写两个想要初始化的元素即可;
pairp("haha",5);
//如果想要在代码中临时构建一个 pair,有如下两种方法:
// (1) 将类型定义写在前面,后面用小括号内两个元素的方式。
pair("haha", 5);
// (2) 使用自带的 make_pair 函数。
make_pair("haha", 5)
#include
#include
#include
using namespace std;
int main()
{
pair p;
p.first = "haha";
p.second = 5;
cout << p.first << " " << p.second << endl;
p = make_pair("xixi", 55);
cout << p.first << " " << p.second << endl;
p = pair("heihei", 555);
cout << p.first << " " << p.second << endl;
return 0;
}
此部分选自C++中pair使用详细说明_c++ pair_想去的远方的博客-CSDN博客
std是一个类(输入输出标准),它包括了cin成员和cout成员,声明了“using namespace std;”以后才能使用它的成员。
如果不先声明“using namespace std;”,就需要在cin和cout前面加“std::”,如"std::cin"和"std::cout"。
std是命名空间,你所用到的很多函数或者类都是被放到命名空间里面的,命名空间是防止名字重复而使用的。当你自己定义一个string并把它放到命名空间AAA中的时候,你使用string只要指定是哪个命名空间的,就不会导致编译器分不清是哪个string了。你使用时会用std::string或者AAA::string,前者告诉编译器我用的string是在命名空间std里面的,后者告诉编译器用的string是在命名空间AAA里面的。
"using namespace std;"这样告诉编译器,我没有指定命名空间的,就默认使用std这个命名空间,那么你使用string就不用再加std::作用域了,只需要直接写string就可以了。
此部分选自【C++】C++中“std::“是什么意思?起什么作用?_一拳Marx的博客-CSDN博客