C ++指针和结构

时间:2019-02-10 10:09:18

标签: c++ arrays pointers struct iostream

我必须执行以下任务:

  1. 读取文件person.txt中有关个人的信息(请参见下文),并存储到数组p中。首先将每个人的配偶指针设置为NULL值。
  2. MaryTom执行结婚操作。您可以通过将他们的配偶指针设置为彼此指向来结婚(彼此的存储地址)。
  3. 打印出数组p中的内容,您需要在其中打印数组p指向的每个人员变量。如果某人的配偶指针为NULL值,则打印Not Married,否则打印配偶名称。程序的输出如下所示。确保您的输出相同。

我可以做(1),读取文本文件person.txt,其内容如下:

Mary        012-35678905    20000
John        010-87630221    16000
Alice       012-90028765    9000
Tom         019-76239028    30000
Pam         017-32237609    32000

但是我不知道该怎么做(2)和(3)。

根据问题提供的模板,这是我到目前为止所做的,并且我不应该更改:

#include <iostream>    //>>>>>>> This part is the template given >>>>>>>
#include <cstdlib>     //
#include <fstream>     //
                       //
using namespace std;   //
                       //
struct person          //
{                      //
char name[30];         //
char phone[15];        //
double money;          //
person *spouse;        //
};                     //
                       //
int main()             //
{                      //
person *p[10];         //<<<<<<<< This is the end of the template part <<<  

ifstream inFile;
inFile.open("person.txt");

if (inFile.fail())
{
    cout << "Error in opening the file!" << endl;
    exit(1);
}

char name[30], phone[15];
int money;
int number = 5;

for (int i = 0; i < number; i++)
{
    inFile >> name >> phone >> money;
    cout << "Name:" << name << endl;
    cout << "Phone:" << phone << endl;
    cout << "Money:" << money << endl;
    cout << "Spouse Name:" << endl;
    cout << endl;
}

cin.get();

system("pause");
return 0;
}

预期输出应如下所示:

Name: Mary
Phone Number:012-35678905
Money: 20000
Spouse Name:Tom

Name: John
Phone Number:010-87630221
Money: 16000
Spouse Name: Not Married

...

1 个答案:

答案 0 :(得分:1)

请注意,本练习显示了对C ++的过时使用

首先进入您忘记使用的数组pp[10]是10的数组。但是10是什么? person*的指针,因此指向人的指针。

这是非常老式的C ++。如果您在互联网上学习课程,请立即进行更改,因为如今,我们将使用vector<person>stringnullptr。如果这是一门课程,您别无选择,所以让我们继续...

基于您已经完成的操作的一些提示

首先简化阅读循环,不要忘记按照问题中的要求将指针设置为NULL

for (int i = 0; i < number; i++)
{
    person *r = new person;                     // allocate a new person 
    inFile >> r->name >> r->phone >> r->money;  // read data into the new person
    r->spouse = NULL;                           // initialize the poitner
    p[i] = r;                                   // store the pointer in the array 
}

您几乎已经拥有印刷部分(3)。您只需要将其从阅读循环移至新循环,从数组中打印并解决已婚人士的特殊情况:

for (int i = 0; i < number; i++)
{
    cout << "Name:" << p[i]->name << endl;
    cout << "Phone:" << p[i]->phone << endl;
    cout << "Money:" << p[i]->money << endl;
    cout << "Spouse:" ;
    if (p[i]->spouse==NULL) {
         cout << "Not married" <<endl; 
    }
    else {
         cout << p[i]->spouse->name <<endl; 
    }
    cout << endl;
}

现在可以自己做点事情

现在要结婚(2)中的“嫁给汤姆”。这更加精致。我不会为您做这件事,因为现在您拥有完成作业所需的一切。但一般原则是:

  • 创建两个指针spouse1spouse2并将它们初始化为NULL。
  • 遍历数组以查找哪个人是Tom和哪个人是Marry,并更新相关的指针(例如spouse1 = p[i];
  • 在循环结束时,检查我们是否找到了两个配偶(两个指针都不再为NULL,并且两个指针也不相同,因为您无法与自己的人结婚)
  • 如果可以的话,就嫁给他们:spouse1->spouse=spouse2; spouse2->spouse=spouse1;

最后,在结束程序之前,您需要释放数组中的所有指针(使用向量,则不必担心)。

需要进一步改进

您仍然需要改善阅读循环,使其更具动态性。因为实际上,您不知道文本文件中有多少行。因此,从number=0开始,并尽可能长时间地读取数据,每次都递增number,但是如果不再可能读取,或者如果达到数组的最大大小,则停止。