# what am i doing wrong here?help

Discussion in 'C++' started by naushil mehta, Mar 18, 2012.

1. ### naushil mehtaGuest

http://comsc265.yolasite.com/lab-3.php

here is code

#include <iostream>
//Lab 3a
//Programmer:Naushil Mehta
//Compiler used:vc ++ 2010

using std::cout;
using std::endl;
using std::cin;
#include<cstdarg>
//function prototype(s)
int avg(int,...);

int main()
{
// identifying output statements
cout << "Programmer: Naushil Mehta" << endl;
cout << "Description: This program gives you the average of floating
point numbers." << endl;

cout<<"The average of 6 test scores is
"<<avg(6,50,81,92,73,84,95)<<endl;
return 0;
}
//return average of a variable length list of integers
int avg(int n, ...)//"n" is the number of numbers in the list;"..."is
the list
{
va_list list; // assign the name "list" to the variable length list of
integers
va_start(list,n);//tell c++ that the list begins after the argument
"n"
int num;//store the numbers from the list in "num" as they are "read"

//create the total of "n" numbers in the list
int total=0;//track the total of the numbers in the list
for(int i=0;i<n;i++)
{
num=va_arg(list,int);//set num equal to the next number in the list,as
an int
total=total+num;//increment the total
}
va_end(list);//close the list--REQUIRED

// compute and return the average

}
//===================//
{
cout<<"The average of 7 test scores is
"<<avg(7.0,59.86,50.23,81.55,55.92,67.23,84.43,95.43)<<endl;
}
double davg(double m, ...)//"m" is the number of numbers in the
list;"..."is the list
{
va_list list; // assign the name "list" to the variable length list of
integers
va_start(list,m);//tell c++ that the list begins after the argument
"m"
double num;//store the numbers from the list in "num" as they are

//create the total of "m" numbers in the list
double total=0;//track the total of the numbers in the list
for(double i=0;i<m;i++)
{
num=va_arg(list,double);//set num equal to the next number in the
list,as a double
total=total+num;//increment the total
}
va_end(list);//close the list--REQUIRED

// compute and return the average
}

//=======================//

int avgx (int,...)
{
int a, aMax, aMin;
a = avgx(aMax, aMin, 8, 23,55,45,67,42,44,70,98);

cout<<"The average of 8 scores is "<<avgx(8,
23,55,45,67,42,44,70,98)<<endl;
return 0;
}//

//returns average and passes max and min back through argument list
int avgx(int& mx,int& mn,int n,...)//n is the number of numbers in the
list
{
va_list list;//assign the name "list" to the variable length list of
integers
va_start(list,n);//tell c++ that the list begins after the argument
"n"
int num;//store the numbers from the list in "num" as they are "read"

//create the total of "n" numbers in the list
int total=0;//track the total of the numbers in the list
for (int i=0;i<n; i++)
{
num=va_arg(list,int);//set num equal to the next number in the
list,as an int
if((i==0) ||(mn>num))//update min value
mn=num;
if((i=0)||(mx<num))//update max value
mx= num;
total=total+num;//increment the toal
}
va_end(list);//close the list--required

//compute and return the average
}

naushil mehta, Mar 18, 2012

2. ### Jens Thoms ToerringGuest

It would be useful if you would describe what you actually need help
indentation in your code, it's cheap and helps enormously in making
things easier to read. And then stop commenting each and every litt-
le and obvious detail.
This should work, doesn't it? One might argue if returning
an int for the average is a good idea since the way you
wrote that it will return the integer value below the actual
average (unless the sum can be divided exactly by the number
of values the average is calculated from) but that's up to
you.
I would guess that you intended to call davg() here.
It would make much more sense to use an integer for the count
here. Floating point values can behave in unexpected ways since
they might have values slightly different from whhat you expect.
Probably not a problem here but you better get in the habit of
avoiding them as counters whenever pssible.
Don't use floating point numbers for such things if you can
avoid it!
That's a function declaration (but misses a colon at the
end), a definition would need a named variable. The com-
piler won't accept this.
Now things get rather confusing: you have two functions with
the same name, 'avgx', but which take different kinds of
arguments and do completely different things. Moreover,
you call the function with the references as the first two
arguments but don't use the results at all and then call the
other avgx() function from within itself, resulting in an
infinite recursion. I also don't see any declaration for
the argx() function with the two reference arguments, so the
compiler won't compile this also for that reason. Please try
to post complete, compilable code if possible in the future.

I have added a bit of white space and removed all the
rather superfluous comments from the next function:
Take a look if you now can spot what's wrong here more
easily...

If you haven't yet found it here's the offending line:
You don't compare 'i' to 0 here, you assign 0 to it! The
result is that you will never get out of this loop. Try
to find out how to make ypur compiler complain about pos-
sible problems (i.e. use a higher warning level, IIRC you
can use '/warn ption' with VS, where 'option' is a number
between 0 and 4) and it probably will report this as a po-
tential mistake.
Regards, Jens

Jens Thoms Toerring, Mar 18, 2012

3. ### Jens Thoms ToerringGuest

Oops, I was thinking C when I wrote that (have been writing C
the last few days) - in C++ you can have unnamed arguments if
you're not goind to use them within the function, so it's a
valid start for a function definition (but one that makes no
sense for a function with a variable number of arguments since
now you can't get at them because there's nothing you could
pass to va_start() as the second argument).

Regards, Jens

Jens Thoms Toerring, Mar 18, 2012