简单的C语言作业-学生管理

#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude <string.h>
#define NULL 0
#define ST struct stunode

/*全局变量nN为链表长度*/
int nN;
/*学生结构体*/
struct student
 {
  long lnID;
  char chName[10];
  int nScore;
 }stu1;
/*学生节点*/
ST
 {
  long lnID;
  char chName[10];
  int nScore;
  ST *next;
 };
FILE *fp;

/*函数Load功能:由指定文件中的数据生成链表,如果文件不存在则为空链*/
ST * Load(char chFname[])
{
 ST *head,*p,*q;
 q=head=NULL;
 if ((fp=fopen(chFname,"rb"))==NULL)
  return head;
    else
 {
  while(!feof(fp))//从文件中每次读一个数据块并建立链表
  {
   if(fread(&stu1,sizeof(struct student),1,fp)==1)
   {
    p=(ST *)malloc(sizeof(ST));

    p->lnID=stu1.lnID;
    strcpy(p->chName ,stu1.chName );
    p->nScore=stu1.nScore;
    
    head=p; p->next=q;q=head;//头指针始终指向当前进入的。
   }
   nN=nN+1;//计算链表长度
  }
  fclose(fp);
  return(head);
 }
}
/*函数Show功能:显示所有学生记录*/
ST * Show(ST *head)
{
 ST *p;
 p=head;
 while(p!=NULL)
 {
  printf("%ld/t%s/t%d/n",p->lnID,p->chName,p->nScore);
  p=p->next;
 }
 return (head);
}


/*函数Insert功能:输入一条学生资料,添加到链表*/
ST * Insert(ST *head)
{
 ST *p,*temp;
 long lnTemp;
 temp=head;
 printf("请输入学生学号,输入0表示结束输入:/n");
 scanf("%ld",&lnTemp );

 while(lnTemp!=0)
 {
  p=(ST * )malloc(sizeof(ST));
  p->lnID=lnTemp;
  printf("请输入学生姓名:/n");
  scanf("%s",&p->chName );
  printf("请输入学生成绩:/n");
  scanf("%d",&p->nScore );
  
  head=p;
  p->next=temp;

    printf("请输入学生学号,输入0表示结束输入:/n");
    scanf("%ld",&lnTemp );
 }
 return (head);
}

/*函数Delete功能:根据姓名删除一条学生记录*/
ST * Delete(ST *head)
{
 ST *p,*q;
 p=head;
 char chName[10];
 printf("请输入要删除学生的姓名:/n");
 scanf("%s",chName);
 while(p!=NULL)
 {
  if (strcmp(chName,p->chName)==0)
  {
   if(p==head) head=p->next; //如果该学生记录为表头
   else q->next=p->next;
   free(p);break;
  }
  else
  {
   q=p;
   p=p->next;
  } 
 }
 if (p==NULL) printf("找不到此学生的记录:");
 return head;
}

/*函数Search功能:根据姓名查找学生记录*/
ST * Search(ST *head)
{
 ST *p;
 p=head;
 char chName[10];
 printf("请输入要查找学生的姓名:/n");
 scanf("%s",chName);
 while(p!=NULL)
 {
  if(strcmp(chName,p->chName)==0)
  {
   printf("ID:%ld/tName:%s/tScore:%d/n",p->lnID,p->chName,p->nScore);
   break;
  }
  else p=p->next;
 }
 if(p==NULL) printf("找不到此学生的记录/n");
 return (head);
}


/*函数Compute功能:计算总分和平均分*/
void Compute(ST *head)
{
 ST *p;
 double dbSum=0,dbAvg,nI=0;

 p=head;
 while(p!=NULL)
 {
  dbSum=dbSum+p->nScore;
  nI++;
  p=p->next;
 }
 dbAvg=dbSum/nI;
 printf("总分:%.1f/t平均分: %.2lf/n",dbSum,dbAvg);

 return;
}

/*函数Save功能:保存学生记录*/
ST *Save(ST *head,char chFname[])
{
 ST *p;
 p=head;
 if((fp=fopen(chFname,"wb"))==NULL)
  printf("无法打开文件/n");
 else
 {
 while(p!=NULL)
 {
  stu1.lnID=p->lnID;
  strcpy(stu1.chName ,p->chName);
  stu1.nScore =p->nScore;
  if(fwrite(&stu1,sizeof(struct student),1,fp)!=1)
   printf("写入失败!/n ");
  p=p->next;
 }
 }
 fclose(fp);
 return (head);
}

/*函数menu功能:菜单选择界面*/
int Menu(void)
{
 int nI,nK;

 for(nI=0;nI<80;nI++)
  printf("*");

 printf("1插入一条记录/t/t/t2显示所有记录/t/t/t3按姓名查找/n");
 printf("4按姓名删除/t/t/t5计算总分及平均分/t/t6存盘并退出/n");
 
 for(nI=0;nI<80;nI++)
    printf("*");

 printf("请选择操作(选择(0)退出):");

 scanf("%d",&nK);
 
 return (nK);
}

void main(void)
{
 ST *head;
 char chFname[20]="1.txt";

 head=Load(chFname);
 printf("/t/t/t/t学生管理系统/n");
 printf("/t/t/t作者:姜晨  班级:05032项目部  学号:TB0503133/n");
 while(1)
 {
  printf("/n");
  switch(Menu())
  {
   case 1:
    {
     head=Insert(head);
    }break;
   case 2:
    {
     head=Show(head);
    }break;
   case 3:
    {
     Search(head);
    }break;
   case 4:
    {
     head=Delete(head);
    }break;
   case 5:
    {
     Compute(head);
    }break;
   case 6:
    {
     head=Save(head,chFname);
     exit(1);
    }break;
   default:printf("输入错误,请重新输入!");
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值