[必做 2] 读取小文本文件A_Tale_of_Two_Cities.txt 统计某一指定单词在该文本文件中出现的频率。

结对对象:刘雨恬

  博客网址:http://www.cnblogs.com/liuyutian/

  github链接:https://github.com/liuyutianlyt/EX_4.md

  贡献比例:1:1

  预估时间:由于已经有了上次作业的基础,我的预估时间是一个小时。在此次任务完成后,我确实也只花了1个小时!

   这次的任务只是在上次作业的基础上减少了一个输出流文件,但是需要查找指定单词的频率。因此首先我设置了一个字符型变量x;在与先前已统计好的数组,作比较,找到相同的便输出就好。

 

源代码:

#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;

struct WORD {                           /* 创建一个结构体 */
    int    count;
    char    s;
    void    exchange( Word &word )  /* 交换单词 */
    {
        string    tStr    = word.Str;
        int    tCount    = word.Count;
        word.Str    = Str;
        word.Count    = Count;
        Str        = tStr;
        Count        = tCount;
    }
};
} w[100];

bool isword( char a[] ) /* 判断是否是一个单词 */
{
    int i = 0;
    for ( i = 0; a[i] != '\0'; i++ )
        if ( (a[i] >= 'a' && a[i] <= 'z') || (a[i] >= '0' && a[i] <= '9') )
            return(true);
        else
            return(false);
}


int judge( char b[], int n )                            /* 判断该单词是否出现过 */
{
    if ( n > 0 )
        for ( int i = 0; i < n; i++ )
        {
            if ( !strcmp( b, &w[i].s ) )    /* 出现 */
            {
                w[i].count++;
                return(-1);
            }
        }
}


void SortWordDown( Word * words, int size )  /* 降序排序 */
{
    for ( int i = 0; i < size; i++ )
    {
        for ( int j = 0; j < size - 1; j++ )
        {
            if ( words[j].Count < words[j + 1].Count )
            {
                words[j].exchange( words[j + 1] );
            }
        }
    }
}


int main( void )
{
    char result[500];

    char *ptr;
    ifstream file( "c://A_Tale_of_Two_Cities.txt" ); /* 读取 */
    if ( !file )
    {
        cout << "不能打开文件";
    }
    while ( !file.eof() )
    {
        file.getline( result, 500 );
    }
    file.close();
    int j = 0; /* 大写转小写 */
    while ( result[j] != '/0' && result[j + 1] != '/0' )
    {
        if ( result[j] >= 'A' && result[j] <= 'Z' )
        {
            result[j] = result[j] - 'A' + 'a';
            j++;
        }
    }
    cout << result;
    char *sep = " ";

    int i = 0;
    ptr = strtok( result, " " );            /* 利用strtok函数来分割result字符串中的单词 */
    while ( ptr != NULL )
    {
        if ( isword( p ) != false )
        {
            if ( judge( p, n ) != false )
            {
                w[n].s = *p;    /* 赋值给数组 */
                n++;
            }
        }
        ptr = strtok( NULL, " " );
    }
    int t = 0;
    char x[8];
    cout<<"请输入需要统计的单词:"; 
    cin>>x;                                        /*输入需要统计的单词*/
    while (! strcmp(w[t].s,x))                     /*查询比较所需统计的单词*/   
    {
        t++;
    }
    cout<< w[t].s << "" << w[t].count << '\n';      /* 输出统计结果 */
    return(0);
}

结果示例:

总结:这几次的作业感觉是那种层层递进的感觉,每次都是在前面的基础上去增加知识点,让我慢慢的学到了很多。这次的主要任务是去比较查找。我和我的搭一起翻阅书籍,在共同的努力下完成了这次对的作业。