简体   繁体   English

我怎样才能在没有向量的情况下改进这个 C++ 程序?

[英]How could I improve this c++ program without vectors?

**Guidelines:**get 3 seperate lists of data(array) for head of household, annual income, and household members, then get all annual incomes and average them together. **指南:**获取户主、年收入和家庭成员的 3 个单独的数据列表(数组),然后获取所有年收入并将它们平均在一起。 Display in a neat table.陈列在整洁的桌子上。

This is from a school project I wasn't allowed to use anything very advanced but I'd like to go back and improve it now.这是来自一个学校项目,我不允许使用任何非常先进的东西,但我现在想回去改进它。 I'd like ti make it cleaner and particularly like to find more that I can take away from it than add to it.我想让它更干净,特别想找到更多我可以从中带走的东西,而不是添加进去。

// <Program Name> Programming Project #3 Average Income (Using Functions and Arrays)
// <Author> Brendan Jackson
// <Date of Programs Release> 08/05/15
// <Program Description> takes 3 arrays and displays them with average income
#include <iostream> // allows cin and cout statements
#include <iomanip> //allows setprecision
#include <string> //allows strings
using namespace std; // Namespace std allows program to use entities from <iostream>

int input(string[], int[], double[]); //function 1
double calculate_average_income(double[], int);  //function 2
void display_survey_data(string[], int[], double[],int , double);  //function 3


int main() // main function
{

    //variables for functions
    string name[10];

    int members[10];

    double income[10];

    int count_of_households;

    double average;

    //get input
    count_of_households = input(name, members, income);

    //calculate average
    average = calculate_average_income(income, count_of_households);


    //output all data in table
    display_survey_data(name, members, income, count_of_households, average);


    return 0;

}


int input(string name[], int members[], double income[]) //function 1
{

    // get household info
    int count_of_households = 0;

    cout << "How many house holds were there? ";
    cin >> count_of_households;
    //TODO: handle bad input (characters and decimals)
    if (count_of_households >= 11 || count_of_households < 0) 
    {
        cout << "must enter valid # " ; //TODO: more description
        count_of_households = 0; //set back to safe value
    }
    else 
    {

           //cycle through arrays                  
        for (int count = 0; count < count_of_households; count++) //TODO:  take out (count + 1) start from 1 alternatively
        {

            // get survey info for names
            cout << "Enter household #" << (count + 1) << "'s head of household name\t"  ;
            cin.ignore() ; // ignores keyboard buffer characters
            getline (cin, name[count]) ; 


            // get survey info for income
            cout << "Enter household #" << (count + 1) << "'s annual income\t"  ;
            cin >>  income[count];


            // get survey info for members
            cout << "Enter household #" << (count + 1) << "'s household members\t"  ;   
            cin >>  members[count]; 
        }   
    }
    return count_of_households;
}

double calculate_average_income(double income[], int count_of_households) //function 2
{


    //add incomes together
    double total = 0.0;
    double average = 0.0;

    //loop over income
    for (int count = 0 ; count < count_of_households; count++)
    {
        //add income to runnning total
        total += income[count];  
    }

    // save calculations
    average = total / count_of_households; 
    return average;
}




void display_survey_data(string name[], int members[], double income[],int count_of_households, double average) //funtion 3
{
    //print out header
    cout << setw(30) << ""
         << setw(30) << ""
         << setw(30) << "NUMBER OF\n" ;
    cout << setw(30) << "HOUSEHOLD NAME"
         << setw(30) << "ANNUAL INCOME"
         << setw(30) << "HOUSEHOLD MEMBERS\n" ;
    cout << setw(30) << "--------------------" 
         << setw(30) << "---------------" 
         << setw(30) << "------------------------\n" ;      
    ///loop over values
    for (int count = 0 ; count < count_of_households; count++)
    {
        cout << setw(30) << name[count]
             << setw(30) << setprecision(2) << fixed << showpoint << income[count]
             << setw(30) << members[count] 
             << endl;   
    }   
    // display average
    cout << endl
         << setw(30) << "AVERAGE INCOME"
         << setw(30) << average
         << endl;
}

You could use std::array你可以使用std::array

This is simply an array on the stack, just like you used, but has iterators, type safe, bound safe, use value semantics and work with most stl algorithm.这只是堆栈上的一个数组,就像您使用的一样,但具有迭代器、类型安全、绑定安全、使用值语义和大多数 stl 算法。

It is declared like this:它是这样声明的:

array<string, 3> myArray;

And it must be passed by reference, because passing by value will copy it's content:它必须通过引用传递,因为通过值传递将复制它的内容:

void doSomething(array<int, 6>& aArray) {
    // do something
}

Notice that you must specify the length of the array, since it's a template parameter.请注意,您必须指定数组的长度,因为它是一个模板参数。 If you want to have an array of any size, use tempaltes:如果你想要一个任意大小的数组,请使用模板:

template<size_t length>
void foobar(array<double, length> theArray) {
    // do something else
} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM