问题的提出:编程建立学生成绩管理系统。要求具有以下功能:一个学生的信息包括学号、姓名、英语成绩、语文成绩、数学成绩,要求输入每位学生的信息并显示这些信息;同时计算每位学生的总分即英语、语文、数学成绩之和,并对输入的若干学生按总分排名,按总分名次输出每位学生及其信息;最后计算这些学生的英语平均分、语文平均分和数学平均分,并输出结果。
遇到的问题:
(1).1>test7.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Student::Student(void)" (??0Student@@QAE@XZ),该符号在函数 _wmain 中被引用
1>D:\jiangshan\test7\Debug\test7.exe : fatal error LNK1120: 1 个无法解析的外部命令
这是因为你在类定义里面列出了构造函数的原型,但是没有函数体,所以链接时发生错误
需要把构造函数Student();改为Student() {}
(2).new和delete的使用方法
new和delete运算符用于动态分配和撤销内存的运算符
new用法:
1. 开辟单变量地址空间
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
2. 开辟数组空间
一维: int *a = newint[100];开辟一个大小为100的整型数组空间
二维: int **a = newint[5][6]
三维及其以上:依此类推.
一般用法: new 类型 [初值]
delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
代码:
// test3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class Student
{
private:
//int total;
int number;
string name;
float Chin;
float Engl;
float Math;
float sumS;
public:
Student(){}
Student(int n, string str, float c, float e, float m)
{
number=n;
name=str;
Chin=c;
Engl=e;
Math=m;
}
void setup(int n, string str, float c, float e, float m)
{
//Student s;
number=n;
name=str;
Chin=c;
Engl=e;
Math=m;
//return s;
}
void sum(float c, float e, float m)
{
sumS=c+e+m;
}
friend void Bubble(Student *s, int n);
friend void Show(Student *s,int n);
friend ostream & operator<<(ostream &, Student &);
};
ostream & operator<<(ostream &os, Student &s)
{
cout<<left<<setw(10)<<"学生学号:"<<left<<setw(4)<<s.number;
//cin>>num;
cout<<left<<setw(10)<<" 学生姓名:"<<left<<setw(7)<<s.name;
//cin>>str;
cout<<left<<setw(10)<<" 语文成绩:"<<left<<setw(4)<<s.Chin;
//cin>>c;
cout<<left<<setw(10)<<"英语成绩:"<<left<<setw(4)<<s.Engl;
//cin>>e;
cout<<left<<setw(10)<<"数学成绩:"<<left<<setw(4)<<s.Math;
//cin>>m;
cout<<left<<setw(10)<<"总成绩:"<<left<<setw(4)<<s.sumS;
return os;
}
void Bubble(Student *s, int n)
{
Student temp;
for(int i=0; i<n; i++)
{
for(int j=0; j<n-1-i; j++)
{
if(s[j].sumS<=s[j+1].sumS)
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
}
void Show(Student *s,int n)
{
cout<<left<<setw(10)<<"学生学号";
//cin>>num;
cout<<left<<setw(10)<<"学生姓名";
//cin>>str;
cout<<left<<setw(10)<<"语文成绩";
//cin>>c;
cout<<left<<setw(10)<<"英语成绩";
//cin>>e;
cout<<left<<setw(10)<<"数学成绩";
//cin>>m;
cout<<left<<setw(10)<<"总成绩";
cout<<endl;
float avg_c = 0;
float avg_m = 0;
float avg_e = 0;
for(int i=0; i<n; i++)
{
cout<<left<<setw(10)<<s[i].number;
//cin>>num;
cout<<left<<setw(10)<<s[i].name;
//cin>>str;
cout<<left<<setw(10)<<s[i].Chin;
//cin>>c;
cout<<left<<setw(10)<<s[i].Engl;
//cin>>e;
cout<<left<<setw(10)<<s[i].Math;
//cin>>m;
cout<<left<<setw(10)<<s[i].sumS;
cout<<endl;
avg_c=avg_c+s[i].Chin;
avg_m=avg_m+s[i].Math;
avg_e=avg_e+s[i].Engl;
}
avg_c=avg_c/n;
avg_e=avg_e/n;
avg_m=avg_m/n;
cout<<"语文的平均分为:"<<avg_c<<endl;
cout<<"英语的平均分为:"<<avg_e<<endl;
cout<<"数学的平均分为:"<<avg_m<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"请输入一共有多少个学生:";
int n;
cin>>n;
//分别n个学生的信息
int num;
string str;
float c;
float e;
float m;
Student *s = new Student[n];
for(int i=0;i<n;i++)
{
cout<<"第"<<(i+1)<<"个学生的信息:"<<endl;
cout<<"学生学号:";
cin>>num;
cout<<"学生姓名:";
cin>>str;
cout<<"语文成绩:";
cin>>c;
cout<<"英语成绩:";
cin>>e;
cout<<"数学成绩:";
cin>>m;
s[i].setup(num,str,c,e,m);
s[i].sum(c,e,m);
}
//根据总成绩,对这些学生进行排序
Bubble(s, n);
Show(s,n);
//for(int i=0;i<n;i++)
//{
// cout<<s[i]<<endl;
//}
//cout<<s[0];
delete [] s;
system("pause");
return 0;
}
结果: