C++ and solving quadratic Equations

  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,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:
     
  2. jcsd
  3. whhat is "0.5b" suppose to do? What other errors do you get?
     
  4. 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:

    on line 30 and 31.

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

    problem solved.
     
    Last edited: Sep 2, 2006
  5. 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

    }
     
  6. 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 (Text):

    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.
     
  7. Mark44

    Staff: Mentor

    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 (Text):

    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 (Text):
    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 (Text):
    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 (Text):

    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 (Text):
    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.
     
Know someone interested in this topic? Share a link to this question via email, Google+, Twitter, or Facebook

Have something to add?