| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1351 人关注过本帖
标题:每日一题!NO.4(适合新手做练习)-[统计字符问题](给出答案)
只看楼主 加入收藏
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
结帖率:91.67%
收藏
已结贴  问题点数:2 回复次数:27 
每日一题!NO.4(适合新手做练习)-[统计字符问题](给出答案)
题目:输入一行字符(字符串),统计其中包含多少单词,单词之间用空格分开
      附加要求:需要验证统计的单词是合法的,也就是说统计的单词字符是字母,(谢谢5楼的提醒)

题不难
希望新手们动哈手,错了大家为你找出错误,不要害羞,实践出真理,
注意加注释哦!先前自己太少看给出评论了,呵呵,我尽量发更多时间学习你们的成果,
(由于要考试了,怕挂课,我又不是计算机专业,只是喜欢。所以得发时间去背我们专业的资料,请大家谅解)
图片附件: 游客没有浏览图片的权限,请 登录注册

加入了符号的判定把符号也当成空格,添加非单词的验证!
但是还是不能完全满足实际英文判定的要求,比如说 有些单词中有-符号,还是由于英语一直没学好过,所以就这样吧!
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    int ch, space=0, wd=0;//定义变量
    char put[100];
    gets(put);
    if(put[0]==' ')//判断第一个字符是不是空格
    {
        space=1;
    }
    for(int i=0;put[i]!='\0';i++)//循环扫描
    {
        if(put[i]==' '||put[i]=='.'||put[i]=='!'||put[i]=='?'||put[i]==',')//判断是否出项空格,标点符号
        {
            if(space==0)//判断是不是非连续的空格或符号
            {
                wd+=1;//加一个单词(没有验证是不是非法单词)
                space=1;//标志已经出现了空格和字符
                ch=0;//标致这个单词还没出现非法字符
            }
        }
        else
        {
            if((put[i]<39||(39<put[i]&&put[i]<65)||(90<put[i]&&put[i]<97)||122<put[i])&&ch==0)//判断单词是否出现非法字符
            {wd-=1;//出出项非法字符把这个单词就为非法的,减一个
              ch=1;//ch=1,表示这个单词中已经出非法字符
            }
            space=0;//表示下一个出现的字符为非连续空格或符号
        }
    }
    if(space==0)//如果最后没有出现的空格或字符,单词数加一
    {
        wd+=1;
    }
    printf("%d",wd);

}


[ 本帖最后由 啊C 于 2011-6-8 21:52 编辑 ]
搜索更多相关主题的帖子: 计算机专业 统计 
2011-06-07 23:14
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
统计空格数然后 + 1 就好。连续空格当做一个处理
2011-06-07 23:22
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 


[ 本帖最后由 cosdos 于 2011-6-8 01:26 编辑 ]

—>〉Sun〈<—
2011-06-08 01:03
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    int ch, space=1, wd=0;
    while( (ch=getchar())!='\n' && ch != EOF )
    {
        if(space && !isspace(ch)) {
                wd++;
                space=0;
        }
        else
            space=isspace(ch);
    }
    printf("%d", wd);
    system("pause");
    return 0;
}

[ 本帖最后由 cosdos 于 2011-6-8 01:22 编辑 ]

—>〉Sun〈<—
2011-06-08 01:11
cxs365
Rank: 2
等 级:论坛游民
帖 子:32
专家分:30
注 册:2011-5-6
收藏
得分:2 
这个题目出的不是很好,尽管大家都明白题目的意思。要求是输入字符(串),那么“@#¥%…&*”这些都算,但是你不能说它们是单词。
统计单词之间的空格数就知道单词的个数,也不一定正确。如果输入的第一个字符就是空格呢?还有输入的最后一个字符也加上一个空格呢?
新手,答案正在思考中……

每天前进一小步!
2011-06-08 07:56
滊乐天天
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-6-4
收藏
得分:0 
找下书就能找得到的东西。。。   不用思考太久。。。   看下书怎么解释的就行了。。
2011-06-08 09:10
cq7610
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:28
专家分:111
注 册:2010-11-17
收藏
得分:0 
以前写的统计文章里单词出现的次数,原来想借此分析单词的频率,好重点记忆,结果出现的全是冠词连词啥的,很失败的构思。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct MYDATA{
        char sword[30];
        int ncount;
        struct MYDATA* pnext;
}MYDATA;

int main(void)
{
        FILE* fps;
        FILE* fpt;
        FILE* fpd;
        char ctemp;
        char stemp[50];
        MYDATA* phead = NULL;
        MYDATA* pcurrent = NULL;
        MYDATA* ptemp = NULL;
        int nexist = 0;
        int nmax = 0;
        int i;

        if((fps = fopen("test.txt", "r")) == NULL){
                printf("打开指定文件失败,");
                system("pause");
                return 0;
        }

        if((fpt = fopen("temp.txt", "wt+")) == NULL){
                printf("创建临时文件失败,");
                system("pause");
                return 0;
        }

        while(!feof(fps)){
                ctemp = fgetc(fps);
                if(ctemp >= 97 && ctemp <= 122 || ctemp == 39){
                        fputc(ctemp, fpt);
                }
                else{
                        if(ctemp >= 65 && ctemp <= 90){
                                fputc(ctemp + 32, fpt);
                        }
                        else{
                                fputc('\n', fpt);
                        }
                }
        }

        fclose(fps);

        rewind(fpt);

        while(!feof(fpt)){
                fscanf(fpt, "%s", stemp);

                if(phead == NULL){
                        phead = (MYDATA*)malloc(sizeof(MYDATA));
                        strcpy(phead->sword, stemp);
                        phead->ncount = 1;
                        phead->pnext = NULL;
                        pcurrent = phead;
                        if(nmax <= phead->ncount)
                                nmax = phead->ncount;
                }
                else{
                        ptemp = phead;
                        nexist = 0;

                        while(ptemp != NULL){
                                if(strcmp(ptemp->sword, stemp) == 0){
                                        ptemp->ncount++;
                                        nexist = 1;
                                        if(nmax <= ptemp->ncount)
                                                nmax = ptemp->ncount;
                                }
                                ptemp = ptemp->pnext;
                        }

                        if(nexist == 0){
                                ptemp = (MYDATA*)malloc(sizeof(MYDATA));
                                strcpy(ptemp->sword, stemp);
                                ptemp->ncount = 1;
                                ptemp->pnext = NULL;
                                pcurrent->pnext = ptemp;
                                pcurrent = ptemp;
                                if(nmax <= ptemp->ncount)
                                        nmax = ptemp->ncount;
                        }
                }
        }
        
        fclose(fpt);
        remove("temp.txt");

        if((fpd = fopen("data.txt", "w")) == NULL){
                printf("创建数据文件失败,");
                system("pause");
                return 0;
        }

        for(i = nmax; i > 0; i--){
                ptemp = phead;
                while(ptemp != NULL){
                        if(ptemp->ncount == i){
                                fprintf(fpd, "%-20s%d\n", ptemp->sword, ptemp->ncount);
                        }
                        ptemp = ptemp->pnext;
                }
        }

        fclose(fpd);

        printf("程序运行结束!");
        system("pause");
        return 0;
}
2011-06-08 10:25
爱你521226
Rank: 2
等 级:论坛游民
帖 子:25
专家分:34
注 册:2011-3-31
收藏
得分:0 
7楼你好强啊,向你致敬。向你学习。
2011-06-08 10:32
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
以下是引用cxs365在2011-6-8 07:56:37的发言:

这个题目出的不是很好,尽管大家都明白题目的意思。要求是输入字符(串),那么“@#¥%…&*”这些都算,但是你不能说它们是单词。
统计单词之间的空格数就知道单词的个数,也不一定正确。如果输入的第一个字符就是空格呢?还有输入的最后一个字符也加上一个空格呢?
新手,答案正在思考中……
恩,说得对,是我大意了,还要要求输入的是字母,对吧!

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-08 11:53
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
以下是引用voidx在2011-6-7 23:22:29的发言:

统计空格数然后 + 1 就好。连续空格当做一个处理
如果单词之间出显多个空格!就不能实现了!

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-08 11:56
快速回复:每日一题!NO.4(适合新手做练习)-[统计字符问题](给出答案)
数据加载中...
 
   



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

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