Hello all I am trying to figure out how to sort an array(actors) by their last name using bubble sort.I have a function that gets the lastname of the actors for one movie, but when I try to print out all the movies I get the error.
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr
I can sort the struct on any field but the actors. I can sort by actors with only one movie. It is when I try to sort with all 6 movies that I can not figure out. Any tips on what I am doing wrong would be greatly appreciated.
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
struct Movie
{
string name;
string year;
string directors;
string actors[5];
int count;
};
string lastname (string name)
{
int i = name.size() - 1;
while(name[i] != ' ') i--;
i++;
return name.substr(i,255);
}
void bubblesortnn( Movie movies[6], int N)
{
int i,swaps = 1;
while (swaps)
{
swaps = 0;
for (int i = 0; i < 6; i++)
{
movies[i];
for(int j=0;j<=4;j++)
{
if(movies[i].actors[j] > movies[i].actors[i+j])
{
swap(movies[i].actors[j], movies[i].actors[i+j]);
swaps = 1;
}
}
}
}
}
void bubblesort( Movie movies[6], int N)
{
int i,swaps = 1;
while (swaps)
{
swaps = 0;
for (i = 0; i < N-1; i++)
if (movies[i].name > movies[i + 1].name)
{
swap(movies[i], movies[i+1]);
swaps = 1;
}
}
}
struct Movie movies[6];
int main()
{
int N = 6;
string st;
int i = 0;
int j = 0;
getline(cin, movies[i].name);
getline(cin, movies[i].year);
getline(cin, movies[i].directors);
Snow White and the 7 Dwarfs
1937
Director: David Hand
Adriana Caselotti
Lucille La Verne
Harry Stockwell
====================
Pinocchio
1940
Directors: Ben Sharpsteen Hamilton Luske
Dickie Jones
Cliff Edwards
Mel Blanc
====================
Cinderella
1950
Directors: Clyde Geronimi Hamilton Luske Wilfred Jackson
Ilene Woods
Eleanor Audley
Verna Felton
James MacDonald
Betty Lou Gerson
====================
Peter Pan
1953
Directors: Clyde Geronimi Wilfred Jackson Hamilton Luske
Bobby Driscoll
Kathryn Beaumont
Hans Conried
Tommy Luske
====================
Lady and the Tramp
1955
Directors: Clyde Geronimi Wilfred Jackson Hamilton Luske
Peggy Lee
Barbara Luddy
Larry Roberts
====================
The Rescuers
1977
Directors: John Lounsbery Wolfgang Reitherman Art Stevens
Bob Newhart
Eva Gabor
Geraldine Page
Joe Flynn
I think your problem is within the bubblesortnn function: movies[i].actors[i+j]
where i+j goes as high as 9 but the size of the array actors[] is 5. It should be j+1 instead and with the range restricted to 0 through size-2.
Something like this (untested):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
void bubblesortnn( Movie movies[], int N)
{
for (int i = 0; i < N; i++)// for each movie
{
int swaps = 1;
while (swaps)// swap the actors
{
swaps = 0;
for(int j=0;j<4;j++)// not <=
{
if(movies[i].actors[j] > movies[i].actors[j+1])// j+1 not i+j
{
swap(movies[i].actors[j], movies[i].actors[j+1]);
swaps = 1;
}
}
}
}
}
Now I am trying to figure out how to get it to sort by the actor's last name. My function works but only one movie at a time. For some reason it cannot find the second movie.
Here is what it does:
Snow White and the 7 Dwarfs
1937
Director: David Hand
All I am trying to do now is print out the movies with only the last name for the actors' names. Her is the code i am using
for(int i = 0; i<=5;i++)
{
cout<<movies[i].name<<endl;
cout<<movies[i].year<<endl;
cout<<movies[i].directors<<endl;
for (int j = 0; j <=4; j++)
{
cout<<lastname(movies[i].actors[j])<<endl;
}