5 Write a CC program that solves a quadratic equation as des
Solution
#include <complex>
#include <iostream>
#include <utility>
#include <vector>
#include <istream>
#include <tuple>
std::vector<std::complex<double>> quadRoot(double A, double B, double C){
auto DIS = (B*B-4*A*C);
std::vector<std::complex<double>> roots;
if(DIS >= 0){
DIS = sqrt(DIS);
double r1 = (-B+DIS)/(2*A);
double r2 = (-B-DIS)/(2*A);
if(DIS!=0){
roots = {r1, r2};
}
else{
roots = {r1};
}
}
else{
DIS = sqrt(-DIS);
auto r1 = std::complex<double>(-B/(2*A), DIS/(2*A));
auto r2 = std::complex<double>(-B/(2*A), -DIS/(2*A));
roots = {r1, r2};
}
return roots;
}
void checkQuadRoots(){
auto v1 = quadRoot(1, 2, -8);
std::cout << \"Roots 1 \" << std::endl;
for(auto r : v1){ std::cout << r << \"\\t\"; };
std::cout << \"Roots 2 : \" << std::endl;
auto v2 = quadRoot(1,-9, 8);
for(auto r : v2){ std::cout << r << \"\\t\"; };
std::cout << \"Roots 3 : \" << std::endl;
auto v3 = quadRoot(4, 2, 5);
for(auto r : v3){ std::cout << r << \"\\t\"; };
}
struct Point3D{
double x;
double y;
double z;
friend std::istream& operator>> (std::istream& is, Point3D& p){
char ch[4];
is >> ch[0] >> p.x >> ch[1] >> p.y >> ch[2] >> p.z >> ch[3];
if(ch[0]==\'(\'&&ch[1]==\',\'&&ch[2]==\',\'&&ch[3]==\')\'){
return is;
}
else{
std::cerr << \"error in input\";
return is;
}
}
friend double distance(const Point3D& p1, const Point3D& p2){
auto dx = p1.x-p2.x;
auto dy = p1.y -p2.y;
auto dz = p1.z -p2.z;
return sqrt(dx*dx+dy*dy+dz*dz);
}
friend double amplitude(const Point3D& p){
return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
}
friend double dotP(const Point3D& p1, const Point3D& p2){
return (p1.x*p2.x + p1.y*p2.y + p1.z*p2.z);
}
friend double angleV(const Point3D& p1, const Point3D& p2){
return std::acos(dotP(p1,p2)/(amplitude(p1)*amplitude(p2)));
}
};
void checkVec(){
Point3D p1, p2;
std::cout << \"\ P1:\";
std::cin >> p1;
std::cout << \"P2:\";
std::cin >> p2;
std::cout << \"Distance : \" << distance(p1,p2) << std::endl;
std::cout << \"Amplitude :\" << amplitude(p1) << \"\\t\" << amplitude(p2) << std::endl;
std::cout << \"DotProducet : \" << dotP(p1, p2) << std::endl;
std::cout << \"Angle : \" << angleV(p1,p2) << std::endl;
}
std::vector<std::tuple<double, double, double, double>> table(){
double betaF = 50;
double xF = 0.5;
double beta0 = 50;
double x0 = 0;
std::vector<std::tuple<double, double, double, double>> result;
result.reserve(240);
for(int i = 0; i <= 40; ++i){
for(int j = 0; j <= 6; ++j){
double beta = betaF*j + beta0;
double x = xF*i + x0;
double F = beta*x;
double E = 0.5*beta*x*x;
result.push_back(std::make_tuple(x,beta,F,E));
}
}
return std::move(result);
}
void printTable(){
std::cout << \"\ x\\tBeta\\tForce\\tEnergy\ \";
auto res = table();
for(auto& v: res){
double x, beta, F, E;
std::tie(x, beta, F, E) = v;
std::cout << x << \"\\t\" << beta << \"\\t\" << F << \"\\t\" << E << \"\ \";
}
}
int main(){
checkQuadRoots();
checkVec();
printTable();
}


