如何理解C ++函数/数据结构?

时间:2018-01-16 21:32:13

标签: c++

我在大学里学习C ++。我一直试图理解这段代码,但我改变的一切似乎都会引发更多的错误,我认为我的逻辑已被打破。我理解Python中的函数,但它在C ++中似乎并不正确。有人可以指出我在正确的轨道上使这个代码工作吗?

我一直在使用https://www.programiz.com/cpp-programming/structure-function作为参考,对我而言,我的代码似乎与列出的示例类似。我没有特定的问题,但我真的很感激有人指出我的错误是什么,因为现在我不明白我做错了什么,以便我可以重新研究它。

#include <algorithm>
#include <iostream>

using namespace std;


// FIXME (1): Define a data structure to hold bid information together as a 
single unit of storage.
struct Info {
    char title;
    int fund;
    int vehicleID;
    int bidAmount;
    };

// FIXME (4): Display the bid values passed in data structure
/**
 * Display the bid information
 *
 * @param ?type? data structure containing the bid info
 */
void displayBid(Info itemOne) {
    cout << "Title: " << itemOne.title << endl;
    cout << "Fund: " << itemOne.fund << endl;
    cout << "Vehicle: " << itemOne.vehicleID << endl;
    cout << "Bid Amount: " << itemOne.bidAmount << endl;

    return;
}

// FIXME (3): Store input values in data structure
/**
 * Prompt user for bid information
 *
 * @return data structure containing the bid info
 */
Info getBid() {
    Info itemOne;

    cout << "Enter title: ";
    cin.ignore();
    getline(cin, itemOne.title);

    cout << "Enter fund: ";
    cin >> itemOne.fund;

    cout << "Enter vehicle: ";
    cin.ignore();
    getline(cin, itemOne.vehicleID);

    cout << "Enter amount: ";
    cin.ignore();
    string strAmount;
    getline(cin, strAmount);
    itemOne.bidAmount = strToDouble(strAmount, '$');

    return;
}


double strToDouble(string str, char ch) {
    str.erase(remove(str.begin(), str.end(), ch), str.end());
    return atof(str.c_str());
}

int main() {

    // FIXME (2): Declare instance of data structure to hold bid information
    Info itemOne;

    // loop to display menu until exit chosen
    int choice = 0;
    while (choice != 9) {
        cout << "Menu:" << endl;
        cout << "  1. Enter Bid" << endl;
        cout << "  2. Display Bid" << endl;
        cout << "  9. Exit" << endl;
        cout << "Enter choice: ";
        cin >> choice;

        // FIXME (5): Complete the method calls then test the program
        switch (choice) {
            case 1:
                itemOne = getBid();
                break;
            case 2:
                displayBid(itemOne);
                break;
        }
    }

    cout << "Good bye." << endl;

    return 0;
}

编辑:这是错误:

  1. 没有匹配函数来调用&#39; getline(std :: istream&amp;,int&amp;)&#39; Lab1-3.cpp / Lab1-3 / src第59行C / C ++问题

  2. 没有匹配函数来调用&#39; getline(std :: istream&amp;,char&amp;)&#39; Lab1-3.cpp / Lab1-3 / src第52行C / C ++问题

  3. 无效的参数&#39 ;:候选人是: int getline(char * *,unsigned int *,_ iobuf *) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;,#0) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;,#0) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;) &#39; Lab1-3.cpp / Lab1-3 / src第52行语义错误

  4. 无效的参数&#39; 候选人是: int getline(char * *,unsigned int *,_ iobuf *) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;,#0) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;,#0) 的std :: basic_istream&LT;#0,#1&GT; &安培; getline(std :: basic_istream&lt;#0,#1&gt;&amp;,std :: __ cxx11 :: basic_string&lt;#0,#1,#2&gt;&amp;) &#39; Lab1-3.cpp / Lab1-3 / src第59行语义错误

  5. &#39; strToDouble&#39;未在此范围内声明Lab1-3.cpp / Lab1-3 / src第65行C / C ++问题

2 个答案:

答案 0 :(得分:3)

正如@SoronelHaetir指出的那样,第一个问题是你试图将title分配给只能容纳一个字符的变量。相反,您应该使用char数组,char指针,甚至字符串对象来包含多字母值。在下面的代码示例中,我使用固定大小为25的char数组来存储标题。请注意,最多只能存储24个字符,因为char数组需要特殊字符,表示char数组的结尾。否则它最终会在您想要的值之后写 junk 。该特殊字符是空终止字符,其编写方式类似于'\0'

return;函数中使用void displayBid(Info itemOne);语句是完全不必要的。虽然您可以使用return;来停止执行函数,但是您将它放在函数的末尾,该函数即将以正常方式结束,但是您没有理由强制它。此外,对于返回void的函数,你不需要任何return;语句。没有。

然后,fundbidAmount表示货币值,可能是也可能不是整数值,因此您应该考虑存储floatdouble个数据类型货币价值。

接下来就是你的职能Info getBid();。首先,我不得不说命名可能有点令人困惑。如果您在没有看到其实际代码的情况下阅读该功能的名称,您将如何理解它可能做什么?对我来说,这听起来好像是要向我提供有关出价的信息,而实际上它正在设置它。其次,您可以通过我在代码示例中的方式简化输入值的代码。您尝试使用不同技术从用户输入获取值的方式有点不对。 getline是与istream个对象一起使用的成员函数。您的istream对象为cin。要访问该成员函数,您应将其编写为cin.getline( 以进行讨论 );。该功能仅适用于角色。它的第一个参数接受指向第一个字符(第一个字符的地址)的字符序列指针。

第二个参数是整数数据类型,它指定要从输入中提取的字符数,并存储在代替第一个参数的参数中。请注意不要编写,例如25,因为在char数组中,你必须为'\0'字符留出一个位置,该字符会自动放置在需要它的位置。 getline成员函数还有默认分隔符'\n',表示新行。这意味着您可以输入比函数提取的字符少的字符,因为一旦从用户输入读取分隔符值,提取就会停止。虽然,如果您需要特定的分隔符,getline成员函数有其重载版本,第三个参数是您输入所需分隔符作为参数的参数。 (重载函数基本上是具有相同名称但功能不同的函数。它们在不同的实现中提供相同的功能。)

即使您为出价设置了值,也从未将其从函数中返回。您正确地说它的返回值是Info,但您没有返回它。实际上,你在正常退出之前就退出了。相反,你应该写return itemOne;在我的代码示例中,我通过引用传递了int main();函数中创建的变量,这意味着它不是通常的副本,所以我不必返回它分配给另一个相同类型的变量以适当地应用所需的更改。

最后,在int main();函数中,您可以声明int choice,而无需初始化它并按照我的方式使用do-while循环。此外,switch语句提供了定义如果没有任何一个案例都会发生的情况,那就是在你编写default:之后的所有情况下,以及在你想要发生的任何情况下。在您的代码示例中,即使用户输入除1,2之外的任何内容,您的函数也将继续执行,但9定义为停止执行。在我的代码示例中,除了1和2之外的任何用户输入,包括零,函数将退出。好吧,除了换行。

并且,让我们再次讨论命名。您的数据结构名称必须直接暗示它是什么。 Info不这样做。该名称实际上更适合调用void displayBid(Info itemOne);函数。在我的代码示例中,我将其重命名为Bid

#include <iostream>
using namespace std;

struct Bid
{
    char title[25];
    int vehicleID;
    double fund;
    double bidAmount;
};

void GetBid(Bid item)
{
    cout << "Title: " << item.title << endl;
    cout << "Fund: " << item.fund << endl;
    cout << "Vehicle: " << item.vehicleID << endl;
    cout << "Bid Amount: " << item.bidAmount << endl;
}

void SetBid(Bid & item)
{
    cout << "Enter title: ";
    cin >> item.title;

    cout << "Enter fund: ";
    cin >> item.fund;

    cout << "Enter vehicle ID: ";
    cin >> item.vehicleID;

    cout << "Enter amount: ";
    cin >> item.bidAmount;
}

int main()
{
    Bid item;
    int choice;

    do {
        cout << "Menu:" << endl;
        cout << "  1. Enter Bid" << endl;
        cout << "  2. Display Bid" << endl;
        cout << "  0. Exit" << endl;
        cout << "Enter choice: ";
        cin >> choice;

        switch (choice)
        {
            case 1:
                SetBid(item);
                break;
            case 2:
                GetBid(item);
                break;
            default:
                choice = 0;
                cout << "Goodbye." << endl;
                break;
        }
    } while (choice != 0);

    return 0;
}

答案 1 :(得分:0)

第一个(也是最大的)问题是:

char title;

这允许您只存储单个字符而不是整个名称(更喜欢std::stringchar数组)。