| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 300 人关注过本帖
标题:高手帮我看一下为什么查看排序的时候出现死循环!!!
只看楼主 加入收藏
pengchen1017
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-6-27
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:2 
高手帮我看一下为什么查看排序的时候出现死循环!!!
#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;
         }
}
搜索更多相关主题的帖子: english long include return 
2011-07-06 16:58
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:20 
程序代码:
void Dispzf(Stud stud[],int n)
{    int i=2,j;
    int k=stud[0].pzf;
    if(n<1)
    {
     printf(">>没有记录,不能进行排序\n");
     return;
    }
    for(i = 0;i<n-1;i++)
    {
        k = i;
        for(j = i+1;j<n;j++)
            if(stud[k].zf < stud[j].zf)
                k = j;
        if(i!=k)
        {
            Stud temp = stud[i];
            stud[i] = stud[k];
            stud[k] = temp;
        }
    }
     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");
}
你的排序我没看懂  按照你的意思我写个了选择排序

                                         
===========深入<----------------->浅出============
2011-07-06 17:07
pengchen1017
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-6-27
收藏
得分:0 
回复 2楼 laoyang103
还是不可以啊  你运行一下看看  急用啊 求帮助
2011-07-06 17:18
快速回复:高手帮我看一下为什么查看排序的时候出现死循环!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026291 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved