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

本文实例为大家分享了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语言实现简单学生管理系统
  • 学生成绩管理系统C语言代码实现
  • C语言实现学生成绩管理系统
  • C语言图书管理系统简洁版
  • C语言图书管理系统课程设计
  • C语言实现图书管理系统
  • C语言利用结构体数组实现学生成绩管理系统
(0)

相关推荐

  • C语言利用结构体数组实现学生成绩管理系统

    要求: 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入).定义结构体类型描述学生信息,每个学生信息包括:学号.姓名.多门课的成绩.总成绩和平均成绩.用结构体数组作为函数参数,编程实现如下菜单驱动的学生成绩管理系统. (1) 录入每个学生的学号.姓名和各科考试成绩. (2) 计算每门课程的总分和平均分. (3) 计算每个学生的总分和平均分. (4) 按每个学生的总分由高到低排出名次表. (5) 按学号由小到大排出成绩表. (6) 按姓名的字典顺序排出成

  • C语言图书管理系统课程设计

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中竟然在QQ网络硬盘中找到了当初的teta版,发布于此,以作纪念. C 源代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> struct book{ char book_name[30]; int bianhao; double price; char author[20]; char state[20]; cha

  • C语言实现学生成绩管理系统

    设计一个学生成绩管理系统,实现对学生成绩的动态管理,实现对学生成绩的输入,显示,删除,查找,插入,最佳,保存,计算,排序等主要功能. 功能要求 1.每一条记录包括一个学生的学号.姓名.3门课成绩.平均成绩. 2.输入功能:可以一次完成若干条记录的输入. 3.显示功能:完成全部学生记录的显示. 4.查找功能:完成按姓名查找学生记录,并显示. 5.排序功能:按学生平均成绩进行排序. 6.插入功能:按平均成绩高低插入一条学生记录 7.删除功能:如果输入错误,可以删除学生记录: 8.退出. 代码: #i

  • C语言实现图书管理系统

    目前为止跟着学校进度学习C语言大概半年左右,基础学习只学到了指针,学得非常浅.说实话,起初对C语言的印象---只是一个学习计算机语言的敲门砖,对具体C语言如何应用等,非常迷茫.直到大一下半学期的高级语言设计课程之后,试过dos运行的图形化界面的完整小程序,才发现C语言的魅力. ok,废话不多说了,下面是我第二节课的作品----C语言的图书管理系统.一个简单的小程序.并非纯原创,是基于网络搜索到的"学生管理系统"改编而成的.通过直接浏览.修改一个完整的代码,我的收获颇丰.我认为这样比枯燥

  • C语言学生成绩管理系统课程设计

    学生成绩管理系统是比较适合初学者的.它涵盖了c语言几乎知识.对于学了c语言的人,把这个课程设计搞好(当然自己能设计出来是要有很好的基础).不管自己能不能够完成,最重要的是能弄懂.参考其他资料,试着自己编写是不错的选择.这个课程设计也是我参照资料,自己编写的.自己适当地增加了一些功能.不过,编的不够那么专业吧. #include<stdio.h> #include<string.h> #include<stdlib.h> #define size 100 char* cl

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

    本文实例为大家分享了C语言学生成绩管理系统的具体代码,供大家参考,具体内容如下 Ps:后加了个链表排序,用冒泡写的. /* Title : Student's score management system Author: nyist_xiaod Date : 2012.5.8 */ #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #define Pr

  • 学生成绩管理系统C语言代码实现

    C语言实现了学生成绩管理系统,可以进行学生成绩的增加,删除,更新,查询,计算和展示. 完整代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct person //定义结构体 { char num[10]; //学号 char name[20]; //姓名 float cyuyan; //C语言成绩 float en; //物理学成绩 float ji; //原子物理成绩

  • C语言编写学生成绩管理系统

    用C语言编写学生成绩管理系统代码,供大家参考,具体内容如下 C语言实现学生成绩管理系统实战教学 https://www.jb51.net/article/154767.htm (1)给出所选课程设计题目以及本题目具体所要完成的功能要求说明. 1.课程设计题目:学生成绩管理系统 2.完成的功能要求: (1).主要实现的功能: 1---学生输入 2---学生插入 3---学生查询(按学号) 4---学生删除 5---学生输出 6---计算每名学生的平均分并输出 7---计算每科的平均分并输出 8--

  • C语言图书管理系统简洁版

    DOS界面的图书管理系统,具体内容如下 程序分为两块:管理员操作(收录图书.删除图书等)和会员操作(注册.借书.还书等): 1.管理员操作界面 2.会员操作界面 global.h头文件:(程序中只使用了一个编写的头文件,在这里存放了所有的接口函数以及需要使用到的头文件,还有结构体的定义) #include "iostream" #include "string" #include "fstream" #include "conio.h&

  • C语言实现简单学生管理系统

    花了一个月的时间,学习了链表,文件,多文件编程,然后就开始写学生管理系统,比较简单的那种,实现了增,添,改,查,多种排序,输入的时候的限定,成绩分析的功能.遇到的问题很多,也尝试解决了,下面写点写学生管理系统的要注意的地方,希望对别人有帮助. 1.一定要先写好主函数的框架,然后再往上面加东西,这样说有点笼统,我把我的主函数在下面,可以借鉴下哈.我的主函数是一个while(1)的无限循环,里面一个switch选择,利用一个菜单函数,让其返回值当成switch选择的值,然后进入不同的功能主函数,其他

随机推荐