当前位置: 代码迷 >> C语言 >> 看看有错没
  详细解决方案

看看有错没

热度:322   发布时间:2008-04-28 13:54:02.0
看看有错没
//把40个学生数据写入到文件中,然后排序总分高低输出
#include <stdio.h>
#include <string.h>
#define M 40
void pai_xu(float data[],int i);
struct stu_info
{
   long no;
   char name[8];
   float math,english,politics,computer;
  }stua[M],*stup;
int main()
  {
   FILE*fp;
   float sum;
   int i;
   stup=stua;
   
   if((fp=fopen("d: \\School\\students","w+"))==NULL)
    {
     printf("Open file error!");
      exit(0);
    }
  printf("\n请输入学生数据,输入完成按"#"确认: \n");
  for(i=0;i<M;i++,stup++)
     {
    scanf("%d%s%f%f%f%f",&stu_p->no,stu_p->name,stu_p->math,stu_p->english,
          stu_p->politics,stu_p->computer);
       if(&stu_p->no||stu_p->name||stu_p->math||stu_p->english||
          stu_p->politics||stu_p->computer=='#')break;
          sum=(stup_math+stu_p->english+stu_p->poplitics+stu_pcomputer);//计算总分数
        pai_xu(sum,M);  //调用pai_xu函数 ,使成绩总分从高到低排序
     stu_p=stua;
    fwrite(stu_p,sizeof(struct stuinfo),M,fp); //成块写入到文件中
    rewind(fp);  //指针移到文件开头
    for(i=0;i<M;i++,stu_p++)
     printf("学生成绩排名如下:\n");
     printf("%5d   %s   %f  %f  %f  %f\n",&stu_p->no,stu_p->name,stu_p->math,
            stu_p->english,stu_p->politics,stu_p->computer); //读出40个学生分数从高到低排序
       stua=stu_p;
     fclose(fp);
     return 0;
     
   }

  void pai_xu(float data[],int n)
   {
     int i,j;
     float max,temp;
     for(i=0;i<n-1;i++)
      {
        max=i;
        for(j=i+1;j<n;j++)
          if(data[i]>data[max]
            max=j;
           temp=data[i];
           data[i]=data[max];
           dat[amax]=temp;
      }
      return;
    }
搜索更多相关的解决方案: float  stup  int  stua  

----------------解决方案--------------------------------------------------------
void pai_xu(float data[],int n)
   {
     int i,j;
     float max,temp;
     for(i=0;i<n-1;i++)
      {
        max=i;
        for(j=i+1;j<n;j++)
          if(data[i]>data[max]  //这里,少半个括号.还有,既然max=i,那么这个条件永远都不会成立了.还有,        要想执行语句块的话,请用{}.
            max=j;
           temp=data[i];
           data[i]=data[max];
           dat[amax]=temp;
      }
      return;
    }
----------------解决方案--------------------------------------------------------
大哥,你的错误可不止一处阿...我把程序改过了,你自己看看阿(我把M改成4了,方便测试)
//把40个学生数据写入到文件中,然后排序总分高低输出
#include <stdio.h>

#include <string.h>

#define M 4

typedef struct
{
    long no;
    char name[8];
    float math,english,politics,computer;
    float sum;
}stu_info;

void pai_xu(stu_info data[],int i);

int main(void)
    {
    FILE*fp;
    float sum;
    int i;
    stu_info stua[M];
    if((fp=fopen("d:\\students.txt","w+"))==NULL)
    {
        printf("Open file error!");
        exit(0);
    }
    printf("\n请输入学生数据,输入完成按\"Enter\"确认: \n");
    for(i=0;i<M;i++)
    {
        scanf("%d%s%f%f%f%f",&stua[i].no,&stua[i].name,&stua[i].math,&stua[i].english,&stua[i].politics,&stua[i].computer);
        stua[i].sum=(stua[i].math+stua[i].english+stua[i].politics+stua[i].computer);//计算总分数
    }
    pai_xu(stua,M);  //调用pai_xu函数 ,使成绩总分从高到低排序
    for(i=0;i<M;i++)
    {
        fwrite(&stua[i],sizeof(stua[i]),M,fp);//成块写入到文件中
    }
    rewind(fp);  //指针移到文件开头
    printf("学生成绩排名如下:\n");
    for(i=0;i<M;i++)
    {
        printf("%5d  %s  %f  %f  %f  %f  %f\n",stua[i].no,stua[i].name,stua[i].math,stua[i].english,stua[i].politics,stua[i].computer,stua[i].sum);
    }
    fclose(fp);
    return 0;
}

void pai_xu(stu_info data[],int n)
{
    int i,j,max;
    stu_info temp;
    for(i=0;i<n-1;i++)
    {
        max=i;
        for(j=i+1;j<n;j++)
        {
            if(data[j].sum>data[max].sum)
            {
                temp=data[max];
                data[max]=data[j];
                data[j]=temp;
            }
        }
    }
    return;
}
----------------解决方案--------------------------------------------------------
//把40个学生数据写入到文件中,然后排序总分高低输出
#include <stdio.h>
#include <string.h>
#define M 40
void pai_xu(float data[],int i);
struct stu_info
{
   long no;
   char name[8];
   float math,english,politics,computer;
  }stua[M],*stup;
int main()
  {
   FILE*fp;
   float sum;
   int i;
   stup=stua;
   
   if((fp=fopen("d: \\School\\students","w+"))==NULL)
    {
     printf("Open file error!");
      exit(0);
    }
  printf("\n请输入学生数据,输入完成按"#"确认: \n");     
//Q1:既然已经指定学生个数,就不用再设置结束符,因为其后的循环次数都设置为学生个数
  for(i=0;i<M;i++,stup++)                      
//Q2:强烈建议把格式调整得整洁点,容易观察括号是否对称
     {
    scanf("%d%s%f%f%f%f",&stu_p->no,stu_p->name,stu_p->math,stu_p->english,
          stu_p->politics,stu_p->computer);        //stu_p是什么?
       if(&stu_p->no||stu_p->name||stu_p->math||stu_p->english||
          stu_p->politics||stu_p->computer=='#')break;
          sum=(stup_math+stu_p->english+stu_p->poplitics+stu_pcomputer);//计算总分数
        pai_xu(sum,M);  //调用pai_xu函数 ,使成绩总分从高到低排序
//Q3:函数传递参数正确否?    
     stu_p=stua;
    fwrite(stu_p,sizeof(struct stuinfo),M,fp); //成块写入到文件中
    rewind(fp);  //指针移到文件开头
    for(i=0;i<M;i++,stu_p++)
     printf("学生成绩排名如下:\n");
     printf("%5d   %s   %f  %f  %f  %f\n",&stu_p->no,stu_p->name,stu_p->math,
            stu_p->english,stu_p->politics,stu_p->computer); //读出40个学生分数从高到低排序    
//Q4:既然是以总分排序,建议把总分都显示出来
       stua=stu_p;
     fclose(fp);
     return 0;
     
   }

  void pai_xu(float data[],int n)    
//Q5:再仔细检查一下排序程序,尤其是总分排序和原学生数组联系起来没?
   {
     int i,j;
     float max,temp;
     for(i=0;i<n-1;i++)
      {
        max=i;
        for(j=i+1;j<n;j++)
          if(data[i]>data[max]
            max=j;
           temp=data[i];
           data[i]=data[max];
           dat[amax]=temp;
      }
      return;
    }

//最有效的检查方式是调试,自己动手调吧,错误信息一目了然
//建议:不如在学生信息里直接加入总分一项,排序时就简单一点
----------------解决方案--------------------------------------------------------
//建议:不如在学生信息里直接加入总分一项,排序时就简单一点
//建议:不如在学生信息里直接加入总分一项,排序时就简单一点??

成绩是几门,请问你是怎么排序,??请指教。。
----------------解决方案--------------------------------------------------------
  相关解决方案