我想知道我是否真正朝着正确的方向发展,我目前正在学习C ++语言并阅读Alex Allain撰写的名为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;
}
答案 0 :(得分:2)
Stackoverflow并不适用于代码审核,但有一个不同的网站(尽管仍处于测试阶段):https://codereview.stackexchange.com/
我注意到了一些简单的事情:
user
阵列是否已满。至于基本的理解......我想是的,但实际上并不难开始。
要实现“允许用户添加任意数量的条目”,您必须使用动态数组(询问用户他想添加多少条目)或使用一些动态存储(例如链接列表)。
答案 1 :(得分: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;
}
}
使用矢量的好处是它可以自动调整大小并跟踪它的大小,而无需使用计数器项。
现在,对于一些有点棘手的事情。我们将使用地图来使用“key”值来获取名称。以下代码不会编译,但在功能上如何执行任务:
#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)是强大的模板库。
我刚刚给你一些关于模板的功能。如果您有任何疑问,请发表评论。我们一直都在你身边,感谢自己从一本书中自学。
答案 2 :(得分:0)
从您的问题和代码看起来您似乎是一名新程序员,因此我会向您解释答案,我会给您一些关于代码的注释。
为了解决“尽可能多的项目”的问题,方法很少。最简单的一个,可能是一个非常好的解决方案是使用map,在任何语言中都有不同的名称。但通常名称是字典,关联数组......
使用地图可以帮助您处理:
我谈到的其他方法,虽然更基本,并且包含更多代码,但它们让您感觉如何自己实现 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 << "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;
}
我希望它有所帮助