【问题标题】:Need help passing arrays, and input arrays需要帮助传递数组和输入数组
【发布时间】:2017-07-01 00:30:26
【问题描述】:

所以这是一个经常被混淆的话题,数组总是通过引用传递的。

这个计划的目的是让一家公司弄清楚他们的小猫每周吃多少食物。

所以该程序运行良好,但是每当我发送我的食物值时,用户自己输入(这些是每只小猫每周吃的食物量),它发送回的值不是我的试图传递,它们只是内存中的随机数,我认为这是因为我没有返回值,但我读到这些值是通过引用传递的,你不需要返回值,

请帮忙!

#include <iostream>

using namespace std;
void kittyfood(string kittyNames[], int sizeOfArray);                 //prototype for kittyfood function
void report(string kittyNames[], int sizeOfArray, float food[]);        //prototype for report function

int main()
{
    string names[5]={"Fluffy","Sneaky","Moonie","Stuffy","Oriana"};   //set cat names to the array
    float food[5];                                                  //float array for food amounts with 5 elements
    kittyfood(names,5);                            //call too kittyfood function passing the kitty names and the size of array
    report(names,5,food);                //call to report function with kitty names, size of array, and ammount of foods
    return 0;
}

void kittyfood(string kittyNames[], int sizeOfArray)
{   
    float food[5];
    for (int i=0;i<sizeOfArray; i++)                //loop to go through cat names and get the amounts of food they eat
    {
        cout << "Please enter the amount of food in pounds "<< kittyNames[i] << " eats weekly\n";  //prompt user food eaten
        cin >> food[i];           //user input food eaten
        while (food[i]<0)
        {
            cout << "This cannot be a negative ammount \n";         //input validation
            cin >> food[i];
        }
    }
}

void report(string kittyNames[], int sizeOfArray, float food[])
{
    float smallest, largest;                    //declaration for the smallest and largest amount
    string smallestName, largestName;           //declaration for the cat that eats the most or least
    smallest=largest=food[0];                   //initialize the smallest and largest at the first array food value
    smallestName=largestName=kittyNames[0];     //initialize for the smallest and largest eaten for the first cat name in array
    float totalFood;                    //declaration
    totalFood=0;                        //initialization
    for (int i=0;i<sizeOfArray; i++)        //loop to go through cats and  display their name and amount of food they ate
    {
        cout << kittyNames[i] << " eats "<< food[i]<< " pounds of food weekly \n";
        if (smallest > food[i])
        {
            smallest = food[i];                         //if the food amount is less than the original value then replace it
            smallestName=kittyNames[i];                 //change the name of the cat to the new cats name
        }

        if (largest < food[i])
        {
            smallest = food[i];                     //if the food amount is more than the original then replace it
            largestName = kittyNames[i];            //change the name of the cat to thew new cats name
        }
        totalFood+=food[i];     //keep adding the amounts of food to the total each time the loop goes through
    }
    cout << endl<<smallestName << " ate the least amount of food at " << smallest << " pounds \n";  //display the lowest cats name + ammount
    cout << largestName << " ate the most amount of food at " << largest << " pounds \n";           //display the largest cats name + ammount
    cout << "The total amount of food eaten weekly is "<<totalFood<<endl;      //display total food eaten
}

【问题讨论】:

  • 内置 (C) 数组作为指针传递给函数。更改为 std::vector<:string> 并将它们作为参考传递会让您更轻松。
  • 传递food数组作为kittyfood()的参数。
  • 我还没有了解向量,但是谢谢,是的,它现在可以作为 kittyfood() 的参数使用,我对此有点困惑

标签: c++ arrays pass-by-reference


【解决方案1】:

问题在于 kittyfood 函数中的食物是一个局部变量,与您在主函数中创建的数组不同。

函数返回后,局部变量被销毁,而 main 上的变量仍未初始化,因此包含垃圾值。

【讨论】:

    【解决方案2】:

    main 中的food 数组与kittyfood 中的food 数组不同。在kittyfood 中,您正在使用一些值填充函数数组的本地。因此,main 中的数组具有未定义的内容。

    您也可以将food 数组传递给kittyfood,如下所示:

    int main()
    {
        string names[5]={"Fluffy","Sneaky","Moonie","Stuffy","Oriana"};   
        float food[5];  
        kittyfood(names, food, 5);       
    }
    
    void kittyfood(string kittyNames[], float food[], int sizeOfArray)
    {   
       // populate the food array
    }
    

    或者您可以使用std::vectorstd::array 让您的生活更轻松,但这不是问题所在。

    【讨论】:

    • 现在可以了,这是一个简单的修复,但您能解释一下原因吗?如果在那个函数之后它不是一个东西,为什么我什至会将它传递给那个函数是没有意义的。
    【解决方案3】:

    您从kittyfood 函数的标准输入中读取了食物量(float food[5]; 变量)并且从不使用它。我想这会对你有所帮助。

    void kittyfood(string kittyNames[], int sizeOfArray, float food[])
    {   
        for (int i=0;i<sizeOfArray; i++)                //loop to go through cat names and get the amounts of food they eat
        {
            cout << "Please enter the amount of food in pounds "<< kittyNames[i] << " eats weekly\n";  //prompt user food eaten
            cin >> food[i];           //user input food eaten
            while (food[i]<0)
            {
                cout << "This cannot be a negative ammount \n";         //input validation
                cin >> food[i];
            }
        }
    }
    

    【讨论】:

    • 谢谢,它说float food[5]这行隐藏了一个参数,所以我删除了它,现在它可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2013-12-08
    • 2016-10-07
    相关资源
    最近更新 更多