📄 xueyuanguanli.txt
字号:
C语言编写的一个学员管理系统
/*---------------------------------------------------------
实现一个学员管理系统,要求:
1)学员信息(学号,姓名,年龄,性别,班级)用结构体来描述;
2)学员信息数据在内存中用链表来组织数据,并要求按学号排序;
3)能够按照姓名查找学员信息.
4)能够从存放学员信息数据的文件中读入数据到内存中(链表);
5)能够插入和删除某个学员的信息.
6)能够将用链表表示的学员信息数据写入一个文件中.
-----------------------------------------------------------*/
#include <stdio.h> //提供标准io函数
#include <stdlib.h> //提供exit()
#include "string.h" //strcmp&strcpy
#include "malloc.h" //()malloc(sizeof())
#define SI struct student_Info //定义学员信息链表节点
FILE *fp; //定义文件指针
/*学员对象*/
struct student
{
long id; //学号
char name[20];
char sex;
int age;
int CLASS;
} ;
/*定义学员信息链表节点*/
SI
{
long id;
char name[20];
char sex;
int age;
int CLASS;
SI *next;
} ;
/*打开数据文件并建立链表*/
SI *load(char filename[])
{
SI *p,*q,*head,*tail;
struct student stu;
q=(SI *)malloc(sizeof(SI));
head=q=NULL;
if ((fp=fopen(filename,"rb"))==NULL) //当文件不存在就返回新建节点为首节点
{
printf("\n文件不存在,已经新建文件。\n\n");
return head;
}
else
{
while (!feof(fp))
{
if(fread(&stu,sizeof(struct student),1,fp)==1)
{
p=(SI *)malloc(sizeof(SI)); /*头指针的data为空,只存储next*/
p->id = stu.id;
strcpy(p->name,stu.name);
p->sex = stu.sex;
p->age = stu.age;
p->CLASS = stu.CLASS;
if(head == NULL) //以下循环组建链表
{
head=tail=p; //将head指向数组首元素
q=p;
tail->next=NULL;
}
else
{
q->next = p;
p->next = NULL;
q = p;
}
}
else
{
printf("……读取完毕。\n\n");
break; //考虑成功读取,以break跳出而非exit(1)
}
}
fclose(fp);
return(head);
}
}
/* 输入一条通讯录内容,并按学号升序排列*/
SI *insert(SI *head)
{
SI *tail,*temp,*p,*q;
temp=(SI *)malloc(sizeof(SI)); //创建节点接收新信息
printf("\n\t请输入学号(整数):"); scanf("%ld",&temp->id);getchar();
//getchar()吞噬"回车"
printf("\n\t请输入姓名:"); scanf("%s",temp->name);getchar();
printf("\n\t请输入性别(m/f):"); scanf("%s",&temp->sex);getchar();
printf("\n\t请输入年纪:"); scanf("%d",&temp->age);getchar();
printf("\n\t请输入班级:"); scanf("%d",&temp->CLASS);
p=head;
if(head == NULL) //以下循环控制链表按学号升序排列
{head = tail = temp;tail->next = NULL;}
else
{
p = head;
while((p->next != NULL)&&(p->id < temp->id))
{
q=p;
p=p->next;
}
if(p->id >= temp->id)
{
if(head == p)
{
temp->next = head;
head = temp;
}
else
{
q->next = temp;
temp->next = p;
}
}
else
{
p->next = temp;
temp->next = NULL;
tail = temp;
}
}
return head;
}
/*保存写入文件并退出*/
void save(SI *head,char filename[])
{
SI *p;
struct student stu;
if ((fp=fopen(filename,"wb"))==NULL)
{
printf("文件无法写入");
exit(1);
}
else
{
p = head;
while(p != NULL)
{
stu.id = p->id;
strcpy(stu.name,p->name);
stu.sex = p->sex;
stu.age = p->age;
stu.CLASS = p->CLASS;
if(fwrite(&stu,sizeof(struct student),1,fp)!=1)
{
printf("文件不能写入数据,请检查后重新运行.\n");
exit(1);
}
p = p->next;
}
printf("\n写入成功,请按任意键退出!\n");
fclose(fp);
}
}
/*输出当前学员信息到屏幕*/
void show(SI *head)
{
SI *p;
p = head;
while(p != NULL)
{
printf("学号:%ld\t",p->id);
printf("姓名:%s\n",p->name);
printf("性别:%c\n",p->sex);
printf("年纪:%d\t\t",p->age);
printf("班级:%d\n\n",p->CLASS);
p = p->next;
}
}
/*按姓名查找学员信息*/
void find(SI *head)
{
SI *p;
char name[20];
printf("请输入要查找的人的姓名:");
scanf("%s",name);
p=head;
while(p!=NULL) //循环搜索匹配信息
{
if (strcmp(name,p->name)==0)
{
printf("id:%ld\t\t",p->id);
printf("name:%s\n",p->name);
printf("sex:%c\n",p->sex);
printf("age:%d\t\t",p->age);
printf("CLASS:%d\n\n",p->CLASS);
break;
}
else
p=p->next;
}
if (p==NULL) printf("\n\t\t查无此人\n\n");
}
/*按姓名查找并删除*/
SI *delete(SI *head)
{
SI *p,*q;
char name[20];
printf("请输入要删除的人的姓名:");
scanf("%s",name);
p=q=head;
while(p!=NULL)
{
if (strcmp(name,p->name)==0)
{
if (head==p) head=p->next;
else q->next=p->next;
free(p);
break;
}
else
{
q=p;
p=p->next;
}
}
if (p==NULL)
printf("\n\t\t查无此人\n\n");
return head;
}
/*学员管理系统主程序*/
void main()
{
SI *head;
char fname[20];
char choise[10];
printf("请输入学员信息文件名:");
scanf("%s",fname);
head=load(fname); //打开文件,并返回head指针
while(1)
{
printf("\t\t 学员管理系统\n");
printf("\t\t=========================\n");
printf("\t\t 1. 插入一条记录\n");
printf("\t\t 2. 显示所有记录\n");
printf("\t\t 3. 按姓名查找\n");
printf("\t\t 4. 按姓名删除\n");
printf("\t\t 5. 存盘并退出\n");
printf("\n\n\t请选择(1~5):");
getchar(); //吞噬'回车'
scanf("%s",choise);
if(choise[1] != NULL) //判断是否输入超过2个字符
{
printf("请输入1~5!请重新输入!\n");
continue;
}
switch(choise[0]) //当输入为1~5,连接相应函数
{
case '1' : head=insert(head);break;
case '2' : show(head);break;
case '3' : find(head);break;
case '4' : head=delete(head);break;
case '5' : save(head,fname);exit(0);
default : printf("输入错误,请重新输入!\n");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -