| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1069 人关注过本帖
标题:求解一个C语言题目,关于结构体的
只看楼主 加入收藏
Maple1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:1
注 册:2011-11-5
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:9 
求解一个C语言题目,关于结构体的
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
我的代码如下:
#include<stdio.h>
#include<string.h>
struct Student
    {
        int num;
        char name[12];
        float score[12];
        float average;
    };
int main()
{
    struct Student stu[45]={};
    struct Student temp;
    int k,n,m,i,j,p,h,g;
    scanf("%d",&k);
    for(i=0;i<k;i++)
    {
        scanf("%d %d\n",&n,&m);
        for(j=0;j<45;j++)
        {
            for(p=0;p<12;p++)
            {
                stu[j].name[p]='\0';
                stu[j].score[p]=0;
            }
        }
        for(j=0;j<n;j++)
        {
            scanf("%s",stu[j].name);
            for(p=0;p<m;p++)
            {
                scanf("%f",&stu[j].score[p]);
            }
            for(p=0;p<m;p++)
            {
                stu[j].average+=stu[j].score[p];
            }
            stu[j].average=stu[j].average/m;
        }
        for(j=0;j<n-1;j++)
        {
            h=j;
            for(p=j+1;p<n;p++)
            {
                if(stu[p].average>stu[h].average)h=p;
            }
            temp=stu[h];stu[h]=stu[j];stu[j]=temp;
        }
        for(j=0;j<n-1;j++)
        {
            h=j;
            for(p=j+1;p<n;p++)
            {
                if(stu[p].average==stu[h].average&&strcmp(stu[h].name,stu[p].name)>0)h=p;
            }
            temp=stu[h];stu[h]=stu[j];stu[j]=temp;
        }
        for(j=0;j<n;j++)
        {
            stu[j].num=j+1;
        }
        for(j=0;j<n;j++)
        {
            if(stu[j].average==stu[j+1].average)
            stu[j+1].num=stu[j].num;
        }
        for(j=0;j<n;j++)
        {
            printf("%d %s %.1f\n",stu[j].num,stu[j].name,stu[j].average);
        }
    }
    return 0;
}
测试了好几个,结果都是对的,交到OJ上就是报wrong anwser,不知道是哪里出了问题,求解!(本人新手,代码可能比较小白,勿怪)
搜索更多相关主题的帖子: 英文字母 结构体 C语言 
2012-08-29 21:37
wiseley747
Rank: 1
等 级:新手上路
帖 子:22
专家分:8
注 册:2012-8-16
收藏
得分:5 
回复 楼主 Maple1992
if(stu[p].average==stu[h].average&&strcmp(stu[h].name,stu[p].name)>0)h=p;

這句話註解 就可以編譯了
哈哈 我也是新手  不知道問題出在哪
2012-08-30 18:14
hxt532084126
Rank: 1
等 级:新手上路
帖 子:34
专家分:5
注 册:2012-8-26
收藏
得分:5 
新手不解释...
2012-08-30 18:24
zhangqi_gsts
Rank: 6Rank: 6
来 自:甘肃天水
等 级:侠之大者
威 望:1
帖 子:227
专家分:457
注 册:2011-3-27
收藏
得分:5 
顶起
2012-08-30 20:07
wiseley747
Rank: 1
等 级:新手上路
帖 子:22
专家分:8
注 册:2012-8-16
收藏
得分:0 
回复 2楼 wiseley747
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    double sum=0;
    double aver;
    int* score;
    int student;
   
    // 輸入學生人數後配置記憶體
    printf("請輸入學生人數: ");
    scanf("%d",&student);
    score = (int *) malloc(sizeof(int)*student);
    // malloc 會回傳 (void *) 型態 

    // 分別讀入student個數值
    for ( i=0; i < student; i++ )
    {
          printf("學生%d (%d): ", i+1, score+i);
          scanf("%d", (score+i));
    }
    // 計算總和
    for ( i=0; i < student; i++ )
    {
          sum = sum + *(score+i);
    }
   
    // 求平均值
    aver=sum/student;
    printf("平均=%.2lf分\n",aver);

    //將配置記憶體釋放
    free(score);   
    system("pause");

    return 0;
}
首先是您定义一堆内存地址
看了眼花撩乱
您的程序 思路还没有出来


您这题还真有点程度
首先是输入K 先不理这个

输入N  代表N个学生
输入M  代表M门成绩
因为N个学生和M门成绩
所以应该会使用到动态内存配置
类似下列语句
score = (int *) malloc(sizeof(int)*student);

我知道如果配合单向炼表  有使用到这个符号 ->
可能可以达到您的需求 但是我还没看到那个章节

至于学生成绩的平均值 应该要另外写个函式

我这个程序只是动态内存配置的范例

老哥我还是新手  思路还没扩展出来

同求高手出来解决思路

2012-08-31 11:36
JON_me
Rank: 2
等 级:论坛游民
帖 子:30
专家分:68
注 册:2012-5-4
收藏
得分:5 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define  LEN  sizeof(struct student)
typedef struct student   //定义一个学生的信息结构体
{
    int num;
    char name[20];
    double sore[20];
    double average;
};
struct student * stu,temp;   //声明班级
int main(void)
{
    int M,N;          //M为班级人数,N为科目数目
    int i,j;
    printf("请输入班级人数M和科目数目N:\n");
    scanf("%d%d",&M,&N);
    stu=(struct student *)malloc(LEN*M);
    printf("请输入班级给位同学信息:\n");
    for(i=0;i<M;i++)                        //建立学生信息
    {
        scanf("%s",stu[i].name);
        stu[i].average=0;
        for(j=0;j<N;j++)                   //输入学生各科成绩
        {
            scanf("%lf",&(stu[i].sore[j]));
            stu[i].average+=stu[i].sore[j];
        }
        stu[i].average/=N;                //求学生的平均成绩
    }
    for(i=0;i<M;i++)                      //冒泡法排序
    {
        for(j=i+1;j<M;j++)
            if((stu[i].average)<(stu[j].average))
            {
                temp=stu[i];
                stu[i]=stu[j];
                stu[j]=temp;
            }
    }
    for(i=0;i<M;i++)
        if((stu[i].average)==(stu[i+1].average))
                if(strcmp(stu[i].name,stu[i+1].name)>0)
                {
                    temp=stu[i];
                    stu[i]=stu[j];
                    stu[j]=temp;
                }
    printf("排名后:\n");
    for(i=0;i<M;i++)
    {
        printf("%s %4.2lf\n",stu[i].name,stu[i].average);
    }
    return 0;
}






我也是新手,请大家多多指教。

因为爱情,不会轻易悲伤······
2012-08-31 20:05
wiseley747
Rank: 1
等 级:新手上路
帖 子:22
专家分:8
注 册:2012-8-16
收藏
得分:0 
回复 6楼 JON_me
正解
幾乎答對了
不錯不錯 學習了
2012-09-03 09:29
wiseley747
Rank: 1
等 级:新手上路
帖 子:22
专家分:8
注 册:2012-8-16
收藏
得分:0 
回复 6楼 JON_me
程序代码:
 for(i=0;i<M;i++)
        if((stu[i].average)==(stu[i+1].average))
                if(strcmp(stu[i].name,stu[i+1].name)>0)
                {
                    temp=stu[i];
                    stu[i]=stu[j];
                    stu[j]=temp;
                } 
這段冒泡排序程序不寫也不影響結果
不知用意為何
這段程序我也看不是很懂 煩請指導一下
2012-09-03 09:44
Maple1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:1
注 册:2011-11-5
收藏
得分:0 
找到问题了,是初始化的出了问题
for(j=0;j<45;j++)
        {
            stu[j].average=0;
            stu[j].num=0;
        }
初始化部分应该是这样的就通过了,不过还是谢谢大家
2012-09-03 17:23
JON_me
Rank: 2
等 级:论坛游民
帖 子:30
专家分:68
注 册:2012-5-4
收藏
得分:0 
回复 8楼 wiseley747
根据题目要求,当两人的平均分一样的时候,要对其姓名进行字典的排序·····

因为爱情,不会轻易悲伤······
2012-09-03 19:43
快速回复:求解一个C语言题目,关于结构体的
数据加载中...
 
   



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

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