📄 student.c
字号:
if (j==1)
{
printf("please enter name for search\n");
scanf("%s",s); /*输入姓名*/
p=h; /*将头指针赋给p*/
printf("****************************have found***************************\n");
printf("| no | name | sex | age |course1|course2|course3|\n");
do
{
while(strcmp(p->name[0],s[0])&&p!=NULL) /*当记录的姓名不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(p==NULL) /*如果指针为空*/
printf("\nlist no %s student\n",s); /*显示没有该学生*/
else /*显示找到的记录信息*/
{
printf("|----------|----------------|-----|-----|-------|-------|-------|\n");
printf("|%-10s|%-16s|%5s|%5d|%7d|%7d|%7d|\n",p->no,p->name,p->sex,p->age,p->xuanxiu[1].score,p->xuanxiu[2].score,p->xuanxiu[3].score);
p=p->next;
}
}while(p!=NULL);
printf("******************************end********************************\n");
}
if (j==2)
{
printf("please enter age for search\n");
scanf("%d",&k);
p=h; /*将头指针赋给p*/
printf("***********************have found*************************\n");
printf("| no | name | sex | age |course1|course2|course3|\n");
do
{
while((p->age-k)>=0&&p!=NULL) /*当记录的姓名不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(p==NULL) /*如果指针为空*/
printf("\nlist no %s student\n",s); /*显示没有该学生*/
else /*显示找到的记录信息*/
{
printf("|----------|----------------|-----|-----|-------|-------|-------|\n");
printf("|%-10s|%-16s|%5s|%5d|%7d|%7d|%7d|\n",p->no,p->name,p->sex,p->age,p->xuanxiu[1].score,p->xuanxiu[2].score,p->xuanxiu[3].score);
p=p->next;
}
}while(p!=NULL);
printf("******************************end********************************\n");
}
getch();
}
/*统计每个学生各门功课的平均成绩*/
void sort(STUDENT *h)
{
int i=0; /*保存名次*/
STUDENT *p,*q,*t,*h1; /*定义临时指针*/
clrscr();
h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/
h->next=NULL; /*第一个结点为新表的头结点*/
while(h1!=NULL) /*当原表不为空时,进行排序*/
{
t=h1; /*取原表的头结点*/
h1=h1->next; /*原表头结点指针后移*/
p=h; /*设定移动指针p,从头指针开始*/
q=h; /*设定移动指针q做为p的前驱,初值为头指针*/
while(t->average<p->average&&p!=NULL) /*作总分比较*/
{
q=p; /*待排序点值小,则新表指针后移*/
p=p->next;
}
if(p==q) /*p==q,说明待排序点值大,应排在首位*/
{
t->next=p; /*待排序点的后继为p*/
h=t; /*新头结点为待排序点*/
}
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
{
t->next=p; /*t的后继是p*/
q->next=t; /*q的后继是t*/
}
}
p=h; /*已排好序的头指针赋给p,准备填写名次*/
while(p!=NULL) /*当p不为空时,进行下列操作*/
{
i++; /*结点序号*/
p->order=i; /*将名次赋值*/
p=p->next; /*指针后移*/
}
printf("*******************************sort sucess!!!*******************************\n");
printf("|order| no | name | average |course1|course2|course3| sum |\n");
p=h;
while(p!=NULL)
{
printf("|-----|----------|----------------|---------|-------|-------|-------|-------|\n");
printf("|%-5d|%-10s|%-16s|%9.2f|%7d|%7d|%7d|%7d|\n",p->order,p->no,p->name,p->average,p->xuanxiu[1].score,p->xuanxiu[2].score,p->xuanxiu[3].score,p->sum);
p=p->next;
}
printf("*************************************end***********************************\n");
}
/*统计并输出各班各门功课的平均成绩和总平均成绩*/
void total(STUDENT *h)
{
STUDENT *p,*q; /*定义临时指针变量*/
char sno[9],qno[9],*ptr; /*保存班级号的*/
float s1,s2,s3,ave; /*保存总分和均分*/
float i; /*保存班级人数*/
clrscr(); /*清屏*/
printf("******************Total****************\n");
printf("| class |course1|course2|course3|average|\n");
p=h; /*从头指针开始*/
while(p!=NULL) /*当p不为空时做下面的处理*/
{
memcpy(sno,p->no,7); /*从学号中取出班级号*/
sno[7]='\0'; /*做字符串结束标记*/
q=p->next; /*将指针指向待比较的记录*/
s1=p->xuanxiu[1].score; /*当前班级的总分初值为该班级的第一条记录总分*/
s2=p->xuanxiu[2].score;
s3=p->xuanxiu[3].score;
ave=p->average; /*当前班级的均分初值为该班级的第一条记录均分*/
i=1.; /*统计当前班级人数*/
while(q!=NULL) /*内循环开始*/
{
memcpy(qno,q->no,7); /*读取班级号*/
qno[7]='\0'; /*做字符串结束标记*/
if(strcmp(qno,sno)==0) /*比较班级号*/
{
s1+=q->xuanxiu[1].score; /*累加总分*/
s2+=q->xuanxiu[2].score;
s3+=q->xuanxiu[3].score;
ave+=q->average; /*累加均分*/
i++; /*累加班级人数*/
q=q->next; /*指针指向下一条记录*/
}
else
break; /*不是一个班级的结束本次内循环*/
}
printf("|%9s|%7.2f|%7.2f|%7.2f|%7.2f|\n",sno,s1,s2,s3,ave/i);
if(q==NULL)
break; /*如果当前指针为空,外循环结束,程序结束*/
else
p=q; /*否则,将当前记录作为新的班级的第一条记录开始新的比较*/
}
printf("-------------------------------------------\n");
}
/*统计并输出每个同学已修学分*/
void tjxf(STUDENT *h)
{
STUDENT *p;
p=h;
printf("***************xue fen tong ji***************\n");
printf("| no | name | yi xiu xue fen |\n");
while(p!=NULL)
{
printf("|%-10s|%-16s|%16d|\n",p->no,p->name,p->xuanxiu[1].course+p->xuanxiu[2].course+p->xuanxiu[3].course);
printf("|----------|----------------|----------------|\n");
p=p->next;
}
}
/*列出不及格学生清单*/
void bjg(STUDENT *h)
{
STUDENT *p;
int i;
p=h;
clrscr();
printf("Please change the course for not pass to list!\n");
printf("1--course1\n");
printf("2--course2\n");
printf("3--course3\n");
scanf("%d",&i);
printf("********course1 not pass list********\n");
if (i==1)
{
printf("| no | name |course1|\n");
do
{
while((p->xuanxiu[1].score-60)>=0&&p!=NULL)
p=p->next;
if(p==NULL)
printf(" no student\n");
else
{
printf("|----------|----------------|-------|\n");
printf("|%-10s|%-16s|%7d|\n",p->no,p->name,p->xuanxiu[1].score);
p=p->next;
}
}while(p!=NULL);
}
if (i==2)
{
printf("| no | name |course2|\n");
do
{
while((p->xuanxiu[2].score-60)>=0&&p!=NULL)
p=p->next;
if(p==NULL)
printf("\n no student\n");
else
{
printf("|----------|----------------|-------|\n");
printf("|%-10s|%-16s|%7d|\n",p->no,p->name,p->xuanxiu[2].score);
p=p->next;
}
}while(p!=NULL);
}
if (i==3)
{
printf("| no | name |course3|\n");
do
{
while((p->xuanxiu[3].score-60)>=0&&p!=NULL)
p=p->next;
if(p==NULL)
printf("\n no student\n");
else
{
printf("|----------|----------------|-------|\n");
printf("|%-10s|%-16s|%7d|\n",p->no,p->name,p->xuanxiu[3].score);
p=p->next;
}
}while(p!=NULL);
}
printf("******************end****************\n");
}
/****保存文件****/
void save(STUDENT *h)
{
FILE *fp; /*定义指向文件的指针*/
STUDENT *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("\nSaving file......\n"); /*打开文件,提示正在保存*/
p=h; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(STUDENT),1,fp);/*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("-----save success!!-----\n"); /*显示保存成功*/
}
/* 从文件读数据*/
STUDENT *load()
{
STUDENT *p,*q,*h=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=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!p)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,sizeof(STUDENT),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/
if(!p->next)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n");
return h; /*返回头指针*/
}
/*修改*/
STUDENT *revise(STUDENT *h)
{
int i,j,k,l;
int s;
char xh[11];
STUDENT *p;
p=h;
printf("enter xue hao for xiu gai!\n");
scanf("%s",xh);
while(strcmp(p->no,xh)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
p=p->next; /*将p指针指向下一条记录*/
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
printf("\nlist no %s student\n",xh);
else /*p不为空,显示找到的记录信息*/
{
printf("***************have found****************\n");
printf("| no | name | sex | age |\n");
printf("|----------|----------------|-----|-----|\n");
printf("|%-10s|%-16s|%5s|%5d|\n",p->no,p->name,p->sex,p->age);
printf("*******************end*******************\n");
getch();
printf("Please enter new infomation!\n");
for(;;)
{
inputs("enter no(enter @ return):",p->no,11); /*输入学号并校验*/
inputs("enter name:",p->name,15); /*输入姓名,并进行校验*/
inputs("enter sex:",p->sex,1);
printf("enter age:");
scanf("%d",&p->age);
for(k=1;k<10;k++)
{
p->xuanxiu[k].score=0;
p->xuanxiu[k].course=0;
for(l=1;l<10;l++)
strcpy(p->xuanxiu[l].chongxiu[l].chengji,"0");
}
for(i=1;;)
{
printf("enter di %d men xuan xiu ke bian hao(enter @ return):",i);
scanf("%s",p->xuanxiu[i].clsnum);
if(p->xuanxiu[i].clsnum[0]=='@') break;
inputs("enter xuan xiu ke ming cheng:",p->xuanxiu[i].clsnam,16);
printf("enter shi fou chong xiu(n or y):");
scanf("%s",&p->xuanxiu[i].rebuild);
printf("enter xuan xiu ke cheng ji:");
scanf("%d",&p->xuanxiu[i].score);
printf("enter xuan xiu ke xue fen:");
scanf("%d",&p->xuanxiu[i].course);
for(j=1;;)
{
printf("enter di %d chi chong xiu xue qi(such as:2007/1(2);enter @ return):",j);
scanf("%s",p->xuanxiu[i].chongxiu[j].xueqi);
if(p->xuanxiu[i].chongxiu[j].xueqi[0]=='@') break;
printf("enter chong xiu cheng ji:");
scanf("%s",&p->xuanxiu[i].chongxiu[j].chengji);
j++;
}
i++;
}
printf("if want to end enter @\n");
if(getch()=='@') break;
}
}
return h;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -