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;
传名即可,类似于结构体数组。