| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1844 人关注过本帖
标题:[求助]结构体排序答案输出错误,求指点
只看楼主 加入收藏
tiki
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-4-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
[求助]结构体排序答案输出错误,求指点
输入
4
bt_2012211111   5      8      100
bt_2012212222   4      0      200
bt_2012213333   5      0      150
bt_2012214444   6      9      200
第一行为一个整数n(1<n<10),后面是n行考生数据,共4列,每列之间以空格分隔。

其中第一列为考生帐号(固定15位的字符串,格式为bt_**********,其中所有的*均为数字),

第二列为该生正确解答的题目数(大于等于0,且小于10的整数),

第三列为该生正确解答的题目中错误提交的次数(大于等于0,且小于100的整数),

第四列为从考试开始到该生最后一次正确提交时的分钟数(大于等于0,且小于300的整数)。

以正确提交的次数num从大到小对账号进行排序,但如果甲、乙两同学都正确完成两道题目,

其中甲同学最后正确提交的时间是考试开始后200分钟,

乙同学为180分钟,但乙同学有一题提交了3次(错误提交为2次,罚时为40分钟)。

这样甲同学的总用时为200分钟而乙同学为180 + 40 = 220 分钟,所以甲同学总用时少,排名靠前。

输出
bt_2012214444
bt_2012213333
bt_2012211111
bt_2012212222


#include<stdio.h>
#include<string.h>
#define N 10
struct student
{
    char name[20];
    int num;
    int fals;
    int time;
} stu[N];
int main()
{
    int n,i,j,k[10],m,f,t,c,q;
    char str1[20],str2[20];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%s%d%d%d",&stu[i].name,&stu[i].num,&stu[i].fals,&stu[i].time);
    //对所有元素根据num从大到小进行重新排序
    for(j=0;j<n-1;j++)
    for(i=0;i<n-1-j;j++)
    {
        if(stu[i].num<stu[i+1].num)
        {
            strcpy(str1,stu[i].name);
            strcpy(stu[i].name,stu[i+1].name);
            strcpy(stu[i+1].name,str1);
            m=stu[i].num;
            stu[i].num=stu[i+1].num;
            stu[i+1].num=m;
            f=stu[i].fals;
            stu[i].fals=stu[i+1].fals;
            stu[i+1].fals=f;
            t=stu[i].time;
            stu[i].time=stu[i+1].time;
            stu[i+1].time=t;
        }
    }
    //根据提交错误次数和时间进行排序
    for(j=0;j<n-1;j++)
    for(i=0;i<n-1-j;j++)
    {
        if(stu[i].num==stu[i+1].num)
        {
            c++;
            k[i]=stu[i].time+20*stu[i].fals;
            for(j=0;j<c;j++)
            for(i=0;i<c-j;i++)
            {
                if(k[i]>k[i+1])
                {
                    strcpy(str2,stu[i].name);
                    strcpy(stu[i].name,stu[i+1].name);
                    strcpy(stu[i+1].name,str2);
                }
            }
        }
    }
    //根据排序输出结果
    for(i=0;i<n;i++)
    {
        printf("%s\n",stu[i].name);
    }
    return 0;
}
输出的结果不对,求指点

[ 本帖最后由 tiki 于 2015-4-19 18:38 编辑 ]
搜索更多相关主题的帖子: 结构体 字符串 
2015-04-19 18:20
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:20 
程序代码:


#include<stdio.h>
#define N 4
typedef struct student{
    char name[20];
    int num;
    int fals;
    int time;
}STU;
    
int main (void)
{
    STU stu[N]={
        {"bt_2012211111",5,8,100},
        {"bt_2012212222",4,0,200},
        {"bt_2012213333",5,0,150},
        {"bt_2012214444",6,9,200}
    
    };
    STU t_stu;
    int i,j;
    
    for(j=0;j<N-1;j++)
     for(i=0;i<N-1-j;i++)
      if(stu[i].num<stu[i+1].num)
      {
          t_stu=stu[i];
          stu[i]=stu[i+1];
          stu[i+1]=t_stu;
          
      }
    
    //进一步调整num想等,但是时间有差距的元素 
    
    //先要找到num想等的元素 

     for(i=0;i<N-1;i++)  //j=0  i :1~
        if(stu[i].num==stu[i+1].num)
        {
            int t_i_sum=0;
            int t_i1_sum=0;
            
            t_i_sum=stu[i].time+stu[i].fals*20;
            t_i1_sum=stu[i+1].time+stu[i+1].fals*20;
            
            if(t_i1_sum<t_i_sum)
            {
                t_stu=stu[i];
                  stu[i]=stu[i+1];
                  stu[i+1]=t_stu;
                
            }
            
            
        } 
    
    
    
    for(i=0;i<N;i++)
     printf("%s\n",stu[i].name);
    
    
    
    
}    
    


  



给你个思路

[ 本帖最后由 code力力 于 2015-4-19 23:29 编辑 ]

你醒了?快起来敲代码!!
2015-04-19 23:16
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
我不知道比排序交换的时候为什么那么复杂,结构体是可以相互赋值的。

也可以用指针,会更高效。

不过用结构体相互赋值会更加意思明了。

你醒了?快起来敲代码!!
2015-04-19 23:32
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
程序代码:
//先要找到num想等的元素 ,因为第一从排序,num想等的元素就靠在一起了,所以这里只要临近的两两比较就OK,一旦发现临近的2个元素num想等,
//就比较他们的时间大小,时间一个大于另一个,就把他们交换。(时间小的排在前面)
     for(i=0;i<N-1;i++)  //j=0  i :1~
        if(stu[i].num==stu[i+1].num)
        {
            int t_i_sum=0;
            int t_i1_sum=0;
            
            t_i_sum=stu[i].time+stu[i].fals*20;
            t_i1_sum=stu[i+1].time+stu[i+1].fals*20;
            
            if(t_i1_sum<t_i_sum)
            {
                t_stu=stu[i];
                  stu[i]=stu[i+1];
                  stu[i+1]=t_stu;
                
            }
            
            
        } 

你醒了?快起来敲代码!!
2015-04-19 23:38
tiki
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-4-19
收藏
得分:0 
回复 4楼 code力力
谢谢指点,这个题卡了我一晚上,我才开始学,做题的思路比较简单,万分感谢
2015-04-20 13:06
快速回复:[求助]结构体排序答案输出错误,求指点
数据加载中...
 
   



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

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