学生信息管理系统
具体题目:
一个班30名学生,4门课程。使用菜单形式进行学生成绩管理,完成结构化程序设计并完成以下功能。
(1) 成绩信息的输入;
(2) 成绩的计算;
(3) 成绩的排序;
(4) 成绩信息的输出 ;
(5) 学生的查找(按学号,按姓名)。
前言
学生信息是学校管理一项繁杂的工作。学生完成课程考试后,教师要录入学生的考试成绩,再由管理员统计所有学生的信息计算每个学生的总分,进行排名。本文就介绍了如何设计一套实用的学生信息管理系统。
提示:以下是本篇文章正文内容,下面案例可供参考
1、系统需求
系统中需要实现的功能如下:
- 学生信息的输入:向系统中添加学生信息,包括(学号,姓名,语文、数学、英语、化学四门成绩)
- 学生成绩的计算:计算每个学生四门成绩的总和
- 学生成绩的排序:按照学生的四门成绩总和从高到低排序
- 学生信息的输出:输出所有学生(排序前和排序后)所有信息,包括(学号,姓名,语文、数学、英语、化学四门成绩)
- 学生的查找(按学号或者姓名):按照姓名查看指定学生信息
2.创建项目
创建项目步骤如下:
- 创建新项目
- 添加文件
2.1创建项目
打开vs2019后,点击创建新项目,创建新的cpp项目
填写项目名称,选择项目路径:
2.2添加文件
添加成功后,效果如图:
3.学生信息的输入
功能描述:
输入学生的信息,学生信息包括(学号,姓名,语文、数学、英语、化学四门成绩)
步骤:
- 设计学生结构体
- main函数中定义学生数组
- 封装学生信息输入函数
- 在main函数中调用输入函数
- 测试添加学生信息功能
3.1 设计学生结构体
学生信息包括:学号、姓名、语文 数学 英语 化学 分数四门总分
设计如下:
#include<iostream>
using namespace std;
struct student
{
char num[10]; //学号
string name; //姓名 包含头文件#include<string>
float score[4];//语文、数学、英语、化学 成绩
float add; //四门成绩之和
};
3.2 main函数中定义学生数组
维护一个容量为30的存放学生信息的数组
设计如下:
int const N = 30; //表示成员变量 一个班30个学生
int main()
{
student stu[N] = { 0 }; //结构体数组初始化 一个班30个同学的信息初始为空
system("pause");
return 0;
}
3.3 封装学生信息输入函数
输入学生信息代码:
int input(student stu1[], int n)//输入学生的信息并统计输入总人数
{
int i = 0, j;
cout << "请输入" << N << "个学生的学号 姓名 语文 数学 英语 化学 的成绩" << endl;
while (i < n)
{
char ch, zh;
cin >> stu1[i].num; //输入学号
cin >> stu1[i].name; //输入姓名
for (j = 0; j < 4; j++)
cin >> stu1[i].score[j]; //输入分数
cout << "第" << i + 1 << "个学生输入完毕!" << endl;
i++;
}
cout << endl;
cout << "*********************************" << endl;
cout << "******共输入" << i << "个学生记录******" << endl; // 统计输入总人数
cout << "*********************************" << endl;
cout << endl;
return i; //返回总人数的值
}
3.4.在main函数中调用输入函数
设计如下:
int main()
{
student stu[N] = { 0 }; //结构体数组初始化 一个班30个同学的信息初始为空
int i;
i = input(stu, N); //i为输入函数中返回的输入总人数
system("pause");
return 0;
}
3.5. 测试添加学生信息功能
测试输入学生信息是否成功输入 (测试学生人数2人)
测试效果图如下:
4.学生成绩的计算
功能描述:计算每个学生的成绩总和
步骤:
- 封装计算学生成绩的函数
- 在main函数中调用计算函数
- 测试计算学生成绩的功能
4.1 封装计算学生成绩的函数
设计如下:
int count(student stu1[], int n)//求学生的总分
{
int i, j;
float sum1;
for (i = 0; i < n; i++)
{
sum1 = 0;
for (j = 0; j < 4; j++)
{
sum1 = sum1 + stu1[i].score[j];
}
stu1[i].add = sum1;
cout << "stu["<<i+1<<"]的总分为:"<<stu1[i].add << endl;
}
return 0;
}
4. 2. 在main函数中调用计算函数
设计如下:
int main()
{
student stu[N] = { 0 }; //结构体数组初始化 一个班30个同学的信息初始为空
int i;
i = input(stu, N); //i为输入函数中返回的输入总人数
count(stu, i);
system("pause");
return 0;
}
4.3 测试计算学生成绩的功能
测试能否算出每个学生的总分
测试效果图如下:
5. 成绩信息的输出
功能描述:
输出所有输入的学生信息,学生信息包括(学号,姓名,语文、数学、英语、化学四门成绩)
步骤:
- 封装输出学生成绩的函数
- 在main函数中调用输出函数
- 测试输出学生成绩的功能
5.1 封装输出学生成绩的函数
设计如下:
#include<iomanip>
void output( student stu1[],int n)//输出
{
//cout << "----------" << endl;
int i, j;
for (i = 0; i < n; i++)
{
cout << "第" << i + 1 <<"个学生"<< endl;
cout << "学号:" << stu1[i].num << endl;
cout<<"姓名:" << stu1[i].name << endl;
cout << "语文 英语 数学 化学 分数为:" << endl;
for (j = 0; j < 4; j++)
cout<< stu[i].score[j] << setw(4); //包含头文件 #include<iomanip>
cout << endl;
cout << "-----------" << endl;
}
}
5.2 在main函数中调用输出函数
int main()
{
student stu[N] = { 0 }; //结构体数组初始化 一个班30个同学的信息初始为空
int i;
i = input(stu, N); //i为输入函数中返回的输入总人数
count(stu, i);
output(stu, i);
system("pause");
return 0;
}
5.3 测试输出学生成绩的功能
测试效果如下:
6.成绩的排序
功能描述:
按照学生的四门成绩总和从高到低排序
步骤:
- 封装排序学生成绩的函数
- 在main函数中调用排序函数
- 测试排序学生成绩的功能
6.1 封装排序学生成绩的函数
设计如下:
int sort(student stu1[], int n)//从高到低排序
{
int i,j;
student temp;
for (j = 0; j < n; j++) //进行n次循环,比较n趟
{
for (i = 0; i < n - j; i++)//在每一趟中进行n-j次比较
{
if (stu1[i].add < stu1[i + 1].add)//相邻两个数比较
{
temp = stu1[i];
stu1[i] = stu1[i + 1];
stu1[i + 1] = temp;
}
}
}
return 0;
}
6. 2 在main函数中调用排序函数
设计如下:
int main()
{
student stu[N] = { 0 }; //结构体数组初始化 一个班30个同学的信息初始为空
int i;
i = input(stu, N); //i为输入函数中返回的输入总人数
count(stu, i);
sort(stu, i);
output(stu,i);
system("pause");
return 0;
}
6. 3 测试排序学生成绩的功能
测试效果如下:
7. 学生的查找(按学号,按姓名)
功能描述:
按照姓名查看指定学生信息
步骤:
- 封装查找学生成绩的函数``
- 在main函数中输入指定学生姓名并调用查找函数
- 测试查找学生成绩的功能
7.1 封装查找学生成绩的函数
设计如下:
int finding(student stu[], string name) //name为main函数中输入的要查找学生名字
{
int i,r=-1;
for (i = 0; i < N; i++)
{
if (stu[i].name == name)
{//如果指定查找的学生存在,输出该学生的学号和姓名,并返回i值
cout << stu[i].num << " " << stu[i].name << endl;
cout << endl;
r = i;
}
}
return r; // 如果为找到指定的学生,返回r(-1)值
}
7.2 在main函数中输入指定学生姓名并调用查找函数
int main()
{
student stu[N] = { 0 }; //结构体数组初始化 一个班30个同学的信息初始为空
int i;
i = input(stu, N); //i为输入函数中返回的输入总人数
count(stu, i);
sort(stu, i);
output(stu, i);
{
cout << "请输入姓名" << endl;
string name; //与结构体成员name定义同种类型 string
cin >> name; //输入指定学生的姓名,进行查找!
if (finding(stu, name) == -1) //调用查找函数,若返回值为-1,则表示没找到该学生
{
cout << "查无此人!" << endl;
}
else//返回值为i,则表示找到了该学生
{
cout << "找到此人!" << endl;
}
}
system("pause");
return 0;
}
7.3 测试查找学生成绩的功能
测试效果如下:
8.输入系统的完善
功能描述:
完善输入系统的两个功能
- 输入过程中学生信息输入有误,重新输入学生信息的动能
- 提前结束输入学生信息的功能
步骤:
- 在输入函数中添加重新输入信息的代码
- 测试重新输入学生信息的功能
- 在输入函数中添加提前结束输入学生信息的代码
- 测试提前结束输入学生信息的功能
8.1 在输入函数中添加重新输入信息的代码
#include<conio.h> //定义了通过控制台进行数据的输入和数据输出的函数(通过按键盘产生的对应的操作)。
int input(student stu1[], int n)//输入学生的信息并统计输入总人数
{
int i = 0, j;
cout << "请输入" << N << "个学生的学号 姓名 语文 数学 英语 化学 的成绩" << endl;
while (i < n)
{
char ch, zh;
cin >> stu1[i].num; //输入学号
cin >> stu1[i].name; //输入姓名
for (j = 0; j < 4; j++)
cin >> stu1[i].score[j]; //输入分数
cout << "第" << i + 1 << "个学生输入完毕!" << endl;
i++;
//此段为重新输入的代码 以下
cout << "按r可重新输入上一行数据,按回车继续" << endl;
ch = _getch();// 输入字符 但只能接受一个字符 使用要包含头文件#include<conio.h>
if (ch == 'r')
{
cout << "重新输入:" << endl;
i = i - 1;
}
else if (ch == 13) //回车键在十进制下ASCII码为13
{
//cout << endl;
}
else
cout << "error!" << endl;
}
//以上
cout << endl;
cout << "*********************************" << endl;
cout << "********共输入" << i << "个学生记录********" << endl; // 统计输入总人数
cout << "*********************************" << endl;
cout << endl;
return i; //返回总人数的值
}
8.2 测试重新输入学生信息的功能
测试效果如下:
8.3 在输入函数中添加提前结束输入学生信息的代码
int input(student stu1[],int n)//输入学生的信息并统计输入总人数
{
int i=0,j;
cout << "请输入"<<N<<"个学生的学号 姓名 语文 数学 英语 化学 的成绩" << endl;
while(i<n)
{
char ch,zh;
cin >> stu1[i].num;
cin >> stu1[i].name;
for (j = 0; j < 4; j++)
cin >> stu1[i].score[j];
cout << "第" << i +1<< "个学生输入完毕!" << endl;
i++;
cout << "按r可重新输入上一行数据,按回车继续" << endl;
ch = _getch();// 输入字符 但只能接受一个字符 使用要包含头文件#include<conio.h>
if (ch == 'r')
{
cout << "重新输入:" << endl;
i = i - 1;
}
else if (ch == 13) //回车键在十进制下ASCII码为13
{
//cout << endl;
}
else
cout << "error!" << endl;
// 此段为提前结束输入的代码 如下
cout << "按t可提前结束输入,按回车继续" << endl;
cout << "-------------------------" << endl;
zh = _getch();
if (zh == 't')
break;
else if (zh == 13)
{
cout << endl;
cout << "输入第" << i + 1 << "个学生信息" << endl;
}
else
cout << "error!" << endl;
}
// 如上
cout << endl;
cout << "*********************************" << endl;
cout << "******共输入" << i << "个学生记录******" << endl;
cout << "*********************************" << endl;
cout << endl;
return i;
}
8.4 测试提前结束输入学生信息的功能
测试效果如下:
至此,学生信息管理系统完成!