运行过程中采用一个结构体链表存储学生信息。退出系统时可以采用文件存储用户输入的信息,再次运行的时候从文件中读取。
完整C语言程序分为三个文件,student.h、student.cpp和main.c文件。具体实现如下所示:
student.h文件中定义学生信息结构体,操作函数声明。
1 #ifndef STUDENT_HEAD
2 #define STUDENT_HEAD
4 typedef struct node /*定义结构体*/
6 int num; //学号
7 char name[15];//姓名
8 char sex[9]; //性别
9 int age; //年龄
10 int english; //英语成绩
11 int math; //数学成绩
12 int computer;//计算机成绩
13 int average; //平均成绩
14 struct node *next; //链表指针域
15 }student_info;
17 //学生信息链表
18 extern student_info* student_list; //全局变量声明
21 //初始化函数声明
22 //初始化学生信息链表
23 void init_student_info_list();
24 //判断学生信息链表是否为空
25 int student_list_empty();
27 //操作函数声明
28 //向学校信息表中添加学生信息记录
29 int add_student_info();
30 //根据学号删除学生信息
31 int delete_student_info(int num);
32 //根据学号修改学生信息
33 int modify_student_info(int num);
34 //根据学号查找学生信息
35 student_info* search_student_info(int num);
36 //输出每个学生的平均成绩
37 void display_average();
38 //显示所有学生信息
39 void display_student_info();
40 //将学生信息保存到文件
41 int save_file();
42 //从文件中读取学生信息
43 int read_file();
44 #endif
student.c文件中是对student.h文件中声明的函数进行定义,给出具体的实现代码。
1 #include "student.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <malloc.h>
6 //初始化学生信息链表
7 void init_student_info_list()
9 //学生信息链表头结点
10 student_list = (student_info*)malloc(sizeof(student_info));
11 student_list->next = NULL;
12 }
13 //判断学生信息链表是否为空
14 int student_list_empty()
15 {
16 return student_list->next == NULL;
17 }
18 //操作函数实现
19 //向学校信息表中添加学生信息记录
20 int add_student_info()
21 {
22 student_info *pstu = (student_info*)malloc(sizeof(student_info));
23 if(pstu == NULL)
24 {
25 printf("内存分配失败.\n");
26 return 0;
27 }
28 printf("请按要求一次输入学生的信息.\n");
29 printf("请输入学号: ");
30 scanf("%d",&pstu->num);
31 //判断该学号是否已经存在
32 if(search_student_info(pstu->num) != NULL)
33 {
34 printf("该学号已经存在学生信息表中.\n");
35 return 0;
36 }
37 printf("请输入姓名: ");
38 getchar();
39 gets(pstu->name);
40 printf("请输入性别: ");
41 scanf("%s",pstu->sex);
42 printf("请输入年龄: ");
43 scanf("%d",&pstu->age);
44 printf("请输入英语成绩: ");
45 scanf("%d",&pstu->english);
46 printf("请输入数学成绩: ");
47 scanf("%d",&pstu->math);
48 printf("请输入计算机成绩: ");
49 scanf("%d",&pstu->computer);
50 pstu->average = (pstu->english + pstu->math + pstu->computer)/3;
51 //每次从学生信息链表的头部插入;
52 pstu->next = student_list->next;
53 student_list->next = pstu;
54 return 1;
55 }
56 //根据学号删除学生信息
57 int delete_student_info(int num)
58 {
59 student_info *pstu;
60 student_info *qstu;
61 if(search_student_info(num) == NULL)
62 {
63 printf("不存在该学好为%d的学生信息.\n",num);
64 return 0;
65 }
66 pstu = student_list->next;
67 qstu = student_list;
68 while(pstu->num != num)
69 {
70 qstu = pstu;
71 pstu = pstu->next;
72 }
73 qstu->next = pstu->next;
74 free(pstu);
75 return 1;
76 }
77 //根据学号修改学生信息
78 int modify_student_info(int num)
79 {
80 int choice;
81 student_info *pstu = search_student_info(num);
82 if(pstu == NULL)
83 {
84 printf("不存在该学好为%d的学生信息.\n",num);
85 return 0;
86 }
87 printf("1.姓名 2.性别 3.年龄 4.英语成绩 5.数学成绩 6.计算机成绩.\n");
88 printf("请选择修改的信息: ");
89 scanf("%d",&choice);
90 switch(choice)
91 {
92 case 1:
93 printf("请输入新的姓名: ");
94 getchar();
95 gets(pstu->name);
96 break;
97 case 2:
98 printf("请输入新的性别: ");
99 scanf("%s",pstu->sex);
100 break;
101 case 3:
102 printf("请输入新的年龄: ");
103 scanf("%d",&pstu->age);
104 break;
105 case 4:
106 printf("请输入新的英语成绩: ");
107 scanf("%d",&pstu->english);
108 break;
109 case 5:
110 printf("请输入新的数学成绩: ");
111 scanf("%d",&pstu->math);
112 break;
113 case 6:
114 printf("请输入新的计算机成绩: ");
115 scanf("%d",&pstu->computer);
116 break;
117 default:
118 printf("请按提示要求操作.\n");
119 }
120 return 1;
121 }
122 //根据学号查找学生信息
123 student_info* search_student_info(int num)
124 {
125 student_info *pstu;
126 pstu = student_list->next;
127 while(pstu && pstu->num != num)
128 {
130 pstu = pstu->next;
131 }
132 return pstu;
133 }
134 //输出每个学生的平均成绩
135 void display_average()
136 {
137 student_info *pstu;
138 pstu = student_list->next;
139 while(pstu)
140 {
141 printf("学号为%d,姓名为%s的学生平均成绩为: %d\n",pstu->num,pstu->name,pstu->average);
142 pstu = pstu->next;
143 }
144 }
145 //显示所有学生信息
146 void display_student_info()
147 {
148 student_info *pstu;
149 pstu = student_list->next;
150 printf("所有学生信息如下所示.\n");
151 printf("学号\t姓名\t性别\t年龄\t英语\t数学\t计算机\t平均成绩.\n");
152 while(pstu)
153 {
154 printf("%d\t",pstu->num);
155 printf("%s\t",pstu->name);
156 printf("%s\t",pstu->sex);
157 printf("%d \t",pstu->age);
158 printf("%d \t",pstu->english);
159 printf("%d \t",pstu->math);
160 printf("%d \t",pstu->computer);
161 printf("%d\n",pstu->average);
162 pstu = pstu->next;
163 }
164 }
165 //将学生信息保存到文件
166 int save_file()
167 {
168 FILE *pfile;
169 student_info *pstu;
170 pfile = fopen("student.txt","w");
171 if(pfile == NULL)
172 {
173 printf("打开文件失败.\n");
174 return 0;
175 }
176 pstu = student_list->next;
177 while(pstu)
178 {
179 fprintf(pfile,"%5d%15s%9s%3d%4d%4d%4d%4d",pstu->num,pstu->name,pstu->sex,pstu->age,
180 pstu->english,pstu->math,pstu->computer,pstu->average);
181 pstu = pstu->next;
182 }
183 fclose(pfile);
184 return 1;
185 }
187 //从文件中读取学生信息
188 int read_file()
189 {
190 FILE *pfile;
191 student_info *pstu;
192 pfile = fopen("student.txt","r");
193 if(pfile == NULL)
194 {
195 printf("打开文件失败.\n");
196 return 0;
197 }
198 while(!feof(pfile))
199 {
200 pstu = (student_info*)malloc(sizeof(student_info));
201 fscanf(pfile,"%5d%15s%9s%4d%4d%4d%4d%4d",&pstu->num,pstu->name,pstu->sex,&pstu->age,
202 &pstu->english,&pstu->math,&pstu->computer,&pstu->average);
203 pstu->average = (pstu->english + pstu->math + pstu->computer)/3;
204 //每次从学生信息链表的头部插入;
205 pstu->next = student_list->next;
206 student_list->next = pstu;
207 }
208 fclose(pfile);
209 return 1;
210 }
主函数main.c文件进行测试调用,如下所示:
1 #include "student.h"
2 #include <stdlib.h>
3 #include <stdio.h>
5 void menu();
7 //学生信息链表
8 student_info* student_list;
10 //用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。
11 int main()
12 {
13 int choice;
14 int num;
15 printf("**************************\n");
16 printf("欢迎使用学生信息管理系统\n");
17 printf("**************************\n");
18 printf("-----------------------------\n");
19 init_student_info_list();
20 if(read_file())
21 printf("从文件中读取学生信息成功.\n");
22 else
23 printf("从文字中读取学生信息失败.\n");
24 printf("-----------------------------\n");
25 menu();
26 while(1)
27 {
28 printf("请选择操作: ");
29 scanf("%d",&choice);
30 switch(choice)
31 {
32 case 1:
33 if(student_list_empty())
34 printf("学生信息表为空,请先添加学生信息.\n");
35 else
36 display_student_info();
37 break;
38 case 2:
39 if(add_student_info())
40 printf("添加学生信息成功.\n");
41 else
42 printf("添加学生信息失败.\n");
43 break;
44 case 3:
45 if(student_list_empty())
46 printf("学生信息表为空,请先添加学生信息.\n");
47 else
48 {
49 printf("请输入要删除学生信息的学号: ");
50 scanf("%d",&num);
51 if(delete_student_info(num))
52 printf("成功删除该学号对应的学生信息.\n");
53 else
54 printf("删除失败.\n");
55 }
56 break;
57 case 4:
58 if(student_list_empty())
59 printf("学生信息表为空,请先添加学生信息.\n");
60 else
61 {
62 printf("请输入要修改学生信息的学号: ");
63 scanf("%d",&num);
64 if(modify_student_info(num))
65 printf("成功修改该学号对应的学生信息.\n");
66 else
67 printf("修改失败.\n");
68 }
69 break;
70 case 5:
71 if(student_list_empty())
72 printf("学生信息表为空,请先添加学生信息.\n");
73 else
74 display_average();
75 break;
76 case 6:
77 if(student_list_empty())
78 printf("学生信息表为空,请先添加学生信息.\n");
79 else
80 if(save_file())
81 printf("保存学生信息成功.\n");
82 else
83 printf("保存学生信息失败.\n");
84 break;
85 case 0:
86 printf("欢迎下次使用,再见.\n");
87 system("pause");
88 exit(0);
89 break;
90 default:
91 printf("输入错误,请重新选择操作.\n");
92 }
93 }
94 system("pause");
95 return 0;
96 }
98 void menu()
99 {
100 printf("1.查看学生信息.\n");
101 printf("2.添加学生信息.\n");
102 printf("3.删除学生信息.\n");
103 printf("4.修改学生信息.\n");
104 printf("5.输出平均成绩.\n");
105 printf("6.保存学生信息.\n");
106 printf("0.退出系统操作.\n");
107 }
程序执行结果如下所示:
(1)第一次执行没有学生信息,读取文件失败。
(2)以后执行先从文件中读取学生信息,然后进行操作。