我正在完成 Alex Ellaine 书中的任务。在一项测试任务中的指针和链接主题之后,他要求编写一个包含联系人列表的程序。一个先决条件是结构是动态的。我写了代码。但是我在创建动态结构时遇到了问题。我的问题的本质是我无法组织程序的逻辑并且不知道在什么特定时刻最好声明一个动态变量来使用该结构。下面我附上我的代码。通常,代码编译并运行。但是,填写联系人信息并要求他们显示后,只会显示联系人的数量,但字段将完全为空。此外,我在调试模式下运行代码,但仍然无法理解循环中的变量在什么时候“丢失”。
#include <iostream>
using namespace std;
//Собственно, сама структура
struct People
{
string UName;
string UJob;
int UPhone;
};
int pins = 0; //В этой переменной хранится информация о том, сколько в сумме имеется записей в книжке
int main() // Точка входа в программу
{
//Сперва, мы взаимодействуем с пользователем. Спрашиваем у него, что конкретно он хочет сделать
int action; //Переменная, которая помнит выбор пользователя
cout << "\nWelcome to Contact app. \n\n" <<
"1 - Show contact list.\n" <<
"2 - Add new contact.\n\n" <<
"Your action: ";
cin >> action; //Реагируем на действия
switch (action)
{
case 1:
// Цикл 1. Если количество записей ноль, то пишем уведомление.
if (pins == 0)
{
cout << "Contact list empty...\n";
main();
}
else
//Если есть записи, то выводим их на экран
{
People My_people[pins];
for (int i = 0; i < pins; i++)
{
cout << "Name: " << My_people[i].UName << '\n' <<
"Job: " << My_people[i].UJob << '\n' <<
"Phone number: " << My_people[i].UPhone << '\n';
}
//Конец цикла 1.
}
main(); //Выходим в начало программы
break;
case 2:
//Добавляем контакты
//Объявляем необходимые переменные.
int NewContact;
string name;
string job;
int PN;
//Спрашиваем, сколько будет новых контактов
cout << "How many new contacts do you want to add?\n";
cin >> NewContact;
//Заполняем поля в цикле столько раз, сколько указано указано в переменной выше
for (int i = 0; i < NewContact; i++)
{
cout << "Name new contact: \n";
cin >> name;
cout << "As whom does " << name << " work?\n";
cin >> job;
cout << name << " phone number: \n";
cin >> PN;
pins = pins + 1; //Увеличиваем на 1 количество записей.
}
//Добавляем данные в динамическую структуру. Так как неизвестно сколько по факту будет новых пользователей
People *my_people = new People[NewContact];
//Копируем по одном введённую выше в структуру.
for (int i = 0; i < pins; i++)
{
my_people[i].UName = name;
my_people[i].UJob = job;
my_people[i].UPhone = PN;
}
delete[] my_people;
main(); //Выходим в главное меню
break;
}
}
代码结果可以在链接中查看:
当我做这样的事情时,没有任何 Switch 分支(某种轻量级版本),代码工作正常。即使它被驱动到 Do While 循环并执行任意次数。
#include <iostream>
using namespace std;
struct People
{
string name;
int health;
};
int main ()
{
int action;
cout << "Enter how much new player: \n";
cin >> action;
People *my_people = new People[action];
for (int i = 0; i < action; i++)
{
cout << "NAme: \n";
cin >> my_people[i].name;
cout << "health int \n";
cin >> my_people[i].health;
}
for (int i = 0; i < action; i++)
{
cout << "result: \n";
cout << my_people[i].name << '\n' <<
my_people[i].health << '\n';
}
delete[] my_people;
system("pause");
}
数据被添加到 my_people 数组中;
在 pin 元素上声明一个空数组 My_people 并立即尝试显示这些值。这些是不同的数组,它们对彼此一无所知。
与您的第二个选项一样,您需要在 main () 函数的开头声明
并且只和他一起工作。
关于此代码
您在循环中将值写入变量字符串名称;字符串作业;int PN,每次覆盖旧值。然后在一个单独的循环中,将 People 类的实例添加到具有相同值的数组中。这是一个可能的解决方案:
我通过以下方式解决了这个问题:我的主要问题是我无法确切地弄清楚如何以新数据不会删除以前的数据的方式组织使用动态内存的工作,如何在屏幕上显示所有这些,等等。
在我没有经验的情况下,我为复制操作制作了太多动态数组(旧的,然后“粘合”旧的加上新的条目,等等)。他感到困惑,并从简单的事情中做出了复杂的事情。在深入研究了 Ellaine 的教程后,我发现了文件流之类的东西,我终于明白了为什么(以及它如何工作)需要将参数传递给函数。
为了:
谢谢大家的回复,我的问题已经解决了。