| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 790 人关注过本帖
标题:有没有更简单发方法,求高手指教
只看楼主 加入收藏
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

2014-03-06 11:16
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define IN  1
#define OUT 0

struct record_word
 {
     char c[30];
     int n;
 } w[10000];

int main()
 {
     FILE *fp;
     int ch;
     int i, j, n = 0, t;
     int word = OUT;         // OUT表示现在读取的字符不属于一个单词, IN表示正在读取一个单词
    char s[30], lastc = ' ';  // lastc保存读取的前一个字符, 当现在的字符不是字母, 前一个是字母, 表示一个单词结束

    fp = fopen("case1.txt", "r");
     if (fp == NULL)
         exit(1);

     while ((ch = fgetc(fp)) != EOF) {
         if (isalpha(ch)) {
             ch = tolower(ch);
             if (word == OUT) {   // 当读取一个字母时, 判断是一个新单词的开始, 还是旧单词的一部分
                i = 0;
                 word = IN;
             }
             s[i++] = ch;
         }
      else if (ch == '\n' && lastc == '-')
             continue;                   // 读取连字符后面的回车符, 如果后面没有回车符的, 可以删除这句
         else if (isalpha(lastc)) {   // 如果读取的不是字母, 而前一个字符是字母, 表示一个单词结束, 则处理这个单词, 否则,不操作
            word = OUT;
             s[i] = '\0';
             for (j = 0; j <= n; j++)
                 if (strcmp(s, w[j].c) == 0) {
                     w[j].n++;
                     break;
                 }
             if (j > n) {
                 n = j;
                 w[j].n++;
                 strcpy(w[j].c, s);
             }
         }
         lastc = ch;
     }

     for(i=0; i<n&&i<5; i++)
     {
         t=0;
         for(j=1; j<=n; j++)
         {
             if(strcmp(w[j].c,"\0")!=0)
             {
                 if(w[j].n>w[t].n)  t=j;
                 else if(w[j].n==w[t].n)
                     if(strcmp(w[j].c,w[t].c)<0)
                         t=j;
             }
         }
         printf("%s %d\n",w[t].c,w[t].n);
         w[t].n=0;
     }

     fclose(fp);
     return 0;
 }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
测试数据用例 No.2

标准输入数据:
I am a student. My school is SCAU. It is a beau-
tiful university. I like it.
I am a student. My school is SCAU. It is a i-
s university. I like it.
1 2 3 4 5 6 7 8 9
12 12 12 12
II I


标准输出答案:
   1|i 5
   2|is 5
   3|a 4
   4|it 4
   5|am 2


你的错误输出结果:
   1|i 6
   2|a 4
   3|is 4
   4|it 4
   5|am 2
~~~~~~~~~~~~~~~~~~~~~~~~~~

[ 本帖最后由 qq471402415 于 2014-3-6 18:55 编辑 ]
2014-03-06 18:28
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
测试数据用例 No.2

标准输入数据:
I am a student. My school is SCAU. It is a beau-
tiful university. I like it.
I am a student. My school is SCAU. It is a i-
s university. I like it.
1 2 3 4 5 6 7 8 9
12 12 12 12
II I


标准输出答案:
   1|i 5
   2|is 5
   3|a 4
   4|it 4
   5|am 2


你的错误输出结果:
   1|i 5
   2|a 4
   3|is 4
   4|it 4
   5|am 2
~~~~~~~~~~~~~~~~~~~~~~~~~~我自己测试也有问题

[ 本帖最后由 qq471402415 于 2014-3-6 18:56 编辑 ]
2014-03-06 18:28
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
是不是编译器的问题~~~
2014-03-06 18:33
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
是不是编译器的问题~~~
2014-03-06 18:33
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
以下是引用qq471402415在2014-3-6 18:33:14的发言:

是不是编译器的问题~~~
不是编译器的问题, 是我代码的问题, 考虑不周, 我之前的结果对只能说是意外, 惭愧, 改来改去变得复杂了. 不好意思, 水平有限
之前是先读到回车符, 再判断前一个是不是连字符, 这样是错的, 因为读到回车的时候, 连字符已经计算过一次了,
现在改成读到连字符, 就再读取一个字符, 如果是回车, 就跳过,进入下一个循环, 如果是'-'而后一个不是回车, 那就把文件光标后退一个字符(因为红色位置读取了一个).
增加了一个变量 cn 用来保存中间读取的字符.

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define IN  1
#define OUT 0

struct record_word
{
    char c[30];
    int n;
} w[10000];

int main()
{
    FILE *fp;
    int ch, cn = '\n';     // cn初始化为'\n'
    int i, j, n = 0, t;
    int word = OUT;        
    char s[30], lastc = ' ';  

    fp = fopen("casel.txt", "r");
    if (fp == NULL)
        exit(1);

    while ((ch = fgetc(fp)) != EOF) {
        if (isalpha(ch)) {
            ch = tolower(ch);              
            if (word == OUT) { 
                i = 0;
                word = IN;
            }
            s[i++] = ch;
        }
        else if (ch == '-' && (cn = fgetc(fp)) == '\n')   // 修改条件
                  continue;
        else if (isalpha(lastc)) {  
            word = OUT;
            s[i] = '\0';
            for (j = 0; j <= n; j++)
                if (strcmp(s, w[j].c) == 0) {
                    w[j].n++;
                    break;
                }
            if (j > n) {
                n = j;
                w[j].n++;
                strcpy(w[j].c, s);
            }
        }
        if (ch == '-' && cn != '\n')   // 增加判断
            fseek(fp, -1L, 1);
        lastc = ch;
    }

    for(i=0; i<n&&i<5; i++)
    {
        t=0;
        for(j=1; j<=n; j++)
        {
            if(strcmp(w[j].c,"\0")!=0)
            {
                if(w[j].n>w[t].n)  t=j;
                else if(w[j].n==w[t].n)
                    if(strcmp(w[j].c,w[t].c)<0)
                        t=j;
            }
        }
        printf("%s %d\n",w[t].c,w[t].n);
        w[t].n=0;
    }

    fclose(fp);
    return 0;
}


这样的话, 改用一次读取一行的方法更方便了, 唉, 没自信了....
2014-03-07 09:40
快速回复:有没有更简单发方法,求高手指教
数据加载中...
 
   



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

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