程序要求如下:
实验源码:
/*要求实现学生信息的查找、添加、删除、修改、浏览、保存、从文件读取7 个功能,
每个功能模块均能实现随时从模块中退出,而且可以选择不同的方式实 现所需功能,从而完成一个学生管理系统所需功能。
2.要使用结构体来实现对学生信息的存储。
3.使用链表来实现对学生信息的查找、添加、删除、修改、浏览等操作。
4.使用文件完成数据的存储与读取,要求每次运行某个功能模块时将数据读入结构体中,
并给用户提供保存选项,可以将结构体中的数据保存在文件中。
5.系统制作完成后应实现类似下图所示界面。
补充说明:
学生信息需至少包括:学号,姓名,性别,年龄
成绩信息至少包括三科以上成绩:C语言、高数、英语...*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define LEN sizeof(struct student)
struct student{
long num;
char name[30];
char sex[10];
int age;
float C;
float math;
float English;
struct student *next;
}s3={2001,"xiaoming","man",18,89,67,85,NULL},s2={2002,"xiaohong","woman",17,79,89,92,&s3},s1={5002,"xiaogang","man",18,67,34,45,&s2};
struct student *head=&s1;
void Seanum()
{
struct student *p=&s1;
long a;
printf("请输入要查询的学号:");
scanf("%ld",&a);
while(p!=NULL){
if(a==p->num){
printf("学号:%ld\n姓名:%s\n性别:%s\n年龄:%d",p->num,p->name,p->sex,p->age);
}
p=p->next;
}
}
void Seaname()
{
struct student *p=&s1;
char str[30];
printf("请输入要查询的姓名:");
scanf("%s",str);
while(p!=NULL){
if(strcmp(str,p->name)==0){
printf("学号:%ld\n姓名:%s\n性别:%s\n年龄:%d",p->num,p->name,p->sex,p->age);
}
p=p->next;
}
}
void Seasex()
{
struct student *p=&s1;
char str[10];
printf("请输入要查询的性别:");
scanf("%s",str);
while(p!=NULL){
if(strcmp(str,p->sex)==0){
printf("学号:%ld\n姓名:%s\n性别:%s\n年龄:%d",p->num,p->name,p->sex,p->age);
}
p=p->next;
}
}
void Seaage()
{
struct student *p=&s1;
long a;
printf("请输入要查询的年龄:");
scanf("%d",&a);
while(p!=NULL){
if(a==p->num){
printf("学号:%ld\n姓名:%s\n性别:%s\n年龄:%d",p->num,p->name,p->sex,p->age);
}
p=p->next;
}
}
void Search1()
{
int i;
printf("请输入要查找的类型:\n\t\t1.学号\n\t\t2.姓名\n\t\t3.性别\n\t\t4.年龄\n\t\t0.退出");
scanf("%d",&i);
switch(i){
case 0: break;
case 1: Seanum(); break;
case 2: Seaname(); break;
case 3: Seasex(); break;
case 4: Seaage(); break;
}
printf("\n");
}
void SeaC()
{
struct student *p=&s1;
float a;
printf("请输入要查询的C语言成绩:");
scanf("%f",&a);
while(p!=NULL){
if(a==p->C){
printf("学号:%ld\n姓名:%s\n性别:%s\nC语言成绩:%f",p->num,p->name,p->sex,p->C);
}
p=p->next;
}
}
void Seamath()
{
struct student *p=&s1;
float a;
printf("请输入要查询的高数成绩:");
scanf("%f",&a);
while(p!=NULL){
if(a==p->C){
printf("学号:%ld\n姓名:%s\n性别:%s\n高数成绩:%f",p->num,p->name,p->sex,p->math);
}
p=p->next;
}
}
void SeaEnglish()
{
struct student *p=&s1;
float a;
printf("请输入要查询的英语成绩:");
scanf("%f",&a);
while(p!=NULL){
if(a==p->C){
printf("学号:%ld\n姓名:%s\n性别:%s\n英语成绩:%f",p->num,p->name,p->sex,p->English);
}
p=p->next;
}
}
void Search2()
{
int i;
printf("请输入要查找的类型:\n\t\t1.C语言\n\t\t2.高数\n\t\t3.英语\n");
scanf("%d",&i);
switch(i){
case 1: SeaC(); break;
case 2: Seamath(); break;
case 3: SeaEnglish(); break;
default: printf("输入错误!!");
}
printf("\n");
}
void Add()
{
struct student *p1,*p2;
p1=(struct student *)malloc(LEN);
p2=head;
if(p1==NULL){
printf("申请空间失败");
}else{
printf("按学号、姓名、性别、年龄、C语言成绩、高数成绩、英语成绩的顺序输入数据:");
printf("\n");
scanf("%ld%s%s%d%f%f%f",&p1->num,&p1->name,&p1->sex,&p1->age,&p1->C,&p1->math,&p1->English);
while(p2!=NULL){
p2=p2->next;
}
p2->next=p1;
p1->next=NULL;
}
}
void Delete()
{
printf("输入要删除数据的学生姓名:");
char Name[30];
int n=0;
scanf("%s",Name);
struct student *p2,*p1;
p1=head;
p2=head;
while(p1!=NULL){
n++;
if(n==1){
if(strcmp(p1->name,Name)==0){
head=p1->next;
}p1=p2->next;
}
else if(strcmp(p1->name,Name)==0){
p2->next=p1->next;
}
p2=p1;
p1=p1->next;
}
}
void xiugai()
{
printf("输入要修改数据的学生姓名:");
char Name[30];
int n=0;
scanf("%s",Name);
struct student *p1;
p1=head;
while(p1!=NULL){
if(strcmp(p1->name,Name)==0){
printf("按学号、姓名、性别、年龄、C语言成绩、高数成绩、英语成绩的顺序输入数据:");
printf("\n");
scanf("%ld %s",&p1->num,&p1->name);
getchar();
scanf("%s",&p1->sex);
getchar();
scanf("%d %f %f %f",&p1->age,&p1->C,&p1->math,&p1->English);
}
p1=p1->next;
}
}
void liulan()
{
struct student *p1=head;
while(p1!=NULL){
printf("\t学号:%ld\n \t姓名:%s\n \t性别:%s\n \t年龄:%d\n \tC语言成绩:%f\n \t高数成绩:%f\n \t英语成绩:%f\n",p1->num,p1->name,p1->sex,p1->age,p1->C,p1->math,p1->English);
printf("\n");
p1=p1->next;
}
}
void chengji()
{
printf("*****************************************************\n");
printf("\t\t学生成绩信息管理系统\n");
printf("\t\t 1. 查找\n\t\t 2. 添加\n\t\t 3. 删除\n\t\t 4. 修改\n\t\t 5. 浏览\n");
printf("*****************************************************\n请选择:");
int i;
scanf("%d",&i);
switch (i){
case 1: Search2(); break;
case 2: Add(); break;
case 3: Delete(); break;
case 4: xiugai(); break;
case 5: liulan(); break;
default: printf("输入错误!!");
}
}
void jiben()
{
printf("*****************************************************\n");
printf("\t\t学生基本信息管理系统\n");
printf("\t\t 1. 查找\n\t\t 2. 添加\n\t\t 3. 删除\n\t\t 4. 修改\n\t\t 5. 浏览\n");
printf("*****************************************************\n请选择:");
int i;
scanf("%d",&i);
switch (i){
case 1: Search1(); break;
case 2: Add(); break;
case 3: Delete(); break;
case 4: xiugai(); break;
case 5: liulan(); break;
default: printf("输入错误!!");
}
}
void File()
{
FILE *fp;
struct student *p;
if((fp=fopen("wenjian","wb"))==NULL){
printf("打开错误!!");
exit(0);
}
p=head;
while(p!=NULL)
{
fwrite(p,LEN,1,fp);
printf("\n");
p=p->next;
}
fclose(fp);
printf("成功保存!!");
}
struct student *Fileout()
{
FILE *fp;
struct student *p1,*p,*s;
if((fp=fopen("wenjian","rb"))==NULL){
return NULL;
}else if(fgetc(fp)==EOF){
return NULL;
}
rewind(fp);
p1=(struct student *)malloc(LEN);
fread(s,LEN,1,fp);
p=p1;
while(!feof(fp)){
s=(struct student *)malloc(LEN);
if(fread(s,LEN,1,fp)==0){
break;
}
p->next=s;
p=s;
p->next=NULL;
}
return head;
fclose(fp);
}
void file()
{
printf("请选择功能:\n\t1.保存\n\t2.从文件读取\n");
int i;
scanf("%d",&i);
switch(i){
case 1: File(); break;
case 2: Fileout(); break;
default: printf("输入错误!!");
}
}
int main()
{
printf("*****************************************************\n");
printf("\t\t学生管理系统\n");
printf("\t\t 1. 学生基本信息管理\n\t\t 2. 学生成绩信息管理\n\t\t 3. 文件操作\n\t\t 4. 退出\n");
printf("*****************************************************\n请选择:");
int i;
scanf("%d",&i);
switch (i){
case 1: jiben(); break;
case 2: chengji(); break;
case 3: file(); break;
case 4: return 0; break;
default: printf("输入错误!!");
}
if(i!=4){
main();
}
return 0;
}