• C

# Finding the Standard deviation from a structure of numbers

Im trying to find the standard deviation from a structure of numbers.
the array is in the format:

s[x].sid=            301111;
s[x].mark=      50;

were x is incremented for every user.

heres the code for the standard deviation, its in the form of a function initalised using:

float stdDev(struct student s[], int n);

and called using:

stdDev(staff,ARR_SIZE);

heres the function... it just crashes! theres 5 entrys, which should be passed to the function in n
float stdDev(struct student s[], int n)
{
int x;
float  mean, sigma;

mean = s[x].sid / n;
for (x=0; x<5; x++) n += (mean - s[x].mark)*(mean-s[x].mark);
sigma = sqrt(n/5);
printf("Std Deviation is %f",sigma);

return sigma;
###### Who is Participating?

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
You're trying to access your struct in:

mean = s[x].sid / n;

but x has not been initialized!

Try to change:

int x;

to:

int x = 0;
0
Commented:
Also, the for() loop, change:

for (x=0; x<5; x++)

to:

for (x=0; x<n; x++)

as 'n' is the size of the array!
0
Author Commented:
Its returning: -1.#IND00 any ideas on what could be wrong?
if that would be any easier? or is there a better way to work out the Standard Deviation!

float stdDev(struct student s[], int n);

*/function called with:*/
stdDev(staff,ARR_SIZE);

*/Function:*/

float stdDev(struct student s[], int n)
{
int x = 0;
float  mean, sigma;

mean = s[x].sid / n;
for (x=0; x<n; x++) n += (mean - s[x].mark)*(mean-s[x].mark);
sigma = sqrt(n/5);
printf("Std Deviation is %f",sigma);
0
Commented:
Ok, I had a closer look at your aglorithm, and it is not correct, which of course is why you're getting the wrong result.

Change to the following:

float mean_mark(struct student s[], int n)
{
int i;
int acc = 0;
for( i=0; i<n; i++ )
{
acc += s[i].mark;
}
return (float)acc / (float)n;
}

float stdDev(struct student s[], int n)
{
int x;
float  mean, sigma, sum = 0.0f;

mean = mean_mark( s, n );
for (x=0; x<n; x++)
{
sum += pow(mean - s[x].mark, 2.0);
}
sigma = sqrtf(sum/(n -1));
std::cout << "Std Deviation is %f" << sigma;

return sigma;
}

Good luck!
0
Author Commented:
I belive this is a C++ alternative, is it possible to modify this for C? i think pow is the only command thats C++, apart from that, its perfect
0
Commented:
The code above is pure C. pow is included in the standard math.h

So the code is working for you now?
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Commented:
>>> std::cout << "Std Deviation is %f" << sigma;
>>>The code above is pure C
???!!!

replace that with a printf() and replace
pow (x, 2.0)
with
(x * x)

0
Commented:
The code that does the work is pure C. The std::cout was a lapse.

0
Commented:
I figured but couldn't resist the urge to be pedantic.  :)
E.
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.