| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 727 人关注过本帖
标题:一个C语言编程的问题,请多多指教
只看楼主 加入收藏
lywhlao
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-6-16
结帖率:0
收藏
 问题点数:0 回复次数:9 
一个C语言编程的问题,请多多指教
题目是这样的:

成绩排名

Acceteped : 1          Submit : 9
Time Limit : 1000 MS         Memory Limit : 65536 KB
 
Description

给出一个班的成绩情况,请计算平均分,并按平均分进行排名。 输入 第一行是一个整数K,表示样例个数。每个样例的第一行是两个正整数N(N<=40)和M(M<=10),分别表示班上的人数信息,课程的门数。以后的N行,每行一个字符串和M个整数,字符串表示学生姓名(字符串不超过10个字符,只含英文字母),M个整数表示M门课的成绩。 输出 每个样例输出一个排名结果,一行为一个学生的成绩信息。包含3个部分的信息,第一个是一个整数,表示排名,从1开始计数;第二部分是学生的姓名;第三部分是一个浮点数,表示学生的平均成绩,保留1位小数。排名按平均成绩从高到低排列,如果平均成绩相同,按姓名的字典序排列,其排名相同,后面的排名依次后推。三者之间用一个空格隔开,行末无空格。
 
Sample Input

1
4 2
eric 80 90
rose 70 80
john 80 70
jone 60 60
 
Sample Output

1 eric 85.0
2 john 75.0
2 rose 75.0
4 jone 60.0
 
Source

=================================================================================
下面是我写的代码,测试用例已经过了,但提示是WA,我找了很久也没发现问题,试了很多数据,希望大家帮我看看,这是OJ地址http://cie.xtu.,题号是1106,先谢谢了。
#include<stdio.h>
#include<string.h>
 struct t{
    char n[100];
    int c[100];
    double avg;
}t[1000];
int main()
{
   int ca;
   scanf("%d",&ca);

   while(ca--)
   {
       memset(t,0,1000);
       int num;//人数
       int k;//科目
       int i;
       int j;
       scanf("%d %d",&num,&k);
       for(i=0;i<num;i++)
       {
           double sum=0;
           scanf("%s",t[i].n);//输入名字
           for(j=0;j<k;j++)
           {
               scanf("%d",&t[i].c[k]);//输入成绩
               sum+=t[i].c[k];
           }
           t[i].avg=sum/(double)k;
       }

   int x,y;
   for(x=0;x<num-1;x++)//冒泡排序
   for(y=x+1;y<num;y++)
   {
       if(t[x].avg<t[y].avg)
       {
           struct t temp;
           temp=t[x];
           t[x]=t[y];
           t[y]=temp;
       }
   }
   int flag=1;
   for(i=0;i<num;i++)
    {
       if(i==0)printf("1 ");
       else
       {
           if(t[i].avg==t[i-1].avg)
               printf("%d ",flag);
           else
           {
               printf("%d ",i+1);
               flag=i+1;

           }

       }


        printf("%s %.1f\n",t[i].n,t[i].avg);
    }
    }
   }

搜索更多相关主题的帖子: 信息 英文字母 Memory C语言 
2011-10-29 14:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你们学校的OJ已经停止注册了,所以没能实际试一下。
程序代码:
#include<stdio.h>
#include<string.h>
struct student
{
    char name[11];
    double avg_score;
}ss[100];
int cmp(const void * a, const void * b)
{
    struct student * pa, * pb;
    pa = (struct student *)a;
    pb = (struct student *)b;
    return (pa->avg_score == pb->avg_score) ? strcmp(a, b) : pb->avg_score - pa->avg_score;
}
int main()
{
    int t, n, m, i, j, score;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d %d", &n, &m);
        for(i = 0; i < n; i++)
        {
            scanf("%s", ss[i].name);
            for(ss[i].avg_score = 0, j = 0; j < m; j++)
            {
                scanf("%d", &score);
                ss[i].avg_score += score;
            }
            ss[i].avg_score /= m;
        }
        qsort(ss, n, sizeof(struct student), cmp);
        for(i = 0; i < n; i++)
            printf("%d %s %.1lf\n", i + 1, ss[i].name, ss[i].avg_score);
        //printf("\n"); //题目里没提到,但一般这类题这里应该要求加一个空行
    }
    return 0;
}

重剑无锋,大巧不工
2011-10-29 16:47
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
又一次看到LS大大简练的代码,我这个格式没有照着做,也发出来献献丑了

想到我代码的长度比起LS大大的我哭了

大大能留个联系方式吗.
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

void input(struct student *  , int, int );
void output(struct student *, int );
void sort(struct student *, int);
void avg(struct student *,int , int);
struct student
{
    float avg;
    float score[10];
    char name[10];
};

int main (void)
{
    struct student * pArr;
    int len,subject;

    printf("Please enter the number of students:");
    scanf("%d", &len );
    printf("Please enter the number of subject:");
    scanf("%d", &subject);

    pArr = (struct student *) malloc(len * sizeof(struct student));
    input(pArr,len,subject);
    avg(pArr,len,subject);
    sort(pArr,len);
    output(pArr,len);

    free(pArr);
    system("pause");

    return 0;
}

void input (struct student * stutemp , int len, int sub)
{
    int i,j;

    for (i=0; i<len ; ++i)
    {
        printf("please input the student name:");
        scanf("%s",stutemp[i].name);
        for (j=0; j<sub; ++j)
        {
        printf("please input the student score[s:%d]:", j);
        scanf("%f", &stutemp[i].score[j]);
        }
    }

}

void  output (struct student * stutemp , int len)
{
    int i;

    for (i=0; i<len; ++i)
    {
        printf("-------------------------\n");
        printf("No.:%d\n", i+1);
        printf("name:%s\n", stutemp[i].name);
        printf("avg:%1f\n", stutemp[i].avg);
    }
}

void sort (struct student * stutemp , int len)
{
    struct student temp;
    int i,k;
    int j;
    for (i=0; i<len-1; ++i)
    {
        for (k=0; k<len-1-i; ++k)
        {
            if (stutemp[k].avg > stutemp[k+1].avg && stutemp[k].avg != stutemp[k+1].avg)
            {
                temp = stutemp[k];
                stutemp[k] = stutemp[k+1];
                stutemp[k+1] = temp;
            }
            else
            {
                for (j=0; j<=10; j++)
                    if (stutemp[k].name[j] < stutemp[k+1].name[j] && stutemp[k].name[j] != stutemp[k+1].name[j])
                    {
                        temp = stutemp[k];
                        stutemp[k] = stutemp[k+1];
                        stutemp[k+1] = temp;
                    }
                    else ;
            }
        }
    }
}

void avg(struct student * temp, int len , int subj)
{
    int i,j;
    float sum = 0;

    for (i=0; i<len; ++i)
    {
        for (j=0; j<subj; ++j)
        {
            sum = sum + temp[i].score[j];
        }
        temp[i].avg = sum / subj;
        sum = 0;
    }
}




[ 本帖最后由 随风飘荡 于 2011-10-29 17:01 编辑 ]
2011-10-29 16:58
lywhlao
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-6-16
收藏
得分:0 
回复 楼主 lywhlao
回复错了。
2011-10-29 17:01
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
没看到,我改改去
2011-10-29 17:02
lywhlao
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-6-16
收藏
得分:0 
回复 2楼 beyondyf
你的输出有问题吧?如果成绩一样排名也是一样的。
2011-10-29 17:03
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 6楼 lywhlao
你试过了吗? 注意一下cmp函数。

重剑无锋,大巧不工
2011-10-29 17:10
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 3楼 随风飘荡
感谢兄弟的抬爱。我的代码是针对ACM做的精简,没有多余的输出部分。我想你还没玩过这种编程游戏,试试吧。

重剑无锋,大巧不工
2011-10-29 17:16
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
我刚开始自己学的,ACM是美国计算机协会?

我改了一下,输出居然都多了2
没时间了,赶着出去,晚上回来再试数。

大大能不能留个联系方式啊,QQ啊 MSN啊 邮箱都可以
2011-10-29 17:21
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
改好了,函数越来越多了,我自己都觉得不妥

程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

void input(struct student *  , int, int );
void output(struct student *, int );
void sort(struct student *, int );
void avg(struct student *,int , int);
void rank(struct student *,int,int *);
struct student
{
    float avg;
    float score[10];
    char name[10];
    int rank;
};

int main (void)
{
    struct student * pArr;
    int len,subject;
    int rankall=0;

    printf("Please enter the number of students:");
    scanf("%d", &len );
    printf("Please enter the number of subject:");
    scanf("%d", &subject);

    pArr = (struct student *) malloc(len * sizeof(struct student));
    input(pArr,len,subject);
    avg(pArr,len,subject);
    sort(pArr,len);
    rank(pArr,len,&rankall);
    output(pArr,len);

    free(pArr);
    system("pause");

    return 0;
}

void input (struct student * stutemp , int len, int sub)
{
    int i,j;

    for (i=0; i<len ; ++i)
    {
        printf("please input the student name:");
        scanf("%s",stutemp[i].name);
        for (j=0; j<sub; ++j)
        {
        printf("please input the student score[s:%d]:", j);
        scanf("%f", &stutemp[i].score[j]);
        }
    }

}

void  output (struct student * stutemp , int len)
{
    int i;

    for (i=0; i<len; ++i)
    {
        printf("-------------------------\n");
        printf("rank:%d\n", stutemp[i].rank);
        printf("name:%s\n", stutemp[i].name);
        printf("avg:%1f\n", stutemp[i].avg);
    }
}

void sort (struct student * stutemp , int len)
{
    struct student temp;
    int i,k;
    int j;
    for (i=0; i<len-1; ++i)
    {
        for (k=0; k<len-1-i; ++k)
        {
            if (stutemp[k].avg > stutemp[k+1].avg && stutemp[k].avg != stutemp[k+1].avg)
            {
                temp = stutemp[k];
                stutemp[k] = stutemp[k+1];
                stutemp[k+1] = temp;
            }
            else
            {
                for (j=0; j<=10; j++)
                    if (stutemp[k].name[j] > stutemp[k+1].name[j] && stutemp[k].name[j] != stutemp[k+1].name[j])
                    {
                        temp = stutemp[k];
                        stutemp[k] = stutemp[k+1];
                        stutemp[k+1] = temp;
                    }
                    else ;
            }
        }
    }
}

void avg(struct student * temp, int len , int subj)
{
    int i,j;
    float sum = 0;

    for (i=0; i<len; ++i)
    {
        for (j=0; j<subj; ++j)
        {
            sum = sum + temp[i].score[j];
        }
        temp[i].avg = sum / subj;
        sum = 0;
    }
}

void rank(struct student * stutemp ,int len , int * rankall)
{
    int i;
    for (i=len-1; i>=0; --i)
    {
        if (stutemp[i].avg == stutemp[i-1].avg)
        {
            *rankall = *rankall +1;
            stutemp[i].rank = *rankall;
            stutemp[i-1].rank = *rankall;
//          printf("i = %d, len = %d , rank = %d , [%d].avg = [%d].avg True\n",i,len,*rankall,i,i-1);
        }
        else if ( -1 != i-1 ) // 防止出现比较[0] / [-1]的情况
        {
            *rankall = *rankall +1;
            stutemp[i-1].rank = *rankall;
//          printf("i = %d, len = %d , rank = %d , [%d].avg = [%d].avg False\n",i,len,*rankall,i,i-1);
        }
    }
}

2011-10-30 02:45
快速回复:一个C语言编程的问题,请多多指教
数据加载中...
 
   



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

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