课设——C语言学生成绩管理系统
介绍
相信许多同学在大学期间,学习计算机相关课程的时候,都有一个令人头疼的问题——课程设计。那么本片文章就详细的分享一个用C语言实现一个简单学生成绩管理系统,供同学们学习和参考(文章最后会附上源程序)。
项目分析
1.建立一张学生成绩表,每个学生包含 学号、姓名、性别、语文、数学、英语、平均分。
2.将表中所有信息按平均分降序排列。
3.按学号查找某学生所有成绩。
4.能够实现某学生的成绩插入和删除。
5.实现文件操作,程序退出时将学生成绩保存在studen_grad.txt文件中;程序开始时,能够从student_grad.txt文件中加载已有的学生成绩信息。
整题框架
包含文件:
1.main函数文件(main.c),主程序整题框架
2.学生成绩管理函数文件(score managemen.c),用来实现各接口函数
3.学生成绩管理头文件(score managemen.h),用来定义和声明函数。
main.c文件
主函数框架
int main()
{Slist* List = ListInit();ListLoad(List);int input = 0;do{menu();printf("请选择:>");scanf("%d",&input);switch(input){case 1:ListPushBack(List);break;case 2:ListDelet(List);case 3:ListPrint(List);break;case 4:ListSort(List);break;case 5:ListSearch(List);break;case 0:ListSave(List);printf("保存成功,退出!\n");break;}}while(input);return 0;
}
menu()函数
void menu()
{printf("*****************************************\n");printf("****** 学生成绩管理系统 ********\n");printf("****** 1.增加 2.删除 ********\n");printf("****** 3.显示 4.排序 ********\n");printf("****** 5.查找 0.退出 ********\n");printf("*****************************************\n");
}
score managemen.h文件
结构体链表
//双向循环链表 存储学生信息
typedef struct ScoreList
{char number[20];char name[20];char sex[5];int chinese;int math;int english;float average;struct ScoreList* next;struct ScoreList* prev;}Slist;
接口函数声明
Slist* ListInit();//链表初始化
void ListPushBack(Slist* phead);//链表尾部插入学生成绩
void ListDelet(Slist* phead);//按学号删除
void ListSearch(Slist* phead);//按学号查找
void ListPrint(Slist* phead);//打印链表
void ListSort(Slist* phead);//排序(平均分降序)
void ListSave(Slist* phead);//文件保存
void ListLoad(Slist* phead);//加载
scor managem.c文件
Slist* ListInit() 链表初始化函数
Slist* ListInit()
{Slist* phead = (Slist*)malloc(sizeof(Slist));phead->next = phead;phead->prev = phead;return phead;
}
void ListPushBack(Slist* phead) 链表尾部插入学生成绩
//链表尾部插入
void ListPushBack(Slist* phead)
{system("cls");assert(phead);Slist* newnode = (Slist*)malloc(sizeof(Slist));printf("请输入学号:");scanf("%s",newnode->number);printf("请输入姓名:");scanf("%s",newnode->name);printf("请输入性别:");scanf("%s",newnode->sex);printf("请输入语文成绩:");scanf("%d",&(newnode->chinese));printf("请输入数学成绩:");scanf("%d",&(newnode->math));printf("请输入英语成绩:");scanf("%d",&(newnode->english));newnode->average =(float)(newnode->chinese + newnode->math + newnode->english)/3;Slist* tailnode = phead->prev;tailnode->next = newnode;newnode->prev = tailnode;newnode->next = phead;phead->prev = newnode;printf("添加成功\n");
}
void ListDelet(Slist* phead) 按学号链表删除
//按学号删除
void ListDelet(Slist* phead)
{assert(phead);system("cls");char number[20];//存储要删除学生的学号printf("请输入要删除的学号:>");scanf("%s",number);Slist* cur = phead->next;while(cur != phead){if(strcmp(number,cur->number) == 0)//判断成绩表中是否存在该学生学号{Slist* nextnode = cur->next;Slist* prevnode = cur->prev;free(cur);prevnode->next = nextnode;nextnode->prev = prevnode;printf("删除成功!\n");return;}cur = cur->next;}printf("该学生不存在\n");}
void ListSearch(Slist* phead) 按学号查找
void ListSearch(Slist* phead)
{assert(phead);system("cls");char number[20];printf("请输入学号:>");scanf("%s",number);Slist* cur = phead->next;while(cur != phead){if(strcmp(number,cur->number) == 0) //判断学生是否存在{printf("姓名:%s 性别:%s 语文:%d 数学:%d 英语:%d 平均分:%f\n",cur->name,cur->sex,cur->chinese,cur->math,cur->english,cur->average);return;}cur = cur->next;}printf("没有找到该学生\n");
}
void ListPrint(Slist* phead);//打印链表
//链表打印
void ListPrint(Slist* phead)
{assert(phead);system("cls");printf("%-10s\t%-8s\t%-5s\t%-5s\t%-5s\t%-5s\t%-10s\n","学号","姓名","性别","语文","数学","英语","平均分");Slist* cur = phead->next;while(cur != phead){printf("%-10s\t%-8s\t%-5s\t%-5d\t%-5d\t%-5d\t%-10.3f\n",cur->number,cur->name,cur->sex,cur->chinese,cur->math,cur->english,cur->average);cur = cur->next;}
}
void ListSort(Slist* phead);//排序(平均分降序)
//按平均分降序
void ListSort(Slist* phead)
{assert(phead);system("cls");int count = 0;//记录链表长度Slist* cur = phead->next;while(cur != phead){count++;cur = cur->next;}int i = 0;int j = 0;for(i = 0;i < count;i++)//冒泡排序{Slist* prevnode = phead;Slist* curnode = prevnode->next;Slist* nextnode = curnode->next;Slist* tailnode = nextnode->next;for(j = 0;j < count-i;j++){if(curnode->average < nextnode->average){prevnode->next = nextnode;nextnode->prev = prevnode;curnode->next = tailnode;tailnode->prev = curnode;nextnode->next = curnode;curnode->prev = nextnode;}tailnode = tailnode->next;nextnode = nextnode->next;curnode = curnode->next;prevnode = prevnode->next;}}printf("排序成功!\n");
}
void ListSave(Slist* phead);//文件保存
void ListSave(Slist* phead)
{FILE* fpWrite = fopen("student_grad.txt","w");if(fpWrite == NULL){printf("%s\n",strerror(errno));return;}Slist* cur = phead->next;while(cur != phead){fprintf(fpWrite,"%-10s\t%-8s\t%-5s\t%-5d\t%-5d\t%-5d\t%-10.3f\n",cur->number,cur->name,cur->sex,cur->chinese,cur->math,cur->english,cur->average);cur = cur->next;}fclose(fpWrite);fpWrite = NULL;
}
void ListLoad(Slist* phead);//加载
void ListLoad(Slist* phead)
{FILE* fpRead = fopen("student_grad.txt","r");while(1){Slist* newnode = (Slist*)malloc(sizeof(Slist));if(fscanf(fpRead,"%s\t%s\t%s\t%d\t%d\t%d\t%f\n",newnode->number,newnode->name,newnode->sex,&(newnode->chinese),&(newnode->math),&(newnode->english),&(newnode->average)) != EOF)//判断是否读取完{Slist* tailnode = phead->prev;tailnode->next = newnode;newnode->prev = tailnode;newnode->next = phead;phead->prev = newnode;}else{break;}}}
源程序
链接:https://pan.baidu.com/s/1gppTuGUD6CD0j78YJYf8-g?pwd=1234
提取码:1234
希望帮助到的同学给个三连呀~