RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 714084
Accepted
Денис
Денис
Asked:2020-09-04 15:15:36 +0000 UTC2020-09-04 15:15:36 +0000 UTC 2020-09-04 15:15:36 +0000 UTC

c++中的动态结构

  • 772

我正在完成 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;
    }
}

代码结果可以在链接中查看:

http://cpp.sh/8nj6k

当我做这样的事情时,没有任何 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");
}
c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Александр
    2020-09-04T15:33:37Z2020-09-04T15:33:37Z
    //Добавляем данные в динамическую структуру. Так как неизвестно сколько по 
     факту будет новых пользователей
    People *my_people = new People[NewContact];
    

    数据被添加到 my_people 数组中;

    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';
    }
    

    在 pin 元素上声明一个空数组 My_people 并立即尝试显示这些值。这些是不同的数组,它们对彼此一无所知。

    与您的第二个选项一样,您需要在 main () 函数的开头声明

    People *my_people = new People[size];
    

    并且只和他一起工作。

    关于此代码

        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;
    

    您在循环中将值写入变量字符串名称;字符串作业;int PN,每次覆盖旧值。然后在一个单独的循环中,将 People 类的实例添加到具有相同值的数组中。这是一个可能的解决方案:

    int NewContact;
    string name;
    string job;
    int PN;
    
    //Спрашиваем, сколько будет новых контактов
    cout << "How many new contacts do you want to add?\n";
    cin >> NewContact;
    
    People *my_people = new People[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 количество записей.
    
        my_people[i].UName = name;
        my_people[i].UJob = job;
        my_people[i].UPhone = PN;
    }
    
    • 0
  2. Best Answer
    Денис
    2020-09-20T18:13:58Z2020-09-20T18:13:58Z

    我通过以下方式解决了这个问题:我的主要问题是我无法确切地弄清楚如何以新数据不会删除以前的数据的方式组织使用动态内存的工作,如何在屏幕上显示所有这些,等等。

    在我没有经验的情况下,我为复制操作制作了太多动态数组(旧的,然后“粘合”旧的加上新的条目,等等)。他感到困惑,并从简单的事情中做出了复杂的事情。在深入研究了 Ellaine 的教程后,我发现了文件流之类的东西,我终于明白了为什么(以及它如何工作)需要将参数传递给函数。

    为了:

    • 如果用户添加了新联系人,那么程序首先会询问会有多少联系人。然后填充(动态)结构的字段。毕竟,文件流将结构数据写入磁盘。
    • 如果用户想要查看联系人列表,则调用一个单独的函数来打开文件流,再次从(动态)结构中填充数组,然后从中获取数据以输出到控制台。
    • 一个不错的奖励,我也终于明白了 - 矢量<> =)

    谢谢大家的回复,我的问题已经解决了。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5