码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-08-06 00:31:45      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:重要   lap   The   std   microsoft   ISE   struct   als   list   

学完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.没有创建用户名和密码,缺失安全性

 

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

标签:重要   lap   The   std   microsoft   ISE   struct   als   list   

原文地址:https://www.cnblogs.com/HyattXia/p/9427873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!