C/C++ C++ and solving quadratic Equations

Click For Summary
The discussion revolves around translating a basic Python program for solving quadratic equations into C++. The original Python code prompts users for coefficients a, b, and c, processes them, and calculates the roots while handling imaginary numbers. The C++ translation initially contains several errors, including incorrect input syntax, missing data types, and formatting issues.Key corrections include changing the input method to properly read multiple values, ensuring the main function is declared with "int", and fixing output formatting to use the correct stream operators. Additionally, suggestions are made to improve user prompts for clarity and to avoid potential divide-by-zero errors by not modifying the coefficients. The discussion also highlights the importance of calculating the discriminant separately for better readability and accuracy, recommending the use of double for variable types to enhance precision. Overall, the conversation emphasizes best practices in coding and user experience in programming.
Mattara
Messages
347
Reaction score
1
Today, I tried to translate the very basic "solve quadratic equations" program I made a while back in Python to C++.

#Solving quadratic equations
import math
print
print "Please enter information in accordance with ax^2 + bx + c = 0"
a = input("What is a?")
b = input("What is b?")
c = input("what is c?")

b = float(b) / float(a)
c = float(c) / float(a)

before_the_square = 0.5 * b * -1
the_square = (0.5 * b)**2 - c
if the_square < 0:
print "Imaginary" #fail-safe for imaginary numbers.
else:
value_of_square = math.sqrt(the_square)
x1 = before_the_square + value_of_square
x2 = before_the_square - value_of_square
print
print "x(1) is:"
print x1
print
print "x(2) is:"
print x2

I tried something like this in C++:

// Solving quadratic equations

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

main ()
{
float a, b, c, before_sqrt, inside_sqrt, after_sqrt, x1, x2;
cout << "Solving quadratic equation" << endl << endl;
cout << "ax^2 + bx + c = 0";
cin >> a, b, c;

b = b / a;
c = c / a;

before_sqrt = (b/2)*-1;
inside_sqrt = pow(0.5b[/color],2) - c;
if (inside_sqrt < 0)
{
cout << "Error";
}
else
after_sqrt = sqrt (inside_sqrt);

x1 = before_sqrt + after_sqrt;
x2 = before_sqrt - after_sqrt;

cout "x1 =" << endl << endl << x1;
cout "x2 =" << endl << endl << x2;
system("pause");
return 0;
}

The indent is wrong due to copy/pasting and I have not removed the scaffolding.

I'm pretty sure I made some mistakes with the declaration in the beginning as well as the difficulty to use exponential with variables (red), altohugh I'm not sure how to solve it. Any help is greatly appreciated.

Thank you for your time :smile:
 
Technology news on Phys.org
whhat is "0.5b" suppose to do? What other errors do you get?
 
It is suppose to do 0.5*b.

Oh, by writing 0.5*b, that particular error goes away. I've alos missed to add int to main()

The only error messages I am getting now is:

Expected ";" before string constant

on line 30 and 31.

Edit: as it turns out I forgot the ">>" in "
cout >> "x1 =" << endl << endl << x1;"

problem solved.
 
Last edited:
This is the corrected way of writing the program...
I've not really checked the logic, but this is the corrected way of writing what you want to.
Try and avoid spaces.


#include<iostream.h>
#include<conio.h> //I've put this for the clrscr() function.
#include<string.h>
#include<math.h>

int main () {

clrscr(); //It makes sure the screen becomes clear when you run the program again.

float a, b, c, before_sqrt, inside_sqrt, after_sqrt, x1, x2;
cout<<"Solving quadratic equation";
cout<<"ax^2 + bx + c = 0";
cin>>a>>b>>c; //You have to take the parameters like this

b=b/a;
c=c/a;

before_sqrt = (b/2)*(-1);
inside_sqrt = pow(0.5*b,2)-c;

if (inside_sqrt < 0)
cout<<"Error";
else
after_sqrt=sqrt (inside_sqrt);

x1=before_sqrt+after_sqrt;
x2=before_sqrt-after_sqrt;

cout<<"x1 ="<<endl<<endl<<x1;
cout<<"x2 ="<<endl<<endl<<x2;

return 0; //You need int main() for this statement

}
 
Pratibha_S said:
Try and avoid spaces.

Sorry, but that is bad advice. Sure, you can't add spaces just anywhere you want, but things should be spaced out to make it more readable. Squishing everything together like you did is not good.

Although the unportable system("pause") does hint he's using Windows, I suggest not even using that. Why write unportable programs when it's no harder to write it portably (in this case)? No need to clear the screen, and something like cin.get() at the end should work as well as the pause. Adding Windows conio stuff makes it more unportable and more non-standard.

Matara, this line still isn't quite right:

cout >> "x1 =" << endl << endl << x1;

It should be:

cout << "x1 =" << endl << endl << x1;

All the operators should be <<, not >>. They go the other way for input. For example:

Code:
char c;
cin >> c;

That's formatting it like you seemed to want to, but I'm not sure why you want two newlines between "x1 = " and the variable value. Right now, if x1 is 42, you'll end up printing:

x1 =

42

Most people would stick to:

cout << "x1 = " << x1 << endl;

But that's up to you.

As Pratibha_S pointed out, this is wrong:

cin >> a, b, c;

And should be:

cin >> a >> b >> c;

When you enter them, they should be separated by spaces. Might not be a bad idea to point that out in a prompt.

And I guess you know about the missing "int " in front of your main function.

Lastly, when you post code, to preserve the rather important indentation, put your code between CODE tags. Put [ CODE] in front and [ /CODE] at the end, removing the spaces I put in after the opening square brackets.
 
Some additional comments...

1. The way you did input in your python version is better than how you did it in your C++ version.

python version:
Code:
print "Please enter information in accordance with ax^2 + bx + c = 0"
a = input("What is a?")
b = input("What is b?")
c = input("what is c?")

C++ version:
Code:
cout << "ax^2 + bx + c = 0";
cin >> a, b, c;
Aside from the errors already noted, the python version is superior, from the perspective of a naive user of your program, because each variable has its own prompt. The prompt in the C++ version, "ax^2 + bx + c = 0" might be decipherable for you, the author of the program, but it doesn't offer much information for someone who isn't as familiar with your program.

2. You are calculating the roots of the quadratic in a nonintuitive way.
Code:
b = b / a;
c = c / a;

before_sqrt = (b/2)*-1;
inside_sqrt = pow(0.5b,2) - c;
if (inside_sqrt < 0)
{
   cout << "Error";
}
else
after_sqrt = sqrt (inside_sqrt);

x1 = before_sqrt + after_sqrt;
x2 = before_sqrt - after_sqrt;
If someone enters 0 for a, you are going to have a divide-by-zero error right off the bat.
Instead of resetting b and c as you are doing, why not leave them as they are?

The thing inside the square root is called the discriminant. It's useful to calculate it before taking its square root.
Code:
disc = b * b - 4 * a * c;
Then your code can check to see if disc is less than zero and handle complex roots or not. Notice that I used b * b instead of the pow() function.

Assuming the discriminant was nonnegative, the two roots are:
Code:
x1 = 1/(2a)*(-b + sqrt(disc));
x2 = 1/(2a)*(-b - sqrt(disc));

One other thing - your variables are of type float. For better precision I would use double.
 
I tried a web search "the loss of programming ", and found an article saying that all aspects of writing, developing, and testing software programs will one day all be handled through artificial intelligence. One must wonder then, who is responsible. WHO is responsible for any problems, bugs, deficiencies, or whatever malfunctions which the programs make their users endure? Things may work wrong however the "wrong" happens. AI needs to fix the problems for the users. Any way to...

Similar threads

  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 15 ·
Replies
15
Views
4K
  • · Replies 23 ·
Replies
23
Views
3K
Replies
12
Views
3K
  • · Replies 89 ·
3
Replies
89
Views
6K
  • · Replies 4 ·
Replies
4
Views
6K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 29 ·
Replies
29
Views
10K
  • · Replies 1 ·
Replies
1
Views
4K
  • · Replies 2 ·
Replies
2
Views
4K