求解二次方程

描述

编写一个程序,实现求解形如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 <iostream>
#include <cmath>       //需要用到sqrt函数
#include <iomanip>      //需要用到保留几位小数当中
#include <utility>       //需要用到pair
using namespace std;

pair<float, float> 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);
	pair<float, float>result;
	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<float, float> 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 <iostream>

using namespace std;

template <typename T>          //模板声明,其中的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<<i<<" "<<d<<" "<<g<<endl;

return 0;

}

定义函数模板的一般形式为:

template <typename T>

通用函数定义

//或

template <class T>

通用函数定义

 template的含义是“模板”,尖括号中先写关键字typename(或class),后面跟一个类型参数T,这个参数实际上是一个虚拟的类型名,表示模板中出现的T是一个类型名,但是现在并未指定它是哪一种具体的类型。

类型参数可以不止一个,可以根据需要确定个数,如:

template <class T1 , typename T2>

用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数体相同,函数的参数个数相同而数据类型不同的情况。如果参数个数不同,则不能用函数模板。

②:函数的重载

C++中允许用同一函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。这就是函数的重载,即对一个函数名重新赋予它新的含义,使一个函数名可以多用。所谓重载,其实就是“一物多用”。 函数可以重载,运算符也可以重载,例如:运算符“<<”和“>>”既可以作为位移运算符,又可以作为输出流中的插入运算符和输入流中的提取运算符。

重载函数的参数个数、参数类型或参数顺序三者必须至少有一种不同,函数返回值类型可以相同也可以不同。

在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,易使人莫名其妙。

③:pair的用法
1)C++中的pair是一个模板类,用于存储两个不同类型的值。它将两个值组合在一起,可以用来表示一个键值对或者简单的有序组。

要使用 pair,应先添加头文件 #include <utility>,并在头文件下面加上 " using namespace std; " ,然后就可以使用了。

注意:由于 map 的内部实现中涉及 pair,因此添加 map 头文件时会自动添加 utility 头文件,此时如果需要使用 pair ,就不需要额外再去添加 utility 头文件了。

2)pair 实际上可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下:

struct pair
{
    typeName1 first;
    typeName2 second;
}; 

// pair 有两个参数,分别对应 first 和 second 的数据类型,它们可以是任意基本数据类型或容器。
pair<typeName1, typeName2> name;
 
// 想要定义参数为 string 和 int 类型的 pair,如下:
pair<string, int> p;
 
//如果想在定义 pair 时进行初始化,只需要跟上一个小括号,里面填写两个想要初始化的元素即可;
pair<string, int> p("haha",5); 

//如果想要在代码中临时构建一个 pair,有如下两种方法:
 
// (1) 将类型定义写在前面,后面用小括号内两个元素的方式。
pair<string, int>("haha", 5);
 
// (2) 使用自带的 make_pair 函数。
make_pair("haha", 5)  

3)pair 中只有两个元素,分别是 first 和 second ,只需要按正常结构体的方式去访问即可。 
#include <iostream>
#include <utility>
#include <string>
using namespace std;
 
int  main()
{
	pair<string, int> 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<string, int>("heihei", 555);
	cout << p.first << " " << p.second << endl;
	return 0;
}

 此部分选自C++中pair使用详细说明_c++ pair_想去的远方的博客-CSDN博客

④:“std::”是什么?

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博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值