2017-04-20 62 views
-1

我一直堅持這一整天。這段代碼應該找到文本文件中最大和最小數量的數字,然後輸出這些數字的平均值。一切工作正常,除了平均水平。它根本沒有計算。我知道問題在於我沒有在我的find_average函數中正確使用我的數組,但是對於我的生活,我無法將我的頭圍繞在我做錯的地方。請幫忙。傳遞數組和計算平均值C++的問題

// Student:  Tyler Brady 
// Assignment:  5 
// File:   assing5.cpp 
// Input:   Keyboard 

#include <iostream> 
#include <fstream> // I/O 
#include <iomanip> // For setw() 
using namespace std; 
ofstream outputfile("output.txt"); 
const int MAX_FILE_NAME = 35; // Maximum file name length 
const int MAX_NUMBER_SCORES = 40; // Maximum number of values in array 
void open_input(ifstream& input, char name[]);      // Get file name, Open file 
void read_values(ifstream& input, double v[], int size, int& used); // Read values from file 
void find_max_min(const double v[], int n, double& max, double& min);// Find max/min in array 
void output(const char name[], const double v[], int n, 
    double max, double min, double average, ostream &out = cout);   // Print Results 

double find_average(const double v[], int n); 

int main() 
// Parameters: None 
// Returns: Zero 
// Calls:  open_input(), read_values(), find_max_min(), output()  
{ 
    char  again;      // Does user want to go through loop again? 
    char  file_name[MAX_FILE_NAME + 1]; // Name of file to be processed 
    ifstream input_numbers;    // Input file of doubles 
    double scores[MAX_NUMBER_SCORES]; // Array to hold scores processed 
    double max, min;      // Maximum and minimum numbers from file 
    int  num_scores;     // Number of scores in file 

    double average; 

    cout << "This program can find the largest and smallest numbers in a file\n" 
     << "of at most " << MAX_NUMBER_SCORES << " floating-point values.\n" << endl; 
    system("pause"); // Hold message on screen until key is pressed 

    do 
    { 
     open_input(input_numbers, file_name); // Get file name & open file 
     read_values(input_numbers, scores, 
      MAX_NUMBER_SCORES, num_scores);  // Read values 
     input_numbers.close();     // Close file 
     if (num_scores > 0) 
     { 
      find_max_min(scores, num_scores, max, min); // Find max & min values in array 
      average = find_average(scores, num_scores); 
      output(file_name, scores, num_scores, max, min, average); // Print results on screen 
      output(file_name, scores, num_scores, max, min, average, outputfile); // and outputfile 
     } 
     else 
     { 
      cout << "\n\n\aNo data in file: " << file_name << endl; 
     } 

     cout << "\nDo you want to process another file (Y/N)? "; 
     cin >> again; 
     cin.ignore(256, '\n'); // Remove Enter key from keyboard buffer 
    } while (again == 'y' || again == 'Y'); 

    cout << "\nEnd of Program!" << endl; 
    outputfile << "\n\nThanks for using MaxMin!\f"; 
    outputfile.close(); 
    return 0; 
} // End of main() 

void open_input(ifstream& input, char name[]) //Open file 
               // Parameters: Variables for input file reference nad input file name 
               // Returns: None 
               // Calls:  None 
{ 
    int count = 0;    // Count number of tries 
    do // Continue until we get a valid file name and can open file 
    { 
     count++; 
     if (count != 1) // Issue error message if we are trying again. 
     { 
      cout << "\n\aInvalid file name or file does not exist. Please try again." 
       << endl; 
     } 
     cout << "\nEnter the input file name (maximum of " << MAX_FILE_NAME 
      << " characters please)\n:> "; 
     cin.get(name, MAX_FILE_NAME + 1);// Gets at most MAX_FILE_NAME characters 
     cin.ignore(256, '\n');   // Remove Enter key from keyboard buffer 
     input.clear();     // Clear all error flags, if any, from prev try 
     input.open(name, ios_base::in); // Open to read only if file exists 
    } while (input.fail());   // If can't open file, try again 
} // End of open_input() 

void read_values(ifstream& input, double v[], int size, int& used) // Read values 
                    // Parameters: Variables for file reference, variable for array reference, 
                    //    value for array size and variable for number of values in array 
                    // Returns: None 
                    // Calls:  None 
{ 
    double value;  // Value from file 
    int count = 0;  // Count number of values in file 

    while (count < size && input >> value) // Continue as long as there is 
              // room in the array and we can read 
    { 
     v[count] = value;     // a number from file. 
     count++; 
    } 

    used = count; 
} // End of read_values() 

double find_average(const double v[], int n) 
{ 
    double value; 
    double sum = 0; 
    int count = 0; 

    while (count >> value) 
    { 
     sum += value; 
     count++; 
    } 
    return sum/count; 
} 

void find_max_min(const double v[], int n, double& max, double& min) // Find max & min values 
                    // Parameters: Variables for array reference, value for number of values 
                    //    and variables for max and min values 
                    // Returns: None 
                    // Calls:  None 
{ 
    int i; // Array index and loop counter 

    max = min = v[0]; 

    for (i = 1; i < n; i++) // Start with 1 since max & min initialized to v[0] 
    { 
     if (v[i] > max) max = v[i]; 
     if (v[i] < min) min = v[i]; 
    } 
} // End of find_max_min() 

void output(const char name[], const double v[], int n, 
    double max, double min, double average, ostream& out) 
    // Parameters: File name, array reference, number of values and max & min values 
    // Returns: None 
    // Calls:  None 
{ 
    int i; // Array index and loop counter 
    out.setf(ios::fixed); 
    out.setf(ios::showpoint); 
    out.precision(1); 
    out << "\n\nInput File Name:   " << name << endl; 
    out << "\nFile Contents:" << endl; 
    for (i = 0; i < n;) 
    { 
     out << setw(8) << v[i]; 
     if (++i % 5 == 0) out << "\n"; // Print only 5 values per line 
    } 
    if (i % 5 != 0) out << "\n";  // Newline if last line is short 
    out << "\nLargest Number in File:  " << setw(8) << max << endl; 
    out << "Smallest Number in File:  " << setw(8) << min << endl; 
    out << "Average of Numbers:  " << setw(8) << average << endl; 
} // End of output() 
+0

像你需要用一個for循環遍歷數組的所有其他職能。你爲什麼不在'find_average()'中做這個? – NathanOliver

+2

第1步。瞭解如何調試代碼(以及如何分離問題並創建[mcve])。你也應該*真的*更喜歡原始數組上的std :: vector或std :: array。 – UnholySheep

回答

0

這是find_average函數中的while循環不正確。在count >> value語句中,變量值沒有初始化,所以它的值可以是任何東西(垃圾),並且shift運算符不能與double一起使用。

你可以試試這個:

while (count < n) 
{ 
    sum += v[count]; 
    count++; 
} 
return sum/count; 

或者使用一個for循環:

for (int i = 0; i < n; i++) 
{ 
    sum += v[i]; 
} 
return sum/n; 
+1

_ find_average函數中的while循環不好._你能解釋一下,爲什麼它不行。以及您的解決方案如何解決上述問題? –

+0

謝謝Rofellos。工作完美! –