实验任务
为了提高学生学习兴趣,越来越多的游戏式学习方式得到教育界的关注。现考虑一个晋级式学习平台,针对每门课程,学生通过完成相应测试(可被称为关卡),获取一定的积分。当积分达到一定阈值后,该生等级晋级一级。
针对该平台,设计一个学生和试题管理系统。其中学生信息包括学号、姓名、班级、每门课程的积分和等级等信息;课程信息包括课程编号、课程名称、测试试题等信息;试题信息成功完成该测试试题能获得的积分等信息。
(1)新增学生信息:录入信息包括学号、姓名、班级,并将每门课程的积分和等级均初始化为0。
(2)新增课程:录入课程信息包括课程名称、课程编号(在系统中是唯一的)。
(3)新增试题:录入每道题的打分标准和相应分值。
(4)更新积分:根据学生完成某试题的情况更新该学生在这门课程的积分:如果成功完成,则增加该试题对应的积分;反之,学生在这门课程的积分不变。
(5)计算学生等级:针对每门课程,根据学生的积分,计算相应等级。等级与积分的对应关系为正在上传…重新上传取消,其中表示积分,表示等级,表示取整数部分。比如积分为0的等级为0;积分为1~98的等级为1;积分为99~998的等级为2;积分为999~9998的等级为3;……
(6)查找功能:可以查找指定学生的各门课程的积分和等级情况。
(7)排序功能:将学生信息按某门课程的积分自高到低进行排序。
(8)输出功能:将学生信息按照平均等级格式化输出。
(9)删除某门课程的某个试题:主要用于更新需要删除过时或不合适的关卡。
(10)保存功能:将学生信息、课程信息和试题信息保存至文件。
(11)导入功能:从文件中导入学生信息、课程信息和试题信息。
注1:C语言中以10为底的对数函数为math.h中的double log10(double)。
注2:参考结构体类型声明
struct student{
char num[20]; //学号
char name[20]; //姓名
char class[20]; //班级
int scores[3]; //该生在三门课程中所获得的积分
int levels[3]; //三门课程的等级,与scores一一对应
};
struct course{
int num; //课程编号
char name[20]; //课程名称
int item[1000]; //完成相应试题所获取的分值,假设每门课程最多包括1000道试题
};
如下所示,为源代码,已经写了5天了,目前只是初级版,还得去学习如何去积分,如何去增加试卷题目,不过这都是比葫芦画瓢,慢慢摸索应该能写成功!
#include
#include
#include
#include
typedef struct _Student
{
char name[20];// 姓名
int age; //年龄
int stuNum;//学号
int score;//成绩
}Student;
//链表(车厢)
typedef struct _Node
{
Student stu; //学生
struct _Node* pNext;//指向下一个节点的指针
}Node;
//头结点
Node* g_pHead = NULL; //头结点
void Welcome();
void InputStudent(); //录入学生信息
void PrintStudent(); //打印学生信息
void SaveStudent(); //保存学生信息
void ReadStudent(); //读取学生信息
int CountStudent(); //统计所有学生人数
Node* FindStudent(); //查找学生
void ModifyStudent(); //修改学生信息
void DeleteStudent(); //删除学生信息
//主函数
int main() {
while (1) {
Welcome();
char ch = getch();//可以暂停一下循环,从键盘输入一个数字
switch (ch) {
case '1':InputStudent(); break;//输入1录入学生信息
case '2':PrintStudent(); break;//输入2打印学生信息
case '3':SaveStudent(); break;//输入3保存学生信息
case '4':ReadStudent(); break;//输入4读取学生信息
case '5':printf("学生总人数为:%d\n",CountStudent()); system("pause"); system("cls"); break;//输入5统计学生总人数
case '6'://输入6查找学生信息
{
system("pause");//画面停留
//清屏
system("cls");
Node* p = FindStudent();
if (p != NULL)
printf("学号: %d\t姓名: %s\t年龄: %d\t成绩: %d\n", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.score);
else
printf("没有找到该学生\n");
; system("pause");
system("cls");
break;
}
case '7':ModifyStudent(); break;//修改学生信息
case '8':DeleteStudent(); break;//删除学生信息
case '0':printf("谢谢使用!!\n"); return 0; //退出管理系统
default:printf("非法数据\n"); system("pause"); system("cls"); break;
}
}
return 0;
}
//封面
void Welcome()
{
printf("-----------------------------------------------------\n");
printf("-- 欢迎使用学生管理平台(超级无敌牛逼版vol.2) --\n");
printf("-----------------------------------------------------\n");
printf("-- 请选择功能列表 --\n");
printf("-----------------------------------------------------\n");
printf("-- 1.录入学生信息 --\n");
printf("-- 2.打印学生信息 --\n");
printf("-- 3.保存学生信息 --\n");
printf("-- 4.读取学生信息 --\n");
printf("-- 5.统计学生总数 --\n");
printf("-- 6.查找学生信息 --\n");
printf("-- 7.修改学生信息 --\n");
printf("-- 8.删除学生信息 --\n");
printf("-- 0.退出管理系统 --\n");
printf("-----------------------------------------------------\n");
}
//录入学生信息
void InputStudent() {
char charge; //准备打印学生信息
//创建一个新节点
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
//头插法,尾插法
//头插法
if (g_pHead == NULL) //没有头
{
g_pHead = pNewNode; //定义一个头
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s", pNewNode->stu.name);
printf("请输入学生的年龄:\n");
scanf("%d", &pNewNode->stu.age);
printf("请输入学生的学号:\n");
scanf("%d", &pNewNode->stu.stuNum);
printf("请输入学生的成绩:\n");
scanf("%d", &pNewNode->stu.score);
printf("学生信息录入成功\n");
system("pause");//画面停留
//清屏
system("cls");
}
void PrintStudent() //打印学生信息
{
system("cls");
printf("-----------------------------------------------------\n");
printf("-- 欢迎使用学生管理平台(超级无敌牛逼版vol.2) --\n");
printf("-----------------------------------------------------\n");
printf("-- -学号- -姓名- -年龄- -成绩- --\n");
printf("-----------------------------------------------------\n");
//遍历链表
Node* p = g_pHead;
while (p != NULL)//只要节点不到头就一直往下打印
{
printf("-- -%d- -%s- -%d- -%d- --\n",
p->stu.stuNum,
p->stu.name,
p->stu.age,
p->stu.score);
p = p->pNext;
}
system("pause");//画面停留
//清屏
system("cls");
}
//保存学生信息
void SaveStudent()
{
//打开文件,利用文件指针
FILE* fp=fopen("C:\\Users\\ROG\\Desktop\\作业\\学生管理系统平台vol.2\\stuinfo.dat", "w");//以写文件的形式打开文件
if (fp == NULL)
{
printf("打开文件失败.\n");
return;
}
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
//写文件
fwrite(&p->stu, 1, sizeof(Student), fp);
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("\n数据保存成功\n");
system("pause");//画面停留
//清屏
system("cls");
}
//读取学生信息
void ReadStudent()
{
//打开文件
FILE *fp =fopen("C:\\Users\\ROG\\Desktop\\作业\\学生管理系统平台vol.2\\stuinfo.dat", "r");
if (fp == NULL)
{
printf("打开文件失败\n");
return;
}
//读文件
Student stu;
while (fread(&stu, 1, sizeof(Student), fp)) //如果读到的文件不是末尾继续读
{
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
memcpy(pNewNode, &stu, sizeof(Student));
//头插法
if (g_pHead == NULL) //没有头
{
g_pHead = pNewNode; //定义一个头
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
//关闭文件
fclose(fp);
printf("加载数据成功.\n");
system("pause");//画面停留
//清屏
system("cls");
}
//统计学生人数
int CountStudent()
{
int nCount = 0;//学生总数
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
nCount++;
p = p->pNext;
}
return nCount;
}
//查找学生
Node* FindStudent() {
int nStuNum;
char szName[20];
printf("请输入要查找的学生的学号:\n");
scanf("%d", &nStuNum);
printf("请输入要查找的学生的姓名:\n");
scanf("%s", szName);
Node* p = g_pHead;
while (p != NULL)
{
//strcmp字符串比较函数
if (p->stu.stuNum == nStuNum || 0 == strcmp(p->stu.name, szName))
return p;
p=p->pNext;
}
//没有找到
return NULL;
}
//修改学生信息
void ModifyStudent()
{
int nStuNum;
printf("请输入需要修改学生信息的学号:\n");
scanf("%d", &nStuNum);
Node* p = g_pHead;
while (p != NULL)
{
if (p->stu.stuNum == nStuNum)
{
printf("请输入要修改的学生的姓名 年龄 成绩:\n");
scanf("%s %d %d",p->stu.name,&p->stu.age,&p->stu.score);
printf("修改成功\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生的信息\n");
}
system("pause"); //画面停留
system("cls"); //清屏
}
//删除学生信息
void DeleteStudent()
{
int nStuNum;
printf("请输入要删除学生的学号:\n");
scanf("%d", &nStuNum);
Node* p1;
//判断是不是头节点
if (g_pHead->stu.stuNum == nStuNum) //如果头节点等于删除学生的学号
{
p1=g_pHead; //备份一下头
g_pHead = g_pHead->pNext;
free(g_pHead); //释放内存即可删除学生信息
}
//不是头节点
Node* p = g_pHead;
Node* p2; //备份的
while (p->pNext!=NULL)
{
if (p->pNext->stu.stuNum == nStuNum)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2); //释放内存
system("pause");//画面停留
//清屏
system("cls");
return;
}
p = p->pNext;
if (p->pNext == NULL) //如果节点到了尾部跳出
{
break;
}
}
if (p->pNext == NULL) //如果从到到尾都没有找到
{
printf("没有找到该学生\n");
}
system("pause");//画面停留
//清屏
system("cls");
}