1. Limited time only! Sign up for a free 30min personal tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C++ Why is my function printing TWICE?

  1. Mar 28, 2012 #1
    1. The problem statement, all variables and given/known data

    My printArray function, when called in my int main() with the arguments ("***monthly total***, sums, NUM_MON) is printing out twice as many times as it should be, and for some reason, even the string caption is printing out as "******monthly total******" instead of "***monthly total***" (6 *'s instead of 3). Can anyone see any obvious mistake that I might me missing, causing this to print out wrong?


    2. Relevant equations



    3. The attempt at a solution

    Code (Text):

    #include <iostream>
    #include <iomanip>
    #include <math.h>
    #include <fstream>

    //#includes

    const int NUM_MON = 12;   // define number of months as constant

    using namespace std;


    //function prototypes

    void buildArrays(double[], double[], double[]);

    void printUtilityStat(string, double[], int);

    void getSumArray(double[], double[], double[], double[]);

    void printArray(string, double[], int);

    double mean(double[], int);

    double sum(double[], int);

    double low(double[], int);

    double high(double[], int);

    void sortArray(double[], int);


    //define arrays
    double gas[NUM_MON];
    double water[NUM_MON];
    double electricity[NUM_MON];
    double sums[NUM_MON];

    int main()
    {
       
        buildArrays(gas,electricity, water); //fill the three arrays
       
       
        printUtilityStat("gas", gas, NUM_MON);
        printUtilityStat("electricity", electricity, NUM_MON);
        printUtilityStat("water", water, NUM_MON); // print the stats for each utility
       

        getSumArray(gas, electricity, water, sums); //build the array of the sum of each months expenses
       
        printArray ("***monthly total***", sums, NUM_MON);
       
        sortArray (sums, NUM_MON);// sort the array using the sortArray function
       
        cout<<endl;
       
        printArray ("***sorted monthly total***", sums, NUM_MON);// print the results of the sorted array
       
       

        cout<<endl<<endl<<endl
            <<"The highest monthly expense is "<<sums[11]   <<endl<<endl   // in the sorted array, the highest expense is in the last slot
            <<"The lowest monthly expense is "<<sums[0]    <<endl<<endl    // in the sorted array, the lowest expense is in the first slot
            <<"The average monthly expense is "<<mean(sums, NUM_MON)   <<endl;// call the mean function to find the average of the sums array
           
       
       
       
        //call all worked functions with proper arguments, into the boss main function
       
    system ("pause");
    return 0;    
    }
    /*****************
    This function takes 3 arrays as arguments.  Calling it will read the expenses.txt file and fill the arrays with the proper
    data using for loops and temporary string variables. It returns nothing.


    ******************/
    void buildArrays(double gas[], double electricity[], double water[])
    {
         ifstream inFile;    //input file stream for data for .txt file
         
         inFile.open("expenses.txt");
         
         if (inFile.fail() )
            {
            cout<<"Unable to open expenses.txt file\n";
            exit(1);
           
            //display error message if file fails to open
            }
           
            string temp;  //define temporary variable for the words in the file, they are not needed
            int i;
           
            inFile>> temp;  // store the word in the file into this variable
           
            for (i=0; i<NUM_MON; i++)
                {
                    inFile>> gas[i];  
                      }
                     
            inFile>> temp;
           
            for (i=0; i<NUM_MON; i++)
                {
                    inFile>> electricity[i];  // for loop to store file content into proper array
                      }
                     
            inFile>> temp;
           
            for (i=0; i<NUM_MON; i++)
                {
                    inFile>> water[i]; // for loop to store file content into proper array  
                      }
                     
              inFile.close();            
                           }
                           
       
         
    /*****************
    This function takes a string, double array, and integer as arguments.  the string is a label or caption.  The function uses
    the arguments to print out the data in a formatted table with 2 decimal places.



    ******************/
    void printUtilityStat(string caption, double array[], int size)
    {
        cout<<"***"<<caption<<"***"<<endl<<setiosflags(ios::right)
            <<"sum over 12 months: "<<setprecision(2)<<fixed<<"$"<<sum(array, size)<<endl
            <<"average           : "<<"$"<< mean(array, size)<<endl
            <<"highest cost      : "<<"$"<< high(array, size)<<endl
            <<"lowest cost       : "<<"$"<< low (array, size)<<endl<<endl;
           
            //formatted data output
         
         
         }
    /*****************
    This function takes 4 arrays as arguments.  It sums the contents of each subscript in each array, and stores them in a new array.
    It returns nothing.


    ******************/
    void getSumArray(double gas[], double electricity[], double water[], double sums[])
    {
         for (int i=0; i< NUM_MON; i++)
             {
              sums[i] = (gas[i] + electricity[i] + water[i]);
              //sum the three arays for each month and store answer in new array    
                 
                  }
         
         }

    /*****************
    This function takes a string, array, and integer for arguments.  The string is a caption or label, and it uses the array
    and input integer to go through the array and print out the contents.  

    ******************/
    void printArray(string caption, double array[], int size)
    {
          cout<<"***"<<caption<<"***"<<endl;
         
         for(int i=0; i<size; i++)
         {
          cout<<setprecision(2)
              <<fixed
              <<"$"<<array[i]<<endl;
             
              //print out result of arrays with 2 decimal places and a dollar sign, using a for loop
                 }
         }

    /*****************
    This function takes an array and integer as argument.  It uses a variable, result, and caluclated the average
    using the arguments.  It returns the average.


    ******************/
    double mean(double array[], int size)
    {
           double result;
           
           result= sum(array, size);
                 
           
            return  result/ size;
           
            //calculation for average
               
               
           
           }
    /*****************
    This function takes an array and integer as argument, and uses a for loop to go through the array and sum the contents.
    It returns the sum of the contents of the array.


    ******************/
    double sum(double array[], int size)
    {
       double sum=0;  
           
           for(int i=0; i<size; i++)
           {
            sum+= array[i];    
                   }
           
           return sum;
           
           //calculation to add the contents of the array together
           }


    /*****************
    This function takes an array and integer as argument, and uses logic to find the smallest number in the array.
    It then returns this number.


    ******************/
    double low(double array[], int size)
    {
         double min =array[0];
     
         for (int i=1; i<size; i++)
          {
           if (array[i]<min)
              {
              min=array[i];
              }
             
              //logic for finding smallest number in array
               
           }
           
           return min;
           }
    /*****************
    This function takes an array and integer as argument, and uses logic to find the largest number in the array.
    It then returns this number.


    ******************/
    double high(double array[], int size)
    {
           double max =array[0];
     
         for (int i=1; i<size; i++)
          {
           if (array[i]>max)
              {
              max=array[i];
              }
              //logic for finding largest number in array
             
              }
              return max;

     }
    /*****************
    This function takes an array and integer as argument, and sorts it with logic.  It returns nothing.


    ******************/
    void sortArray(double array[], int size)
    {
         int first;
         double temp;
         
         for(int i= 0; i<size; i++)
         {
         first=i;
         for(int j=i+1; j<size; j++)
                 {
                  if(array[j]<array[first])
                    {
                    first=j;
                                           }
                                           }  
          temp= array[first];
          array[first] = array[i];
          array[i]=temp;    
         
          cout<<setprecision(2)<<fixed
              <<"$"<<array[i]
              <<endl;
                 }
         
                 //sort array using selection sort array similar to the example gone over in lecture
          }    



         
     

     
     
  2. jcsd
  3. Mar 29, 2012 #2
    sortArray also prints. And printArray explicitly adds three stars to each end of whatever caption you send.

    Oh yes, and read (or reread) this comment on indenting.
     
    Last edited: Mar 29, 2012
  4. Mar 29, 2012 #3
    just a quick explanation of indenting...

    the rules are: each control flow block should be a step further in the page. this makes it much easier to see what the program does, and make sure all your statements are in the right place.

    as an example, your function low();
    Code (Text):


    ******************/
    double low(double array[], int size)
    {                               // function starts
         double min =array[0];
     
         for (int i=1; i<size; i++)                 // for loop starts here
         {
                if (array[i]<min)                       // if block
                {      
                     min=array[i];                      // conditional statements

                }                               // if block ends
               
          }                                 // for loop ends here
           
          return min;
    }                               // function ends
    /*****************
    see now that you can choose a { brace, and follow it vertically down untill you find a } brace, and all the lines you pass are inside that control. I noticed several mistakes form your previous version, which you've now corrected, but proper indenting makes them obvious from the start. ie:

    Code (Text):

    /* this from previous thread */
    double low(double array[], int size)
    {
        double min = array[0];
     
        for (int i=0; i<size; i++)
        {
                if (array[i]<min)
                {
                        min=array[i];
                }

                                       /* Now obvious that a } is missing at the end of the for loop*/

             return min;
    }


     
    a particularly useful aspect of this is that the compiler wont tell you "your for loop is missing a bracket", it will think your function is missing it, as your for loop steals the function's closing brace. naturally when your told that the function is missing a closing bracket, you stick one on the end, but that means your return statement is inside the for loop. the compiler wont complain, but the funtion will return the wrong value
     
  5. Mar 29, 2012 #4

    Mark44

    Staff: Mentor

    Joe_K, we appreciate you putting your code in [ code ] tags - Thanks!

    Joffan and earlofwessex - very good points about indentation. I'm hopeful that Joe_K picks up on the value of good indentation in code.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: C++ Why is my function printing TWICE?
Loading...