7-1 友元很简单2016final (15分)
C++考试正在进行。请设计一个学生类student,学号、本次考试成绩是其私有数据成员,同时有一个求本次考试成绩最高分的学生的友元函数 student* average(student *p,int count)
以上类名和友元函数的形式,均须按照题目要求,不得修改。
输入格式:
输入是 学号([00001,99999])和成绩,以0结束。(不超过100个学生)
输出格式:
输出是最高分学生的 学号 。 提示:如果是并列最高分,需要将并列最高分学生的学号都输出,以一个空格间隔。
输入样例:
在这里给出一组输入。例如:
10001 90
10002 93
0
输出样例:
在这里给出相应的输出。例如:
10002
作业中出现的问题:
1、在主函数中调用了average函数,一开始写成了student* average(student tt, int i);这导致了执行到这一函数时直接跳过,一直以为是因为每遍循环结束时自动调用的析构函数导致的,其实不是,是由于调用写错的缘故,正确写法应是average(tt, i);
AC代码
#include<iostream>
using namespace std;
class student {
private:
int num;
double score;
public:
student() {}
student(int a,double b):num(a),score(b){}
friend student* average(student* p, int count);
~student() {}
};
student* average(student* p, int count) {
int m = 0;
int n = 0,g=0;
for (m = 0; m < count; m++) {
if (p[m].score > p[n].score) {
n = m;
}
}
for (m = 0; m < count; m++) {
if (p[m].score == p[n].score) {
g++;
if (g==1){
printf("%05d", p[m].num);
}
else{
printf(" %05d", p[m].num);
}
}
}
return p;
}
int main() {
student* tt = new student[100];//创建指向对象数组的指针
int i,j;
double k;
for (i = 0;; i++) {
cin >> j;
if (j == 0) {
break;
}
cin >> k;
tt[i] = student(j, k);//进一步初始化对象
}//每次循环到这时都会调用析构函数
/*for (int t = 0; t < i; t++) {
tt[t].print();
}*/
//cout << "hello world " << endl;
average( tt, i);
delete[]tt;
return 0;
}
7-2 2018Final友元函数(体检表) (10分)
体育已经成为一门重要的中考科目,但身体存在某些疾病的同学可以免考。
为此,凤湖中学每年需要整理一下毕业班同学(学生数不超过300人)的体检表中的体检结论,筛选出需要免考的同学,建议其申请免考。
要求建立一个类Exam,每个Exam类对象存储一位同学的体检信息,包括私有数据成员:
string num;//学号
int disease[10];//疾病信息
int count;//疾病数
该类还包括一些必要的公有成员函数。
此外,该类还有一个友元函数void print(Exam*e, int count, int *d) 用于输出需要申请免考的学生信息,这里e是一个指向Exam类对象数组元素的指针,count是学生数量,d是一个指向值得关注病病数组元素的指针。
输入格式:
首先输入学生的体检信息,每位学生一行,以0结束输入。首先输入学生的学号(000-999,每位同学的学号各不相同);接着输入疾病数T(T<=10);然后是T个疾病信息,每种疾病用一个正整数编号(100-999)表示,每种疾病对应的编号不同。 在输入学生体检信息后,输入一行值得关注的疾病编号(相邻的编号以单个空格隔开),最后一个编号为0,标识结束输入病病编号。
输出格式:
输出由于患有值得关注疾病,需要申请免考的同学的学号,以及所患疾病编号(在存在多个值得关注的疾病时,仅输出编号最小的那个),每位同学一行,按照输入顺序输出。
输入样例:
103 0
109 1 101
002 3 105 101 107
825 4 108 775 109 104
0
105 101 0
输出样例:
109 101
002 101
完成过程中遇到以及搜索过的问题以及相关资料
问题一:数据成员为数组怎么初始化
方法:可以在初始化列表中初始化(包括传入数组名或指针的情况);
参考资料 传送门
问题二:sort函数的使用
sort(数组首地址,需要排序的最后一个地址,排序函数cmp);
sort(start,end,cmp);