目录
一、前言
二、系统简介
三、完整代码
四、总结
???????
一、前言
? ? ? ? 本人是大一本科在读学生,也是一名刚接触代码不久的新手程序员。在学完结构体部分内容后,老师布置了一个综合实验作业,需要制作一个简单的学生成绩管理系统。本文章主要是向大家分享我所编写的学生成绩管理系统代码以及我在编程过程中的感受和遇到的一些问题。?
二、系统简介
? ? ? ? 该学生成绩管理系统最多可录入100名学生(可修改上限,此处设为100人),每个学生的信息录入包括姓名、学号、性别、语文成绩、数学成绩、英语成绩以及三门课程的平均成绩。系统功能包括:
(1)输入所有学生的信息(不包括平均成绩);
(2)输出所有学生的信息(不包括平均成绩);
(3)输出某个学生的相关信息;
(4)求任意一门课的平均成绩;
(5)求每个学生3门课程的平均成绩;
(6)找出平均成绩为最高分的学生;
(7)找出平均成绩为不及格的学生;
(8)根据给定的学号查询某学生;
(9)根据给定的学号修改某学生信息。
系统函数对应功能:
(1)构建Create函数,实现所有学生信息的输入;
(2)构建DisplayAll函数,实现所有学生信息的输出;
(3)构建DisplayOne函数,实现某个学生信息的输出;
(4)构建CourseAve函数,实现任意一门课程的计算及输入;
(5)构建StudentAve函数,实现每个学生3门课的平均成绩的计算,并调用DisplayAll函数或DisplayOne函数输出相关信息;
(6)构建TopScore函数,实现平均成绩最高分学生的查找,并调用DisplayOne函数输出该学生的信息(包括姓名、学号、性别、三门课成绩和平均分);
(7)构建FailExam函数,实现平均成绩不及格(60分以下)学生的查找,并调用DisplayOne函数输出该学生的信息(包括姓名、学号、性别、三门课成绩和平均分);
(8)构建IsExist函数,实现根据给定的学号查询某学生是否存在;
(9)构建Search函数,实现调用IsExist函数判断给定学号的某学生是否存在,若存在,则调用DisplayOne函数输出该学生的信息(包括姓名、学号、性别、三门课成绩),若不存在,则输出“查无此人”;
(10)构建Modify函数,实现调用IsExist函数判断给定学号的某学生是否存在,若存在,则修改该学生的信息(包括姓名、学号、性别、三门课成绩),若不存在,则输出“查无此人”;
(11)附加Check函数,检查用户输入规范的问题。
三、完整代码
#include <iostream>
#include <string.h>
#include <iomanip>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996) //解决Visual Studio中strcpy不安全报错问题
using namespace std;
int x = 0;
int* X = &x; //指针计数器
struct student
{
char name[10];
char number[100];
char sex[10];
float Chinese;
float math;
float English;
float AverageScore;
};
//--------------------------------------------------------------------------------------------------------------
//定义结构体数组:
struct student stu[100]; //限定100名学生
//--------------------------------------------------------------------------------------------------------------
//判断用户的输入是否正确(字符和字符串):
float Check(int a)
{
if (a == 0) //针对字符和字符串
{
float m;
if (cin >> m)
{
return m;
}
else
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
while (!(cin >> m))
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
}
return m;
}
}
else if (a == 1) //针对字符和字符串以及StudentAve函数中菜单的数字范围
{
float m;
float c;
if (cin >> m)
{
while (1)
{
if (m == 1 || m == 2 || m == 3)
{
return m;
break;
}
else
{
cout << "输入错误,请重新输入:";
c = Check(1);
return c;
break;
}
}
}
else
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
while (!(cin >> m))
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
}
while (1)
{
if (m == 1 || m == 2 || m == 3)
{
return m;
break;
}
else
{
cout << "输入错误,请重新输入:";
c = Check(1);
return c;
break;
}
}
}
}
else if (a == 2) //针对字符和字符串以及重新查询和退出选择功能的数字范围
{
float m;
float c;
if (cin >> m)
{
while (1)
{
if (m == 1 || m == 2)
{
return m;
break;
}
else
{
cout << "输入错误,请重新输入:";
c = Check(2);
return c;
break;
}
}
}
else
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
while (!(cin >> m))
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
}
while (1)
{
if (m == 1 || m == 2)
{
return m;
break;
}
else
{
cout << "输入错误,请重新输入:";
a = Check(2);
return a;
break;
}
}
}
}
else if (a == 3) //针对字符和字符串以及重新查询和退出选择功能的数字范围
{
float m;
float c;
if (cin >> m)
{
while (1)
{
if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7)
{
return m;
break;
}
else
{
cout << "输入错误,请重新输入:";
c = Check(3);
return c;
break;
}
}
}
else
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
while (!(cin >> m))
{
cout << "输入错误,请重新输入:";
cin.clear();
cin.get();
}
while (1)
{
if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7)
{
return m;
break;
}
else
{
cout << "输入错误,请重新输入:";
a = Check(3);
return a;
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------------------------------
//输入学生信息
void Create(int p)
{
if (x <= 100) //设置上限,该表存放最多不超过100名学生的信息
{
int Y = x;
cout << "请分别输入:姓名(不超过3个字)、学号(11位数字)、性别、语文成绩、数学成绩、英语成绩" << endl;
for (int i = Y; i < Y + p; i++)
{
cin >> stu[i].name >> stu[i].number >> stu[i].sex >> stu[i].Chinese >> stu[i].math >> stu[i].English;
if (i != Y + p - 1)
{
cout << "请输入下一个学生的信息:" << endl;
}
*X += 1; //记录表中人数
}
cout << endl << endl;
cout << "添加成功!" << endl << endl;
}
else
{
cout << "亲~表格人数已满,无法再继续添加了噢" << endl << endl << endl;
}
return;
}
//--------------------------------------------------------------------------------------------------------------
//输出所有学生信息
int DisplayAll(int a)
{
if (a == 0) //该函数基本功能的实现
{
cout << endl << "序号\t" << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << endl;
for (int i = 0; stu[i].Chinese != 0; i++)
{
cout << i + 1 << ":\t";
cout << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << endl;
}
cout << endl << endl;
}
else if (a == 1) //StudentAve调用DisplayAll函数专属通道
{
cout << endl << "序号\t" << "姓名\t" << "学号\t\t" << "性别\t" << "平均成绩\t" << endl;
for (int i = 0; stu[i].Chinese != 0; i++)
{
cout << i + 1 << ":\t";
cout << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl;
}
cout << endl << endl;
}
return 0;
}
//--------------------------------------------------------------------------------------------------------------
//查询某个学生信息
int DisplayOne(int b, float* a)
{
if (b == 0) //该函数基本功能的实现
{
char A[1000];
int c = 0;
cout << "请输入你想查询学生的姓名:";
cin >> A;
cout << endl << endl;
for (int i = 0; i < x; i++)
{
int a = strcmp(A, stu[i].name);
if (a == 0)
{
cout << "查询结果:" << endl;
cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << endl;
cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << endl << endl;
return 1;
break;
}
else
{
c++;
}
}
if (c == x)
{
cout << "查无此人" << endl << endl;
return 0;
}
}
else if (b == 1) //StudentAve调用DisplayOne函数专属通道
{
char C[1000];
int d = 0;
cout << "请输入你想查询学生的姓名:";
cin >> C;
cout << endl << endl;
for (int i = 0; i < x; i++)
{
int a = strcmp(C, stu[i].name);
if (a == 0)
{
cout << "姓名\t" << "学号\t\t" << "性别\t" << "平均成绩\t" << endl;
cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
return 1;
break;
}
else
{
d++;
}
}
if (d == x)
{
cout << "查无此人" << endl << endl;
return 0;
}
}
else if (b == 2) //TopScore调用DisplayOne函数专属通道
{
for (int i = 0; i < x; i++)
{
if (*a == stu[i].AverageScore)
{
cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl;
cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
cout << "查询成功!" << endl << endl << endl;
break;
}
}
}
else if (b == 3) //FailExam调用DisplayOne函数专属通道
{
cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl;
for (int i = 0; i < x; i++)
{
if (*a == stu[i].AverageScore)
{
cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
break;
}
}
}
return 0;
}
//--------------------------------------------------------------------------------------------------------------
//计算任意一门课的平均成绩
void CourseAve()
{
char B[100];
cout << "请输入您所要查询平均成绩的科目:";
cin >> B;
int sum = 0, a = 0;
for (int i = 0; i < x; i++)
{
if (strcmp(B, "语文") == 0)
{
sum += stu[i].Chinese;
a++;
}
else if (strcmp(B, "数学") == 0)
{
sum += stu[i].math;
a++;
}
else if (strcmp(B, "英语") == 0)
{
sum += stu[i].English;
a++;
}
else
{
cout << "没有此学科,请重新输入" << endl;
CourseAve();
a = 0;
break;
}
}
if (a == x)
{
float ave = (float)sum / x;
cout << "该学科的平均成绩为:" << ave << endl << endl << endl;
}
}
//--------------------------------------------------------------------------------------------------------------
//计算每个学生三门课程的平均成绩
int StudentAve(int c)
{
if (c == 0) //录入平均成绩并提供查询功能
{
for (int i = 0; i < x; i++)
{
stu[i].AverageScore = (float)(stu[i].Chinese + stu[i].math + stu[i].English) / 3;
}
cout << "平均成绩录入成功!" << endl;
cout << "1.查看全部学生的平均成绩" << endl;
cout << "2.查看某个学生的平均成绩" << endl;
cout << "3.不查看" << endl;
int a = Check(1);
if (a == 1) //查看全部学生的平均成绩
{
DisplayAll(1);
}
else if (a == 2) //查看某个学生的平均成绩
{
float* a = NULL;
while (1)
{
int k = DisplayOne(1, a);
if (k == 1)
{
cout << "查询成功!" << endl << endl;
break;
}
else
{
cout << "查询失败,是否重新查询?" << endl;
cout << "1.是" << endl;
cout << "2.否" << endl;
int j = Check(2);
if (j == 1)
{
continue;
}
else if (j == 2)
{
cout << endl << endl;
break;
}
}
}
}
}
else if (c == 1) //直接录入平均成绩,不提供查询功能
{
for (int i = 0; i < x; i++)
{
stu[i].AverageScore = (float)(stu[i].Chinese + stu[i].math + stu[i].English) / 3;
}
}
return 0;
}
//--------------------------------------------------------------------------------------------------------------
// 平均成绩最高分学生的查找
void TopScore()
{
StudentAve(1); //录入每位同学的平均成绩
//--------------------------------------------------------------------------------------------------------------
//找出平均成绩中的最大值
float max = stu[0].AverageScore;
for (int i = 1; i < x; i++)
{
if (max < stu[i].AverageScore)
{
max = stu[i].AverageScore;
}
}
float* b = &max; //利用指针进行地址传递
DisplayOne(2, b);
return;
}
//--------------------------------------------------------------------------------------------------------------
//找出平均成绩中不合格的同学
void FailExam()
{
StudentAve(1); //录入每位同学的平均成绩
float fail;
float* Fail = &fail; //利用指针进行地址传递
int k = 0; //计数器
for (int i = 0; i < x; i++)
{
if (stu[i].AverageScore < 60)
{
fail = stu[i].AverageScore;
DisplayOne(3, Fail);
}
else
{
k++;
}
}
if (k == x) //k=x即没有一位同学的成绩低于60分
{
cout << "全体及格!!!" << endl << endl << endl;
}
return;
}
//--------------------------------------------------------------------------------------------------------------
// 根据学号查询某学生是否存在
int IsExist(char b[100])
{
int k = 0;
for (int i = 0; i < x; i++)
{
int a = strcmp(b, stu[i].number);
if (a == 0)
{
return 1; //查询成功
break;
}
else
{
k++;
}
}
if (k == x)
{
return 0; //查询失败
}
}
void Search()
{
char b[100];
cout << "请输入你所要查询的学号:";
cin >> b;
int back = IsExist(b); //调用IsExist函数判断该学生是否存在
if (back == 1)
{
StudentAve(1); //录入每位同学的平均成绩
for (int i = 0; i < x; i++)
{
int a = strcmp(b, stu[i].number);
if (a == 0)
{
cout << endl << endl;
cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl;
cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
cout << "查询成功!!!" << endl << endl;
break;
}
}
}
else if(back == 0)
{
cout << "查无此人" << endl << endl;
}
return;
}
//--------------------------------------------------------------------------------------------------------------
// 修改学生信息
void Modify()
{
char c[100];
cout << "请输入你所要查询的学号:";
cin >> c;
int back = IsExist(c); //调用IsExist函数判断该学生是否存在
int f = 0; //定位器
if (back == 1)
{
StudentAve(1); //录入每位同学的平均成绩
for (int i = 0; i < x; i++) //查找出该同学在结构体数组中的下标
{
int a = strcmp(c, stu[i].number);
if (a == 0)
{
f = i;
}
}
while (1) //修改信息
{
cout << endl << endl;
StudentAve(1); //考虑到成绩的修改,此处重新录入每位同学的平均成绩
cout << "姓名\t" << "学号\t\t" << "性别\t" << "语文\t" << "数学\t" << "英语\t" << "平均成绩\t" << endl;
cout << endl << stu[f].name << "\t" << stu[f].number << "\t" << stu[f].sex << "\t" << stu[f].Chinese << "\t" << stu[f].math << "\t" << stu[f].English << "\t" << fixed << setprecision(2) << stu[f].AverageScore << endl << endl;
cout << "+------------+" << endl;
cout << "| 1.姓名 |" << endl;
cout << "| 2.学号 |" << endl;
cout << "| 3.性别 |" << endl;
cout << "| 4.语文成绩 |" << endl;
cout << "| 5.数学成绩 |" << endl;
cout << "| 6.英语成绩 |" << endl;
cout << "| 7.退出修改 |" << endl;
cout << "+------------+" << endl;
cout << "请选择你要修改的内容(输入数字):";
int b = Check(3);
cout << endl << endl;
if (b == 1) //改姓名
{
char name[10];
cout << "修改为(不超过三个字):";
cin >> name;
strcpy(stu[f].name, name);
cout << endl << endl;
cout << "修改成功!";
}
else if (b == 2) //改学号
{
char number[100];
cout << "修改为(11位数字):";
cin >> number;
strcpy(stu[f].number, number);
cout << endl << endl;
cout << "修改成功!";
}
else if (b == 3) //改性别
{
char sex[100];
cout << "修改为:";
cin >> sex;
strcpy(stu[f].sex, sex);
cout << endl << endl;
cout << "修改成功!";
}
else if (b == 4) //改语文成绩
{
cout << "修改为:";
float Chinese = Check(0);
stu[f].Chinese = Chinese;
cout << endl << endl;
cout << "修改成功!";
}
else if (b == 5) //改数学成绩
{
cout << "修改为:";
float math = Check(0);
stu[f].math = math;
cout << endl << endl;
cout << "修改成功!";
}
else if (b == 6) //改英语成绩
{
cout << "修改为:";
float English = Check(0);
stu[f].English = English;
cout << endl << endl;
cout << "修改成功!";
}
else if (b == 7) //退出修改
{
cout << "退出成功!" << endl << endl;
break;
}
}
}
else if (back == 0)
{
cout << "查无此人" << endl << endl;
}
return;
}
//--------------------------------------------------------------------------------------------------------------
//主体部分
int main()
{
//--------------------------------------------------------------------------------------------------------------
//初始化界面
system("color E1"); //设置背景色为淡黄色,字体颜色为蓝色
cout << "+------------------------+" << endl;
cout << "| Programmer:豆漿油條 |" << endl;
cout << "| Version:3.7.4 |" << endl;
cout << "+------------------------+" << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
cout << "\t\t\t\t\t 欢迎使用学生成绩管理系统!!!" << endl;
Sleep(5000); //延时5秒
system("cls"); //清屏
//--------------------------------------------------------------------------------------------------------------
//菜单界面
while (1)
{
//--------------------------------------------------------------------------------------------------------------
//菜单选项:
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 << "| 0.退出程序 |" << endl;
cout << "+-----------------------------------------+" << endl;
cout << "请输入数字以实现功能:";
//--------------------------------------------------------------------------------------------------------------
//利用Check函数判断用户的输入是否正确(字符和字符串):
float n = Check(0);
cout << endl << endl;
//--------------------------------------------------------------------------------------------------------------
//按钮对应功能的实现:
if (n == 1)
{
cout << "请输入你要添加学生的人数:";
int p = Check(0);
Create(p);
Sleep(3000); //延时3秒
system("cls"); //清屏
}
else if (n == 2)
{
DisplayAll(0);
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 3)
{
float* a = NULL;
while (1)
{
int k = DisplayOne(0, a);
if (k == 1)
{
cout << "查询成功!" << endl << endl;
break;
}
else
{
cout << "查询失败,是否重新查询?" << endl;
cout << "1.是" << endl;
cout << "2.否" << endl;
int j = Check(2);
if (j == 1)
{
continue;
}
else if (j == 2)
{
cout << endl << endl;
break;
}
}
}
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 4)
{
CourseAve();
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 5)
{
StudentAve(0);
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 6)
{
TopScore();
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 7)
{
FailExam();
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 8)
{
Search();
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 9)
{
Modify();
system("pause"); //界面静止
system("cls"); //清屏
}
else if (n == 0)
{
cout << "你真的要退出了吗?" << endl;
cout << "1.强忍离去" << endl;
cout << "2.继续使用" << endl;
float a = Check(2);
cout << endl << endl;
if (a == 1)
{
system("cls"); //清屏
cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << "\t\t\t\t\t\t 期待您的下次使用!" << endl << endl << endl;
Sleep(3000); //延时3秒
break;
}
else if (a == 2)
{
system("cls"); //清屏
continue;
}
}
//--------------------------------------------------------------------------------------------------------------
//判断用户的输入是否正确(非餐单中的整型数字):
else
{
cout << "您输入数字有误,请重新输入" << endl << endl << endl;
}
//--------------------------------------------------------------------------------------------------------------
}
return 0;
}
注:该程序代码通过Visual Studio2019版编写。
四、总结
? ? ? ? 对于我这个C++新手来说,编写这个程序其实是挺有难度的,它涉及到了多个函数之间的相互调用,在编写的过程中,也有遇到一些问题,例如:定义整形或浮点型量输入字符会报错导致程序崩溃;一个函数如何多功能实现;VS中strcmp不安全性报错等......后来自己也是慢慢摸索,逐个问题击破。在实现了基本功能之后,我又对程序进行了美化操作,使其成为一个更加偏向于一个面向对象的程序。总的来说,第一次独自编写一个大程序,还算是比较满意的。
? ? ? ? 上面源代码中的程序是3.7.4版本,对于版本信息我是这样定义的:初始版本为1.0.0,第一个数字代表大更新,例如添加新函数、实现新功能、程序美化......每实现一次大更新第一个数字就+1;第二个数字代表小更新,例如增减注释和部分代码、调整代码顺序......每实现一次小更新第二个数字就+1;第三个数字代表debug次数,每成功修改一处Bug第三个数字就+1。目前程序还在持续更新当中,并不是最终版本,大家如果发现代码有什么问题或有什么改进意见和看法,欢迎在评论区中指出。第一次发表文章,如果上述内容有什么错误的地方,也欢迎在评论区中指出。
|