-1

我想知道我是否真的走对了方向,我目前正在学习 C++ 语言并阅读 Alex Allian 的这本书,名为 Jumping into 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 << "CONTACTS\n";
    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    Number\n";
        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;
}
4

3 回答 3

2

Stackoverflow 不适合用于代码审查,但有一个不同的站点(尽管仍处于测试阶段):https ://codereview.stackexchange.com/

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

  • 您的程序忽略无效输入(输入 2、3 或任何其他数字,而不是 1 或 0)。
  • 您不检查您的user阵列是否已满。
  • 这不是真正的面向对象。

至于基本的理解......我想是的,但这实际上并不难开始。

为了实现“允许用户添加任意​​数量的条目”,您必须使用动态数组(询问用户他想添加多少条目)或使用一些动态存储(例如链表)。

于 2013-01-03T01:00:11.253 回答
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 之外)是强大的模板库。

我刚刚向您介绍了使用模板可以做什么。如果您有任何疑问,请发表评论。我们都曾到过你所在的地方,感谢你从一本书中自学。

于 2013-01-03T01:18:06.980 回答
0

从您的问题和代码来看,您似乎是一名新程序员,因此我将向您解释答案,并为您的代码提供一些注释。

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

使用地图将帮助您处理:

  • 尽可能多的项目
  • 按名称排序
  • 你会更容易过滤,这取决于你想做什么,以及你的过滤器有多复杂。

我谈到的其他方法虽然更基本,并且包含更多代码,但它们让您感觉如何自己实现地图对象,但这是一个不同的问题。

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

关于您的代码的一些注释。

    #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 不会是电话号码的上帝,因为有时您需要星号或哈希,或前导零,可能是加号。最好也使用字符串作为 tat。当然,每次您获得用户输入时,您都应该验证它 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 << "CONTACTS\n";
    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    Number\n";
        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;
}

我希望它有帮助

于 2013-01-03T01:20:41.380 回答