温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言学生成绩管理系统的示例分析

发布时间:2021-08-15 12:12:07 来源:亿速云 阅读:220 作者:小新 栏目:编程语言

小编给大家分享一下C语言学生成绩管理系统的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

具体内容如下

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

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

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

1.学生成绩添加模块

2.学生成绩删除模块

3.学生成绩修改模块

4.学生成绩检索模块

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

6.学生成绩保存模块

效果图:

C语言学生成绩管理系统的示例分析

C语言学生成绩管理系统的示例分析

本设计大概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语言学生成绩管理系统的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI