一、 明确实验目的
1、 通过动态内存分配实现动态数组,并体会指针在其中的作用;
2、理解C++中深复制、浅复制的区别和适用场合,掌握其应用方法;
3、分别使用字符数组和标准C++库的string类对象练习处理字符串的方法;
4、运用所学知识,实现简单的数据结构,培养分析和解决实际问题的能力。
1、认真审题
建立一个名为CStudent的类,该类有以下几个属性:学号、姓名(使用字符指针)、成绩,并为上述属性定义相应的方法。
用C++ 面向对象的程序设计方法,找到并输出存放在CStudent类动态数组中学生成绩最高的学生信息(需考虑分数相同的情况,输出学号、姓名和成绩)。
2、设计CStudent类:
(1)数据成员:学号、姓名(使用字符指针,例如char * Name)、成绩;
(2)成员函数:
默认构造函数、有参构造函数、复制构造函数、析构函数;重点难点在于该类的构造函数和复制构造函数的定义。
(3)其他必要的成员函数,如赋值函数、取值函数、显示输出函数。
3、按要求查找并输出相关的信息。
(1)动态创建一个CStudent类对象数组,数组的大小由键盘输入。
(2)用函数实现查找最大值的功能。
(3)在main函数中输出成绩最高的学生基本信息(如有成绩相同的情况,均输出)。
#include<iostream>
#include<cstring>
using namespace std;
class Cstudent
{
private :
long long number;
char *p;//字符指针
int score;
public:
Cstudent(long n,char *q,int s);//默认构造
Cstudent(const Cstudent &s);//复制构造
friend void max(Cstudent*st,int count1);//友元函数方便后面比较成绩大小 实质上就是一个数组排序;
void input();//输入相应的数据
void show();//展示
~Cstudent(); //析构函数
};
Cstudent::Cstudent(long n=0,char *q="no mame",int s=0)//有默认值
{
p=new char[20];//只用在构造函数的地方分配空间
strcpy(p,q);
number=n;
score=s;
}
Cstudent::Cstudent(const Cstudent &s)
{
number=s.number;
score=s.score;
p=new char (*s.p);//深复制函数
}
void Cstudent:: input()//录入数据
{
long long num;
int s;
cout<<"请输入姓名:"<<endl;
gets(p);
cout<<"请输入学号,成绩:"<<endl;
cin>>num>>s;
number=num;
score=s;
cin.ignore();
}
void Cstudent ::show()
{
cout<<"姓名:";
puts(p);
cout<<"学号:"<<number<<endl<<"成绩:"<<score<<endl;
}
Cstudent::~Cstudent()
{
delete []p;//与前面的new对应
}
void max(Cstudent*st,int count1)
{
int maxx=0;
int j;
for(int i=0;i<count1;i++)
{
if(st[i].score>maxx)
{
maxx=st[i].score;
j=i;
}
}
for(int i=0;i<count1;i++)
{
if(st[i].score==maxx)
{
st[i].show();
cout<<endl;
}
}
}
int main()
{ cout<<"请输入对象的个数:"<<endl;
int a;
cin>>a;
cin.ignore();
const int count=a;
Cstudent*str=new Cstudent[count];
for(int i=0;i<count;i++)
{
str[i].input();
}
max(str,count);
return 0;
}