| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1217 人关注过本帖
标题:输入一行字符,输出最长的单词。怎么做。
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
扫描整个字符串是必不可免的。想办法详细分析整个字符串的构成,提取尽可能详细的信息,把字符串分解为单词数组是最明智的,如果仅仅为了单一的需求而设计算法,那是没多大用处的,因为需求一旦稍微变化,这种算法就失去作用,要重新设计算法,反而得不偿失。写程序是为了以后不再重复劳动,适应最大的变化可能,不要攻其一点不及其余。

这个题目本来可以锻炼很多编程技能,但为了做题而做题,就失去了题目的意义。

授人以渔,不授人以鱼。
2013-08-02 11:53
艺术的生活
Rank: 2
等 级:论坛游民
帖 子:51
专家分:77
注 册:2013-7-28
收藏
得分:0 
回复 10楼 TonyDeng
我现在会了。
思路就是顺序扫描。如果不是空格就累加,如遇到空格或者0累加就停止。每扫描完一个单词就用一个变量保存它的长度,并和一个变量max比。max初值为0.如果比max大,就把它赋给max。这样全部扫描完毕之后,max里保存的就是最长的那个单词的长度。

可是这样有一个问题。如果一句话当中有好几个最长的单词呢。比如:what is your name.
这句话当中有what 、your、name共3个单词的长度为4.所以应该输出:
what:4
your:4
name:4

我看了网上其它的一些代码,他们好像都是只输出一个最长的。
是不是可以用二维数组来解决?把每一个单词放到二维数组的第二维当中,然后用一个for来判断所有单词的长度(用strlen),并记录最大的有几个。

2013-08-02 19:01
艺术的生活
Rank: 2
等 级:论坛游民
帖 子:51
专家分:77
注 册:2013-7-28
收藏
得分:0 
回复 11楼 TonyDeng
你讲的很对
2013-08-02 19:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,用二维数组储存提取的单词,或者把单词转到文件上,还可以考虑标点符号不算在单词内。

授人以渔,不授人以鱼。
2013-08-02 19:39
艺术的生活
Rank: 2
等 级:论坛游民
帖 子:51
专家分:77
注 册:2013-7-28
收藏
得分:0 
呵呵,文件操作还不会。我学C还没多久呢。
我好像弄出来了。
可以把一行字符中所有最长的单词都提取出来。你看看,提点意见吧,我知道你是高手。
程序代码:
#include <stdio.h>
#include <string.h>
main()
{
    char a[20][20];//定义二维数组,可存储20个,每个最长为20的单词
    int i,j,len,max=0;
    char c ;
  
    printf("请输入一行字符,以回车结束: ");
    for(i=0;i<20;++i)
    {
        j=0 ;//j每次都要从0开始
        while((c=getchar())!='\n'&&c!=' ')//当输入的字符不为回车或者空格时
        {
            a[i][j]=c;
            j++;
        }
        if(c==' ')   a[i][j]='\0' ;//如果扫描到是空格,则加0
        if(c=='\n')//如果扫描到是回车,则加0并退出
        {
            a[i][j]='\0' ;
            break ;
        }
    }
    len=i+1 ;//len就是单词的个数
    for(i=0;i<len;++i)//此循环找到最大单词的个数并保存在max中
    {
        if(max<strlen(a[i]))
               max=strlen(a[i]);
          
    }

 
      for(i=0;i<len;++i)//此循环把所有长度等于max的单词都输出
     {
          int t;
         if(strlen(a[i])==max)
             {
             t=i;
             printf("最长的单词为%s,长度为%d\n",a[t],max);
             }
     }    

 
}
代码:

[ 本帖最后由 艺术的生活 于 2013-8-2 20:48 编辑 ]
2013-08-02 20:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
// 求最长单词

#include <stdio.h>

const int word_max_length = 80;         // 每个单词的最大长度
const int word_max_quantity = 100;      // 文本容许的单词最大数量

void main(void)
{
    int ch;                                                     // 键入的字符
    char words[word_max_quantity][word_max_length];             // 储存单词清单的二维数组
    int lengths[word_max_quantity];                             // 储存单词长度的数组
    int max_length = 0;                                         // 单词最大长度

    int number = 0, index = 0;
    bool in_word = false;                                       // 标识当前扫描指示器是否处于单词中

    printf_s("Please type your text (Press <Enter> to end):\n");
    do
    {
        ch = getchar();
        if (ch == ' ' || (ch == '\n'))
        {
            if (in_word)
            {
                lengths[number] = index;
                if (lengths[number] > max_length)
                {
                    max_length = lengths[number];
                }
                in_word = false;
                ++number;
                index = 0;
            }
        }
        else
        {
            if (!in_word)
            {
                in_word = true;
            }
            words[number][index++] = ch;
            words[number][index] = '\0';
        }
    } while (ch != '\n');
   
    printf_s("\nWords list:\n");
    for (index = 0; index < number; ++index)
    {
        printf_s("%c [%s], %d\n", (lengths[index] == max_length) ? '*' : ' ', words[index], lengths[index]);
    }
    printf_s("max_length is %d\n", max_length);

    printf_s("\nPress any key to continue...");
    getchar();
}


如果你的编译器不是VC,把printf_s()函数名改为printf()。

注:这里回避了使用结构体数组,是假定你没学到。除了使用printf()和getchar(),没有使用别的函数,是最基本的方法了。随着你以后学到更多的知识,尽可以改动,比如用结构体、动态内存、C++的容器……等等。不要使用scanf()或gets(),会遇到很多麻烦的问题。

[ 本帖最后由 TonyDeng 于 2013-8-4 00:21 编辑 ]

授人以渔,不授人以鱼。
2013-08-04 00:14
艺术的生活
Rank: 2
等 级:论坛游民
帖 子:51
专家分:77
注 册:2013-7-28
收藏
得分:0 
回复 16楼 TonyDeng
真的非常感谢。

我先把你的程序好好学习一下,然后想一想如果加上标点的话应该怎么处理。
再次感谢。
2013-08-04 16:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我发觉你对乱码有兴趣,小心入了魔道。纯粹友情提醒,可以不听。

授人以渔,不授人以鱼。
2013-08-04 20:58
快速回复:输入一行字符,输出最长的单词。怎么做。
数据加载中...
 
   



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

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