C语言学生成绩管理系统小设计

 更新时间:2018年01月15日 09:22:21   作者:IT人Key  
这篇文章主要为大家详细介绍了C语言学生成绩管理系统小设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文实例为大家分享了C语言学生成绩管理系统的具体代码,供大家参考,具体内容如下

一、本设计涉及的重要C语言知识有:

1.单链表的各种操作
2.文件流的操作
3.单链表的排序

二、本设计主要以下几个模块组成

1.学生成绩添加模块

2.学生成绩删除模块

3.学生成绩修改模块

4.学生成绩检索模块

5.学生成绩显示模块(包括成绩排序)

6.学生成绩保存模块

效果图:

本设计大概5、6百行代码左右,通过这个设计,本人感觉C语言熟练了很多,

希望能对像我一样的C语言菜鸟同学会有点帮助,废话少说,咱们上代码!

三、程序代码

1.main.c

这个文件内主要完成主菜单的跳转和接受用户信息完成到各个模块的跳转。

#include <stdio.h> 
#include "students.h" 
 
int select_menu(void); 
void hand_menu(int cmd, int *flag); 
void quit(); 
 
 
  
int main(int argc, char *argv[]) 
{ 
 int cmd; 
 int flag = 0; 
  
 while(1){ 
  cmd = select_menu();   
  hand_menu(cmd, &flag); 
 } 
} 
 
int select_menu(void) 
{ 
 int select = 0; 
 printf("**************************************************************\n\n"); 
 printf("   学生管理系统    \n"); 
 printf(" 1:添加学生信息   2:删除学生信息\n"); 
 printf(" 3:修改学生信息   4:查询学生信息\n"); 
 printf(" 5:查看学生信息   6:保存\n"); 
 printf(" 0:退出\n\n"); 
 printf("**************************************************************\n"); 
 printf("请选择:"); 
  
 select=getch(); 
 while(select<'0'||select>'6'){ 
  printf("\n输入错误,请重新选择:"); 
  select=getch(); 
 } 
 return select; 
} 
 
void hand_menu(int cmd, int *flag) 
{ 
 static STU *stu_head = NULL; 
 if(*flag == 0){ 
  stu_head = init_student(stu_head); 
  *flag = 1; 
 } 
  
 switch(cmd){ 
  case '0': 
   save_student(stu_head); 
   quit(); 
   break; 
  case '1': 
   system("cls"); 
   stu_head = add_student(stu_head); 
   system("cls"); 
   break; 
  case '2': 
   system("cls"); 
   stu_head = del_student(stu_head); 
   system("cls"); 
   break; 
  case '3': 
   system("cls"); 
   modify_student(stu_head); 
   system("cls"); 
   break; 
  case '4': 
   system("cls"); 
   search_student(stu_head); 
   system("cls"); 
   break; 
  case '5': 
   system("cls"); 
   stu_head = display_student(stu_head); 
   system("cls"); 
   break; 
  case '6': 
   system("cls"); 
   save_student(stu_head); 
   system("cls"); 
   break; 
  default: 
   break; 
 } 
} 
 
void quit() 
{ 
 printf("\n感谢使用学生管理系统!\n"); 
 exit(0); 
} 


2.students.h

这个文件主要包含students.c文件函数操作所需的定义。

#ifndef _STUDENTS_H_ 
#define _STUDENTS_H_ 
 
typedef struct st{ 
 unsigned long ID; 
 char name[10]; 
 float chinese; 
 float math; 
 float english; 
 double all_sub; 
 float average; 
 struct st* next; 
}STU; 
 
#define ASK_STU(p) do{p=(STU *)malloc(sizeof(STU));\ 
    if(p==NULL){printf("malloc memory failed!\n");exit(1);}\ 
    }while(0) 
     
STU *search_by_nb(STU *stu_head, unsigned long nb); 
STU *search_by_name(STU *stu_head, char name[]); 
STU *select_sort(STU *g, char flag); 
STU *add_student(STU *stu_head); 
STU *del_all(STU *stu_head); 
STU *del_one(STU *stu_head, int flag); 
STU *del_student(STU *stu_head); 
void modify_student(STU *stu_head); 
STU *display_student(STU *stu_head); 
STU *search_by_name(STU *stu_head, char name[]); 
STU *search_by_nb(STU *stu_head, unsigned long nb); 
#endif 

3.store.h

#ifndef _STORE_H_ 
#define _STORE_H_ 
void save_student(STU *stu_head); 
STU *init_student(STU *stu_head); 
#endif 

4.students.c

这个文件是本设计的核心部分,包括各个模块的实现函数,
包括添加,删除,修改,查找,显示学生信息这几个模块的实现。

#include <stdio.h> 
#include "students.h" 
 
 STU *select_sort(STU *g, char flag) 
 { 
 STU *p,*q,*t,*s,*h; 
 
 h=(STU *)malloc(sizeof(STU)); 
 h->next=g; 
 p=h; 
 while(p->next->next!=NULL) 
 { 
  for(s=p,q=p->next;q->next!=NULL;q=q->next) 
  { 
   if(flag == '1') 
    if(q->next->ID<s->next->ID) 
     s=q; 
    
   if(flag == '2') 
    if(q->next->chinese<s->next->chinese) 
     s=q; 
      
   if(flag == '3') 
    if(q->next->math<s->next->math) 
     s=q; 
      
   if(flag == '4') 
    if(q->next->english<s->next->english) 
     s=q; 
      
   if(flag == '5') 
    if(q->next->average<s->next->average) 
     s=q; 
  } 
 
  if(s!=q) 
  { 
   t=s->next; 
   s->next=t->next; 
   t->next=p->next; 
   p->next=t; 
  } 
  p=p->next; 
 } 
 g=h->next; 
 free(h); 
 return g; 
} 
 
STU *add_student(STU *stu_head) 
{  
 STU *stu; 
 STU *head = stu_head; 
 STU *node = stu_head; 
 STU *node_fd; 
 int sel; 
 
 ASK_STU(stu); 
 stu->next = NULL; 
  
 printf("请输入学生学号:"); 
 scanf("%d", &stu->ID);  
 
 while(search_by_nb(node, stu->ID)){ 
  printf("已经存在该学号!请重新输入一个学号:"); 
  scanf("%d", &stu->ID); 
 } 
  
 printf("请输入学生名字:"); 
 scanf("%s", stu->name); 
 printf("请输入该学生英语成绩:"); 
  
 scanf("%f", &stu->english); 
 while(stu->english < 0.0 || stu->english > 100.0){ 
  printf("输入错误,请重新输入英语成绩:"); 
  scanf("%f", &stu->english); 
 } 
 printf("请输入该学生数学成绩:"); 
 scanf("%f", &stu->math); 
 while(stu->math < 0.0 || stu->math > 100.0){ 
  printf("输入错误,请重新输入数学成绩:"); 
  scanf("%f", &stu->math); 
 } 
 printf("请输入该学生语文成绩:"); 
 scanf("%f", &stu->chinese); 
 while(stu->chinese < 0.0 || stu->chinese > 100.0){ 
  printf("输入错误,请重新输入数学成绩:"); 
  scanf("%f", &stu->chinese); 
 } 
  
 stu->all_sub = stu->chinese+stu->math+stu->english; 
 stu->average = stu->all_sub/3; 
  
 if(!head){ 
  head = stu; 
  return head; 
 } 
 
 while(node->next) 
  node = node->next; 
   
 node->next = stu; 
 head = select_sort(head, '1'); 
 return head;  
} 
STU *del_all(STU *stu_head) 
{ 
 if(!stu_head) 
  return NULL; 
 del_all(stu_head->next); 
 free(stu_head); 
 stu_head = NULL; 
 return NULL; 
} 
 
STU *del_one(STU *stu_head, int flag) 
{ 
 STU *node = stu_head; 
 STU *head = stu_head; 
 STU *pre; 
  
 char name[10]; 
 unsigned long ID; 
  
 if(head = NULL){ 
  printf("没有任何学生信息!\n"); 
  return head; 
 } 
  
 if(flag == '2'){ 
  printf("请输入要删除的学生姓名:"); 
  scanf("%s", name); 
   
  if(!strcmp(node->name, name)){ 
   free(node); 
   head = node->next; 
   printf("成功删除!按任意键返回。\n"); 
   getch(); 
   return head; 
  } 
   
  while(node){ 
   if(!strcmp(node->name, name)){ 
    pre->next = node->next; 
    free(node); 
    printf("成功删除!按任意键返回。\n"); 
    getch(); 
    return head; 
   } 
   pre = node; 
   node = node->next; 
  } 
   
  printf("没有找到该学生信息!\n"); 
  return head; 
 } 
  
 if(flag == '3'){ 
  printf("请输入要删除的学生学号:"); 
  scanf("%d", &ID); 
   
  if(node->ID == ID){ 
   free(node); 
   head = node->next; 
   printf("成功删除!按任意键返回。\n"); 
   getch(); 
   return head; 
  } 
   
  while(node){ 
   if(!strcmp(node->name, name)){ 
    pre->next = node->next; 
    free(node); 
    printf("成功删除!按任意键返回。\n"); 
    getch(); 
    return head; 
   } 
   pre = node; 
   node = node->next; 
  } 
   
  printf("没有找到该学生信息!按任意键返回\n"); 
  getch(); 
  return head; 
 } 
  
} 
 
STU *del_student(STU *stu_head) 
{ 
 int sel; 
 STU *head = stu_head; 
  
 printf("1:删除全部 2:按名字删除 3:按学号删除 0:返回\n"); 
 printf("请选择:\n"); 
  
 sel = getch(); 
 while(sel<'0'||sel>'3'){ 
  printf("输入错误,请重新选择:\n"); 
  sel = getch(); 
 } 
  
 if(sel == '0') 
  return head; 
  
 if(!head){ 
  printf("没有任何学生信息!按任意键返回.\n"); 
  getch(); 
  return head; 
 } 
  
  if(sel == '1'){ 
  head = del_all(head); 
  printf("删除成功!按任意键返回."); 
  getch(); 
  return head; 
 } 
  
 if(sel == '2'||sel =='3'){ 
  head = del_one(head, sel); 
  return head; 
 } 
  
} 
 
void modify_student(STU *stu_head) 
{ 
 STU *head = stu_head; 
 STU *node_fd; 
 int sel; 
 char name[10]; 
 unsigned long nb; 
  
recyc3: 
 printf("1:修改指定学号的学生信息 2:修改指定姓名的学生信息 0:返回\n请选择:\n"); 
  
 sel = getch(); 
 while(sel < '0'|| sel>'2'){ 
  printf("输入错误!请重新选择:\n"); 
  sel = getch(); 
 } 
 if(sel == '1'||sel=='2'){ 
  if(sel == '1'){ 
   printf("请输入要修改的学生学号:"); 
   scanf("%d", &nb);  
   node_fd = search_by_nb(head, nb); 
  } 
  if(sel == '2'){ 
   printf("请输入要修改的学生姓名:"); 
   scanf("%s", name); 
   node_fd = search_by_name(head, name); 
  } 
  
  if(node_fd){ 
    
   printf("请输入该学生英语成绩:"); 
   scanf("%f", &node_fd->english); 
   while(node_fd->english < 0.0 || node_fd->english > 100.0){ 
    printf("输入错误,请重新输入英语成绩:"); 
    scanf("%f", &node_fd->english); 
   } 
   printf("请输入该学生数学成绩:"); 
   scanf("%f", &node_fd->math); 
   while(node_fd->math < 0.0 || node_fd->math > 100.0){ 
    printf("输入错误,请重新输入数学成绩:"); 
    scanf("%f", &node_fd->math); 
   } 
   printf("请输入该学生语文成绩:"); 
   scanf("%f", &node_fd->chinese); 
   while(node_fd->chinese < 0.0 || node_fd->chinese > 100.0){ 
   printf("输入错误,请重新输入数学成绩:"); 
   scanf("%f", &node_fd->chinese); 
   } 
  
   node_fd->all_sub = node_fd->chinese+node_fd->math+node_fd->english; 
   node_fd->average = node_fd->all_sub/3; 
   printf("修改成功!\n"); 
   goto recyc3; 
  } 
  else{ 
   printf("没有该学生信息!\n"); 
   goto recyc3; 
  } 
 } 
} 
 
STU *display_student(STU *stu_head) 
{ 
 int sel; 
 STU *head = stu_head; 
 STU *node = stu_head; 
 if(node == NULL){ 
  printf("没有任何学生信息,按任意键返回"); 
  getch(); 
  return head; 
 } 
recyc: 
 printf("学号  姓名  语文 数学 英文 平均分 总分\n"); 
 while(node){ 
  printf("%d  %s  %0.1f %0.1f %0.1f %0.1f %0.1f\n", node->ID, node->name,\ 
   node->chinese, node->math, node->english, node->average, node->all_sub); 
  node=node->next; 
 } 
 printf("排序方式: 1:按学号排序 2:按语文成绩排序 3:按数学成绩排序\n   4:按英文成绩排序 5:按总分排序 0:返回\n请选择:"); 
 
 sel = getch(); 
 while(sel < '0'|| sel>'5'){ 
  printf("输入错误!请重新选择:"); 
  sel = getch(); 
 } 
 if(sel == '0') 
  return head; 
   
 head = node = select_sort(head, sel); 
 system("cls"); 
 goto recyc; 
 return head; 
} 
 
STU *search_by_name(STU *stu_head, char name[]) 
{ 
 STU *node = stu_head; 
 
 if(!node) 
  return NULL; 
 
    
 while(node){ 
  if(!strcmp(node->name, name)) 
    return node; 
   node=node->next; 
 } 
   
 return NULL; 
} 
 
STU *search_by_nb(STU *stu_head, unsigned long nb) 
{ 
 STU *node = stu_head; 
 
 if(!node) 
  return NULL; 
   
    
 while(node){ 
  if(node->ID == nb) 
   return node; 
    
  node=node->next; 
 } 
   
 return NULL; 
} 
 
void search_student(STU *stu_head) 
{ 
 STU *head = stu_head; 
 STU *node; 
 int sel = 0; 
 char name[10]; 
 unsigned long ID; 
  
recyc2: 
 printf("1:按姓名查找 2:按学号查找 0:返回\n请选择:"); 
 sel = getch(); 
 while(sel<'0' || sel>'2'){ 
  printf("\n输入错误,请重新选择:"); 
  sel = getch(); 
 } 
  
 if(sel == '0') 
  return; 
 if(sel == '1'||sel=='2'){ 
  if(sel == '1'){ 
   printf("\n请输入你要查找的学生姓名:"); 
   scanf("%s", name); 
   node = search_by_name(head, name); 
  } 
  else{ 
   printf("\n请输入你要查找的学生学号:"); 
   scanf("%d", &ID); 
   node = search_by_nb(head, ID); 
  } 
  
  if(node){ 
   printf("学号  姓名  语文 数学 英文 平均分 总分\n"); 
   printf("%d  %s  %0.1f %0.1f %0.1f %0.1f %0.1f\n", node->ID, node->name,\ 
     node->chinese, node->math, node->english, node->average, node->all_sub); 
    goto recyc2; 
  } 
  else{ 
   printf("没有找到该学生信息!\n"); 
   goto recyc2; 
  } 
 } 
 
}

5.store.c

这个文件包含程序启动时读取文件内的学生成绩信息,
和需要保存时或者退出时向文件保存学生成绩信息的操作。

#include <stdlib.h> 
#include <stdio.h> 
 
#include "students.h" 
 
#define FILE_NAME "students" 
 
void save_student(STU *stu_head) 
{ 
 STU *node = stu_head; 
 FILE *fp; 
 fp = fopen(FILE_NAME, "w+"); 
 while(node){ 
  fprintf(fp, "%ld %s %0.1f %0.1f %0.1f %0.1lf %0.1f\n", node->ID, node->name,\ 
    node->chinese, node->math, node->english, node->all_sub, node->average); 
  node=node->next; 
 } 
 fclose(fp); 
 printf("保存成功!按任意键返回。\n"); 
 getch(); 
} 
 
STU *init_student(STU *stu_head) 
{ 
 STU *node = stu_head; 
 STU *head = stu_head; 
 STU *new_node; 
 int i; 
 FILE *fp; 
 char name[10]; 
 int num; 
  
 ASK_STU(new_node); 
 new_node->next=NULL; 
  
 fp = fopen(FILE_NAME, "r+"); 
 rewind(fp); 
 while((i = fscanf(fp, "%ld%s%f%f%f%lf%f\n", &new_node->ID, new_node->name,\ 
     &new_node->chinese, &new_node->math, &new_node->english, &new_node->all_sub, &new_node->average)) == 7){ 
  if(!head) 
   head = node = new_node; 
  else{ 
   while(node->next) 
    node = node->next; 
   node->next = new_node; 
  } 
  ASK_STU(new_node); 
  new_node->next = NULL; 
 } 
 fclose(fp); 
 return head; 
} 

四、总结

菜鸟修炼C语言基础部分到此告一段落了,通过这段时间的修炼对C语言有了更加深入的理解,
能够熟练运用指针、数组、结构体和链表进行代码的编写了。
如果以后有时间,可能会修炼一下C算法,下一段时间我会修炼C++。
希望能对像我一样的C语言菜鸟能提供到帮助,大家共同努力,共同奋斗!

相关文章

  • C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析

    C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析

    这篇文章主要介绍了C++实现图的邻接矩阵存储和广度、深度优先遍历,实例分析了C++实现图的遍历技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C/C++?函数的存储位置和占用空间详解

    C/C++?函数的存储位置和占用空间详解

    Lambda函数的代码部分在代码段中,被捕获的变量存储在Lambda函数对象的内部,这些变量的存储位置取决于Lambda函数对象的存储位置,这篇文章主要介绍了C/C++函数的存储位置和占用空间,需要的朋友可以参考下
    2023-06-06
  • C++11-20 常量表达式的使用

    C++11-20 常量表达式的使用

    本文主要介绍了C++11-20常量表达式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++实现学生管理系统示例解析

    C++实现学生管理系统示例解析

    这篇文章主要介绍了C++实现学生管理系统示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C++检查某个文件或目录是否存在的函数

    C++检查某个文件或目录是否存在的函数

    这篇文章主要介绍了C++检查某个文件或目录是否存在的函数,是Windows应用程序设计中非常常见的实用技巧,需要的朋友可以参考下
    2014-10-10
  • C语言举例讲解i++与++i之间的区别

    C语言举例讲解i++与++i之间的区别

    这篇文章主要介绍了C语言中i++和++i的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言辗转相除法求2个数的最小公约数

    C语言辗转相除法求2个数的最小公约数

    辗转相除法最大的用途就是用来求两个数的最大公约数。下面通过本文给大家介绍C语言辗转相除法求2个数的最小公约数,非常不错,感兴趣的朋友一起看看吧
    2016-12-12
  • C语言链表实现简易通讯录

    C语言链表实现简易通讯录

    这篇文章主要为大家详细介绍了C语言链表实现简易通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++时间戳转化操作实例分析【涉及GMT与CST时区转化】

    C++时间戳转化操作实例分析【涉及GMT与CST时区转化】

    这篇文章主要介绍了C++时间戳转化操作,结合实例形式分析了C++时间戳转换与显示操作的原理与具体实现技巧,涉及GMT与CST时区转化,需要的朋友可以参考下
    2017-05-05
  • c语言获取用户输入字符串是scanf和gets的区别详解

    c语言获取用户输入字符串是scanf和gets的区别详解

    今天小编就为大家分享一篇c语言获取用户输入字符串是scanf和gets的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论

?


http://www.vxiaotou.com