学完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 }
不足的地方有很多,我目前认为主要有以下两点:
1.没有任何文件操作,数据不能保存下来
2.没有创建用户名和密码,缺失安全性