我的源代码是否显示了我对c ++中结构的理解?

我想知道如果我事实上是朝着正确的方向发展的,我目前正在学习C ++语言,并阅读由Alex Allain撰写的名为“跳进C ++”的书,并且在本章末尾有一个关于结构的实践问题,一个联系簿程序用户应该不能只填写一个结构,但应该能够添加新的条目,每个条目都有一个单独的名称和电话号码。 让用户添加尽可能多的条目 - 这很容易吗? 添加显示全部或部分条目的功能,让用户浏览条目列表。

到目前为止,以下是我所做的,我想知道我的源代码是否正确,它是否显示我对结构和整体c ++的理解?

#include "stdafx.h"
#include "iostream"
#include "string"

using namespace std;

struct user{
    string name;
    int phone_num;
};


int _tmain(int argc, _TCHAR* argv[])
{
    int input, number;                      // will hold the users input at the beginning of the program
    int counter = 0;                // keep track of the array position
    int const arraySize = 10;       // size of the array
    user new_username[arraySize]; // will hold the users details    
    string name;                    // will hold the users input for the name

    cout << "CONTACTSn";
    do{     


        cout << "+ADD [1] -EXIT[0]";
        cin >> input;


        if(input == 1){

                //cout << counter;
                cout << "nName: ";
                cin >> name;
                new_username[counter].name += name;
                cout << endl << "nPhone: ";
                cin >> number;
                new_username[counter].phone_num =  number;
                counter++;
            //set_user(counter);            

        }
        cout << "Name    Numbern";
        cout << "--------------n";
        for(int j=0; j < arraySize; j++){

                cout << new_username[j].name;
                cout << " -- ";
                cout << new_username[j].phone_num;
                cout << "n";
        } 

        cout << "n";

    }while(input != 0);


    cout << "n";
    system("PAUSE");
    return 0;
}

如果您希望用户能够添加尽可能多的联系人,您可以使用强大的标准模板机制。

对于这个应用程序,我会建议看看

std::vector

要么

std::map

这就是你将如何使用它们:(请记住这是伪代码,不会编译)

#include <vector>

typedef struct {
   std::string name;
   double phoneNumber;
} YourStruct;

int main( int argc, char **argv ) {

std::vector<YourStruct> structVector;

do {
    int input;
    std::cin >> input;
    if (input) {
       //(read user input for name and number) 
       YourStruct yourStruct;
       yourStruct.name = (user input)
       yourStruct.phoneNumber = (user input)
       // insert into the vector
       structVector.push_back(yourStruct)
    }
} while (input != 0)

// now to print what you have:
for (int i = 0; i < structVector.size(); i++) {
    std::cout << structVector[i].name << ", " << structVector[i].number << std::endl;
}
}

使用矢量的好处在于,它可以自动调整大小并跟踪它的大小,而无需使用计数器项目。

现在,有点棘手。 我们将使用地图来使用“键”值来获取名称。 以下代码不会编译,但它在功能上将如何执行该任务:

#include <map>

int main(int argc, char** argv) {
    std::map<std::string,double> myMap;
    // the string is the "key" value, which can be the name of the person
    // while the "independent" is the phone number
    do {
       // determine if the user wants to put another entry in the map
       if (insert) {
          std::string name = (user input name)
          double number = (user input number)
          myMap[name] = number;
       }
    } while (input != 0)

    // now we can iterate through the map
    std::map<std::string,double>::iterator it;
    for (it = myMap.begin(); it != myMap.end(); ++it) {
       std::cout << it.first << ", " << it.second << std::endl; 
    }

    // also, you can look up by name
    it = myMap.find("Tony Stark");
    if (it != myMap.end()) { // if this condition is met, it means you found one
       std::cout << it.first << ", " << it.second << std::endl; 
    }
}

总的来说,你的代码看起来不错 但是,它不是C ++。 你像C程序员一样编程。 C ++的美丽(当然除了polymophisim)是强大的模板库。

我刚刚给你一点你能用模板做什么的感觉。 如果您有任何疑问,请发表评论。 我们一直都在你的身边,为自己从书本中学习而感到自豪。


Stackoverflow并不意味着用于代码评论,但是这里有一个不同的网站(虽然仍在测试中):https://codereview.stackexchange.com/

只是我注意到一些快速的事情:

  • 您的程序会忽略无效输入(输入2,3或任何其他数字而不是1或0)。
  • 你不检查你的user数组是否已满。
  • 这不是真正的面向对象。
  • 至于基本的理解......我想是的,但这并不难。

    要完成“允许用户添加任意​​数量的条目”,您必须使用动态数组(请询问用户要添加多少条目)或使用某些动态存储(例如链接列表)。


    从你的问题和代码看,你似乎是一个新的程序员,因此我会向你解释答案,并且会给你一些关于你的代码的注释。

    为了解决“尽可能多的项目”的问题,几乎没有办法。 最简单的一个,也许是一个很好的解决方案,就是使用map,任何语言都有不同的名字。 但通常名称是字典,关联数组...

    使用地图将帮助您处理:

  • 尽可能多的项目
  • 按名称排序
  • 你过滤起来会更容易,这取决于你想要做什么,以及你的过滤器有多复杂。
  • 我谈到的其他方法更基本,包含更多的代码,但它们让你感觉如何自己实现地图对象,但这是一个不同的问题。

    在我上面提到的链接中,例子是用于电话输入。 但是如果你仍然想使用struct,你可以把键作为名字,而把它的值作为结构本身。 其中一个理由可能是您稍后计划添加地址和公司名称。

    关于你的代码的一些说明。

        #include "stdafx.h"
     #include "iostream"
    #include "string"
    
    using namespace std;
    
    //use meanigful name, instead of user it can be phoneEntry
    struct user{
        string name;
    //Starting using the following conventions using the capital letter in variable names for example phoneNumber
    

    // int不会是电话号码的神,因为有些时候你需要星号或散列,或者是前导零,也许是加号。 对于达特也更好。 当然,每次你得到一个用户输入你应该验证它int phone_num; };

    //Why the name of the function is not main, why its _tmain
    int _tmain(int argc, _TCHAR* argv[])
    {
    //Keep going with your comments, with time you would imbrase your own style based on things that you will see. But in general commenting is very important
    //Give meanigful name, instead input userCommand for example
        int input, number;                      // will hold the users input at the beginning of the program
        int counter = 0;                // keep track of the array position
        int const arraySize = 10;       // size of the array
    //Again meangful names
        user new_username[arraySize]; // will hold the users details    
        string name;                    // will hold the users input for the name
    
        cout << "CONTACTSn";
        do{     
    
    
            cout << "+ADD [1] -EXIT[0]";
            cin >> input;
    
    
            if(input == 1){
    
                    //cout << counter;
                    cout << "nName: ";
                    cin >> name;
                    new_username[counter].name += name;
                    cout << endl << "nPhone: ";
                    cin >> number;
                    new_username[counter].phone_num =  number;
                    counter++;
                //set_user(counter);            
    
            }
            cout << "Name    Numbern";
            cout << "--------------n";
            for(int j=0; j < arraySize; j++){
    
                    cout << new_username[j].name;
                    cout << " -- ";
                    cout << new_username[j].phone_num;
                    cout << "n";
            } 
    
            cout << "n";
    
        }while(input != 0);
    
    
        cout << "n";
        system("PAUSE");
        return 0;
    }
    

    我希望它有帮助

    链接地址: http://www.djcxy.com/p/40279.html

    上一篇: Does my source code shows my own understanding of structures in c++?

    下一篇: Is the sizeof(some pointer) always equal to four?