[问题]向高手讨教个C++问题,简单dio

软件和网站开发以及相关技术探讨
回复
头像
yjzzo0
帖子: 39
注册时间: 2007-10-25 18:45

[问题]向高手讨教个C++问题,简单dio

#1

帖子 yjzzo0 » 2008-04-12 4:00

这是一道作业题:从键盘输入全班学生的数据,包括学号、姓名、英语成绩、高数成绩和C++成绩,并按照平均成绩的升序输出全班学生的成绩。

我的代码如下:

代码: 全选

#include <iostream>

using namespace std;

class student
{
public:
	float average();
	void input();
	void display();
	friend void arrange(student &stud[],int count);
private:
	string name;
	int num;
	float english;
	float math;
	float cpp;
	float ave;
};

void student::input()
{
	cout<<"num:";
	cin>>num;
	cout<<"name:";
	cin>>name;
	cout<<"english:";
	cin>>english;
	cout<<"math:";
	cin>>math;
	cout<<"cpp:";
	cin>>cpp;
}

float student::average()
{
	ave=(english+math+cpp)/3;
}

void student::display()
{
	cout<<"num:"<<num<<endl;
	cout<<"name:"<<name<<endl;
	cout<<"english:"<<english<<endl;
	cout<<"matn:"<<math<<endl;
	cout<<"cpp:"<<cpp<<endl;
	cout<<"average:"<<ave<<endl;
}

void arrange(student &stud[],int count)
{
	int m,n;
	student s;
	for(m = 1;m<count;m++)
		for(n = count-1;n >= m;--n)
		{
			if(stud[n-1].ave>stud[n].ave)
			{
				s = stud[n-1];
				stud[n-1] = stud[n];
				stud[n]= s;
			}
		}
}

int main()
{
	student stud[3];
	for(int i=0;i<3;i++)
	{
		cout<<"No."<<i<<endl;
		stud[i].input();
		stud[i].average();
	}
	arrange(stud,3);
	for(int i=0;i<3;i++)
		stud[i].display();
	return 0;
}
不知道为什么用GCC总是编译不过,输出如下错误:
zz@zz-desktop:~$ gcc ./323.cpp
./323.cpp:12: 错误: ‘stud’ 声明为 array of references
./323.cpp:51: 错误: ‘stud’ 声明为 array of references
./323.cpp: In function ‘void arrange(int)’:
./323.cpp:58: 错误: ‘stud’ 在此作用域中尚未声明
./323.cpp: In function ‘int main()’:
./323.cpp:76: 错误: 从类型 ‘student*’ 到类型 ‘int’ 的转换无效
./323.cpp:51: 错误: 给予 function ‘void arrange(int)’ 的实参太多
./323.cpp:76: 错误: 在文件的这个地方
查了N久也搞不定,已经开始怀疑自己的智商,大虾救我!!!
linuxu
帖子: 2
注册时间: 2008-03-29 19:46

#2

帖子 linuxu » 2008-04-12 10:47

首先建议用g++编译,用gcc还要显式的加上C++的链接库

代码: 全选

g++ -Wall student.cpp -o student
改过的几个地方:

代码: 全选

friend void arrange(student &stud[],int count); //去掉&
float student::average() 
 { 
    ave=(english+math+cpp)/3; 
    return ave; //添加这一句
 }
void arrange(student &stud[],int count) //去掉&
{ 
    int m,n; 
    student s; 
    for(m = 1;m<count;m++) 
       for(n = count-1;n >= m;--n) 
       { 
          if(stud[n-1].ave>stud[n].ave) 
          { 
             s = stud[n-1]; 
             stud[n-1] = stud[n]; 
             stud[n]= s; 
          } 
       } 
 } 
这样没有警告且保证能运行了,但细节的地方我没有看:)
结果如下:

代码: 全选

$./student
No.0
num:1
name:jim
english:60
math:70
cpp:80
No.1
num:2
name:lucy
english:80
math:90
cpp:90
No.2
num:3
name:john
english:49
math:95
cpp:68
num:1
name:jim
english:60
matn:70
cpp:80
average:70
num:3
name:john
english:49
matn:95
cpp:68
average:70.6667
num:2
name:lucy
english:80
matn:90
cpp:90
average:86.6667
头像
yjzzo0
帖子: 39
注册时间: 2007-10-25 18:45

#3

帖子 yjzzo0 » 2008-04-12 12:19

呵呵,原来是这样,还是GCC用的少

平时都是用VC的,只是这次在VC上编译不过,才想用GCC试一下

形参利用数组也可以实现值传递?这点以前倒是忽略了,嘿嘿收获

不过这个代码在VC2008下面还是编译不过,提示有两个错误。一般情况下从GCC到VC需要做哪些改动?
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#4

帖子 BigSnake.NET » 2008-04-12 12:36

yjzzo0 写了:呵呵,原来是这样,还是GCC用的少

平时都是用VC的,只是这次在VC上编译不过,才想用GCC试一下

形参利用数组也可以实现值传递?这点以前倒是忽略了,嘿嘿收获

不过这个代码在VC2008下面还是编译不过,提示有两个错误。一般情况下从GCC到VC需要做哪些改动?
不是数组可以值传递, 而是你调用函数时传过去的本来就是数组首地址指针..
你那个& 被认为是 (student & )[] 了
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
yjzzo0
帖子: 39
注册时间: 2007-10-25 18:45

#5

帖子 yjzzo0 » 2008-04-12 23:52

你那个& 被认为是 (student & )[] 了
我是想让形参作为引用,&在这里难道不能当作引用符么?
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#6

帖子 BigSnake.NET » 2008-04-13 20:17

yjzzo0 写了:
你那个& 被认为是 (student & )[] 了
我是想让形参作为引用,&在这里难道不能当作引用符么?
不明白你干吗要传引用

它本身就是个指针, 还传引用干吗
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
yjzzo0
帖子: 39
注册时间: 2007-10-25 18:45

#7

帖子 yjzzo0 » 2008-04-13 22:59

呵呵,对引用还不是太了解,看来是误用 :wink:
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#8

帖子 BigSnake.NET » 2008-04-15 12:58

yjzzo0 写了:呵呵,对引用还不是太了解,看来是误用 :wink:
引用通常是出于性能考虑
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
回复