简易信息统计系统

来源:互联网 发布:mac照片如何传磁盘上 编辑:程序博客网 时间:2024/04/30 05:41

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct info
{
 char num[20];
 char name[10];
 float cj;
 struct info *next;
 struct info *last;
};

void author();
struct info* input(struct info *);
struct info* search(char *,struct info *);
struct info* del(char *,struct info *);
struct info* deleteMenu(struct info *);
void searchMenu(struct info *fPtr);
void saveData(struct info *);
struct info* loadData(struct info *);
void showAll(struct info *);
struct info* sort(struct info *);

void main()
{

 struct info *first=0;
 int choose;
 author();
 while(1){
  printf("**********************************************************/n");
  printf("* 1:加入一个新纪录  2:删除一个记录  3:查询(修改)一个记录 */n");
  printf("* 4:退出程序        5:保存数据      6:载入数据           */n");
  printf("* 7:显示全部记录    8:按成绩排序记录                     */n");
  printf("**********************************************************/n");
  printf("请选择(1~8):");
  scanf("%d",&choose);
  printf("/n");
  
  switch(choose){
  case 1:
   first=input(first);
   break;
  case 2:
   first=deleteMenu(first);
   break;
  case 3:
   searchMenu(first);
   break;
  case 4:
   return;
  case 5:
   saveData(first);
   break;
  case 6:
   first=loadData(first);
      break;
  case 7:
   showAll(first);
   break;
  case 8:
   first=sort(first);
   break;
  default:
   printf("输入错误!/n/n/n");
   break;
  }
 printf("/n/n/n");
 }
}


struct info *input(struct info *fPtr)
{
 struct info *i;
 i=(struct info*)malloc(sizeof(struct info));

 printf("输入该生学号:");
 scanf("%s",i->num);
 printf("输入该生姓名:");
 scanf("%s",i->name);
 printf("输入该生成绩:");
 scanf("%f",&(i->cj));
 
 (i->next)=fPtr;
 if(fPtr!=0){
  (fPtr->last)=i;
 }
 (i->last)=0;
 fPtr=i;
 return fPtr;
}


struct info* del(char *s,struct info *fPtr)
{
 struct info *r;
 r=search(s, fPtr);
 if(r==0){
  printf("没有记录可删除!/n/n/n");
  return fPtr;
 }
 else{
  if(r==fPtr){
   fPtr=fPtr->next;
      free(r);
   printf("删除成功!/n/n/n");
   return fPtr;
  }
  ((r->last)->next)=(r->next);
  free(r);
  printf("删除成功!/n/n/n");
  return fPtr;
 }
}


struct info *search(char *s,struct info *fPtr)
{
 int r;
 if(fPtr==0){
  return 0;
 }
 while(1){
  r=strcmp(fPtr->num, s);
  if(r==0){
   return fPtr;
        }
  r=strcmp(fPtr->name,s);
        if(r==0){
   return fPtr;
        }
  if((fPtr->next)!=0){
   fPtr=(fPtr->next);
  }
  else{
   return 0;
  }
 }
}


struct info* deleteMenu(struct info *fPtr)
{
 char nn[20];
 printf("输入该生姓名或学号:");
 scanf("%s",nn);
 return del(nn,fPtr);
}


void searchMenu(struct info *fPtr)
{
 int yorn;
 char nn[2];
 struct info *r;
 printf("输入该生姓名或学号:");
 scanf("%s",nn);
 r=search(nn,fPtr);
 if(r==0){
  printf("查无记录!/n/n/n");
  return;
 }
 else{
  printf("学号:%s 姓名:%s 成绩:%f/n/n/n",r->num,r->name,r->cj);
     printf("是否要修改?(1=是 , 0=否)");
  scanf("%d",&yorn);
  if(yorn==1){
   printf("输入该生学号:");
   scanf("%s",r->num);
   printf("输入该生姓名:");
   scanf("%s",r->name);
   printf("输入该生成绩:");
   scanf("%f",&(r->cj));
   printf("修改成功!/n/n/n");
  }
 }
}


void saveData(struct info *fPtr)
{
 FILE *fp;
 if(fPtr==0){
  printf("没有记录可保存!/n/n/n");
  return;
 }

 fp=fopen("info.stu","wb+");
 while(1){
  fwrite(fPtr,sizeof(struct info),1,fp);
  fPtr=(fPtr->next);
  if(fPtr==0){
   break;
  }
 }
 printf("保存成功!/n");
 fclose(fp);
}


struct info* loadData(struct info *fPtr)
{
 struct info *now=0;
 struct info *up=0;
 FILE *fp;
 if((fp=fopen("info.stu","rb"))==NULL){
  printf("无法打开文件");
  return fPtr;
 }
    fPtr=(struct info*)malloc(sizeof(struct info));
 up=fPtr;
 fread(fPtr,sizeof(struct info),1,fp);
 if((fPtr->next)==0){
  printf("数据载入成功!/n/n/n");
  return fPtr;
 }
 while(1){
     now=(struct info*)malloc(sizeof(struct info));
        fread(now,sizeof(struct info),1,fp);
  (now->last)=up;
  (up->next)=now;
  up=now;
  if((now->next)==0){
   fclose(fp);
   printf("数据载入成功!/n/n/n");
   return fPtr;
  }
 }
}


void showAll(struct info *fPtr)
{
 if(fPtr==0){
  printf("没有记录!/n/n/n");
  return;
 }
 while(1){
  printf("学号:%s 姓名:%s 成绩:%f/n-----------------------------/n",fPtr->num,fPtr->name,fPtr->cj);
  fPtr=fPtr->next;
  if(fPtr==0){
   printf("显示成功!/n/n/n");
   return;
  }
 }
}

void author()
{
 printf("   ***********************************************/n");
 printf("   *            简易成绩              作者:周伟 */n");
 printf("   *            统计系统              版本:1.1  */n");
 printf("   ***********************************************/n/n/n");
}


struct info* sort(struct info *fPtr)
{
 struct info *now;
 struct info *ne;
 struct info *temp=0;

 if(fPtr==0){
  printf("没有记录可排序!");
  return fPtr;
 }
 
 while(1){
  int i=0;
  int j=1;
  now=fPtr;
  ne=(fPtr->next);
  if((now->next)==0){
   printf("排序成功!");
   return fPtr;
  }
  while(1){
   if((now->cj)<(ne->cj)){
    temp=(ne->next);
    (ne->next)=now;
    (now->next)=temp;
    temp=(now->last);
    (now->last)=ne;
    (ne->last)=temp;
    if(temp!=0){
     (temp->next)=ne;
    }
    if(j==1){
     fPtr=ne;
    }
    ne=(now->next);
       i=1;
   }
   else{
    now=ne;
    ne=(ne->next);
   }
   j++;
   if((now->next)==0){
    break;
   }
   
  }
  if(i==0){
   printf("排序成功!");
   return fPtr;
  }
 }
}