• C语言综合实验1—学生信息管理系统


    实验题目:学生信息管理系统

    实验要求:用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。

    提示:用一个结构体类型表示学生信息

     1 typedef struct node /*定义结构体*/
     2 { 
     3     int num; //学号
     4     char name[15];//姓名
     5     char sex[9]; //性别
     6     int age;  //年龄
     7     int english; //英语成绩
     8     int math; //数学成绩
     9     int computer;//计算机成绩
    10     int average; //平均成绩
    11     struct node *next; //链表指针域
    12 }student_info;

    运行过程中采用一个结构体链表存储学生信息。退出系统时可以采用文件存储用户输入的信息,再次运行的时候从文件中读取。

    完整C语言程序分为三个文件,student.h、student.cpp和main.c文件。具体实现如下所示:

    student.h文件中定义学生信息结构体,操作函数声明。

     1 #ifndef STUDENT_HEAD
     2 #define STUDENT_HEAD
     3 
     4 typedef struct node /*定义结构体*/
     5 { 
     6     int num; //学号
     7     char name[15];//姓名
     8     char sex[9]; //性别
     9     int age;  //年龄
    10     int english; //英语成绩
    11     int math; //数学成绩
    12     int computer;//计算机成绩
    13     int average; //平均成绩
    14     struct node *next; //链表指针域
    15 }student_info;
    16 
    17 //学生信息链表
    18 extern student_info* student_list;  //全局变量声明
    19 
    20 
    21 //初始化函数声明
    22 //初始化学生信息链表
    23 void init_student_info_list();
    24 //判断学生信息链表是否为空
    25 int student_list_empty();
    26 
    27 //操作函数声明
    28 //向学校信息表中添加学生信息记录
    29 int add_student_info();
    30 //根据学号删除学生信息
    31 int delete_student_info(int num);
    32 //根据学号修改学生信息
    33 int modify_student_info(int num);
    34 //根据学号查找学生信息
    35 student_info* search_student_info(int num);
    36 //输出每个学生的平均成绩
    37 void display_average();
    38 //显示所有学生信息
    39 void display_student_info();
    40 //将学生信息保存到文件
    41 int save_file();
    42 //从文件中读取学生信息
    43 int read_file();
    44 #endif

    student.c文件中是对student.h文件中声明的函数进行定义,给出具体的实现代码。

      1 #include "student.h"
      2 #include <stdio.h>
      3 #include <string.h>
      4 #include <malloc.h>
      5 
      6 //初始化学生信息链表
      7 void init_student_info_list()
      8 {
      9     //学生信息链表头结点
     10     student_list = (student_info*)malloc(sizeof(student_info));
     11     student_list->next = NULL;
     12 }
     13 //判断学生信息链表是否为空
     14 int student_list_empty()
     15 {
     16     return student_list->next == NULL;
     17 }
     18 //操作函数实现
     19 //向学校信息表中添加学生信息记录
     20 int add_student_info()
     21 {
     22     student_info *pstu = (student_info*)malloc(sizeof(student_info));
     23     if(pstu == NULL)
     24     {
     25         printf("内存分配失败.\n");
     26         return 0;
     27     }
     28     printf("请按要求一次输入学生的信息.\n");
     29     printf("请输入学号: ");
     30     scanf("%d",&pstu->num);
     31     //判断该学号是否已经存在
     32     if(search_student_info(pstu->num) != NULL)
     33     {
     34         printf("该学号已经存在学生信息表中.\n");
     35         return 0;
     36     }
     37     printf("请输入姓名: ");
     38     getchar();
     39     gets(pstu->name);
     40     printf("请输入性别: ");
     41     scanf("%s",pstu->sex);
     42     printf("请输入年龄: ");
     43     scanf("%d",&pstu->age);
     44     printf("请输入英语成绩: ");
     45     scanf("%d",&pstu->english);
     46     printf("请输入数学成绩: ");
     47     scanf("%d",&pstu->math);
     48     printf("请输入计算机成绩: ");
     49     scanf("%d",&pstu->computer);
     50     pstu->average = (pstu->english + pstu->math + pstu->computer)/3;
     51     //每次从学生信息链表的头部插入;
     52     pstu->next = student_list->next;
     53     student_list->next = pstu;
     54     return 1;
     55 }
     56 //根据学号删除学生信息
     57 int delete_student_info(int num)
     58 {
     59     student_info *pstu;
     60     student_info *qstu;
     61     if(search_student_info(num) == NULL)
     62     {
     63         printf("不存在该学好为%d的学生信息.\n",num);
     64         return 0;
     65     }
     66     pstu = student_list->next;
     67     qstu = student_list;
     68     while(pstu->num != num)
     69     {
     70         qstu = pstu;
     71         pstu = pstu->next;
     72     }
     73     qstu->next = pstu->next;
     74     free(pstu);
     75     return 1;
     76 }
     77 //根据学号修改学生信息
     78 int modify_student_info(int num)
     79 {
     80     int choice;
     81     student_info *pstu = search_student_info(num);
     82     if(pstu == NULL)
     83     {
     84         printf("不存在该学好为%d的学生信息.\n",num);
     85         return 0;
     86     }
     87     printf("1.姓名 2.性别 3.年龄 4.英语成绩 5.数学成绩 6.计算机成绩.\n");
     88     printf("请选择修改的信息: ");
     89     scanf("%d",&choice);
     90     switch(choice)
     91     {
     92     case 1:
     93         printf("请输入新的姓名: ");
     94         getchar();
     95         gets(pstu->name);
     96         break;
     97     case 2:
     98         printf("请输入新的性别: ");
     99         scanf("%s",pstu->sex);
    100         break;
    101     case 3:
    102         printf("请输入新的年龄: ");
    103         scanf("%d",&pstu->age);
    104         break;
    105     case 4:
    106         printf("请输入新的英语成绩: ");
    107         scanf("%d",&pstu->english);
    108         break;
    109     case 5:
    110         printf("请输入新的数学成绩: ");
    111         scanf("%d",&pstu->math);
    112         break;
    113     case 6:
    114         printf("请输入新的计算机成绩: ");
    115         scanf("%d",&pstu->computer);
    116         break;
    117     default:
    118         printf("请按提示要求操作.\n");
    119     }
    120     return 1;
    121 }
    122 //根据学号查找学生信息
    123 student_info* search_student_info(int num)
    124 {
    125     student_info *pstu;
    126     pstu = student_list->next;
    127     while(pstu  && pstu->num != num)
    128     {
    129 
    130         pstu = pstu->next;
    131     }
    132     return pstu;
    133 }
    134 //输出每个学生的平均成绩
    135 void display_average()
    136 {
    137     student_info *pstu;
    138     pstu = student_list->next;
    139     while(pstu)
    140     {
    141         printf("学号为%d,姓名为%s的学生平均成绩为: %d\n",pstu->num,pstu->name,pstu->average);
    142         pstu = pstu->next;
    143     }
    144 }
    145 //显示所有学生信息
    146 void display_student_info()
    147 {
    148     student_info *pstu;
    149     pstu = student_list->next;
    150     printf("所有学生信息如下所示.\n");
    151     printf("学号\t姓名\t性别\t年龄\t英语\t数学\t计算机\t平均成绩.\n");
    152     while(pstu)
    153     {
    154         printf("%d\t",pstu->num);
    155         printf("%s\t",pstu->name);
    156         printf("%s\t",pstu->sex);
    157         printf("%d  \t",pstu->age);
    158         printf("%d   \t",pstu->english);
    159         printf("%d  \t",pstu->math);
    160         printf("%d    \t",pstu->computer);
    161         printf("%d\n",pstu->average);
    162         pstu = pstu->next;
    163     }
    164 }
    165 //将学生信息保存到文件
    166 int save_file()
    167 {
    168     FILE *pfile;
    169     student_info *pstu;
    170     pfile = fopen("student.txt","w");
    171     if(pfile == NULL)
    172     {
    173         printf("打开文件失败.\n");
    174         return 0;
    175     }
    176     pstu = student_list->next;
    177     while(pstu)
    178     {
    179         fprintf(pfile,"%5d%15s%9s%3d%4d%4d%4d%4d",pstu->num,pstu->name,pstu->sex,pstu->age,
    180             pstu->english,pstu->math,pstu->computer,pstu->average);
    181         pstu = pstu->next;
    182     }
    183     fclose(pfile);
    184     return 1;
    185 }
    186 
    187 //从文件中读取学生信息
    188 int read_file()
    189 {
    190     FILE *pfile;
    191     student_info *pstu;
    192     pfile = fopen("student.txt","r");
    193     if(pfile == NULL)
    194     {
    195         printf("打开文件失败.\n");
    196         return 0;
    197     }
    198     while(!feof(pfile))
    199     {
    200         pstu = (student_info*)malloc(sizeof(student_info));
    201         fscanf(pfile,"%5d%15s%9s%4d%4d%4d%4d%4d",&pstu->num,pstu->name,pstu->sex,&pstu->age,
    202             &pstu->english,&pstu->math,&pstu->computer,&pstu->average);
    203         pstu->average = (pstu->english + pstu->math + pstu->computer)/3;
    204         //每次从学生信息链表的头部插入;
    205         pstu->next = student_list->next;
    206         student_list->next = pstu;
    207     }
    208     fclose(pfile);
    209     return 1;
    210 }

    主函数main.c文件进行测试调用,如下所示:

      1 #include "student.h"
      2 #include <stdlib.h>
      3 #include <stdio.h>
      4 
      5 void menu();
      6 
      7 //学生信息链表
      8 student_info* student_list;
      9 
     10 //用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。
     11 int main()
     12 {
     13     int choice;
     14     int num;
     15     printf("**************************\n");
     16     printf("欢迎使用学生信息管理系统\n");
     17     printf("**************************\n");
     18     printf("-----------------------------\n");
     19     init_student_info_list();
     20     if(read_file())
     21         printf("从文件中读取学生信息成功.\n");
     22     else
     23         printf("从文字中读取学生信息失败.\n");
     24     printf("-----------------------------\n");
     25     menu();
     26     while(1)
     27     {
     28         printf("请选择操作: ");
     29         scanf("%d",&choice);
     30         switch(choice)
     31         {
     32         case 1:
     33             if(student_list_empty())
     34                 printf("学生信息表为空,请先添加学生信息.\n");
     35             else
     36                 display_student_info();
     37             break;
     38         case 2:
     39             if(add_student_info())
     40                 printf("添加学生信息成功.\n");
     41             else
     42                 printf("添加学生信息失败.\n");
     43             break;
     44         case 3:
     45             if(student_list_empty())
     46                 printf("学生信息表为空,请先添加学生信息.\n");
     47             else
     48             {
     49                 printf("请输入要删除学生信息的学号: ");
     50                 scanf("%d",&num);
     51                 if(delete_student_info(num))
     52                     printf("成功删除该学号对应的学生信息.\n");
     53                 else
     54                     printf("删除失败.\n");
     55             }
     56             break;
     57         case 4:
     58             if(student_list_empty())
     59                 printf("学生信息表为空,请先添加学生信息.\n");
     60             else
     61             {
     62                 printf("请输入要修改学生信息的学号: ");
     63                 scanf("%d",&num);
     64                 if(modify_student_info(num))
     65                     printf("成功修改该学号对应的学生信息.\n");
     66                 else
     67                     printf("修改失败.\n");
     68             }
     69             break;
     70         case 5:
     71             if(student_list_empty())
     72                 printf("学生信息表为空,请先添加学生信息.\n");
     73             else
     74                 display_average();
     75             break;
     76         case 6:
     77             if(student_list_empty())
     78                 printf("学生信息表为空,请先添加学生信息.\n");
     79             else
     80                 if(save_file())
     81                     printf("保存学生信息成功.\n");
     82                 else
     83                     printf("保存学生信息失败.\n");
     84             break;
     85         case 0:
     86             printf("欢迎下次使用,再见.\n");
     87             system("pause");
     88             exit(0);
     89             break;
     90         default:
     91             printf("输入错误,请重新选择操作.\n");
     92         }
     93     }
     94     system("pause");
     95     return 0;
     96 }
     97 
     98 void menu()
     99 {
    100     printf("1.查看学生信息.\n");
    101     printf("2.添加学生信息.\n");
    102     printf("3.删除学生信息.\n");
    103     printf("4.修改学生信息.\n");
    104     printf("5.输出平均成绩.\n");
    105     printf("6.保存学生信息.\n");
    106     printf("0.退出系统操作.\n");
    107 }

    程序执行结果如下所示:

    (1)第一次执行没有学生信息,读取文件失败。

    (2)以后执行先从文件中读取学生信息,然后进行操作。

  • 相关阅读:
    断开Oracle连接用户
    【转】Windows英文操作系统下ArcGIS 显示和保存中文数据
    断开Oracle连接用户
    如何判断标准输入或输出是否经过了重定向,即是否在命令行上使用了“”?
    PHP MYSQL网站注入扫描
    在PHPLIB中的MYSQL类中加INSERT,UPDATE,DELETE等函数
    为Linux安置红旗紫光输出法
    Linux下Resin JSP MySQL的摆设和设置配备摆设2
    红旗Linux桌面4.1文本安顿过程图解(一)
    MYSQL数据迁移tips,ORA00907: missing right parenthesis
  • 原文地址:https://www.cnblogs.com/Anker/p/3063436.html
Copyright © 2020-2023  润新知