⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xueyuanguanli.txt

📁 这是一个C语言编写的学员管理系统,看着还不错哈.
💻 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 + -