beginner wanting criticism
 CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com

# Thread: beginner wanting criticism

1. Junior Member
Join Date
Jul 2010
Location
Washington state
Posts
3

## beginner wanting criticism

I'm teaching myself c++ and giving myself random stuff to program. This program works, mostly, but I know for a fact that it could have been done much much better. This program is basically Newton's Method http://en.wikipedia.org/wiki/Newtons_method for polynomials. I'm mainly seeking out criticism on this code because I know it isn't the best quality. I know I shouldn't use global variables and I should do comments, but ya...

Code:
```#include <iostream>
#include "math.h"
using namespace std;

double a;
double b;
double c;
double d;
double e;
double f;

double linearsolver(double slope, double x_coordinate, double y_coordinate)
{
double solution = 0 - y_coordinate;
solution = solution/slope;
solution = solution + x_coordinate;
return solution;
}

double equation(double x)
{
double result;
result=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;
return result;
}

double differentiation(double number_diff_at)
{
double i=0.001;
double result,neg_result;
do
{
result=(equation(number_diff_at+i)-equation(number_diff_at)/i;
neg_result=(equation(number_diff_at-i)-equation(number_diff_at))/(-i);
if(floor(result-neg_result)!=0)
{
i=i*i;
}
}while(floor(result-neg_result)!=0);
double deriv_result=(result+neg_result)/2;
return deriv_result;
}

double newtons_method(double initialguess, int iterations)
{
double x=initialguess;
double y,slope,result;
int n;
for(n=iterations;n!=0;n--)
{
slope=differentiation(x);
y=equation(x);
result=linearsolver(slope,x,y);
x=result;
}
return result;
}

int main()
{
double initialguess, result;
int n;
cout<<"a: ";
cin>>a;
cout<<"b: ";
cin>>b;
cout<<"c: ";
cin>>c;
cout<<"d: ";
cin>>d;
cout<<"e: ";
cin>>e;
cout<<"f: ";
cin>>f;
cout<<"\ninitial guess: ";
cin>>initialguess;
cout<<"iterations: ";
cin>>n;
result=newtons_method(initialguess,n);
cout<<"\nsolution is: "<<result<<"\n";
cin>>n;
return 0;
}```

2. ## Re: beginner wanting criticism

This program accepts any user input, without checking it. Does this algorithm have some input restrictions (for example, some variable must be non-negative)? In the case there are such restrictions, you need to check the values typed by user.
If you write in C++, why don't you use classes? Think about class that has a, b... f member variables, and linearsolver, equation.. methods. Main function creates such class instance, fills its members, and calls newtons_method function.
Local variables like initialguess, slope, result have pretty informative names. However, general parameters have short and useless names like x, y.
In some places indentation looks a bit strange. Visual Studio "Format Selected Text" function is a good way to fix this.

Generally, this program is readable and clear.
Last edited by Alex F; July 17th, 2010 at 12:44 AM.

3. ## Re: beginner wanting criticism

Originally Posted by clintavian
Code:
```double linearsolver(double slope, double x_coordinate, double y_coordinate)
{
double solution = 0 - y_coordinate;
solution = solution/slope;
solution = solution + x_coordinate;
return solution;
}```
This is unacceptably verbose. At the least you should write.
Code:
```double solution = -y_coordinate;
solution /= slope;
solution += x_coordinate;
return solution;```
However, I would just write a single line.
Code:
`return -y_coordinate / slope + x_coordinate;`
Originally Posted by clintavian
Code:
```double equation(double x)
{
double result;
result=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;
return result;
}```
There's no need for a local variable if you write it like this. But you may be able to improve performance by changing it to
Code:
```double x2 = x * x;
double x3 = x * x2;
double x4 = x * x3;
double x5 = x * x4;
return a * x5 + b * x4 + ... = f;```
Note the use of spaces between operators to make the code easier to read.

4. ## Re: beginner wanting criticism

Originally Posted by clintavian
Code:
`#include "math.h"`
Perhaps you meant
Code:
`#include <math.h>`
or better yet:

Code:
`#include <cmath>`

5. Elite Member Power Poster
Join Date
Nov 2003
Location
Florida
Posts
12,518

## Re: beginner wanting criticism

I don't think I'd write something like this.

result=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;

At least wrap some parentheses around the various parts of it. That will make it clearer to the reader exactly what order the calculations are being performed in, and probably help you avoid mistakes when you don't get the calculation order right.

6. Elite Member Power Poster
Join Date
Aug 2000
Location
West Virginia
Posts
7,712

## Re: beginner wanting criticism

And for any mathematicians out there ...

Code:
```double equation_horner(double x)
{
return f + x * (e + x * (d + x * (c + x * (b + x*a))));
}```
sorry.

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•

Click Here to Expand Forum to Full Width

On-Demand Webinars (sponsored)