• C语言编写学生信息管理系统


    学完C语言,自己想着编写一个学生信息管理系统,既可以巩固C语言知识,也能体验怎么合理地设计和实现一个项目。

    设计比较简陋,希望各位大佬多多批评,多多指教!

    这个系统最重要的便是主要功能框架,在主函数中用switch()多分支选择结构实现。

    我是链表实现,代码如下:

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<string.h>
      4 #include<malloc.h>
      5 #include<stdbool.h>
      6 
      7 #define len sizeof(Student)
      8 
      9 struct Student{
     10     char ID[11];
     11     char name[10];
     12     int age;
     13     char sex[2];
     14     int Grade;
     15     Student *Next;
     16 };
     17 
     18 Student *Head = NULL;//全局变量,是整个链表的开头 
     19 
     20 void Createlist();
     21 bool Whetherlistempty();
     22 Student *Createlist(int n);
     23 Student *AddNode(int n);
     24 bool Whetherlistempty();
     25 Student * Insertnode(Student *Head, Student *newnode);
     26 Student *Deleteinformation();
     27 Student *DeleteNode(Student * Head, char id[]);
     28 void Display();
     29 Student *ReviseNode(Student* Head, char id[]);
     30 Student *ReviseNode(Student* Head, char id[]);
     31 Student *Findinformation();
     32 Student *FindNode(Student *Head, char id[]);
     33 Student *Sortinformaition();
     34 Student *SortbyID(Student *Head);
     35 Student *SortbyName(Student* Head);
     36 
     37 void login(){//主菜单 
     38     printf("    学生信息管理系统 1.0
    
    ");
     39     printf("请选择操作:
    ");
     40     printf("0.退出出系统
    1.增加学生信息
    2.删除学生信息
    3.修改学生信息
    4.查询学生信息
    5.按信息排序
    6.展示信息
    ");
     41 }
     42 
     43 Student *Createinformation(){//创建学生信息 
     44     printf("请输入录如学生信息学生个数:
    ");
     45     int n;
     46     scanf("%d", &n);
     47     if(n <= 0) return (Student *)NULL;
     48     if(Whetherlistempty()) Head = Createlist(n);//如果链表为空,直接创建新链表 
     49     else Head = AddNode(n);//反之直接在链表中加入新节点即可 
     50     return Head;
     51 }
     52 
     53 bool Whetherlistempty(){//判断链表是否为空 
     54     if(Head == NULL) return true;
     55     else return false;
     56 }
     57 
     58 Student *Createlist(int n){//创建链表 
     59     printf("请按照以下顺序输入学生信息
    ");
     60     printf("学号   姓名 年龄 性别  年级    
    ");
     61     Student *p1, *p2;
     62     for(int i = 0; i < n; i++){
     63         p1 = (Student *)malloc(len);
     64         scanf("%s %s %d %s %d", p1->ID, p1->name, &p1->age, p1->sex, &p1->Grade);
     65         if(Head == NULL) Head = p1;
     66         else p2->Next = p1;
     67         p2 = p1;
     68     }
     69     p2->Next = NULL;
     70     printf("创建完成!
    ");
     71     system("pause");
     72     system("cls");
     73     return Head;//创建完成返回链表头 
     74 }
     75 
     76 Student *AddNode(int n){//增加学生信息 
     77     Student *newnode;
     78     for(int i = 0; i < n; i++){
     79         newnode = (Student *)malloc(len);
     80         printf("请按照以下顺序输入学生信息
    "); 
     81         printf("学号   姓名 年龄 性别  年级    
    ");
     82         scanf("%s %s %d %s %d", newnode->ID, newnode->name, &newnode->age, newnode->sex, &newnode->Grade);
     83         Head = Insertnode(Head, newnode);
     84     }
     85     printf("创建完成!
    ");
     86     system("pause");
     87     system("cls");
     88     return Head;
     89 }
     90 
     91 Student * Insertnode(Student *Head, Student *newnode){//在链表结尾加上一个节点 
     92     Student *p1, *p2, *p;
     93     p1 = p2 = Head;
     94     p = newnode;
     95     if(Head == NULL) {
     96         Head = p;
     97         p->Next = NULL; 
     98     }
     99     else{
    100         while(p1->Next != NULL){
    101             p1 = p1->Next;
    102         }
    103         p1->Next = p;
    104         p->Next = NULL;        
    105     }
    106     return Head;
    107 }
    108 
    109 Student *Deleteinformation(){ //删除学生信息 
    110     printf("请输入要删除信息学生的个数:
    ");
    111     int n;
    112     scanf("%d", &n);
    113     for(int i = 0; i < n; i++){
    114         printf("请输入要删除信息学生的学号:");
    115         char id[11];
    116         scanf("%s", id);
    117         Head = DeleteNode(Head, id); 
    118     }
    119     system("pause");
    120     system("cls");
    121     return Head;
    122 }
    123 
    124 Student *DeleteNode(Student * Head, char id[]){//按学号删除掉链表中相应的节点 
    125     Student *head, *p1, *p2;
    126     head = p1 = p2 = Head;
    127     if(head == NULL){
    128         printf("系统学生信息为空!
    ");
    129         return (Student *)NULL;
    130     }
    131     else{
    132         while(strcmp(p1->ID, id) != 0 && p1->Next != NULL){
    133             p2 = p1;
    134             p1 = p1->Next;
    135         }
    136         if(strcmp(p1->ID, id) == 0){
    137             if(p1  == head){
    138                 head = p1->Next;//删除操作 
    139                 printf("删除成功!
    ");
    140             } 
    141             else{
    142                 p2->Next = p1->Next;//删除操作 
    143                 printf("删除成功!
    ");
    144             } 
    145         }
    146         else printf("没有这个学生!
    ");
    147     }
    148     return head;
    149 }
    150 
    151 void Display(Student *Head){//打印出学生信息 
    152     Student *p1;
    153     p1 = Head;
    154     printf("    学号           姓名  年龄    性别 年级    
    ");
    155     while(p1 != NULL){
    156         printf("%12s %10s %4d %6s %6d
    ", p1->ID, p1->name, p1->age, p1->sex, p1->Grade);
    157         p1 = p1->Next;
    158     }
    159     system("pause");
    160     system("cls");
    161 }
    162 
    163 Student *Reviseinformation(){//查询学生信息 
    164     printf("请输入要修改学生信息的个数
    ");
    165     int n;
    166     scanf("%d", &n);
    167     for(int i = 0; i < n; i++){
    168         printf("请输入要修改信息的学生的学号
    ");
    169         char id[11];
    170         scanf("%s", id);
    171         Head = ReviseNode(Head, id);
    172     } 
    173     return Head;
    174 }
    175 
    176 Student *ReviseNode(Student* Head, char id[]){//在链表中按照学号找到相应的节点 
    177     Student *p1;
    178     p1 = Head;
    179     while(p1 != NULL ){
    180         if( strcmp(p1->ID, id) == 0) break;
    181         p1 = p1->Next;
    182     }
    183     if(p1 == NULL){//未找到该生信息 
    184         printf("此系统不存在该生信息!
    ");
    185         system("pause");
    186         system("cls");
    187     }
    188     else{//找到后直接重新输入 
    189         printf("请重新按照以下顺序输入该生信息:
    ");
    190         printf("学号   姓名 年龄 性别  年级    
    ");
    191         scanf("%s %s %d %s %d", p1->ID, p1->name, &p1->age, p1->sex, &p1->Grade);
    192         printf("修改成功!
    ");
    193         system("pause");
    194         system("cls");
    195     }
    196     return Head;
    197 }
    198 
    199 Student *Findinformation(){//查找学生信息并且输出 
    200     printf("请输入要查询学生信息的个数:
    ");
    201     int n;
    202     scanf("%d", &n);
    203     for(int i = 0; i < n; i++){
    204         printf("请输入要查询学生的学号:
    ");
    205         char id[11];
    206         scanf("%s", id);
    207         Student *p1;
    208         p1 = FindNode(Head, id);
    209         if(i == 0){
    210             printf("    学号           姓名  年龄    性别 年级    
    ");
    211         }
    212         if(p1 == NULL){
    213             printf("没有该生信息!
    ");
    214             continue;
    215         }
    216         printf("%12s %10s %4d %6s %6d
    ", p1->ID, p1->name, p1->age, p1->sex, p1->Grade);
    217     }
    218     system("pause");
    219     system("cls");
    220     return Head;
    221 }
    222 
    223 Student *FindNode(Student *Head, char id[]){//在链表中按照学号寻找相应的节点 
    224     Student *p1;
    225     p1 = Head;
    226     while(p1 != NULL ){
    227         if( strcmp(p1->ID, id) == 0) break;
    228         p1 = p1->Next;
    229     }
    230     return p1;
    231 }
    232 
    233 Student *Sortinformaition(){//排序的次级菜单 
    234     while(1){
    235         printf("请选择操作:
    ");
    236         printf("1.按学号排序
    2.按姓名排序
    0.返回主菜单
    ");
    237         int choice;
    238         scanf("%d", &choice);
    239         switch(choice){
    240             case 0: system("cls"); return Head;
    241             case 1: Head = SortbyID(Head); break;
    242             case 2: Head = SortbyName(Head); break;
    243         }
    244         system("cls");
    245     }
    246 }
    247 
    248 Student *SortbyID(Student *Head){//按照学号排序,冒泡排序法 
    249     Student *p1, *p2;
    250     char tID[11], tname[10], tsex[2];
    251     int tGrade, tage;
    252     for(p1 = Head; p1 != NULL; p1 = p1->Next){
    253         for(p2 = p1->Next; p2 != NULL; p2 = p2->Next){
    254             if(strcmp(p1->ID, p2->ID) > 0){
    255                 strcpy(tID, p1->ID);
    256                 strcpy(p1->ID, p2->ID);
    257                 strcpy(p2->ID, tID);
    258                 strcpy(tname, p1->name);
    259                 strcpy(p1->name, p2->name);
    260                 strcpy(p2->name, tname);
    261                 tage = p1->age;
    262                 p1->age = p2->age;
    263                 p2->age = tage;
    264                 strcpy(tsex, p1->sex);
    265                 strcpy(p1->sex, p2->sex);
    266                 strcpy(p2->sex, tsex);
    267                 tGrade = p1->Grade;
    268                 p1->Grade = p2->Grade;
    269                 p2->Grade = tGrade;
    270             }
    271         }
    272     }
    273     printf("按照学号排序完成!
    ");
    274     system("pause");
    275     system("cls");
    276     return Head;
    277 }
    278 
    279 Student *SortbyName(Student* Head){//按照姓名排序,冒泡排序法 
    280         Student *p1, *p2;
    281     char tID[11], tname[10], tsex[2];
    282     int tGrade, tage;
    283     for(p1 = Head; p1 != NULL; p1 = p1->Next){
    284         for(p2 = p1->Next; p2 != NULL; p2 = p2->Next){
    285             if(strcmp(p1->name, p2->name) > 0){
    286                 strcpy(tID, p1->ID);
    287                 strcpy(p1->ID, p2->ID);
    288                 strcpy(p2->ID, tID);
    289                 strcpy(tname, p1->name);
    290                 strcpy(p1->name, p2->name);
    291                 strcpy(p2->name, tname);
    292                 tage = p1->age;
    293                 p1->age = p2->age;
    294                 p2->age = tage;
    295                 strcpy(tsex, p1->sex);
    296                 strcpy(p1->sex, p2->sex);
    297                 strcpy(p2->sex, tsex);
    298                 tGrade = p1->Grade;
    299                 p1->Grade = p2->Grade;
    300                 p2->Grade = tGrade;
    301             }
    302         }
    303     }
    304     printf("按照姓名排序完成!
    ");
    305     system("pause");
    306     system("cls");
    307     return Head;
    308 }
    309 
    310 int main(){
    311     while(1){    
    312         login();
    313         int funtion;
    314         scanf("%d", &funtion);
    315         system("cls");
    316         switch(funtion){
    317             case 0: return 0;
    318             case 1:Head = Createinformation();break;
    319             case 2:Head = Deleteinformation();break;
    320             case 3:Head = Reviseinformation();break;
    321             case 4:Head = Findinformation();break;
    322             case 5:Head = Sortinformaition();break;
    323             case 6:Display(Head);break;
    324         }
    325     }
    326     return 0;
    327 }
    View Code

    不足的地方有很多,我目前认为主要有以下两点:

    1.没有任何文件操作,数据不能保存下来

    2.没有创建用户名和密码,缺失安全性

    种一棵树最好的时间是十年前,其次是现在。
  • 相关阅读:
    大战设计模式【5】—— 工厂方法模式
    通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
    大战设计模式【4】—— 简单工厂模式
    大战设计模式【3】—— 装饰模式
    大战设计模式【2】—— 观察者模式
    大战设计模式【1】—— 策略模式
    回顾:maven配置和常用命令整理
    idea properties文件unicode码问题
    Nginx学习笔记
    tomcat添加context方式部署web应用
  • 原文地址:https://www.cnblogs.com/HyattXia/p/9427873.html
Copyright © 2020-2023  润新知