为多个用户输入创建结构和调用函数,并通过结构传递它以显示信息

时间:2015-12-18 01:25:13

标签: c++ arrays function data-structures

我必须创建一个C ++程序,要求用户输入不同的产品信息。所以我创建了一个结构来组织产品的成员,我必须使用3个函数,1要求用户输入,1要显示输入,1要显示每个Product项的最后一个成员Count。

我的代码:

#include <iostream>
#include <string>
#include<fstream>

using namespace std;


struct Product  //Structure
{
    char Name[25]; //Product Name
    char Type[25]; //Product Type
    char Exp_Date[25]; //Product Expiration Date
    double Price; //Product Price
    double Discount_Percentage; //Product Discount Percentage
    int Count; //Product Count in stock.
};

//Function Prototypes
Product Receive_Product_Information(Product);
void Display_All_Product_Information(Product & item);
void Display_Each_Product_Count(Product & item);

int main()
{
    Product Item[2];

    for (int i = 0; i < 2; i++)
    {
        cout << "Enter the product information for the number " << i+1 << "item" << endl;

        Product item[2];
        Item[i] = Receive_Product_Information(item[2]);
    }

    cout << "marker" << endl << endl;

    for (int i = 0; i < 2; i++)
    {
        Product item[2];
        Display_All_Product_Information(item[i]);
    }

    for (int i = 0; i < 2; i++)
    {
        Product item[2];
        Display_Each_Product_Count(item[i]);
    }

    return 0;
}

//Function Definitions

Product Receive_Product_Information(Product item)
{
    cout << "Enter Product Name: ";
    cin>>item.Name;

    cout << "Enter the Product Type: ";
    cin>>item.Type;

    cout << "Enter the Product Expiration Date: ";
    cin>>item.Exp_Date;

    cout << "Enter the Product Price: ";
    cin >> item.Price;

    cout << "Enter the Product Discount Price: ";
    cin >> item.Discount_Percentage;

    cout << "Enter the Product Count: ";
    cin >> item.Count;

    cout << endl << endl;

    return item;
}

void Display_All_Product_Information(Product &item)
{
    cout << "Name: " << item.Name<< endl;
    cout << "Type: " << item.Type << endl;
    cout << "Exp Date: " << item.Exp_Date << endl;
    cout << "Price: $" << item.Price << endl;
    cout << "Discount Percentage: " << item.Discount_Percentage << endl;
    cout << "Count: " << item.Count << endl;
    return ;
}

void Display_Each_Product_Count(Product &item)
{
    cout << "Product Count: " << item.Count << endl;
    return ;
}

我的问题:

我现在的问题是成员名称,类型和Exp_Date没有显示为字符串(即Apple,Fruit,December),而是我得到(## $ %%#$%$%#)

1 个答案:

答案 0 :(得分:0)

我发现此代码存在多个问题:

for (int i = 1; i <= 2; i++)

for语句分别在其两次迭代中执行一个循环,i设置为1和2。让我们记住这一点,同时检查循环的其余部分。

    Product item[2];

这声明了一个包含两个Products:item [0]和item [1]

的数组
Item[i] = Receive_Product_Information(item[i]);

此处的第一个错误是在第二次迭代中,这将引用item[2],因为i将为2,见上文。

不幸的是,只存在item[0]item[1],这是未定义的行为。 item是一个双元素数组,在两个元素数组中,您有元素#0和元素#1。不是元素#1和元素#2。

这也适用于Item数组。它在Item的情况下实际上更糟糕,因为它被分配给了。大多数实现的典型结果是损坏的堆栈和崩溃。

Product Receive_Product_Information(Product item)

Receive_Product_information()函数按值接收其参数。但是,该参数是从调用者范围内的尚未初始化的本地范围对象复制而来的。从技术上讲,这不是100%的错误,但这被认为是不好的做法。参数应该通过引用传递,或者对象的内容应该正确初始化。

此外,似乎传递Product参数并没有真正做任何事情.f。Receive_Product_Information()似乎使用标准输入来初始化item的内容...然后马上回来吧。那么,为什么它首先需要呢?

Receive_Product_Information()根本不需要此参数。它只需要自己构造一个Product的新实例,然后返回它。

此代码可能存在或可能没有其他问题,这正是我一眼就注意到的。