Member 13822923 Ответов: 2

Проблема в массивах и классах


Создайте класс "Person", который имеет в частном разделе три поля. "Имя" &st-это
строка, представляющая имя человека* Второй "лучший" - это указатель на
тип персона, представляющий человека, который является лучшим другом этого человека. Третий
"популярность" - это целое число, указывающее, насколько популярен этот человек. Другими словами, сколько других людей имеют его в качестве лучшего друга .

Открытый интерфейс должен иметь следующие функции : конструктор по умолчанию с параметром 1 , имя человека по умолчанию равно"", а конструктор установит best равным NULL и popularity равным 0 . Функция "инкремент" , которая увеличивает значение популярности на 1 . функция "getName", функция "setBest", которая принимает в качестве параметра указатель на тип Person .Функция "печать", которая печатает имя человека, за которым следует имя его лучшего друга, а затем значение его популярности .



Напишите основную программу, которая объявляет массив "список" размером 10. Каждый элемент массива является указателем на тип Person.Откройте файл "person.txt-там есть имена людей, каждое в отдельной строке. Прочитайте имена людей и для каждого имени создайте новый объект и установите указатель массива "список", чтобы он указывал на этот объект человека.
Есть и второй файл "friends.txt" где каждая строка содержит имя человека
далее следует название его лучшего &конца. Прочитайте каждую строку и отрегулируйте объекты в "списке"
соответственно. Другими словами, вы должны установить лучшего друга для объекта, и вы должны увеличить популярность соответствующего человека.

Если ...persons.txt" содержит:
Джон
Стив
Марк
Майк
Зиад
Тарек

А если "друзья.:
Джон Стив
Стив Марк
Марк Стив
Майк Джон
Зиад Джон
Тарек Зияд

Затем программа должна вывести в файл "result.txt" следующая информация:

Джон лучший друг: Стив популярность = 2
Стив лучший друг: Марк популярность = 2
Марк лучший друг: Steve Popularity = 1
Майк лучший друг: Джон популярность = 0
Зиад лучший друг: Джон популярность = 1
Тарек лучший друг: Зиад популярность = 0


Что я уже пробовал:

#include <iostream>
#include <string>
using namespace std;

class person {
private:
	string name;
	person* best;
	int popularity;

public:

	person(string name)
	{
		name = "";
		best = NULL;
		popularity = 0;
	}

	void increment()
	{
		popularity++;
	}
	void getName(string a)
	{
		a = name;
	}
	void setBest(person *person)// not very sure about this
	{
		person = best;
	}

	void print()
	{
		cout << "name:" << name << endl;
		cout << "bestfriend" << best << endl;
		cout << "popularity" << popularity << endl;
	}
};

int main()
{
	  int list[10] person; //??
	
}

Dave Kreskowiak

Итак, был ли вопрос, который вы забыли задать?

Member 13822923

на самом деле я написал в комментариях, что не уверен в функции setBest, и я застрял в основном, я не знал, как сделать массив, который указывает на людей.

Rick York

Замечания в ваших комментариях не означают, что вы задаете вопрос. Вот для чего предназначено верхнее текстовое поле - для вашего вопроса.

2 Ответов

Рейтинг:
2

OriginalGriff

Попробовать это:

int main()
   {
   person myPeople[10];
   ...
   }
Но прочтите вопрос еще раз: чтобы построить массив или объекты Person, классу Person нужен конструктор по умолчанию, который вас специально просят включить:
Цитата:
Открытый интерфейс должен иметь следующие функции : конструктор по умолчанию , с 1 параметром , имя человека, выполняющего по умолчанию ""
Вам нужно переписать свой конструктор на это:
person(string parName = "")
{
    name = parName;
    best = NULL;
    popularity = 0;
}


Member 13822923

Я понимаю, что вы имели в виду о конструкторе, но как массив, который вы написали, указывает на людей? как будто у меня огромные трудности с указателями

Рейтинг:
18

CPallini

Цитата:
поймите, что вы имели в виду, говоря о конструкторе, но как массив, который вы написали, указывает на людей? как будто у меня огромные трудности с указателями
Вы должны четко управлять (выделять/освобождать) памятью. Попробуй
#include <fstream>
#include <sstream>
#include <iostream>
#include <string>

using namespace std;

class Person {
private:
  string name;
  const Person* best;
  int popularity;

public:
  Person(const string & name = "") : name(name), best(nullptr), popularity(0)
  {
  }
  void increment()
  {
    ++popularity;
  }
  string getName() const
  {
    return name;
  }
  void setBest(const Person * person)
  {
    best = person;
  }
  void print()
  {
    cout << "name " << name << ", bestfriend " << best->getName() << ", popularity " << popularity << endl;
  }
};

int load(const string & filepath, Person * p[])
{
  ifstream ifs(filepath);
  string name;
  int n = 0;
  while ( getline(ifs, name) )
  {
    cout << "n " << n << endl;
    p[n] = new Person(name);
    ++n;
  }
  return n;
}
void loadFriends( const string & filepath, Person * p[], int size)
{
  string line;
  ifstream ifs(filepath);
  while ( getline(ifs, line))
  {
    Person *p_person = nullptr, *p_friend = nullptr;
    string person_name, friend_name;
    istringstream iss(line);
    iss >> person_name >> friend_name;
    for (int n=0; n<size; ++n)
    {
      string name = p[n]->getName();
      if ( name == person_name)
        p_person = p[n];

      if ( name == friend_name)
        p_friend = p[n];
    }
    if ( p_person )
    {
      p_person->setBest(p_friend);
      if (p_friend)
        p_friend->increment();
    }
  }
}

int main()
{
  Person * p[10];
  int persons = load("persons.txt", p);
  cout << "persons " << persons << endl;
  loadFriends("friends.txt", p, persons);
  for (int n=0; n<persons; ++n)
  {
    p[n]->print();
  }

  for (int n=0; n<persons; ++n)
    delete p[n];
}




Обратите внимание, что с современными C++ вы могли бы ('должен',
как сказали бы другие люди... :-) ) избегайте явного управления памятью:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <memory>
using namespace std;

class Person {
private:
  string name;
  shared_ptr<Person> best;
  int popularity;

public:
  Person(const string & name = "") : name(name), best(nullptr), popularity(0)
  {
  }
  void increment()
  {
    ++popularity;
  }
  string getName() const
  {
    return name;
  }
  void setBest(const shared_ptr<Person> & person)
  {
    best = person;
  }
  void print() const
  {
    cout << "name " << name << ", bestfriend " << best->getName() << ", popularity " << popularity << endl;
  }
};

vector < shared_ptr < Person > > load(const string & filepath)
{ 
  ifstream ifs(filepath);
  string name;
  vector < shared_ptr < Person > > vp;
  while ( getline(ifs, name) ) 
    vp.push_back(make_shared < Person > ( name ) );
  
  return vp;
}
void loadFriends( const string & filepath, const vector <  shared_ptr < Person > > & vp)
{
  string line;
  ifstream ifs(filepath);

  while ( getline(ifs, line))
  {
    shared_ptr< Person> p_person, p_friend;
    string person_name, friend_name;
    istringstream iss(line);
    iss >> person_name >> friend_name;
    for (auto & p  : vp)
    {
      string name = p->getName();
      if ( name == person_name)
        p_person = p;
      if ( name == friend_name)
        p_friend = p;
    }
    if ( p_person )
    {
      p_person->setBest(p_friend);
      if (p_friend)
        p_friend->increment();
    }
  }
}

int main()
{
  auto vp = load("persons.txt");
  cout << "persons " << vp.size() << endl;
  loadFriends("friends.txt", vp);

  for ( const auto & p : vp)
    p->print();
}