c和c++的一些训练题(9)(学生成绩管理系统)

问题的提出:编程建立学生成绩管理系统。要求具有以下功能:一个学生的信息包括学号、姓名、英语成绩、语文成绩、数学成绩,要求输入每位学生的信息并显示这些信息;同时计算每位学生的总分即英语、语文、数学成绩之和,并对输入的若干学生按总分排名,按总分名次输出每位学生及其信息;最后计算这些学生的英语平均分、语文平均分和数学平均分,并输出结果。

遇到的问题:

(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;
}
结果:





  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值