类的指针数组的排序问题

我在做课设,学生成绩管理系统
排序的时候,交换两个对象时候,内部的字符串全部变成了乱码,就是烫啊之类的东西

需要发源代码吗???有点长,我把问题简化一下发源代码吧。

你的排序是怎么写的? 类对象重载的操作符是什么样....总得贴出代码....

#include
using namespace std;
#include
#include
#include
#include
#define M 16
#define N 14
#define K 3
class Student{ //类的定义,包括学生信息
private:
char num[N];
char name[M];
int score[K];
double gpa[K];
double agpa;
public:
Student(){};
Student(Student &a); //拷贝构造函数
char *getnum(){return num;}; //获取学号
char *getname(){return name;}; //获取姓名
void setnum(char nu[ ]); //设置学号
void setname(char na[ ]); //设置姓名
void setscore(int sc[ ]); //设置学生成绩
void setgpa(double gp[ ]); //设置学生成绩相应绩点
void setagpa(double ag); //设置学生的平均绩点
void computegpa( ); //求学生的相应绩点
void computeagpa( ); //求出学生的平均绩点
void getscore(int sc[ ]); //取出学生成绩
void getgpa(double g[]); //取出学生绩点
void getagpa(double &ag); //取出学生的平均绩点
void disp(); //输出学生信息
};
Student::Student(Student &a){
strcpy(num,a.getnum());
strcpy(name,a.getname());
int sc[K];
a.getscore(sc);
for(int i = 0 ; i < K ; i++){
score[i] = sc[i];
}
}
void Student::setnum(char nu[ ]){ //设置学号
strcpy(num,nu);
}
void Student::setname(char na[ ]){ //设置姓名
strcpy(name,na);
}
void Student::setscore(int sc[ ]){ //设置学生成绩
int i;
for(i = 0 ; i < K ; i++){
score[i] = sc[i];

}
}
void Student::setgpa(double gp[ ]){ //设置学生成绩相应绩点
int i;
for(i = 0 ; i < K ; i++){
gpa[i] = gp[i];
}
}
void Student::setagpa(double ag){ //设置学生的平均绩点
agpa = ag;
}
void Student::computegpa( ){ //求学生的相应绩点
int i;
for(i = 0 ; i < K ; i++)
gpa[i] = (double)(score[i]-50)/10;
}
void Student::computeagpa( ){ //求出学生的平均绩点
agpa=0;
int i;
for(i = 0; i < K ; i++)
agpa += gpa[i];
agpa = agpa/K;
}
void Student::getscore(int sc[ ]){ //取出学生成绩
int i;
for(i = 0 ; i < K ; i++){
sc[i] = score[i];
}
}
void Student::getgpa(double g[ ]){ //取出学生绩点
int i;
for(i = 0 ; i < K ; i++){
g[i] = gpa[i];
}
}
void Student::getagpa(double &ag){ //取出学生的平均绩点
ag = agpa;
}
void Student::disp(){ //输出学生信息
int i;
cout< for(i = 0 ; i cout for(i = 0 ; i cout cout }
class UserDatabase{
private:
int nElem; //学生个数
int Maxu;
Student *user;
public:
UserDatabase(int n = 30);
//构造函数,初始化学生信息表,将user.txt读到User[]中
~UserDatabase( );
//析构函数,将user[]写入user.txt文件中
void clear( ); //删除所有学生的信息
void add_record(char *nu,char *na,int sc[]);
//添加学生信息,插入学生后仍然按升序排列
void delete_record(Student *p);
//删除学生信息
void modify_record(Student *p,int sc[]);
//修改学生信息
Student *query(char *nu);
//按学号查找(顺序查找),这里也可以用折半查找
void sorta_num( ); //按学号升序排列(选择排序法)
void sorta_name( ); //按姓名升序排序(插入排序法)
void sorta_agpa( ); //按平均绩点升序排序(冒泡排序法)
void sort_num( ); //按学号降序排序(冒泡排序法)
void sort_name( ); //按姓名降序排序,将排成升序的对象数组逆向放置
void sort_agpa( ); //按平均绩点降序排序(冒泡排序法)
void disp(); //输出所有学生的信息
int getnElem(){return nElem;}
Student *getuser(){return user;}
};
UserDatabase::UserDatabase(int n){
//构造函数,初始化学生信息表,将user.txt读到User[]中
int i,sc[K]; //成绩
double g[K],ag; //绩点,平均绩点
char num[N],na[M]; //学号,姓名
ifstream infile; //定义文件对象
infile.open("user.txt",ios::in); //打开数据文件
if(!infile){
cout exit(0);
}
nElem = 0;
Maxu = n;
if(n)
user = new Student[n];
else
user = 0;
while(infile>>num){
infile>>na;
for(i = 0 ; i < K ; i++)
infile>>sc[i];
for(i = 0 ; i < K ; i++)
infile>>g[i];
infile>>ag;
if(nElem == Maxu){ //如果实际空间不够
Student *newptr;
newptr = new Student[Maxu+10];//申请一段新表空间
for(i = 0 ; i < nElem ; i++)
newptr[i] = user[i]; //将原表中的元素拷贝到新表中
delete []user; //释放原表空间
Maxu += 10;
user = newptr;
}
user[nElem].setnum(num);
user[nElem].setname(na);
user[nElem].setscore(sc);
user[nElem].setgpa(g);
user[nElem].setagpa(ag);
nElem++;
}
infile.close( );
}
UserDatabase::~UserDatabase( ){ //析构函数,将user[]写入user.txt文件中
int i,j;
int score[K];
double gpa[K];
double agpa;
ofstream outfile; //定义文件对象
outfile.open("user.txt",ios::out); //打开数据文件
if(!outfile){
cout<<"打开文件错误!\n";
exit(0);
}
for(i = 0 ; i < nElem ; i++){
outfile<<user[i].getnum()<<" "<<user[i].getname()<<" ";
user[i].getscore(score);
user[i].getgpa(gpa);
user[i].getagpa(agpa);
for(j = 0 ; j < K ; j++){
outfile<<score[j]<<" ";
}
for(j = 0 ; j < K ; j++){
outfile<<gpa[j]<<" ";
}
outfile<<agpa<<" ";
}

}
void UserDatabase::clear( ){ //删除所有学生的信息
char *a = " ";
int sc[3]={0,0,0};
for(int i = 0 ; i < nElem ; i++ ){
user[i].setnum(a); //设置学号
user[i].setname(a); //设置姓名
user[i].setscore(sc); //设置学生成绩
user[i].computegpa(); //求学生的相应绩点
user[i].computeagpa(); //求出学生的平均绩点
}
nElem = 0;
}
void UserDatabase::add_record(char *nu,char *na,int sc[]){ //添加学生信息,插入学生后仍然按升序排列
user[nElem].setnum(nu); //设置学号
user[nElem].setname(na); //设置姓名
user[nElem].setscore(sc); //设置学生成绩
user[nElem].computegpa(); //求学生的相应绩点
user[nElem].computeagpa(); //求出学生的平均绩点
user[nElem].disp(); //显示学生信息
nElem++;

}
void UserDatabase::delete_record(Student p){ //删除学生信息
int i,j,nCheck;
for(i = 0 ; i < nElem ; i++){
if( strcmp( user[i].getnum() , p->getnum() ) == 0){//判断学号是否相同
for(j = i; j < nElem ; j++){//从相同的位置开始后一位向前挪一位
user[j] = user[j+1];
}
nCheck = 1;//标记整形为1,表示找到了
nElem--;
cout<<"删除成功!\n";
}
}
if(nCheck == 0){
cout<<"该学生不存在!\n";
}
}
void UserDatabase::modify_record(Student *p,int sc[]){ //修改学生信息
int i;
for(i = 0 ; i < nElem ; i++){
if( strcmp( user[i].getnum() , p->getnum() ) == 0){
user[i].setname(p->getname()); //设置姓名
user[i].setscore(sc); //设置学生成绩
user[i].computegpa(); //求学生的相应绩点
user[i].computeagpa(); //求出学生的平均绩点
user[i].disp(); //显示学生信息
}
}
}
Student
UserDatabase::query(char *nu) //折半查找
{
int left,right;
int mid;
left=0;
right=nElem;
while(left<=right)
{
mid=(left+right)/2;
if(strcmp( user[mid].getnum() , nu ) == 0){
user[mid].disp();
return &user[mid];
}
else if(strcmp( user[mid].getnum() , nu ) < 0) right=mid-1;
else if(strcmp( user[mid].getnum() , nu ) > 0) left=mid+1;
}
cout<<"查无此人!";
}
void UserDatabase::sorta_num( ){ //按学号升序排列(选择排序法)
int i,j,k;
Student t;
for(i=0;i<nElem-1;i++){
k=i;
for(j=k+1;j<N;j++)
if( strcmp( user[k].getnum() , user[j].getnum() ) < 0 )
k=j;
if(k!=i){
t=user[k];
user[k]=user[i];
user[i]=t;
}

}
}
void UserDatabase::sorta_name( ){ //按姓名升序排序(插入排序法)
}
void UserDatabase::sorta_agpa( ){ //按平均绩点升序排序(冒泡排序法)
}
void UserDatabase::sort_num( ){ //按学号降序排序(冒泡排序法)
}
void UserDatabase::sort_name( ){ //按姓名降序排序,将排成升序的对象数组逆向放置
}
void UserDatabase::sort_agpa( ){ //按平均绩点降序排序(冒泡排序法)
}
void UserDatabase::disp(){ //输出所有学生的信息
int i,j;
int t = 0;
int score[K];
double gpa[K];
double agpa;
for(i = 0 ; i < nElem ; i++){
cout<<user[i].getnum()<<" "<<user[i].getname()<<" ";
user[i].getscore(score);
user[i].getgpa(gpa);
user[i].getagpa(agpa);
for(j = 0 ; j < K ; j++){
cout<<score[j]<<" ";
}
for(j = 0 ; j < K ; j++){
cout<<gpa[j]<<" ";
}
cout<<agpa<<endl;
t++;
if( t%10 == 0 )
system("pause");

}

}
int sort_menu() //显示排序菜单
{
int n;
system("cls"); //清屏
cout<<"|***************************************************************|\n";
cout<<"| |\n";
cout<<"| 学生成绩管理系统 |\n";
cout<<"| |\n";
cout<<"|***************************************************************|\n";
cout<<"|请选择排序方式: |\n";
cout<<"| 1 - 按学号(升序) |\n";
cout<<"| 2 - 按姓名(升序) |\n";
cout<<"| 3 - 按平均绩点(升序) |\n";
cout<<"| 4 - 按学号(降序) |\n";
cout<<"| 5 - 按姓名(降序) |\n";
cout<<"| 6 - 按平均绩点(降序) |\n";
cout<<"|输入选择: |\n";
cin >> n;
return n; //返回选择的选项
}
void paixu(UserDatabase &abc) //功能5
{
switch(sort_menu()){
case 1:
system("cls");
abc.sorta_num( );
break;
case 2:
system("cls");
// system("pause");
break;
case 3:
system("cls");
// system("pause");
break;
case 4:
system("cls");
// system("pause");
break;
case 5:
system("cls");
// system("pause");
break;
case 6:
system("cls");
// system("pause");
break;
default:
system("cls");
cout<<"|***************************************************************|\n";
cout<<"| |\n";
cout<<"| 错误的选项号! |\n";
cout<<"| |\n";
cout<<"|***************************************************************|\n";
// system("pause");
break;
}

}
//================================系统主函数==================================
int main_menu() //显示菜单函数
{
int n;
system("cls"); //清屏
cout<<"|***************************************************************|\n";
cout<<"| |\n";
cout<<"| 学生成绩管理系统 |\n";
cout<<"| |\n";
cout<<"|***************************************************************|\n";
cout<<"|请选择以下功能: |\n";
cout<<"| 1 - 增加记录 |\n";
cout<<"| 2 - 修改记录 |\n";
cout<<"| 3 - 删除记录 |\n";
cout<<"| 4 - 查找 |\n";
cout<<"| 5 - 排序 |\n";
cout<<"| 6 - 显示记录 |\n";
cout<<"| 7 - 全删 |\n";
cout<<"| 0 - 退出 |\n";
cout<<"| |\n";
cout<<"|输入选择: |\n";
cin >> n;
return n; //返回选择的选项
}
int main() //主函数
{
UserDatabase abc;
Student temp;
int i,j;
int t; //用于判断是否查找到对应学生
int sc[K]; //成绩
char num[N],na[M]; //学号,姓名
char choice;
while(1){
switch (main_menu()){
case 0://退出程序
system("cls");
abc.~UserDatabase();//析构abc对象,并将数据写入文件中保存。
exit(0);
break;
case 1://增加记录
system("cls");
cout<<"请输入学号:";
cin>>num;
for(i = 0 ; i < abc.getnElem() ; i++){
if(strcmp( num , abc.getuser()[i].getnum() ) == 0 ){
cout<<"此人已存在!";
break;
}
}

if(i == abc.getnElem()){
cout<<"请输入姓名:";
cin>>na;
cout<<"请输入"< for(i = 0 ; i cin>>sc[i];
}
abc.add_record(num,na,sc);
}
system("pause");
break;
case 2://修改记录
system("cls");
t = 0;//默认没有查找到学生
cout<<"请输入学号:";
cin>>num;
for(i = 0 ; i < abc.getnElem() ; i++){
if(strcmp( num , abc.getuser()[i].getnum() ) == 0 ){
t = 1;//表示查找到了学生
abc.getuser()[i].disp();
cout<<"请确认是否要修改该学生的记录?\n是(Y) 否(N)\n";
while(cin>>choice){
if(choice == 'Y'){
cout<<"请输入姓名:";
cin>>na;
temp.setnum(num);
temp.setname(na);
cout<<"请输入"< for(j = 0 ; j cin>>sc[j];
}
Student p = &temp;
abc.modify_record(p,sc);
break;
}
else if(choice == 'N'){
break;
}
else
cout<<"您的输入有误!\n";
}
break;
}
}
if(t == 0){
cout<<"查无此人!\n";
}
system("pause");
break;
case 3://删除记录
system("cls");
t = 0;//默认没有查找到学生
cout<<"请输入要删除的学生的学号:";
cin>>num;
for(i = 0 ; i < abc.getnElem() ; i++){
if(strcmp( num , abc.getuser()[i].getnum() ) == 0 ){
t = 1;//表示查找到了该学生
abc.getuser()[i].disp();
cout<<"请确认是否要删除该学生的记录?\n是(Y) 否(N)\n";
while(cin>>choice){
if(choice == 'Y'){
temp.setnum(num);
Student *p = &temp;
abc.delete_record(p);
break;
}
else if(choice == 'N')
break;
else
cout<<"您的输入有误!\n";
}
break;
}
}
if(t = 0){//若没查找到该学生
cout<<"查无此人!\n";
}
system("pause");
break;
case 4://查找记录
system("cls");
cout<<"请输入你要查找的学号码:";
cin>>num;
abc.query(num);
system("pause");
break;
case 5://排序
system("cls");
paixu(abc);
system("pause");
break;
case 6:
system("cls");
abc.disp();
system("pause");
break;
case 7:
system("cls");
abc.clear();
system("pause");
break;
default:
system("cls");
cout<<"|
**************************************************************|\n";
cout<<"| |\n";
cout<<"| 错误的选项号! |\n";
cout<<"| |\n";
cout<<"|***************************************************************|\n";
system("pause");
break;
}

}
return 0;

}

贴出你的代码。你怎么交换的对象,直接赋值的话,是浅拷贝,数组还是指向原来的地址,如果地址在堆栈上或者被回收,就会出现你说的情况。

全都贴上来了,整个系统差排序部分了,不过出了问题,

具体见UserDatabase::sorta_num( ) 这个函数的实现

代码错误太多了,都没法修改

随便说一个
if( strcmp( user[k].getnum() , user[j].getnum() ) < 0 )
这里num是数字,怎么用strcmp比较???

问题描述:
在主函数中输入10个长度为10的字符串,用另一个函数对他们排序,然后再主函数输出这10个已排好序的字符串。(运用指针)

方法一:
运用冒泡排序

#include

void sort(char * p,int n);

void main()
{
 char a[10];
 int i;
 printf("Input 10 strings:......
答案就在这里:数组排序问题(指针)
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?