扩展练习4(学生类设计).设计一个友元函数,按照成绩从高到低的顺序输出姓名、学号和成绩信息。

ahys 2013-05-31 10:33:59
#include<iostream>
using namespace std;
class CStudent{
private:
int id_,math_,forlan_,computer_;//right type :double;
char *name_;
public:
CStudent(int id=0,char *name=" ",int math=0,int forlan=0,int computer=0):id_(id),name_(name),math_(math),forlan_(forlan),computer_ (computer )
{

}
int getAverage();
int getTotal();
void displayInfor();
void setName(char * name);
void setId(int id);
friend void getRank(CStudent grade[])
{
cout<<"chufa "<<endl;
int num=sizeof(grade)/sizeof(grade[0]);
cout<<"chufa "<<endl;
for(int i=0;i<num-1;i++)//触发不了
{
cout<<"chufa "<<endl;
for(int j=i+1;j<num;j++)
{
if(grade[i].getTotal() < grade[j].getTotal())
{
CStudent temp;
temp=grade[i];
grade[i]=grade[j];
grade[j]=temp;
cout<<i<<endl;
}
}
}
for(int i=0;i<num;i++)
{
grade[i].displayInfor();
}
}
};
int CStudent::getAverage()
{
return (math_+forlan_+computer_ )/3;
}
int CStudent::getTotal ()
{
return math_+forlan_+computer_;
}
void CStudent::displayInfor ()
{
cout<<"name: "<<name_ <<" ID: "<<id_<<" math: "<<math_<<
" foreign langue: "<<forlan_<<" computer: "<<computer_<<endl;
}
void CStudent::setName(char * name)
{
name_=name;
}
void CStudent::setId(int id)
{
id_=id;
}
void main()
{
CStudent *grade=new CStudent[3];
//grade={ CStudent(1,"hys",3,3,3), CStudent(2,"szh",1,1,1), CStudent(3,"dyl",2,2,2)};
grade[0]=CStudent(1,"hys",1,3,3);
grade[1]=CStudent(2,"hys",2,3,3);
grade[2]=CStudent(3,"hys",3,3,3);
getRank(grade);
delete []grade;
}
...全文
616 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 kisswawawa 的回复:
int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环
  • 打赏
  • 举报
回复
int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
  • 打赏
  • 举报
回复
楼上高手来了
anshiny 2013-06-01
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
class CStudent{
private:
	int id_,math_,forlan_,computer_;
	char *name_;
public:
	CStudent(int id=0,char *name=" ",int math=0,int forlan=0,int computer=0):id_(id),name_(name),math_(math),forlan_(forlan),computer_ (computer)
	{}
	int getAverage();
	int getTotal();
	void displayInfor();
	void setName(char * name);
	void setId(int id); 
	friend void getRank(CStudent grade[], int size);
	/*{ 
		int i, j;
		CStudent temp;

		for(i=0; i<size-1; i++){
			for(j=i+1; j<size; j++){
				if(grade[i].getTotal() < grade[j].getTotal()){					
					temp = grade[i];
					grade[i] = grade[j];
					grade[j] = temp;
				}
			}
		}

		for(i=0; i<size; i++){
			grade[i].displayInfor();
		}
	}
	*/
};

int CStudent::getAverage(){
	return getTotal() / 3;
}

int CStudent::getTotal(){
	return math_ + forlan_ + computer_; 
}

void CStudent::displayInfor(){
	cout<<"name: "<<name_ <<"    ID: "<<id_<<"    math: "<<math_<<
		"    foreign langue: "<<forlan_<<"    computer: "<<computer_<<endl;
}

void CStudent::setName(char *name){
	name_ = name;
}

void CStudent::setId(int id){
	id_ = id;
}

void getRank(CStudent grade[], int size){ 
	int i, j;
	CStudent temp;
	for(i=0; i<size-1; i++){
		for(j=i+1; j<size; j++){
			if(grade[i].getTotal() < grade[j].getTotal()){					
				temp = grade[i];
				grade[i] = grade[j];
				grade[j] = temp;
			}
		}
	}

	for(i=0; i<size; i++){
		grade[i].displayInfor();
	}
}

void main()
{
	CStudent *grade = new CStudent[3];
	
	grade[0] = CStudent(1,"hys",1,3,3);
	grade[1] = CStudent(2,"hys",2,3,3);
	grade[2] = CStudent(3,"hys",3,3,3);

	getRank(grade, 3);
	delete []grade;
	return;
} 
  • 打赏
  • 举报
回复
friend 应该类里声明 ,在类外实现吧 ,你把friend在类里实现了
ahys 2013-06-01
  • 打赏
  • 举报
回复
引用 2 楼 kisswawawa 的回复:
getRank不能直接调用吧
运行了 可以但是 就是显示不出来
ahys 2013-06-01
  • 打赏
  • 举报
回复
引用 12 楼 kisswawawa 的回复:
[quote=引用 10 楼 oBoySen 的回复:] [quote=引用 8 楼 kisswawawa 的回复:] [quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote]
引用 8 楼 kisswawawa 的回复:
[quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote] 这句话 真有问题 那么 怎么改呢 [/quote] sizeof(grade), grade是指针, 所以等于4啊,不能按你这么用,还是按那位高手的方法吧,把个数传过去,就可以了。我也才学= = [/quote]嗯
  • 打赏
  • 举报
回复
引用 10 楼 oBoySen 的回复:
[quote=引用 8 楼 kisswawawa 的回复:] [quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote]
引用 8 楼 kisswawawa 的回复:
[quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote] 这句话 真有问题 那么 怎么改呢 [/quote] sizeof(grade), grade是指针, 所以等于4啊,不能按你这么用,还是按那位高手的方法吧,把个数传过去,就可以了。我也才学= =
ahys 2013-06-01
  • 打赏
  • 举报
回复
引用 5 楼 anshiny 的回复:
#include<iostream>
using namespace std;
class CStudent{
private:
	int id_,math_,forlan_,computer_;
	char *name_;
public:
	CStudent(int id=0,char *name=" ",int math=0,int forlan=0,int computer=0):id_(id),name_(name),math_(math),forlan_(forlan),computer_ (computer)
	{}
	int getAverage();
	int getTotal();
	void displayInfor();
	void setName(char * name);
	void setId(int id); 
	friend void getRank(CStudent grade[], int size);
	/*{ 
		int i, j;
		CStudent temp;

		for(i=0; i<size-1; i++){
			for(j=i+1; j<size; j++){
				if(grade[i].getTotal() < grade[j].getTotal()){					
					temp = grade[i];
					grade[i] = grade[j];
					grade[j] = temp;
				}
			}
		}

		for(i=0; i<size; i++){
			grade[i].displayInfor();
		}
	}
	*/
};

int CStudent::getAverage(){
	return getTotal() / 3;
}

int CStudent::getTotal(){
	return math_ + forlan_ + computer_; 
}

void CStudent::displayInfor(){
	cout<<"name: "<<name_ <<"    ID: "<<id_<<"    math: "<<math_<<
		"    foreign langue: "<<forlan_<<"    computer: "<<computer_<<endl;
}

void CStudent::setName(char *name){
	name_ = name;
}

void CStudent::setId(int id){
	id_ = id;
}

void getRank(CStudent grade[], int size){ 
	int i, j;
	CStudent temp;
	for(i=0; i<size-1; i++){
		for(j=i+1; j<size; j++){
			if(grade[i].getTotal() < grade[j].getTotal()){					
				temp = grade[i];
				grade[i] = grade[j];
				grade[j] = temp;
			}
		}
	}

	for(i=0; i<size; i++){
		grade[i].displayInfor();
	}
}

void main()
{
	CStudent *grade = new CStudent[3];
	
	grade[0] = CStudent(1,"hys",1,3,3);
	grade[1] = CStudent(2,"hys",2,3,3);
	grade[2] = CStudent(3,"hys",3,3,3);

	getRank(grade, 3);
	delete []grade;
	return;
} 
谢谢 但是 size=sizeof(grade)/sizeof(grade[0]); 这句话 怎么改呢 我写了个 小程序能测试出 这句话的正确性 但在此不行 为啥呢 大神
ahys 2013-06-01
  • 打赏
  • 举报
回复
引用 8 楼 kisswawawa 的回复:
[quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote]
引用 8 楼 kisswawawa 的回复:
[quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote] 这句话 真有问题 那么 怎么改呢
ahys 2013-06-01
  • 打赏
  • 举报
回复
引用 8 楼 kisswawawa 的回复:
[quote=引用 7 楼 kisswawawa 的回复:] int num=sizeof(grade)/sizeof(grade[0]);这个也有错误sizeof(grade)的大小是4
sizeof(grade【0】)大小是20. 4/20=0,所以没循环[/quote]这个没错同学 我试过了还是谢谢你
  • 打赏
  • 举报
回复
getRank不能直接调用吧
ahys 2013-05-31
  • 打赏
  • 举报
回复
我这个 friend 函数触发不了 跪求大婶们 我目前真看不出来 麻烦了

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧