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\n\n");  39     printf("请选择操作:\n");  40     printf("0.退出出系统\n1.增加学生信息\n2.删除学生信息\n3.修改学生信息\n4.查询学生信息\n5.按信息排序\n6.展示信息\n");  41 }  42 
 43 Student *Createinformation(){//创建学生信息 
 44     printf("请输入录如学生信息学生个数:\n");  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("请按照以下顺序输入学生信息\n");  60     printf("学号 姓名 年龄 性别 年级 \n");  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("创建完成!\n");  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("请按照以下顺序输入学生信息\n");  81         printf("学号 姓名 年龄 性别 年级 \n");  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("创建完成!\n");  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("请输入要删除信息学生的个数:\n"); 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("系统学生信息为空!\n"); 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("删除成功!\n"); 140  } 141             else{ 142                 p2->Next = p1->Next;//删除操作 
143                 printf("删除成功!\n"); 144  } 145  } 146         else printf("没有这个学生!\n"); 147  } 148     return head; 149 } 150 
151 void Display(Student *Head){//打印出学生信息 
152     Student *p1; 153     p1 = Head; 154     printf(" 学号 姓名 年龄 性别 年级 \n"); 155     while(p1 != NULL){ 156         printf("%12s %10s %4d %6s %6d\n", 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("请输入要修改学生信息的个数\n"); 165     int n; 166     scanf("%d", &n); 167     for(int i = 0; i < n; i++){ 168         printf("请输入要修改信息的学生的学号\n"); 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("此系统不存在该生信息!\n"); 185         system("pause"); 186         system("cls"); 187  } 188     else{//找到后直接重新输入 
189         printf("请重新按照以下顺序输入该生信息:\n"); 190         printf("学号 姓名 年龄 性别 年级 \n"); 191         scanf("%s %s %d %s %d", p1->ID, p1->name, &p1->age, p1->sex, &p1->Grade); 192         printf("修改成功!\n"); 193         system("pause"); 194         system("cls"); 195  } 196     return Head; 197 } 198 
199 Student *Findinformation(){//查找学生信息并且输出 
200     printf("请输入要查询学生信息的个数:\n"); 201     int n; 202     scanf("%d", &n); 203     for(int i = 0; i < n; i++){ 204         printf("请输入要查询学生的学号:\n"); 205         char id[11]; 206         scanf("%s", id); 207         Student *p1; 208         p1 = FindNode(Head, id); 209         if(i == 0){ 210             printf(" 学号 姓名 年龄 性别 年级 \n"); 211  } 212         if(p1 == NULL){ 213             printf("没有该生信息!\n"); 214             continue; 215  } 216         printf("%12s %10s %4d %6s %6d\n", 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("请选择操作:\n"); 236         printf("1.按学号排序\n2.按姓名排序\n0.返回主菜单\n"); 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("按照学号排序完成!\n"); 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("按照姓名排序完成!\n"); 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.没有创建用户名和密码,缺失安全性

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM