у меня есть алгоритм сортировки выбора, который частично работает, я использую его для сортировки массива объектов класса по возрасту, когда он делает это, он сортирует часть содержимого правильно, но не может отсортировать первый элемент. Также есть способ использовать оператор присваивания для класса, чтобы сделать это немного проще.
Спасибо
ниже мой полный код:
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
void storeinfo() ;
void showinfo() ;
void menu() ;
void deleteinfo() ;
void displayallinfo() ;
void selectionSort() ;
int linsearch(string val) ;class user
{
string firstname, lastname, currentteam, position, status ;
int age ;
public:
user() {};
user(string fname, string lname, string cteam, string pos, string stat, int age)
{
setFirstName(fname);
setLastName(lname);
setCurrentTeam(cteam);
setPosition(pos);
setStatus(stat);
setAge(age);
} ;user& operator = (const user& source)
{
firstname = source.firstname;
lastname = source.lastname ;
currentteam = source.currentteam ;
position = source.position ;
status = source.status ;
age = source.age ;
}void setFirstName(string fname)
{firstname = fname;}
void setLastName(string lname)
{lastname = lname;}
void setCurrentTeam(string cteam)
{currentteam = cteam;}
void setPosition(string pos)
{position = pos;}
void setStatus(string stat)
{status = stat;}
void setAge(int _age)
{age = _age;}
string getFirstName()
{return firstname ;}
string getLastName()
{return lastname ;}
string getCurrentTeam()
{return currentteam ;}
string getPosition()
{return position ;}
string getStatus()
{return status ;}
int getAge()
{return age ;}
};
user player[20] ;
int arrlength = 3 ;
int main()
{
menu() ;
cin.get() ;
return 0 ;
}
void storeinfo()
{
string firstname ;
string lastname ;
string currentteam ;
string position;
string status ;
int age ;
for (int i=0; i < 3; i++)
{
cout << "\n\n Enter First Name : " ;
cin >> firstname ;
player[i].setFirstName(firstname) ;
cout << "Enter Last Name : " ;
cin >> lastname ;
player[i].setLastName(lastname) ;
cout << "Enter Player's Age : " ;
cin >> age;
player[i].setAge(age) ;
cout << "Enter Current Team : " ;
cin >> currentteam ;
player[i].setCurrentTeam(currentteam) ;
cout << "Enter Position : " ;
cin >> position ;
player[i].setPosition(position) ;
cout << "Enter Status : " ;
cin >> status ;
player[i].setStatus(status) ;
cout << "\n\n\n" ;
}
/*cout << string(50, '\n');*/
menu() ;
}
void showinfo()
{
string search;
int found ;cout << "Please Enter The Player's Last Name : " ;
cin >> search ;
found=linsearch(search);
if (found==-1)
{
cout << "\n There is no player called " << search ;
}
else
{
cout << "\n First Name : " << player[found].getFirstName() << "\n" << "Last Name : " << player[found].getLastName() <<
"\n" << "Age : " << player[found].getAge() << "\n" << "Current Team : " << player[found].getCurrentTeam() <<
"\n" << "Position : " << player[found].getPosition() << "\n" << "Status : " << player[found].getStatus() << "\n\n";
}
cin.get() ;
menu() ;
}
void deleteinfo()
{
int arrlength = 3 ;
string search ;
int found ;
cout << "\n Delete A Player's Information \n\n" ;
cout << "Please Enter The Player's Last Name : " ;
cin >> search ;
found=linsearch(search);
if (found==-1)
{
cout << "\n There is no player called " << search ;
}
else
{
for (int i=found + 1; i < arrlength; ++i)
{
player[i-1].setFirstName(player[i].getFirstName()) ;
player[i-1].setLastName(player[i].getLastName()) ;
player[i-1].setAge(player[i].getAge()) ;
player[i-1].setCurrentTeam(player[i].getCurrentTeam()) ;
player[i-1].setPosition(player[i].getPosition()) ;
player[i-1].setStatus(player[i].getStatus()) ;
}
--arrlength ;
cout << "\n Player has been deleted." ;
player[arrlength].setAge(0) ;
player[arrlength].setCurrentTeam("") ;
player[arrlength].setFirstName("") ;
player[arrlength].setLastName("") ;
player[arrlength].setPosition("") ;
player[arrlength].setStatus("");
}
cin.get() ;
menu() ;
}
void displayallinfo()
{
selectionSort();
for (int i=0; i < 3; i++)
{
cout << "\n First Name : " << player[i].getFirstName() << "\n" << "Last Name : " << player[i].getLastName() <<
"\n" << "Age : " << player[i].getAge() << "\n" << "Current Team : " << player[i].getCurrentTeam() <<
"\n" << "Position : " << player[i].getPosition() << "\n" << "Status : " << player[i].getStatus() << "\n\n";
}
cin.get() ;
menu() ;
}
void menu()
{
cout << "\n\n MENU" << "\n" ;
cout << "\n A. Store Player Information" ;
cout << "\n B. Show Player Informaton" ;
cout << "\n C. Delete Player Information" ;
cout << "\n D. Display All Players Sorted By Age";
cout << "\n Z. Exit \n\n" ;
string x = "";
cin >> x ;
if (x=="a" | x=="A")
{
storeinfo() ;
}
else if (x=="b" | x=="B")
{
showinfo() ;
}
else if (x=="c" | x=="C")
{
deleteinfo() ;
}
else if (x=="d" | x=="D")
{
displayallinfo() ;
}
else if (x=="z" | x=="Z")
{
exit(0) ;
}
else
{
cout << "Invalid Choice" ;
menu() ;
}
}
int linsearch(string val)
{
for (int j=0; j <= 3; j++)
{
if (player[j].getLastName()==val)
return j ;
}
return -1 ;
}
void selectionSort()
{
int i, minIndex, minValue;
for (i = 0; i < (arrlength - 1); i++)
{
minIndex = i ;
minValue = player[i].getAge() ;
for (int index = i + 1; index < arrlength; index++)
{
if (player[index].getAge() < minValue)
{
minValue = player[index].getAge();
minIndex = index;
}
}
player[minIndex].setAge(player[i].getAge());
player[i].getAge() == minValue;
}}
Ваш «пользовательский» класс достаточно прост, так что ему не нужен перегруженный оператор присваивания, так как все его члены являются типами старых данных или уже имеют свои собственные операторы присваивания (например, строку). Я бы порекомендовал удалить метод operator = из этого класса, чтобы у вас не было возможности поддерживать метод operator = при добавлении новых членов. C ++ автоматически сгенерирует оператор присваивания для вашего класса, если это необходимо (это присваивает членство). Вы действительно нуждаетесь в перегруженном операторе присваивания, только если у вас есть члены, которые являются указателями, но я отвлекся.
Ваша функция сортировки выбора на самом деле не сортирует игроков. Это просто перераспределение значения «возраста» для каждого игрока. Я думаю, это то, что вы хотите сделать, чтобы «отсортировать» массив «player». (Обратите внимание, это больше «C», чем «C ++», но со мной).
void SimpleButSlowSort()
{
bool fSorted = false;
if (arrLength <= 1)
{
return;
}
while (fSorted)
{
fSorted = true;
for (int index = 0; index < arrLength-1; index++)
{
if (player[index].getAge() > player[index+1].getAge())
{
user temp;
temp = player[index];
player[index] = player[index+1];
player[index+1] = temp;
fSorted = false;
}
}
}
}
Но если вам нужен более стандартный C ++ способ сортировки, вы можете использовать стандартную библиотеку для этого. Но это требует, чтобы игроки были в типе, который может быть повторен. пример
bool MyPlayerCompare(user& u1, user& u2) { return (u1.getAge() < u2.getAge()); }
std::vector<user> players;
void FasterSort()
{
std::sort(players.begin(), players.end(), MyPlayerCompare);
}
Других решений пока нет …