欢迎使用CSDN-markdown编辑器

单词数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 54584 Accepted Submission(s): 13580

Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。

Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

Sample Input
you are my friend
#

Sample Output
4

WA了N次终于提交上了,最初没有看清题目,稀里糊涂的把课本上的代码敲了上去,WA了几次才发现题目读漏了“不同”两个字,本来以为需要换个思路,后来发现并不需要切换,只需后续补加几个步骤即可。
首先统计总单词数,然后求出重复单词数,两者求差即可得到。但是,求重复单词数时,必将将所有单词录入某个字符数组中,进行相互比较。于是遇见了第一个困难,怎么确保除去空格,只录入单词?于是利用现成的代码,进行了改造。Else if的条件是当空格后遇见的第一个字母,于是以此为起点,到下一个空格前的字母终止,于是利用do whil循环,在while循环里进行提前遍历,从而实现录入单词。但是在这一歩中出现了很多错误。
1. a[count][j-i]=str[j]。
这一语句最初写的是strcpy()函数,最后发现总是出错。。。。主要还是二维字符数组使用的不够熟练。
2. while(str[j]!=’ ‘&&str[j]!=’\0’);
while的条件最初只写了前半句,没有对后半句进行限制,最后输出出来后,发现会比输入的数据多出来很多乱码,于是想起来需要对数据的结尾进行控制。(因为数据最后还可能会有很多个空格,从而出现错误答案)。
3. int j=i;
这是第一个错误,没有看清楚,把它放在了do中。。。。。
将所有的单词录入后,便是单词相互比较求出重复单词数。最开始犯了一个很低级的错误,将strcmp函数写成了strcpy函数,甚至自己看了好多遍都没发现。在这一步也用了很多时间,出现大大小小的错误。
1. if(strcmp(a[i],a[j])==0&&strcmp(a[i],” “)!=0)
同上面的2一样,后半部分没有写上,于是出现了复数的情况。在输出所有结果后发现,进行遍历时,第一次被换为“ ”时,会和后续的“ ”重复,从而count–,导致出错。
2. memset(a,0,sizeof(a));
最初没有使用这一函数,于是出现了如果第二次相同位置的单词长度大于第一次的,会出现两个单词混在一起的情况,也就是可能只有第一的答案是正确的。所以需要用这个函数将数组数据重置。
最后把所有的代码粘上。

#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
    char str[500],ch,a[100][100];
    while(gets(str)){
        memset(a,0,sizeof(a));
        int count=0;
        int i=0,flag=0,j=0;
        if(str[0]=='#')
            break;  
        while((ch=str[i])!='\0'){   
            if(ch==' ')
                flag=0;     
            else if(flag==0){
                int j=i;
                flag=1;
                count++;
                do{
                    a[count][j-i]=str[j];
                    j++;

                }
                while(str[j]!=' '&&str[j]!='\0');
            }
        i++;
        }
//      printf("%d\n",count);
        int b=count; 
//      for(i=1;i<=count;i++)
//          printf("%s ",a[i]);
//          printf("\n");
        for(i=1;i<=b;i++){
            for(j=i+1;j<=b;j++){
//              printf("%d/%d\n",i,j);
//              printf("%s %s\n",a[i],a[j]);
//              printf("%d\n",strcmp(a[i],a[j]));
                if(strcmp(a[i],a[j])==0&&strcmp(a[i]," ")!=0){
                    count--;
                    strcpy(a[j]," ");
//                  printf("COUNT:%d\n",count);
                }
            }
        }
        printf("%d\n",count);  
    }
    return 0; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值