c++学生成绩管理系统及(向函数传递对象)

c++学生成绩管理系统及(向函数传递对象)

用c写的学生成绩管理系统初阶是应用结构体数组,配上一些简单的排序搜索算法;进阶版的需要应用到链表,指针,数组,涉及到链表的排序与插入问题,也可以用递归排序等高级一点的排序与搜索算法。
c++的基础版与c大致相同,仅需要将结构体用class代替里面的成员全部用public即可。下面依次对成绩管理系统进行升级,用以学习c++。

#include<iostream>
#include<cstring>
using namespace std;
#define MAX_LEN 10//最大长度
#define MAX_STU 20//最多学生人数
#define MAX_COU 6//课程数
//学生数据设定******1改为private
class Student {
public:
	long num;//学号
	char name[MAX_LEN];//姓名
	float score[MAX_COU];//依次为语数外物化生
	float sum;//总成绩
	float aver;//平均成绩
	int getnum() { return num; }
	int getsum() { return sum; }
	int getaver() { return aver; }
};
//函数声明部分
int Menu();//菜单*****3页面设置
void Read(Student stu[], int n, int m);//数据读入,n代表要录入学生数,m代表要录入******2读到负号结束
void AverSumofEveryStudent(Student stu[], int n, int m);//计算每名学生的总分和平均分
void AverSumofEveryCourse(Student stu[], int n, int m);//计算每门课的总分和平均分
void SortbyScore(Student stu[], int n, int m, int(*compare)(float a, float b));//按学生总成绩排名采用函数指针
int Ascending(float a, float b);//正序
int Descending(float a, float b);//倒序
void ChangeFloat(float* x, float* y);//float型交换函数
void ChangeLong(long* x, long* y);//long型交换函数
void ChangeChar(char x[], char y[]);//char型交换函数
void SortbyNum(Student stu[], int n, int m);//按学号排名
void SortbyName(Student stu[], int n, int m);//按姓名排序
void SearchbyNum(Student stu[], int n, int m);//按学号搜索
void SearchbyName(Student stu[], int n, int m);//按姓名搜索
void Statistic(Student stu[], int n, int m);//数据分析
void PrintScore(Student stu[], int n, int m);//输出分数
//主函数
int main()
{
	char ch;
	int n , m ;
	cout << "请输入录入信息人数(小于20):" ;
	cin >> n;
	cout << "请输入需要录入课程数(小于6):";
	cin >> m;
	Student stu[MAX_STU];
	while (1)
	{
		cout << endl;
		ch = Menu();//获取用户想要使用功能
		switch (ch)
		{
		case 1:Read(stu, n, m);//******4对象数组知识点
			break;

		case 2:AverSumofEveryCourse(stu, n, m);//计算每门课的总分和平均分
			break;
		case 3:AverSumofEveryStudent(stu, n, m);//计算每名学生的总分和平均分
			break;
		case 4:SortbyScore(stu, n, m,Descending);//按学生总成绩排名采用函数指针变小
			cout << "从大到小排名:" << endl;
			PrintScore(stu, n, m);
			break;
		case 5:SortbyScore(stu, n, m, Ascending);//按学生总成绩排名采用函数指针变大
			cout << "从小到大排名:" << endl;
			PrintScore(stu, n, m);
			break;
		case 6:SortbyNum(stu, n, m);
			cout << "按学号排序:" << endl;
			PrintScore(stu, n, m);
			break;
		case 7:SortbyName(stu, n, m);
			cout << "按姓名排序:" << endl;
			PrintScore(stu, n, m);
			break;
		case 8:SearchbyNum(stu, n, m);//按学号搜索
			break;
		case 9:SearchbyName(stu, n, m);//按姓名搜索
			break;
		case 10:Statistic(stu, n, m);//统计
			break;
		case 11:PrintScore(stu, n, m);//输出成绩
			break;
		case 0:cout << "End" << endl;
			exit(0);
		default:cout << "输入错误";

		}
	}
	return 0;
	
}
//函数功能实现
//菜单功能
int Menu()
{
	int temp;
	cout << "你可选择的操作如下" << endl;
	cout << "1:写入数据:" << endl;
	cout << "2:计算每门课的总分和平均分" << endl;
	cout << "3:计算每名学生的总分和平均分" << endl;
	cout << "4:按学生总成绩排名(由大到小)" << endl;
	cout << "5:按学生总成绩排名(由小到大)" << endl;
	cout << "6:按学号排序" << endl;
	cout << "7:按姓名排序" << endl;
	cout << "8:按学号搜索" << endl;
	cout << "9:按姓名搜索" << endl;
	cout << "10:统计" << endl;
	cout << "11:输出数据:" << endl;
	cout << "0:退出" << endl;
	do //对输入按钮值进行限定
	{
		cout << "请输入" << endl;
		cin >> temp;
	} while (temp < 0 || temp>11);
	return temp;
}
//输入数据
void Read(Student stu[], int n, int m)
{
	for (int i = 0; i < n; i++)
	{
		cout << "输入第" << i+1 << "个学号" << endl;
		cin >> stu[i].num;
		cout << "输入第" << i+1 << "个姓名" << endl;
		cin >> stu[i].name;
		cout << "输入" << m << "门" << "成绩" << endl;
		for (int j = 0; j < m; j++)
		{
			cin >> stu[i].score[j];
		}

	}
}
//计算每门课的总分和平均分
void AverSumofEveryCourse(Student stu[], int n, int m)
{
	int i, j;
	float sum[MAX_COU], aver[MAX_COU];
	for (j = 0; j < m; j++)
	{
		sum[j] = 0;
		for (i = 0; i < n; i++)
		{
			sum[j] = sum[j] + stu[i].score[j];
		}
		aver[j] = sum[j] / n;
		cout << "course" << j + 1 << "总分" << sum[j] << "平均分" << aver[j] << endl;
	}
}
//计算每名学生的总分和平均分
void AverSumofEveryStudent(Student stu[], int n, int m)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		stu[i].sum = 0;
		for (j = 0; j < m; j++)
		{
			stu[i].sum = stu[i].sum + stu[i].score[j];
		}
		stu[i].aver = m > 0 ? stu[i].sum / m:-1;
		cout << "student" << i << "总分" << stu[i].sum << "平均分" << stu[i].aver << endl;;
	}
}
//按总分排名
void SortbyScore(Student stu[], int n, int m, int(*compare)(float a, float b))
{
	int i, j, k, t;
	for (i = 0; i < n - 1; i++)
	{
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
		}
		if (k != i)
		{
			for (t = 0; t < m; t++)
			{
				ChangeFloat(&stu[k].score[t], &stu[i].score[t]);
			}
			ChangeFloat(&stu[k].sum, &stu[i].sum);
			ChangeFloat(&stu[k].aver, &stu[i].aver);
			ChangeLong(&stu[k].num, &stu[i].num);
			ChangeChar(stu[k].name, stu[i].name);
		}
	}
}
//升序排列
int Ascending(float a, float b)
{
	return a < b;
}
int Descending(float a, float b)
{
	return a > b;
}
//交换浮点数据
void ChangeFloat(float* x, float* y)
{
	float temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
//交换长整形数据
void ChangeLong(long* x, long* y)
{
	long temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
//交换字符串
void ChangeChar(char x[], char y[])
{
	char temp[MAX_LEN];
	strcpy_s(temp, x);
	x = y;
	y = temp;
	//strcpy_s(x, y);
	//strcpy_s(y, temp);
}
//按学号排序
void SortbyNum(Student stu[], int n, int m)
{
	int i, j, k, t;
	for (i = 0; i < n - 1; i++)
	{
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if (stu[j].num < stu[k].num)
				k = j;
		}
		if (k != i)
		{
			for (t = 0; t < m; t++)
			{
				ChangeFloat(&stu[k].score[t], &stu[i].score[t]);//交换各门科目成绩
			}
			ChangeFloat(&stu[k].sum, &stu[i].aver);//交换总分
			ChangeFloat(&stu[k].aver, &stu[i].aver);//交换平均分
			ChangeLong(&stu[k].num, &stu[i].num);//交换学号
			ChangeChar(stu[k].name, stu[i].name);//交换姓名
		}
	}
}
//name顺序排序
void SortbyName(Student stu[], int n, int m)
{
	int i, j, t;
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (strcmp(stu[j].name, stu[i].name) < 0)
			{
				for (t = 0; t < m; t++)
				{
					ChangeFloat(&stu[i].score[t], &stu[j].score[t]);//交换课程成绩
				}
				ChangeFloat(&stu[i].sum, &stu[j].sum);//交换总分
				ChangeFloat(&stu[i].aver, &stu[j].aver);//交换平均分
				ChangeLong(&stu[i].num, &stu[j].num);//交换学号
				ChangeChar(stu[i].name, stu[j].name);//交换姓名
			}
		}
	}
}
//按学号查找
void SearchbyNum(Student stu[], int n, int m)
{
	long number;
	int i, j;
	cout << "输入查找学号:" << endl;
	cin >> number;
	for (i = 0; i < n; i++)
	{
		if (stu[i].num == number)
		{
			cout << stu[i].num << "      " << stu[i].name << endl;
			for (j = 0; j < m; j++)
			{
				cout << stu[i].score[j] << " ";
			}
			cout << stu[i].sum << " " << stu[i].aver << endl;
			return;//********
		}
	}
	cout << "no found" << endl;
}
//按名称搜索
void SearchbyName(Student stu[], int n, int m)
{
	char x[MAX_LEN];
	int i, j;
	cout << "输入搜索姓名";
	cin >> x;//**********
	for (i = 0; i < n; i++)
	{
		if (strcmp(stu[i].name, x) == 0)
		{
			cout << stu[i].num << "      " << stu[i].name << endl;
			for (j = 0; j < m; j++)
			{
				cout << stu[i].score[j] << " ";
			}
			cout << stu[i].sum << " " << stu[i].aver << endl;
			return;//********
		}
	}
	cout << "没找到";
}
//统计分析
void Statistic(Student stu[], int n, int m)
{
	int i, j, t[6];
	for (j = 0; j < m; j++)
	{
		cout << "课程:" << j + 1 << endl;
		memset(t, 0, sizeof(t));//********
		for (i = 0; i < n; i++)
		{
			if (stu[i].score[j] >= 0 && stu[i].score[j] < 60)t[0]++;
			else if (stu[i].score[j] < 70) t[1]++;
			else if (stu[i].score[j] < 80) t[2]++;
			else if (stu[i].score[j] < 90) t[3]++;
			else if (stu[i].score[j] < 100) t[4]++;
			else if (stu[i].score[j] == 100) t[5]++;
		}
		for (i = 0; i <= 5; i++)
		{
			cout << "0-60" <<" "<< t[0] << endl;
			cout << "60-70" <<" "<< t[1] << endl;
			cout << "70-80" << " "<<t[2] << endl;
			cout << "80-90" << " "<<t[3] << endl;
			cout << "90-100" << " "<<t[4] << endl;
			cout << "100" <<" "<< t[5] << endl;

		}
	}
}
//打印数据
void PrintScore(Student stu[], int n, int m)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		cout <<"学号:"<< stu[i].getnum() << "      " << "姓名"<<stu[i].name << endl;
		for (j = 0; j < m; j++)
		{
			cout <<"科"<<j+1<<":"<< stu[i].score[j] << " ";
		}
		cout << stu[i].getsum()<< " " << stu[i].getaver() << endl;
	}
}

这是c++实现的最简单模式。
1其中值得注意的是对象数组的使用
定义方式与结构体数组相似:Student stu[MAX_STU],使用其中公有成员:例如stu[i].num。(没有定义任何构造函数的类可以定义对象数组,因为c++会为这种类自动生成,如果一个类只有需要参数的构造函数就不能定义对象数组了。)
2也可以用对象指针方式:Student stut=stu;指向对象数组的指针若想要指向单个对象需要有&,例如Student p; Student stut;stut=&p;
通过指针调用成员:stut->num或(*stu).num;
3向函数传递对象

class my {
private:
	int val;
public:
	my(int i) { val = i; }
	int getval() { return val; }
	void setval(int i) { val = i; }//初始化只能在开始的时候赋值,之后要更改数据需要此函数
};

(1)传值:

void change1(my ob) { ob.setval(50); }

传值无法改变对象的数据
(2)传引用

void change2(my& ob) { ob.setval(50); }

可以改变对象数据
(3)传指针

void change3(my* ob) { ob->setval(50); }

可以改变对象数据
(4)对象数组的函数传递

void Statistic(Student stu[], int n, int m)
case 10:Statistic(stu, n, m);//统计
			break;

传名即可,类似于结构体数组。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值