C语言学生管理系统
还是要通过链表和文件操作才能拿分,所以熬夜2天写出1000+行代码,头都大了,删除注释后刚好888行。
以下代码,部分函数来自网络,或者其他博主分享,若有不便我会删除,然后自己写,嘻嘻。
以下是具体代码:
先保存一下,过会发
因为是在上一个博客的基础上写的,代码注释有些没删
/*********************************************************************
文件名称:
文件描述:
编写时间:2020年6月1日
创建工程:韩法旭
***********************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include <mmsystem.h> /*/*/
#pragma comment(lib, "WINMM.LIB")/*/*/
typedef struct stu {
int ID; //学号
char name[15]; //名字
char sex[10]; //性别
int grade; //成绩
//int num; //代号
struct stu* pnext; //***
}student;
//增加功能*
student* pStu = NULL; //定义链表的头节点
FILE* fp = NULL; //定义文件指针
char fileName[20]; //文件名
//int sort = 0;//记录当前有多少个结点,排序用 增加节点原因:读取文件时,添加学生时
//创建链表*
void CreateList() {
pStu = (student*)malloc(sizeof(student)); //开辟一个student结构体大小的内存
pStu->pnext = NULL;
}
//打开文件*
//有文件 打开 文件里面的数据保存到链表里面
//没有文件 就 新建一个文件
void OpenStuFile() {
while (1) {
printf("请输入文件名\n");
scanf("%s", fileName);
fp = fopen(fileName, "r");
if (fp == NULL) {//只读的方式打开了一个不存在的文件
printf("没有这个班级的数据,是否需要创建(y/n)\n");
char ch='y';
scanf("%s", &ch);
if (ch == 'y' || ch == 'Y') {//Y
fp = fopen(fileName, "a+");
if (fp == NULL) {//创建失败
printf("创建失败!!!\n");
exit(0);
}
else { //创建成功
printf("创建成功\n");
system("pause");
break;
}
}//Y
else { //N 不想创建
continue;
}//N
}
else {//文件存在
printf("文件打开成功\n");
system("pause");
break;
}
}
student* pnew = NULL;//结构体类型的指针
student* ptemp = NULL;
CreateList(); //先创建链表
ptemp = pStu;
//这里已经打开了文件 或者是创建了文件 后,执行以下操作 读入数据到程序
//还要判断有两种情况 有没有数据
//读入数据 放入 链表中
while (1) {
//开辟了内存
pnew = (student*)malloc(sizeof(student));
if (fscanf(fp, "%s\t%d\t%s\t%d", pnew->name, &pnew->ID, pnew->sex, &pnew->grade) == EOF) {//文件结束
free(pnew);//没有读出来数据
break;
}
pnew->pnext = NULL;
ptemp->pnext = pnew; //第一行
ptemp = ptemp->pnext; //尾插
//sort++;
}
fclose(fp);
}
void PrintfFileAll() {
system("cls");
system("color 6");
student* ptemp = pStu->pnext;//
if (ptemp == NULL) {//文件,或者链表没有数据
printf("没有数据!\n");
system("pause");
return;
}
printf(" 名字------------学号-------------性别-------------成绩\n");
while (ptemp != NULL) {
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
ptemp = ptemp->pnext;
}
system("pause");
system("cls");
system("color 2");
}
//保存文件
void saveStu() {
student* ptemp = pStu->pnext;
if ((fp = fopen(fileName, "w")) == NULL) {
printf("打开文件失败!!!\n");
}
else {
while (ptemp != NULL) {
fprintf(fp, "%s\t%d\t%s\t%d\n", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
ptemp = ptemp->pnext;
}
}
fclose(fp);
}
void playMusic() {//背景音乐/*/*/
PlaySound(TEXT("a.wav"), 0, SND_FILENAME | SND_ASYNC);
}
void addStu() {//添加几个
int number;//个数
student* pnew = NULL;
student* ptemp = pStu->pnext;//检查学号重复
printf("请输入本次要添加几个学员\n");//当前时间6.3日 0:09
scanf("%d", &number);
// sort = sort + number;
for (int i = 1; i <= number; i++) {
pnew = (student*)malloc(sizeof(student));
printf("请输入第%d个学员的数据\n", i);
printf("请输入学号\n");
scanf("%d", &pnew->ID);
while (ptemp != NULL) {
if (pnew->ID == ptemp->ID) {
printf("学号重复!!请重新输入\n");
scanf("%d", &pnew->ID);
ptemp = pStu->pnext;
continue;
}
else {
ptemp = ptemp->pnext;
}
}
printf("请输入名字\n");
scanf("%s", pnew->name);
printf("请输入性别\n");
scanf("%s", pnew->sex); //当前时间 6.3 0:31
printf("请输入成绩\n");
scanf("%d", &pnew->grade);
if (pStu->pnext == NULL) {
pnew->pnext = NULL;
pStu->pnext = pnew;
}
else {//有
ptemp = pStu;
while (ptemp != NULL) {
if (ptemp->pnext != NULL) {
//比前一个大 比后一个小
if (pnew->ID > ptemp->ID && pnew->ID < ptemp->pnext->ID) {
pnew->pnext = ptemp->pnext;
ptemp->pnext = pnew;
break;
}
}
else {
pnew->pnext = NULL;
ptemp->pnext = pnew;
break;
}
ptemp = ptemp->pnext;
//当前时间0:57/
}
}
}
}
//===========↑↑↑↑↑↑↑↑↑========输入函数======↑↑↑↑↑↑↑================
//============↓↓↓↓↓↓↓=========查询函数============↓↓↓↓↓↓===========
void inqID(student* ptemp) {//根据 学号 查询
//使用链表
printf("请输入学号\n");
int inID;
scanf("%d", &inID);
ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (ptemp->ID == inID) //循环匹配
{
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
void inqName(student* ptemp) {//根据 名字 查询
int n = 0;//找到几个
//使用链表
printf("请输入学生名字\n");
char inName[15];
scanf("%s", inName);
ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (strcmp(ptemp->name, inName) == 0) //循环匹配
{
if (n == 0) {
printf(" 名字------------学号-------------性别-------------成绩\n");
}
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
n++;
}
ptemp = ptemp->pnext;
}
if (n == 0) {
printf("没有这个学生\n");
}
system("pause");
system("cls");
}
void inquMain() {
int c=0;
while (c != 4) {
system("cls");
system("color 2");
printf("++++++++++查询学生成绩++++++++++++\n");
printf("==================================\n");
printf("--------1.输入学号查询------------\n");
printf("--------2.输入名字查询------------\n");
printf("--------3.查看全部学生------------\n");
printf("--------4.返回主菜单表------------\n");
printf("==================================\n");
scanf("%d", &c);
switch (c) {
case 1:
inqID(pStu); //通过 学号 查询
break;
case 2:
inqName(pStu);
break;
case 3:
PrintfFileAll();
break;
case 4:
break;
}
}
system("color 9");
}
//===========↑↑↑↑↑↑↑↑↑========查询函数======↑↑↑↑↑↑↑================
void restuID(student* ptempx) {//修改学号
printf("请输入要修改的学号:\n");
int reID;
scanf("%d", &reID);
ptempx->ID = reID;
}
void restuName(student* ptempx) {//修改名字
printf("请输入要修改的名字:\n");
char reName[15];
scanf("%s", reName);
strcpy(ptempx->name, reName);
}
void restuSex(student* ptempx) {//修改性别
printf("请输入要修改的性别:\n");
char reSex[10];
scanf("%s", reSex);
strcpy(ptempx->sex, reSex);
}
void restugrade(student* ptempx) {//修改成绩
printf("请输入要修改的成绩:\n");
int regrade;
scanf("%d", ®rade);
ptempx->grade = regrade;
}
void reID(student* ptemp) {//根据 学号 修改
//使用链表
printf("请输入修改学生的学号\n");
int inID;
scanf("%d", &inID);
ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (ptemp->ID == inID) //循环匹配
{
printf("你要修改的学生是:\n");
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
int i1=5;
while (i1 != 0) {
printf("\n");
printf("1.修改学号 2.修改名字 3.修改性别 4.修改成绩 0.停止修改\n");
scanf("%d", &i1);
switch (i1) {
case 1:
restuID(ptemp);
break;
case 2:
restuName(ptemp);
break;
case 3:
restuSex(ptemp);
break;
case 4:
restugrade(ptemp);
break;
case 0:
break;
}
/* int i1;
scanf("%d",&i1);
ptemp->grade=i1;*///只修改成绩代码
printf("修改结果为:\n");
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
}
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
void reName(student* ptemp) {//根据 名字 修改
//使用链表
printf("请输入要修改学生的名字\n");
char inName[15];
scanf("%s", inName);
ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (strcmp(ptemp->name, inName) == 0) //循环匹配
{
printf("你要修改的学生是:\n");
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
int i1=5;
while (i1 != 0) {
printf("\n");
printf("1.修改学号 2.修改名字 3.修改性别 4.修改成绩 0.停止修改\n");
scanf("%d", &i1);
switch (i1) {
case 1:
restuID(ptemp);
break;
case 2:
restuName(ptemp);
break;
case 3:
restuSex(ptemp);
break;
case 4:
restugrade(ptemp);
break;
case 0:
break;
}
/* int i1;
scanf("%d",&i1);
ptemp->grade=i1;*///只修改成绩代码
printf("修改结果为:\n");
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
}
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
void reMain() {
int c=0;
while (c != 4) {
system("cls");
system("color 2");
printf("++++++++++修改学生成绩++++++++++++\n");
printf("==================================\n");
printf("--------1.输入学号查询------------\n");
printf("--------2.输入名字查询------------\n");
printf("--------3.查看全部学生------------\n");
printf("--------4.返回主菜单表------------\n");
printf("==================================\n");
scanf("%d", &c);
switch (c) {
case 1:
reID(pStu); //通过 学号 查询
break;
case 2:
reName(pStu);
break;
case 3:
PrintfFileAll();
break;
case 4:
break;
}
}
system("color 9");
}
void delID(student* ptemp) {//根据 学号 删除
//使用链表
printf("请输入学号\n");
int inID;
scanf("%d", &inID);
ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (ptemp->ID == inID) //循环匹配
{
ptemp->grade = -1;
printf("删除成绩后\n");
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
void delName(student* ptemp) {//根据 学号 删除
//使用链表
printf("请输入名字\n");
char inName[15];
scanf("%s", inName);
ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (strcmp(ptemp->name, inName) == 0) //循环匹配
{
ptemp->grade = -1;
printf("删除成绩后\n");
printf(" 名字------------学号-------------性别-------------成绩\n");
printf(" %6s %6d %6s %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
printf("\n");
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
void delMain() {
int x=0;
while (x != 4) {
system("cls");
system("color 2");
printf("++++++++++删除学生成绩++++++++++++\n");
printf("==================================\n");
printf("--------1.输入学号删除------------\n");
printf("--------2.输入名字删除------------\n");
printf("--------3.列出所有学生------------\n");
printf("--------4.返回主菜单表------------\n");
printf("==================================\n");
scanf("%d", &x);
switch (x) {
case 1:
delID(pStu); //通过 学号 删除
break;
case 2:
delName(pStu);
break;
case 3:
PrintfFileAll();
break;
case 4:
break;
}
}
}
void delIDAll(student* ptemp) {//根据 学号 删除
//使用链表
printf("请输入学号\n");
int inID;
scanf("%d", &inID);
// ptemp=ptemp->pnext;//ptemp头节点 后移 到有数据的结点
int i = 0;
while (ptemp != NULL) {
i++;
if (ptemp->pnext->ID == inID) //循环匹配 //删除函数耗时3小时!!!!!!!!废了//6.3 晕
{
student* del = ptemp->pnext;
if (ptemp->pnext->pnext != NULL) {
ptemp->pnext = ptemp->pnext->pnext;
}
else {
ptemp->pnext->pnext = NULL;
ptemp->pnext = ptemp->pnext->pnext;
}
free(del);
printf("删除成功,该学生已从世界消失,不留痕迹\n");
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
//
void delNameAll(student* ptemp) {//根据 学号 删除
//使用链表
printf("请输入名字\n");
char inName[15];
scanf("%s", inName);
// ptemp=ptemp->pnext;//ptemp头节点 后移 到有数据的结点
while (ptemp != NULL) {
if (strcmp(ptemp->pnext->name, inName) == 0) //循环匹配 //删除函数耗时3小时!!!!!!!!废了//6.3 晕
{
student* del = ptemp->pnext;
if (ptemp->pnext->pnext != NULL) {
ptemp->pnext = ptemp->pnext->pnext;
}
else {
ptemp->pnext->pnext = NULL;
ptemp->pnext = ptemp->pnext->pnext;
}
free(del);
printf("删除成功,该学生已从世界消失,不留痕迹\n");
system("pause");
system("cls");
return;
}
ptemp = ptemp->pnext;
}
printf("没有这个学生\n");
system("pause");
system("cls");
}
void delMainAll() {
int x=0;
while (x != 4) {
system("cls");
system("color 2");
printf("++++++++++删除学生信息++++++++++++\n");
printf("++++++++++清空这个学生++++++++++++\n");
printf("==================================\n");
printf("--------1.输入学号删除------------\n");
printf("--------2.输入名字删除------------\n");
printf("--------3.列出所有学生------------\n");
printf("--------4.返回主菜单表------------\n");
printf("==================================\n");
scanf("%d", &x);
switch (x) {
case 1:
delIDAll(pStu); //通过 学号 删除
break;
case 2:
delNameAll(pStu);
break;
case 3:
PrintfFileAll();
break;
case 4:
break;
}
}
}
void swapIDgrade(int& a, int& b)
{
int tmp = b;
b = a;
a = tmp;
}
void sortIDj(student* node) { //根据学号降序排序
if (NULL == node) {
return;
}
student* startP = node;
student* nextP = node;
while (startP->pnext != NULL) {
nextP = startP->pnext;
while (nextP->pnext != NULL) {
if (startP->pnext->ID < nextP->pnext->ID) {
///
swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
swapIDgrade(startP->pnext->grade, nextP->pnext->grade);
char c[15];
strcpy(c, startP->pnext->name);
strcpy(startP->pnext->name, nextP->pnext->name);
strcpy(nextP->pnext->name, c);
char c1[10];
strcpy(c1, startP->pnext->sex);
strcpy(startP->pnext->sex, nextP->pnext->sex);
strcpy(nextP->pnext->sex, c1);
}
nextP = nextP->pnext;
}
startP = startP->pnext;
}
}
void sortIDs(student* node) { //根据学号升序排序
if (NULL == node) {
return;
}
student* startP = node;
student* nextP = node;
while (startP->pnext != NULL) {
nextP = startP->pnext;
while (nextP->pnext != NULL) {
if (startP->pnext->ID > nextP->pnext->ID) {
///
swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
swapIDgrade(startP->pnext->grade, nextP->pnext->grade);
char c[15];
strcpy(c, startP->pnext->name);
strcpy(startP->pnext->name, nextP->pnext->name);
strcpy(nextP->pnext->name, c);
char c1[10];
strcpy(c1, startP->pnext->sex);
strcpy(startP->pnext->sex, nextP->pnext->sex);
strcpy(nextP->pnext->sex, c1);
}
nextP = nextP->pnext;
}
startP = startP->pnext;
}
}
void sortGradej(student* node) { //根据成绩降序排序
if (NULL == node) {
return;
}
student* startP = node;
student* nextP = node;
while (startP->pnext != NULL) {
nextP = startP->pnext;
while (nextP->pnext != NULL) {
if (startP->pnext->grade < nextP->pnext->grade) {
///
swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
swapIDgrade(startP->pnext->grade, nextP->pnext->grade);
char c[15];
strcpy(c, startP->pnext->name);
strcpy(startP->pnext->name, nextP->pnext->name);
strcpy(nextP->pnext->name, c);
char c1[10];
strcpy(c1, startP->pnext->sex);
strcpy(startP->pnext->sex, nextP->pnext->sex);
strcpy(nextP->pnext->sex, c1);
}
nextP = nextP->pnext;
}
startP = startP->pnext;
}
}
void sortGrades(student* node) { //根据成绩升序排序
if (NULL == node) {
return;
}
student* startP = node;
student* nextP = node;
while (startP->pnext != NULL) {
nextP = startP->pnext;
while (nextP->pnext != NULL) {
if (startP->pnext->grade > nextP->pnext->grade) {
///
swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
swapIDgrade(startP->pnext->grade, nextP->pnext->grade);
char c[15];
strcpy(c, startP->pnext->name);
strcpy(startP->pnext->name, nextP->pnext->name);
strcpy(nextP->pnext->name, c);
char c1[10];
strcpy(c1, startP->pnext->sex);
strcpy(startP->pnext->sex, nextP->pnext->sex);
strcpy(nextP->pnext->sex, c1);
}
nextP = nextP->pnext;
}
startP = startP->pnext;
}
}
void menu() {
int i=0;
while (i != 8) {
system("color 9");
system("cls"); //每次打印菜单前清屏
printf("\t\t》》》学生管理系统《《《\n");
printf("=========================================================\n");
printf("*\t1.输入学生成绩\t\t2.删除学生成绩\t\t*\n");
printf("*\t3.查询学生成绩\t\t4.修改学生成绩\t\t*\n");
printf("*\t5.排序学生成绩\t\t6.列出所有学生\t\t*\n");
printf("*\t7.保存学生数据\t\t8.退出管理系统\t\t*\n");
printf("=========================================================\n");
scanf("%d", &i);
switch (i) {
case 1: /已实现
addStu();
break;
case 2: //已实现
printf("请选择删除目标\n");
printf("1.删除这个学生全部信息 2.删除这个学生的成绩");
int x1;
scanf("%x1", &x1);
if (x1 == 1) {
delMainAll();
}
else {
delMain();
}
break;
case 3: /已实现
inquMain();
break;
case 4:
reMain();
break;
case 5:
printf("\t++++++++++排序++++++++++++\n");
printf("1.根据学号降序排序 2.根据成绩降序排序\n");
printf("3.根据学号升序排序 4.根据成绩升序排序\n");
int s;
scanf("%d", &s);
switch (s) {
case 1:
sortIDj(pStu);
break;
case 2:
sortGradej(pStu);
break;
case 3:
sortIDs(pStu);
break;
case 4:
sortGrades(pStu);
break;
}
printf("\n");
break;
case 6:
PrintfFileAll();//当前时间 6.3 9:05
break;
case 7:
saveStu();
break;
case 8:
printf("您已安全退出\n");
break;
}
if (i != 3 && i != 6 && i != 4) {
printf("操作成功!\n");
system("pause");
}
}
}
int main() {
printf("请打开一个班级文件\n");
OpenStuFile();
playMusic();
menu();
return 0;
}
//增加功能:》》》》》》》》》》》》》》》》》
//输入清屏== //已完成 //每次输入清屏
//背景图片== //未完成 改为更换字体颜色
//背景音乐== //已完成 //当前时间6月2日 18:27
//动态链表== //正在学习 //当前时间6月2日 20:29