user12347217
user12347217

Reputation:

How can I find in an array of objects the main actor I need

This is my task:

I have done half of my code, but I'm struggling because I'm a beginner in OOP and I'm not sure how I can find movie where main_actor is Angelina Jolie.

    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.
    }
}

Upvotes: 0

Views: 111

Answers (3)

Samuel B.
Samuel B.

Reputation: 446

Please use getline() function for user input because cin >> name will save from name Angelina Jolie only Angelina. Because it is reading only whole words not including white space.

To use function getline() put this after #include<cstring>

#include <string>

So use getline like this :

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

Another problem is that you need cin.ignore() between two inputs. Because you need to flush the newline character out of the buffer in between.

Before loop ask for data like this :

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

In loop like 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) (put this function in your class in public section right after string 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;
    }
}

And from main call it like this right after loop.

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

Also it's better if you write escape sequence (or special character) for new line (\n) to the end of output message. Like this :

cout << "The name of movie: \n" << name;

Upvotes: 0

Kor Sar
Kor Sar

Reputation: 51

The first thing you should do is using C++ containers like std::vector, std::array instead of raw array. And of course, then you should fill them.

std::vector<Films> films;

std::array<Films, 100> films;

The seconds thing is, you should delete "Films() = default;" part. That declaration changes everything in C++.

After these changes, you will be able to use containers' template member functions and algorithm functions (like find(), find_if(), count() etc.) to get what you need.

#include <algorithm>

If you are not able to do these changes, simply you can do it by looping:

 for(auto film : films){
       //comparisons, if checks, returns
    }

Upvotes: 0

melk
melk

Reputation: 530

You need to make a function that loops over your array and checks the main-actor:

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

Upvotes: 1

Related Questions