首页 新闻 会员 周边 捐助

open 1.10 单词排序 给了九分 说输出格式错误 改了好几遍 还是不行 求助

0
悬赏园豆:5 [已解决问题] 解决于 2018-12-06 11:20
#include <stdio.h>
#include <string.h>
int main()
{
    int d=0,e=0,f,i,j,l;
    char a[5001],b[101][60],c[60],s[10]={"123"};
    gets(a);
    l=strlen(a);
    for(i=0;i<=l;i++)
    {
        if(a[i]!=' '&&a[i]!='\0')
        {
         c[d++]=a[i];
        }
        else
        {
         if(a[i+1]!=' ')
         {
            c[d]='\0';
            strcpy(b[e++],c);
            d=0;
         }
        }
    }
      for(i=0;i<e;i++)
      {
       for(j=i+1;j<e;j++)
       {
        if(strcmp(b[i],b[j])==0)
        {
        strcpy(b[j],s);
        }
       }
      }
      for(i=0;i<e;i++)
      {
        for(j=i+1;j<e;j++)
        {
         if(strcmp(b[i],b[j])>0&&strcmp(b[i],s)!=0&&strcmp(b[j],s)!=0)
         {
          strcpy(c,b[i]);
          strcpy(b[i],b[j]);
           strcpy(b[j],c);
         }
        }
      }
      for(i=0;i<e;i++)
      {
       if(strcmp(b[i],s)!=0)
       {
       f=i;
       }
      }
    for(i=0;i<e;i++)
    {
     if(strcmp(b[i],s)!=0&&i!=f)
     {
     printf("%s\n",b[i]);
     }
     if(i==f)
     {
     printf("%s",b[i]);
     }
    }
}

 

 
打着玩的主页 打着玩 | 初学一级 | 园豆:132
提问于:2018-12-03 22:07

或者谁有更简单的思想 可以提供一下

打着玩 6年前
< >
分享
最佳答案
1

楼上结构体写错了,很明显题目中只有单词没有分数,只是按照单词的字典序进行排序。

最简单的方法是使用string数组,再使用快排。这是c++的特性。

你出现格式错误的原因在于输出的时候最后一个单词是需要换行的,所以不用判断是不是最后一个单词。

此外,如果输入数据字符串的末尾有空格比如:aa aaa aaa后面有几个空格,你会发现你的程序会在第一行会多输出一个换行。

收获园豆:5
Shendu.CC | 老鸟四级 |园豆:2138 | 2018-12-04 10:47

好 我试来着 确实输出有错 我在改改

打着玩 | 园豆:132 (初学一级) | 2018-12-06 10:40

可是 我为啥会多输出一行换行啊 我的b【0】确实是aa啊 怎么会多个换行 而且那个快排 我们还没学 你有啥网址是关于那个快排的吗

 

打着玩 | 园豆:132 (初学一级) | 2018-12-06 10:50

@打着玩: 你读入数据的方式有问题,如果输入数据最后一个是空格,那么你的b[][]数组,会多一个'\0'字符串,你就会多输出一个空字符串,也就是换行。

https://zzk.cnblogs.com 搜索快排,园子里的文章质量都很好。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-12-06 10:56
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
int main()
{
    int d=0,e=0,f,i,j,l;
    char a[5001],b[101][60],c[60],s[10]={" "};
    gets(a);
    l=strlen(a);
    for(i=0;i<=l;i++)
    {
        if(a[i]!=' '&&a[i]!='\0')
        {
         c[d++]=a[i];
        }
        else
        {
         if(a[i+1]!=' ')
         {
            c[d]='\0';
            if(d!=0)
            {
            strcpy(b[e++],c);
            }
            d=0;
         }
        }
    }
      for(i=0;i<e;i++)
      {
       for(j=i+1;j<e;j++)
       {
        if(strcmp(b[i],b[j])==0)
        {
        strcpy(b[j],s);
        }
       }
      }
      for(i=0;i<e;i++)
      {
        for(j=i+1;j<e;j++)
        {
         if(strcmp(b[i],b[j])>0&&strcmp(b[i],s)!=0&&strcmp(b[j],s)!=0)
         {
      swap(b[i],b[j]);
         }
        }
      }
    for(i=0;i<e;i++)
    {
     if(strcmp(b[i],s)!=0)
     {
     printf("%s\n",b[i]);
     }
    }
}

 我在输出那个地方加了一个条件就ok了 要是我还真找不出来 哈哈 总之,谢谢!

打着玩 | 园豆:132 (初学一级) | 2018-12-06 11:18

不是 在把c复制到b里的那个地方 就ok了

打着玩 | 园豆:132 (初学一级) | 2018-12-06 11:20

@打着玩: yes!

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-12-06 11:37
其他回答(1)
0

用一个struct来排序

struct person
{
    int score;
    string name;
}

cmp函数这样写

inline bool cmp(register person a,register person b)
{
    if(a.score!=b.score)
        return a.score>b.score;
    return a.name<b.name;
}
JSOI爆零珂学家yzhang | 园豆:206 (菜鸟二级) | 2018-12-03 22:16

这个结构体 后面的不咋懂 今天刚学的结构体 所以不怎么习惯用它  您这个inline bool cmp函数是什么意思?

return a.name<b.name 和 return a.score>b.score是啥意思

支持(0) 反对(0) 打着玩 | 园豆:132 (初学一级) | 2018-12-03 22:24

@打着玩: sort快排

sort(XXX,XXX,cmp)是自定义排序

cmp函数就是执行这个自定义排序的函数

return a.name<b.name 和 return a.score>b.score

前者表示按名字字典序排序,后者表示按分数排序

先比较分数,再比较名字

支持(0) 反对(0) JSOI爆零珂学家yzhang | 园豆:206 (菜鸟二级) | 2018-12-03 22:26

@JSOI爆零珂学家yzhang: inline bool cmp(register person a,register person b)

前面的inline bool 是啥意思 可以没有嘛?

支持(0) 反对(0) 打着玩 | 园豆:132 (初学一级) | 2018-12-03 22:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册