1. 题目
学生信息管理系统设计
要求:
(1) 学生信息保存在文件中
(2) 学生信息查询、删除、修改和显示
(3) 学生信息的统计:根据性别统计、家乡和专业,统计结果可以保存文件中。
(4) 利用菜单管理
2.设计目的
(1)创建结构体和链表,利用文件读取并显示学生信息
(2)利用链表实现查询、修改、删除、统计学生信息
(3)建立菜单,利用菜单管理
3.总体设计
(1)定义学生信息结构体,创建链表,读入文件
(2)根据要求写好菜单函数
(2)分模块,用void函数写出菜单中各个选项的要求,包括修改信息函数、查询函数、删除函数、统计函数
(4)每写好一步测试一步,最终进行运行调试
4.详细设计
(1)新建头文件fun.h,在头文件中定义结构体
(2)新建两个源文件fun.h、main.c
(3)在fun.c中写入读取文件函数get_data、菜单函数menu、修改函数Mod、查询函数Sea、删除函数Del、显示函数Show、统计函数Save1(统计男女生籍贯)、Save2(统计男女生专业)
(4)在头文件fun.h中声明这些函数,并在菜单函数中对相应的选项引用相应的函数
(5)在main.c文件中写入主函数,在主函数中创建链表,并调用读取数据函数和菜单函数,实现工程管理运行
(6)把学生信息放在文本文件data.txt里,通过读取data文件获取学生信息,再通过菜单进行管理,最后将统计信息存入Tdata.txt文件里
5.调试与测试
(1)运行结果——菜单
![](https://i-blog.csdnimg.cn/blog_migrate/083d49e0bc0782a499ac62eb602d8c18.png)
(2)2.查询信息
![](https://i-blog.csdnimg.cn/blog_migrate/2d748a0d8a7951c45ac8b409f1a15268.png)
(3)1.修改学生信息
![](https://i-blog.csdnimg.cn/blog_migrate/10dd51e33c1cdcd939753318ab23ce7d.png)
(4)3.删除学生信息
![](https://i-blog.csdnimg.cn/blog_migrate/aa9229c6a7df982ea8fc1707bcbc4564.png)
(5)5.统计结果
![](https://i-blog.csdnimg.cn/blog_migrate/39b44df054a01fb8768e5b4d1330366a.png)
(6)6.退出程序
![](https://i-blog.csdnimg.cn/blog_migrate/9f9b6a2022bbb4ee6ed5877516e15538.png)
在这个页面下按任意键退出
(7)4.显示学生信息
![](https://i-blog.csdnimg.cn/blog_migrate/843a25f4249c4b5cdd3be8a59547f7ed.png)
7.程序清单
(1)头文件fun.h
```c
#ifndef _FNM_H
#define _FNM_H
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
struct NODE
{
char id[20]; //学号
char name[20]; //姓名
char gender[20]; //性别
char major[20]; //专业
char home[20]; //家乡
struct NODE *next;
};
void Mod(struct NODE *F);
void Sea(struct NODE *F);
void Del(struct NODE *F);
void Save1(struct NODE *F);
void Save2(struct NODE *F);
void get_data(struct NODE *F);
void Show(struct NODE *F);
void menu(struct NODE *F);
#endif
(2)源文件fun.c
```c
#include"fun.h"
void Mod(struct NODE *F)
{
char d[20];
int flag=0;
printf("请输入需要修改的学生学号:");
scanf("%s",d);
while(F)
{
if(strcmp(F->id,d)==0)
{
printf("请输入修改后的学号 姓名 性别 专业 家乡(空格隔开):"); scanf("%s %s %s %s %s",F->id,F->name,F->gender,F->major,F->home);
printf("修改成功\n");
flag=1;
break ;
}
F=F->next;
}
if(flag==0)
{
printf("未找到\n");
}
}
void Sea(struct NODE *F)
{
char d[20];
int flag=0;
printf("请输入查询的学生学号:");
scanf("%s",d);
while(F)
{
if(strcmp(F->id,d)==0)
{
puts("该学生信息如下:");
printf("学号\t姓名\t性别\t专业\t家乡\n");
printf("%s\t%s\t%s\t%s\t%s\n",F->id,F->name,F->gender,F->major,F->home);
flag=1;
break ;
}
F=F->next;
}
if(flag==0)
{
printf("未找到\n");
}
}
void Del(struct NODE *F)
{
char e[20];
int flag=0;
printf("请输入删除的学生学号:");
scanf("%s",e);
while(F->next!=NULL)
{
struct NODE *D=F->next;
if(strcmp(D->id,e)==0)
{
F->next=D->next;
free(D);
printf("删除成功\n");
flag=1;
break;
}
F=F->next;
}
if(flag==0)
{
printf("未找到\n");
}
}
void Save1(struct NODE *F)
{
int a=0,b=0,c=0,d=0,e=0;
int f=0,g=0,h=0,i=0,j=0;
FILE *T=fopen("Tdata.txt","w");
fprintf(T,"****************************\n男女生籍贯统计如下\n");
while(F)
{
if(strcmp(F->gender,"男")==0)
{
if(strcmp(F->home,"湖北")==0)
{
a++;
}
if(strcmp(F->home,"湖南")==0)
{
b++;
}
if(strcmp(F->home,"江西")==0)
{
c++;
}
if(strcmp(F->home,"重庆")==0)
{
d++;
}
if(strcmp(F->home,"上海")==0)
{
e++;
}
}
else
{
if(strcmp(F->home,"湖北")==0)
{
f++;
}
if(strcmp(F->home,"湖南")==0)
{
g++;
}
if(strcmp(F->home,"江西")==0)
{
h++;
}
if(strcmp(F->home,"重庆")==0)
{
i++;
}
if(strcmp(F->home,"上海")==0)
{
j++;
}
}
F=F->next;
}
fprintf(T," 湖北 湖南 江西 重庆 上海 总数\n");
fprintf(T,"男 %d\t %d\t %d\t %d\t %d\t %d\n",a,b,c,d,e,a+b+c+d+e);
fprintf(T,"女 %d\t %d\t %d\t %d\t %d\t %d\n",f,g,h,i,j,f+g+h+i+j);
fprintf(T,"总数 %d\t %d\t %d\t %d\t %d\t %d\n",a+f,b+g,c+h,d+i,e+j,a+b+c+d+e+f+g+h+i+j);
printf("籍贯统计完成.男女生数据保存到Tdata中\n");
printf(" 湖北\t湖南\t江西\t重庆\t上海\t总数\n");
printf("男 %d\t%d\t%d\t%d\t%d\t%d\n",a,b,c,d,e,a+b+c+d+e);
printf("女 %d\t%d\t%d\t%d\t%d\t%d\n",f,g,h,i,j,f+g+h+i+j);
printf("总数 %d\t%d\t%d\t%d\t%d\t%d\n",a+f,b+g,c+h,d+i,e+j,a+b+c+d+e+f+g+h+i+j);
fclose(T);
}
void Save2(struct NODE *F)
{
int a=0,b=0,c=0,d=0,e=0;
int f=0,g=0,h=0,i=0,j=0;
FILE *T=NULL;
char*szAppendStr="Text";
errno_t eResult;
eResult=fopen_s(&T,"Tdata.txt","a+");
fprintf(T,"****************************\n男女生专业统计如下\n");
while(F)
{
if(strcmp(F->gender,"男")==0)
{
if(strcmp(F->major,"信工")==0)
{
a++;
}
if(strcmp(F->major,"通信")==0)
{
b++;
}
if(strcmp(F->major,"仪器")==0)
{
c++;
}
if(strcmp(F->major,"电气")==0)
{
d++;
}
if(strcmp(F->major,"自动化")==0)
{
e++;
}
}
else
{
if(strcmp(F->major,"信工")==0)
{
f++;
}
if(strcmp(F->major,"通信")==0)
{
g++;
}
if(strcmp(F->major,"仪器")==0)
{
h++;
}
if(strcmp(F->major,"电气")==0)
{
i++;
}
if(strcmp(F->major,"自动化")==0)
{
j++;
}
}
F=F->next;
}
fprintf(T," 信工 通信 仪器 电气 自动化 总数\n");
fprintf(T,"男 %d\t\t%d\t %d\t %d\t %d\t %d\n",a,b,c,d,e,a+b+c+d+e);
fprintf(T,"女 %d\t\t%d\t %d\t %d\t %d\t %d\n",f,g,h,i,j,f+g+h+i+j);
fprintf(T,"总数 %d\t\t%d\t %d\t %d\t %d\t %d\n",a+f,b+g,c+h,d+i,e+j,a+b+c+d+e+f+g+h+i+j);
printf("\n");
printf("\n");
printf("专业统计完成.男女生数据保存到Tdata中\n");
printf(" 信工\t通信\t仪器\t电气\t自动化\t总数\n");
printf("男 %d\t%d\t%d\t%d\t%d\t%d\n",a,b,c,d,e,a+b+c+d+e);
printf("女 %d\t%d\t%d\t%d\t%d\t%d\n",f,g,h,i,j,f+g+h+i+j);
printf("总数 %d\t%d\t%d\t%d\t%d\t%d\n",a+f,b+g,c+h,d+i,e+j,a+b+c+d+e+f+g+h+i+j);
fclose(T);
}
void get_data(struct NODE *F)
{
FILE *in;
if((in=fopen("data.txt","r"))==NULL)
{
printf("文件不存在,请创建数据文件 data.txt");
exit(0);
}
while(!feof(in))
{
struct NODE *n=(struct NODE*)malloc(sizeof(struct NODE); fscanf(in,"%s%s%s%s%s\n",n->id,n->name,n->gender,n->major,n->home);
F->next=n;
n->next=NULL;
F=n;
}
fclose(in);
}
void Show(struct NODE *F)
{
int count=0;
F=F->next;
printf("所有记录如下:\n学号\t姓名\t性别\t专业\t家乡\n");
while(F)
{ printf("%s\t%s\t%s\t%s\t%s\n",F->id,F->name,F->gender,F->major,F->home);
F=F->next;
count++;
}
printf("总人数:%d\n",count);
}
void menu(struct NODE *F)
{
int n;
do
{
printf("****************************\n");
printf(" 学生信息管理系统 \n");
printf("****************************\n");
printf("1.修改信息\t2.查询信息\n3.删除信息\t4.显示信息\n5.统计保存\t6.退出程序\n");
printf("****************************\n");
printf("请输入选择:");
scanf("%d",&n);
system("cls");
switch(n)
{
case 1:
Mod(F);
break;
case 2:
Sea(F);
break;
case 3:
Del(F);
break;
case 4:
Show(F);
break;
case 5:
Save1(F);
Save2(F);
break;
case 6:
system("cls");
printf("\n\n\t\t\t-------------------感谢使用!-------------------\n\n\n");
exit(0);
break;
default:printf("输入错误\n");
}
system("pause");
system("cls");
}
while(n!=0);
}
(3)源文件main.c
```c
#include"fun.h"
int main()
{
struct NODE *F=(struct NODE*)malloc(sizeof(struct NODE));
F->next=NULL;
get_data(F); //从文件读取信息
while(1)
{
menu(F);
}
return 0;
}