高手帮我看一下为什么查看排序的时候出现死循环!!!
#include<stdio.h>#include<math.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct stud
{
char name[10];
int num;
float c;
float math;
float english;
float zf;
int pnum;
int pzf;
}Stud;
void ReadFile(Stud stud[],int &n)
{
FILE *fp;
long length;
int i;
if((fp=fopen("stud.dat","rb"))==NULL){
n=0;
return;
}
fseek(fp,0,2);
length=ftell(fp);
rewind(fp);
n=length/sizeof(Stud);
if(n!=0)
n--;
else
stud[0].pnum=stud[0].pzf=-1;
for(i=0;i<=n;i++)
fread(&stud[i],sizeof(Stud),1,fp);
fclose(fp);
}
void Clearup(Stud stud[],int &n)
{
FILE *fp;
if((fp=fopen("stud.dat","wb"))==NULL){
printf(">> 文件不能打开\n");
return;
}
stud[0].pnum=stud[0].pzf=-1;
n=0;
fclose(fp);
printf(" ============================================================================\n");
}
void SaveFile(Stud stud[],int &n)
{
int i;
FILE *fp;
if((fp=fopen("stud.dat","wb"))==NULL){
printf(">> 文件不能打开\n");
return;
}
if(n>1)
for(i=0;i<=n;i++)
fwrite(&stud[i],sizeof(Stud),1,fp);
fclose(fp);
printf(" ============================================================================\n");
}
void Input(Stud stud[],int &n)
{
printf(">>请输入登记学生 姓名 学号 C语言成绩 数学成绩 英语成绩 (按1退出):\n");
while(1)
{
int i,CJ;
int flag=0;
n++;
scanf("%s%u%f%f%f",&stud[n].name,&stud[n].num,&stud[n].c,&stud[n].math,&stud[n].english);
stud[n].zf=stud[n].c+stud[n].math+stud[n].english;
scanf("%d",&CJ);
if(CJ==1)
break;
for(i=0;i<=n-2;i++)
{
if(stud[i].num==stud[n].num)
{
flag=flag+1;
}
}
if(flag!=0)
printf("学号输入重复,请检查!!\n");
stud[n].pnum=stud[n].pzf=0;
}
}
void OutputFile(Stud stud[],int n)
{
int i;
if(n<1)
{
printf(">>没任何记录\n");
return;
}
printf(" -----------------------------------------------------------------\n");
printf("| 姓名 | 学号 | C语言成绩 | 数学成绩 | 英语成绩 | 总分 |\n");
printf(" -----------------------------------------------------------------\n");
for(i=1;i<=n;i++)
{
printf("|%10s | %u | %6.2f | %6.2f | %6.2f | %6.2f |\n",stud[i].name,stud[i].num,stud[i].c,stud[i].math,stud[i].english,stud[i].zf);
printf(" -----------------------------------------------------------------\n");
}
}
void Dispnum(Stud stud[],int n)
{ int i=2,j;
int k=stud[0].pnum;
if(n<1)
{
printf(">>没有这种记录,不能进行排序\n");
return;
}
stud[0].pnum=1;stud[1].pnum=-1;
while(i<=n)
{
j=0;
while(stud[j].pnum!=-1 && stud[stud[j].pnum].num<stud[i].num)
j=stud[j].pnum;
stud[i].pnum=stud[j].pnum;
stud[j].pnum=i;
i++;
}
printf(" -----------------------------------------------------------------\n");
printf("| 姓名 | 学号 | C语言成绩 | 数学成绩 | 英语成绩 | 总分 |\n");
printf(" -----------------------------------------------------------------\n");
while(k!=-1)
{
printf("|%10s | %u | %6.2f | %6.2f | %6.2f | %6.2f |\n",stud[k].name,stud[k].num,stud[k].c,stud[k].math,stud[k].english,stud[k].zf);
printf(" -----------------------------------------------------------------\n");
k=stud[k].pnum;
}
printf(" ============================================================================\n");
}
void Dispzf(Stud stud[],int n)
{ int i=2,j;
int k=stud[0].pzf;
if(n<1)
{
printf(">>没有记录,不能进行排序\n");
return;
}
stud[0].pzf=1;stud[1].pzf=-1;
while(i<=n)
{
j=0;
while(stud[j].pzf!=-1 && stud[stud[j].pzf].zf<stud[i].zf)
j=stud[j].pzf;
stud[i].pzf=stud[j].pzf;
stud[j].pzf=i;
i++;
}
printf(" -----------------------------------------------------------------\n");
printf("| 姓名 | 学号 | C语言成绩 | 数学成绩 | 英语成绩 | 总分 |\n");
printf(" -----------------------------------------------------------------\n");
while(k!=-1)
{
printf("|%10s | %u | %6.2f | %6.2f | %6.2f | %6.2f |\n",stud[k].name,stud[k].num,stud[k].c,stud[k].math,stud[k].english,stud[k].zf);
printf(" -----------------------------------------------------------------\n");
k=stud[k].pzf;
}
printf(" ============================================================================\n");
}
void xuehao(Stud stud[],int n)
{
int num,i,flag=0;
printf("请输入你要查询学生的学号:\n");
scanf("%d",&num);
for(i=0;i<=n;i++)
{
if(stud[i].num==num)
{
printf(" -----------------------------------------------------------------\n");
printf("| 姓名 | 学号 | C语言成绩 | 数学成绩 | 英语成绩 | 总分 |\n");
printf(" -----------------------------------------------------------------\n");
printf("|%10s | %u | %6.2f | %6.2f | %6.2f | %6.2f |\n",stud[i].name,stud[i].num,stud[i].c,stud[i].math,stud[i].english,stud[i].zf);
printf(" -----------------------------------------------------------------\n");
flag++;
}
}
if(flag==0)printf("查询操作失败,没有你要查询的学生!!!\n");
else printf("查询操作成功!!!\n");
printf(" ============================================================================\n");
}
void xingming(Stud stud[],int n)
{
char name[10];
int i,flag=0;
printf("请输入你要查询的学生的姓名:\n");
scanf("%s",&name);
for(i=0;i<=n;i++)
{
if(strcmp(stud[i].name,name)==0)
{
printf(" -----------------------------------------------------------------\n");
printf("| 姓名 | 学号 | C语言成绩 | 数学成绩 | 英语成绩 | 总分 |\n");
printf(" -----------------------------------------------------------------\n");
printf("|%10s | %u | %6.2f | %6.2f | %6.2f | %6.2f |\n",stud[i].name,stud[i].num,stud[i].c,stud[i].math,stud[i].english,stud[i].zf);
printf(" -----------------------------------------------------------------\n");
flag++;
}
}
if(flag==0)printf("查询操作失败,没有你要查询的学生!!!\n");
else printf("查询操作成功!!!\n");
printf(" ============================================================================\n");
}
void Modify(Stud stud[],int n)
{
int NO,j;
int flag=0;
float c,math,english;
printf("请输入你要修改学生的学号:\n");
scanf("%d",&NO);
for(j=0;j<=n;j++)
{
if(stud[j].num==NO)
{
printf("请输入你要修改的学生的 C语言成绩 数学成绩 英语成绩:\n");
scanf("%f%f%f",&c,&math,&english);
stud[j].c =c;stud[j].math=math;stud[j].english=english;
stud[j].zf=stud[j].c+stud[j].math+stud[j].english;
flag++;
}
}
if(flag==0)printf("修改操作失败,该学号不存在!!!\n");
else printf("修改操作成功!!!\n");
printf(" ============================================================================\n");
}
void Delete(Stud stud[],int &n)
{
int NO,i,j;
int flag=0;
printf("请输入你要删除的学生的学号:\n");
scanf("%d",&NO);
for(i=0;i<=n;i++)
{
if(stud[i].num==NO)
{
for(j=i;j<n;j++)
stud[j]=stud[j+1];
flag++;
}
}
if(flag==0)printf("删除操作失败,该学号不存在!!!\n");
else {n--;
printf("删除操作成功!!!\n");
}
printf(" ============================================================================\n");
}
void Menu()
{ double dummy=sin(0.0);
Stud stud[MaxSize];
int k, n;
printf(" 欢迎使用学生成绩管理系统!!!\n");
printf(" ============================================================================\n");
ReadFile(stud,n);
do{
printf(" 1:学生登记 2:显示学生信息\n ");
printf(" 3:清空记录 4:删除记录\n");
printf(" 5:按学号排序输出 6:按总分排序输出\n");
printf(" 7:学号查询 8:姓名查询\n");
printf(" 9:修改 0:储存退出\n");
printf("请选择相应的功能:");
scanf("%d",&k);
if(k>9&&k<0)printf("操作不当,请重新输入:\n");
switch(k)
{
case 1:Input(stud,n);
break;
case 2:OutputFile(stud,n);
break;
case 3:Clearup(stud,n);
break;
case 4:Delete(stud,n);
break;
case 5:Dispnum(stud,n);
break;
case 6:Dispzf(stud,n);
break;
case 7:xuehao(stud,n);
break;
case 8:xingming(stud,n);
break;
case 9:Modify(stud,n);
break;
case 0:SaveFile(stud,n);
break;
}
}while(k!=0);
}
void MeNu()
{ double dummy=sin(0.0);
Stud stud[MaxSize];
int k, n;
printf(" 欢迎使用学生成绩管理系统!!!\n");
printf(" ============================================================================\n");
ReadFile(stud,n);
do{
printf(" 1:学号查询 2:显示学生信息\n ");
printf(" 3:姓名查询 4:按总分排序输出\n");
printf(" 5: 按学号排序输出 0:储存退出\n");
printf("请选择相应的功能:");
scanf("%d",&k);
if(k>9&&k<0)printf("操作不当,请重新输入:\n");
switch(k)
{
case 1:xuehao(stud,n);
break;
case 2:OutputFile(stud,n);
break;
case 3:xingming(stud,n);
break;
case 4:Dispzf(stud,n);
break;
case 5:Dispnum(stud,n);
break;
case 0:SaveFile(stud,n);
break;
}
}while(k!=0);
}
void MiMa()
{ int a,b;
b=1234;
printf("================");
printf(" 请输入密码");
printf("================\n");
lp1:
scanf("%d",&a);
if(a==b)
{
printf("请选择服务种类,按1进入按其他键退出\n");goto lp2;
}
else
printf("密码错误,请重新输入\n");goto lp1;
lp2:
switch(getch())
{
case'1':Menu();break;
default:break;
}
}
void Mima()
{ int a,b;
printf("=======================\n");
printf("* 请输入学号后9位数 *\n");
printf("=======================\n");
lp3:
scanf("%d",&a);
if(a>118510000||a<118500000)
{
printf("学号输入错误,请重新输入:\n");goto lp3;
}
lp1:
printf("================\n");
printf("* 请输入密码 *\n");
printf("================\n");
scanf("%d",&b);
if(a==b)
{
printf("请选择服务种类,按1进入,按其他键退出\n");goto lp2;
}
else
printf("密码错误,请重新输入\n");goto lp1;
lp2:
switch(getch())
{
case'1':MeNu();break;
default:break;
}
}
void main()
{
int b;
printf(" 欢迎使用学生成绩管理系统!!!\n");
printf(" ============================================================================\n");
printf(" 1:教师 2:学生\n");
printf("请选择登陆身份:");
scanf("%d",&b);
if(b>2&&b<1)printf("操作不当,请重新输入:\n");
switch(b)
{
case 1:MiMa();
break;
case 2:Mima();
break;
}
}