Как я могу найти в массиве объектов главного актера мне нужно - PullRequest
0 голосов
/ 03 апреля 2020

Это моя задача:

Я выполнил половину своего кода, но я борюсь, потому что я новичок в OOP, и я не уверен, как мне найти mov ie где main_actor - Анджелина Джол ie.

    for (int i = 0; i < n; ++i)
    {
        string name;
        int year;
        string prod;
        string actor;
        cout << "\nenter the film name " ;
        cin >> name;
        cout << "\nenter the production year ";
        cin >> year;
        cout << "\nenter the producer name ";
        cin >> prod;
        cout << "\nenter the actor name ";
        cin >> actor;
        obs[i].SetName(name);
        obs[i].SetYearP(year);
        obs[i].SetProducer(prod);
        obs[i].SetMaina(actor);

        if (actor == "Angelina Jolie")
        {
            cout << "The movie who has main actor Angelina Jolie is" << name << endl;
        } // Тhis is my attempt.
    }
}

Ответы [ 3 ]

1 голос
/ 03 апреля 2020

Вам нужно создать функцию, которая перебирает ваш массив и проверяет главный субъект:

bool findFilm(Film* films, int numFilms, string actor)
{
    bool found = false;
    for (int i = 0; i< numFilms; i++) {
        if(!actor.compare(0, films[i].GetyMaina().length(), films[i].GetyMaina()){
            cout<<"Film "<<films[i].GetName()<<" has main actor "<<actor<<"\n";
            found = true;
         }
     }
     return found;
}
0 голосов
/ 03 апреля 2020

Первое, что вы должны сделать, это использовать контейнеры C ++, такие как std :: vector, std :: array вместо raw array. И, конечно, тогда вы должны заполнить их.

std::vector<Films> films;

std::array<Films, 100> films;

Во-вторых, вы должны удалить "Films () = default;" часть. Это объявление меняет все в C ++.

. После этих изменений вы сможете использовать функции-члены-контейнеры и функции алгоритма (например, find (), find_if (), count () et c.) чтобы получить то, что вам нужно.

#include <algorithm>

Если вы не можете сделать эти изменения, просто вы можете сделать это, выполнив цикл:

 for(auto film : films){
       //comparisons, if checks, returns
    }
0 голосов
/ 03 апреля 2020

Пожалуйста, используйте функцию getline () для ввода пользователем, потому что cin >> name спасет от имени Angelina Jol ie только Angelina. Потому что он читает только целые слова, не включая пробелы.

Чтобы использовать функцию getline (), поставьте это после #include<cstring>

#include <string>

Поэтому используйте getline так:

cout << "\n enter the actor name ";
std::getline (std::cin,actor);

Другая проблема заключается в том, что вам нужен cin.ignore () между двумя входами. Потому что вам нужно вывести sh символ новой строки из буфера между ними.

До того, как l oop запросит такие данные:

cout << "how many films ";
cin >> n;
cin.ignore();

В l oop как this:

cout << "\n enter the film name ";
    getline(cin, name);

    cout << "\n enter the production year ";
    cin.ignore();
    cin >> year;

    cout << "\n enter the producer name ";
    cin.ignore();
    getline(cin, prod);

    cout << "\n enter the actor name ";
    getline(cin, actor);

b) (поместите эту функцию в свой класс в разделе publi c сразу после строки GetMania ()):

static void FindFilm(Film arr[], int cntFilms, string actor)
{
    for (int i = 0; i < cntFilms; i++)
    {
        if (arr[i].GetMaina() == "Angelina Jolie")
            cout << "The movie who has main actor Angelina Jolie is" << arr[i].GetName() << endl;
    }
}

И из основного вызова это так сразу после l oop.

string actor = "Angelina Jolie";
Film::FindFilm(obs, n, actor);

Также лучше записать escape-последовательность (или специальный символ) для новой строки (\ n) в конце выходного сообщения. Как это:

cout << "The name of movie: \n" << name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...