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