| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 596 人关注过本帖, 1 人收藏
标题:【求助】在设计一个【单词统计】程序上遇到了困难,求大神们帮助一下小弟
只看楼主 加入收藏
boboxing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-6
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:6 
【求助】在设计一个【单词统计】程序上遇到了困难,求大神们帮助一下小弟
最近学习了C语言,老师让我们设计一个统计一个英文文本里的某些单词数量,但是本人比较渣,设计的程序不完善,比如当输入if 时,统计的个数是正确的,但是如果if 和 i 一起输入的话,或者输入wonder和wonderful时,else和el时统计的个数就会出错,这是什么回事呢,求大神帮我完善一下程序。。。

题目是这样的:a)    单词统计
【问题描述】统计某篇英文小说中某些单词的出现次数。
【实现提示】英文小说存储在一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后全部完成。输出的每个单词的出现次数。约定小说中的词汇一律不跨行,这样每从文本文件中读入一行,就统计每个单词在这行中出现的次数,直到文件结束。
要求在程序运行时才输入文本文件名和要统计的词汇。



以下是我设计的程序:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int comp(char text[], char key[])
{
int i, j, res;
int flag;
res = i =j = 0;
while(text[j] != '\0')
{
while (!(text[j] <= 'z' &&text[j] >='a')|| (text[j] <='Z' &&text[j] >= 'A'))
j++;
flag = 1;
i = 0;
while(key[i] != '\0' && flag == 1)
{
if (key[i] != text[j + i])
flag = 0;
i++;
}
if (flag && !(text[j+i] <= 'z' && text[j+i] >='a') || (text[j+i] <='Z' && text[j+i] >='A'))
{
res++;
}
while((text[j] <= 'z' && text[j] >='a') || (text[j] <='Z' && text[j] >='A'))
j++;
}
return res;
}
int main()
{
FILE *fp1;
int ans[1024],i,k;
char text[1024], key[512][1024],root[1024];
memset(ans,0,sizeof(ans));
printf("Please input the root ofyour file:");
scanf("%s", root);
fp1 = fopen(root,"r");//C:\\Users\\LonG\\Desktop\\a.txt
printf("Please input the numberof the words that you want to check:");
scanf("%d", &i);
for(k = 0; k < i; k++)
{
scanf("%s",key[k]);
}
while(fgets(text,1024,fp1)!=NULL)
{
for(k =0;k < i;k++)
{
ans[k] += comp(text,key[k]);
}
}
for(k =0; k < i; k++)
{
printf("%s : %d \n",key[k], ans[k]);
}
scanf("%s", key[0]);
fclose(fp1);
return 0;
}


[ 本帖最后由 boboxing 于 2013-11-6 10:40 编辑 ]
搜索更多相关主题的帖子: 文本文件 英文小说 wonder C语言 
2013-11-06 02:21
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:3 
统计文件内的单词数量, 只要一个一个的读取字符,
然后判断: 1.是字母,
2.这个字母是单词的第一个字符还是中间的字符.
3.是第一个,单词数加1, 是中间的,就读下一个字符判断.
我发个代码你参考一下.因为我在台资厂上班,所以注释是繁体的.
程序代码:
#include <stdio.h>

int main()
{
    FILE* fp;      
    char fname[40];                           // 文件名, 輸入時有後綴要加後綴
    char lastc;                               // 用來判斷字符.
    int  c;
    int  nw;                                  // 單詞數量

    nw = 0;
    lastc = 0;                                // 等於0表示輸入的不是字符, 等於1 表示輸入的是單詞.
   
    // 輸入文件名,打開文件
    printf("please enter file name:");
    gets(fname);

    if ((fp = fopen(fname, "r")) == NULL) {
        printf("cannot open file.\n");
        exit(0);
    }

    // 讀取字符, 統計單詞數
    while ((c = getc(fp)) != EOF) {
        if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {  // 1. 判斷是不是字母
            if (lastc == 0)                                      // 2. 判斷是不是第一個字符, lastc=0,是第一個,=1是單詞中間的字符.                     
                nw++;                                            // 3. 單詞數加1.
            lastc = 1;                                          
        }
        else
            lastc = 0;
    }

    // 輸出單詞數
    printf("There are %d words in this file.\n", nw);

    fclose(fp);
    return 0;
}

 
2013-11-06 10:07
boboxing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-6
收藏
得分:0 
回复 2楼 pangshch
您这个程序是统计单词的总个数吧,可能我描述的不太清楚,我的程序要求是统计某个单词出现的次数,我把题目也发上去了,如果您方便的话就再帮小弟看看吧,谢谢呀!
2013-11-06 10:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:1 
while(fgets(text,1024,fp1)!=NULL) 这一句不对吧,似乎题目中并没有限定一行的长度
另外,题目中也没有限定单词的长度,这对C而言就难办了(C++中有std::string)
还有,题目也没有对“单词”有什么定义,比如
the People's Republic of China 中 People's 算一个单词,还是 People 和 s 算两个单词,还是 People 算一个单词?
snow-white paper 中 snow-white 算一个单词,还是两个单词?

如果什么也不考虑,很简单
先将 keys 用qsort函数排序,然后不停的用 fscanf("%s") 从文件中读单词,然后用 bsearch函数 在keys中找,找到就加1
2013-11-06 12:38
boboxing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-6
收藏
得分:0 
回复 4楼 rjsp
其实什么都不用考虑的,只需要搜索普通的单词的就行,现在的情况是统计一整个单词时不会出错,输入单词的其中一个字母时就会出错,我的程序不会识别一整个单词还是一个字母,是不是缺了一个检索单词长度的东西啊?
2013-11-06 12:53
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:6 
我发个代码试试, 因为软件的问题, 注释是繁体的.
没有考虑像 don't 这样的缩写.
程序代码:
/* 統計文本文件中單詞出現次數

 * 思路是: 1. 讀入一行後, 用strstr()函數查找單詞最先出現的位置

 *         2. 再分別對比它左邊和右邊是不是字母. (是字母就說明它只是另外一個單詞的一部分),

 *         3. 移動指針指向單詞後一個位置. 

 *         4. 循環到行尾.

 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXWORD 15                        // 單詞的最大長度
#define MAXLINE 256                       // 讀入行的最大長度
#define MAXNUM  100                       // 要統計的最大單詞數

int main()
{
    FILE *fp;
    char name[20];
    char word[MAXNUM][MAXWORD];           // 保存要統計的單詞
    char str[MAXLINE];                   
    char *p;                              // 指向單詞在行中最先出現的位置
    char *q;                              // 指向單詞後一個位置
    int i, nword;
    int *val;                            
    int len;
    int left = 0, right = 0;              // 0表示前面不是字母,1表示是字母
    char ch;

    printf("輸入文件名:");
    gets(name);
   
    if ((fp = fopen(name, "r")) == NULL) {
        printf("cannot open file.\n");
        exit(0);
    }

    printf("輸入要查找的單詞個數:");
    scanf("%d", &nword);

    val = calloc(sizeof(int), nword);                       // 用calloc()直接初始化為0
    if (val == NULL) {
        printf("不能分配內存\n");
        exit(0);
    }

    printf("輸入要統計的單詞\n");
    for (i = 0; i < nword; i++) 
        scanf("%s", word[i]);

    while (fgets(str, MAXLINE, fp))
        for (i = 0; i < nword; ++i) {
            q = str;
            len = strlen(word[i]);
            while (p = strstr(q, word[i])) {
                if (p != q) {                      // 如果找到位置不是開始的地方就要判斷兩邊
                    ch = *(p-1);
                    if (!isalpha(ch))
                        left = 0;
                    else left = 1;
                    ch = *(p+len);
                    if (!isalpha(ch))
                        right = 0;
                    else right = 1;
                if (left == 0 && right == 0)
                        val[i]++;
                }
                else {                            // 如果找到的位置是開始的地方,就只要判斷後一個字符      
                    if (!isalpha(*(p+len)))
                        right = 0;
                    else right = 1;
                    if (right == 0)
                        val[i]++;
            }
            q = &p[len];
            }
        }

    for(i = 0; i < nword; i++) {
        printf("%s : ", word[i]);
        printf("%d\n", val[i]);
    }
    fclose(fp);
    free(val);
    return 0;
}


 
2013-11-06 17:10
boboxing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-6
收藏
得分:0 
回复 6楼 pangshch
我觉得你这个思路不错,怎么我之前就没想到呢,谢谢您的帮助
2013-11-06 18:25
快速回复:【求助】在设计一个【单词统计】程序上遇到了困难,求大神们帮助一下小 ...
数据加载中...
 
   



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

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