2022级郑州轻工业大学学生平台管理系统期末设计(初级版v1.0)

实验任务

为了提高学生学习兴趣,越来越多的游戏式学习方式得到教育界的关注。现考虑一个晋级式学习平台,针对每门课程,学生通过完成相应测试(可被称为关卡),获取一定的积分。当积分达到一定阈值后,该生等级晋级一级。

  1. 任务描述

针对该平台,设计一个学生和试题管理系统。其中学生信息包括学号、姓名、班级、每门课程的积分和等级等信息;课程信息包括课程编号、课程名称、测试试题等信息;试题信息成功完成该测试试题能获得的积分等信息。

  1. 必备功能

(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 <stdio.h>
#include<conio.h>
#include<stdlib.h>
#include <string.h>

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");
}

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆粉今天敲了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值