#include"stdlib.h"
#include"conio.h"
#include"string.h"
#include"mem.h"
#include"alloc.h"
#include"ctype.h"
#define N 3
typedef struct student
{ char num[20];
char name[20];
char xi[10];
float sum;
float avg;
int order;
int score[N];
struct student *next;
}ST;
main()
{ int i;
ST *init(), *create(), *delete(),*insert(), *sort(), *load(), *head,*index();
void print(),search(),save(),append(),total(),copy();
int menu_select();
head=init();
for(;;)
{
switch(menu_select())
{ case 0:head=init();break;
case 1:head=create();break;
case 2:print(head);break;
case 3:search(head);break;
case 4:head=delete(head);break;
case 5:head=insert(head);break;
case 6:head=sort(head);break;
case 7:save(head);break;
case 8:head=load();break;
case 9:append();break;
case 10:head=index(head);break;
case 11:total(head);break;
case 12:copy();break;
case 13:exit(0);
}
}
}
int menu_select()
{ char *menu[]={"************MENU***************",
"0.init list",
"1.Enter list",
"2.print list",
"3.Search list",
"4.Delete a record from list",
"5.insert record to list",
"6.sort to make new file",
"7.save the file",
"8.load the file",
"9.append record to file" ,
"10.index on number",
"11.total on number",
"12.copy the file to new file",
"13.Quit" } ;
char s[3];int c; int i;
gotoxy(1,25);
printf("press any key enter menu......\n");
getch();
clrscr();
gotoxy(6,1);
textcolor(YELLOW);
textbackground(LIGHTGRAY);
gotoxy(16,2);
putch(0xc9);
for(i=1;i<46;i++)
putch(0xcd);
putch(0xbb);
for(i=3;i<20;i++)
{ gotoxy(16,i);putch(0xba);
gotoxy(62,i);putch(0xba);
}
gotoxy(16,20);putch(0xc8);
for(i=1;i<46;i++)
putch(0xcd);
putch(0xbc);
window(17,3,61,19);
textbackground(BLUE);
clrscr();
for(i=0;i<16;i++)
{ gotoxy(9,i+1);printf("%s",menu[i]);}
textbackground(BLACK);
window(1,1,80,25);
gotoxy(16,21);
do { printf("\n enter your choice(0~13):");
scanf("%s",&s);
c=atoi(s);
}while(c<0||c>13);
return c;
}
ST *init()
{
return NULL;
}
ST *create()
{ int i, s;
ST *head=NULL,*info;
for(;;)
{ info=(ST *)malloc(sizeof(ST));
if(!info)
{ printf("\n out of memery");
return NULL;
}
inputs("enter num:",info->num,12);
if(info->num[0]=='@') break;
inputs("enter name:",info->name,15);
inputs("enter xi:",info->xi,10);
printf("please input your score \n",N);
s=0;
for(i=0;i<N;i++)
{ do { printf("score %d:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("bad data ,repeat input\n");
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];
}
info->sum=s;
info->avg=(float)s/N;
info->order=0;
info->next=head;
head=info;
}
return (head);
}
inputs(char *prompt,char *s,int count)
{ char p[255];
do { printf(prompt);
scanf("%s",p);
if(strlen(p)>count) printf("\n too long \n");
}while(strlen(p)>count);
strcpy(s,p);
}
void print(ST *head)
{ int i=0,j=0;
ST *p,*q;
clrscr();
p=head;q=p;
printf("\n\n\n******************student******************\n");
printf("|rec|num | name |zhuanye |sc1|sc2|sc3| sum | avg |order|\n");
printf("|---|------------|---------------|--------|---|---|---|-------|------|-----|\n");
while(p!=NULL)
{ i++;
printf("|%3d|%-12s|%-15s|%8s|%3d|%3d|%3d|%3.2f |%3.2f |%5d|\n",i,
p->num,p->name,p->xi,p->score[0],p->score[1],p->score[2],
p->sum,p->avg,p->order);
p=p->next;
}
printf("******************end*********************\n");
printf("*************chongxiu*********************\n");
while(q!=NULL)
{ while(j<N)
{ if(q->score[j]>=60)
j++;
else
{ printf(" |%-12s|%-15s|%8s|di%2d ke|\n",q->num,q->name,q->xi,j+1);j++; }
}
q=q->next;j=0;
}
printf("******************end*********************\n");
}
void search(ST *head)
{ ST *p;
char s[15];
clrscr();
printf("please enter your name for search \n");
scanf("%s",&s);
p=head;
while(strcmp(p->name,s)&&p!=NULL)
p=p->next;
if(p==NULL)
printf("\n list no %s student\n",s);
else
{ printf("\n\n*************havefound***************\n");
printf("|num | name |zhuanye |sc1|sc2|sc3| sum | avg |order|\n");
printf("|----------|---------------|--------|---|---|---|-----|-----|-----|\n");
printf("|%10s|%-15s|%8s|%3d|%3d|%3d|%3.2f |%3.2f |%5d|\n",p->num,p->name,p->xi,
p->score[0],p->score[1],p->score[2],p->sum,p->avg,p->order);
printf("*****************end********************\n");
}
}
ST *delete(ST *head)
{ ST *p,*q;
char s[12];
clrscr();
printf("please delete num \n");
scanf("%s",&s);
p=q=head;
while(strcmp(p->num,s)&&p!=NULL)
{ q=p;
p=p->next;
}
if(p==NULL)
printf("\n list no %s student\n",s);
else
{ printf("\n\n*************havefound***************\n");
printf("|num | name | zhuanye |sc1|sc2|sc3| sum | avg |order|\n");
printf("|------------|---------------|---------|---|---|---|------|------|-----|\n");
printf("|%12s|%-15s|%8s|%3d|%3d|%3d|%4.2f |%4.2f |%5d|\n",p->num,p->name,p->xi,
p->score[0],p->score[1],p->score[2],p->sum,p->avg,p->order);
printf("*****************end********************\n");
getch();
if(p==head)
head=p->next;
else
q->next=p->next;
free(p);
printf("\n have delete num %s student \n",s);
printf("don't forget save \n");
}
return(head);
}
ST *insert(ST *head)
{ ST *p,*q,*info;
char s[12];
int s1,i;
printf("please enter location before the num \n");
scanf("%s",&s);
printf("\n please new record\n");
info=(ST *)malloc(sizeof(ST));
if(!info)
{ printf("\n out of memery");
return NULL;
}
inputs("enter num:",info->num,12);
inputs("enter name:",info->name,15);
inputs("enter xi:",info->xi,10);
printf("please input your score \n",N);
s1=0;
for(i=0;i<N;i++)
{ do { printf("score %d:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("bad data ,repeat input\n");
}while(info->score[i]>100||info->score[i]<0);
s1=s1+info->score[i];
}
info->sum=s1;
info->avg=(float)s1/N;
info->order=0;
info->next=NULL;
p=head;
q=head;
while(strcmp(p->num,s)&&p!=NULL)
{ q=p;
p=p->next;
}
if(p==NULL)
if(p==head)
head=info;
else
q->next=info;
else
if(p==head){ info->next=p;head=info; }
else{ info->next=p;q->next=info; }
printf("\n----have inserted %s student----\n",info->name);
printf("----don't forget to save----\n");
return (head);
}
ST *sort(ST *head)
{ int i=0;
ST *p,*q,*t,*h1;
h1=head->next;
head->next=NULL;
while(h1!=NULL)
{ t=h1;
h1=h1->next;
p=head;q=head;
while(t->sum<p->sum&&p!=NULL){q=p;p=p->next;}
if(p==q){t->next=p;head=t;}
else{t->next=p;q->next=t;}
}
p=head;
while(p!=NULL){i++;p->order=i;p=p->next;}
printf("sort success!!!!\n");
return head;
}
void save (ST *head)
{ FILE *fp; ST *p;
char outfile[10];
printf("enter outfile name,for example c:\\f1\\te.txt:\n");
scanf("%s",&outfile);
if((fp=fopen(outfile,"wb"))==NULL)
{ printf("can not open file \n");
exit(1);
}
printf("\n saving file.......\n");
p=head;
while(p!=NULL){fwrite(p,sizeof(ST),1,fp);p=p->next;}
fclose(fp);
printf("----- save success -----");
}
ST *load()
{ ST *p,*q,*head=NULL;
FILE *fp;char infile[10];
printf("enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",&infile);
if((fp=fopen(infile,"rb"))==NULL)
{ printf("can not open file \n");
exit(1);
}
printf("\n-----loading file!-----\n");
p=(ST *)malloc(sizeof(ST));
if(!p){printf("out of memery!\n" );return head;}
head=p;
while(!feof(fp))
{ if(1!=fread(p,sizeof(ST),1,fp)) break;
p->next=(ST *)malloc(sizeof(ST));
if(!p->next){printf("out of memery\n");return head;}
q=p;p=p->next;
}
q->next=NULL;
fclose(fp);
printf("----you have success read data from file!---\n");
return head;
}
void append()
{ FILE *fp;
ST *info; int s1,i;
char infile[10];
printf("\nplease new record \n");
info=(ST *)malloc(sizeof(ST));
if(!info)
{ printf("\n out of memery ");
return;
}
inputs("enter num:",info->num,12);
inputs("enter name:",info->name,15);
inputs("enter xi:",info->xi,10);
printf("please input your score \n",N);
s1=0;
for(i=0;i<N;i++)
{ do { printf("score %d:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("bad data ,repeat input\n");
}while(info->score[i]>100||info->score[i]<0);
s1=s1+info->score[i];
}
info->sum=s1;
info->avg=(float)s1/N;
info->order=0;
info->next=NULL;
printf("enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile);
if((fp=fopen(infile,"ab"))==NULL)
{ printf("can not open file \n");
exit(1);
}
printf("\n------appending record!-------\n");
if(1!=fwrite(info,sizeof(ST),1,fp))
{ printf("------file write error------");
return;
}
printf("------append success------\n");
fclose(fp);
}
ST *index(ST *head)
{ ST *p,*q,*t,*h1;
h1=head->next;
head->next=NULL;
while(h1!=NULL)
{ t=h1;
h1=h1->next;
p=head;
q=head;
while(strcmp(t->num,p->num)>0&&p!=NULL)
{ q=p;p=p->next;
}
if (p==q)
{ t->next=p;head=t; }
else { t->next=p;q->next=t;}
}
printf("index success!!\n");
return head;
}
void total(ST *head)
{ ST *p,*q;
char snum[14],qnum[14];
float s1,ave;
int i,m,n,k;
clrscr();
printf("\n\n***************total***************\n");
printf("----class----------sum-----------average-----\n");
p=head;
while(p!=NULL)
{ memcpy(snum, p->num, 10);
snum[10]='\0';
q=p->next;
s1=p->sum;
ave=p->avg;
i=1;
while(q!=NULL);
{ memcpy (qnum, q->num, 10);
qnum[10]='\0';
k=0,m=0,n=0;
if( while(k<10){ snum[m]=qnum[n];k++;})
{ s1+=q->sum;
ave+=q->avg;
i++;
q=q->next;
}
else
break;
}
printf("%s %10.2f %5.2f\n",snum,s1,ave/i);
if(q==NULL)
break;
else
p=q;
}
printf("----------------------------------------");
}
void copy ()
{ char outfile[10],infile[10];
FILE *oldfp,*newfp;
ST *p=NULL;
clrscr();
printf("enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile);
if((oldfp=fopen(infile,"rb"))==NULL)
{ printf("can not open input file\n");
exit(0);
}
printf("enter outfile name,for example c:\\f1\\te.txt:\n");
scanf("%s",outfile);
if((newfp=fopen(outfile,"wb"))==NULL)
{ printf("can not open output file\n");
exit(0);
}
while(!feof(oldfp))
{ if(1!=fread(p,sizeof(ST),1,oldfp))
break;
fwrite(p,sizeof(ST),1,newfp);
}
fclose(oldfp);
fclose(newfp);
printf("you have success copy file!!!!!\n");
}