第一次作业

要求0 作业要求:

https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110

 

要求一

git地址:【https://git.coding.net/hanyh343/wf.git

 

要求二

psp阶段表格

 

任务

预计花费时间

(分钟)

实际花费时间

(分钟)

储备知识,查询资料

180

220

编写、测试功能一

文件读取

程序编写

统计单词数量及输出

30

5

20

5

60

10

45

5

编写、测试功能二

在功能一的基础上修改需求

测试功能二,并修改错误

55

30

25

100

60

40

编写、测试功能三

需求分析及修改

测试功能三

25

15

10

45

25

20

分析预计时间与实际时间差距

  1. 没有考虑到自己的技术在实际操作中会遇到一些棘手的问题,比如一些bug的修改
  2. 主要还是对C++C#java的掌握的不熟练,特别是一些函数、包的运用,有些函数不

常用,所以运用起来不是很熟练

  1. 没有把作业要求理解透彻,学好语文很重要

要求三:

1.解题思路描述

首先看到这个作业的时候我的脑子是毫无头绪的,需要花费时间缕清思路。然后我在博客上看了一些关于coding.netgit的使用方法,之前未曾接触过,git的使用、仓库的建立等理解起来有些困难,同时也在图书馆借阅了一些C++等编程语言用书,大一的时候虽然接触过,但印象并不是很深。而且也不太清楚本地和远程仓库的关系,代码应该在哪里编写及修改,后来看了一些资料和问比较清楚的同学才有了一些头绪,而且作业涉及到文件,基础薄弱的我感觉会很难编写。虽然看了一些关于文件的基础知识,但是实际完成一个任务还是很困难的,本来以为三个功能是有关联的,实现一个其他几个也就很容易了,低估了它的难度,高估了我的智商。

参考博文地址:【http://www.cnblogs.com/life-for-test/p/6284041.html

2.重点代码展示

文本的读入通常使用fopen、fread、fclose内置函数接口,但是读入的文本需要存储在字符串数组中。另外C++标准库实际上有定义类似流输入输出iostream库类似的文本流读入操作。fstream头文件中有定义文本流操作的类。我们只需要实例化一个fstream类对象,通过类对象完成复杂的文本处理工作,并且获取文本可以保存在string字符串类对象中。 

  #include<fstream>
    #include<string>
    string strFile, tmp;
    ifstream file("wf.txt");      //读取当前文件夹下wf.txt文件
    while(getline(file, strFile))//直到文件结尾,依次逐行读入文本
    {
        strFile.append(tmp);    //每次读入一行附加到strFile结尾
        tmp.clear();            //记得清除,否则上一次读入比这次文本长,不会完全覆盖而出错
    }   

2.排除符号位影响,将整个文件的符号位都去掉或者替换成空格。判断哪个字符是否是符号位,主要借助了标准库cctype中的ispunct()函数接口,如果某个字符是符号位(‘,’,’.’ ,’!’等等)就返回True。

  #include<cctype>
    #include<string>
    for (int i = 0; i<strFile.length(); i++)
    {
        if (ispunct(strFile[i]))   
            strFile[i] = ' '; //符号位替换成为空格
    }

3.当一大串文本句子存储在了string对象中,处理单词就需要借助字符串流处理的功能。类似cin和cout,因为经过符号位去除操作后,所有单词是相互空格隔开的,只需要遇到空格读入一个单词即可。sstream头文件定义的stringstream类可以依次流操作读出或者读入一个单词,直到句子结束。

 #include<sstream> 
    stringstream ss(strFile); //先将文本句子载入流中,类似控制端键盘输入一段话
    string strTmp;
    while (ss >> strTmp)      //依次从流中读入每个单词
    {
     //###  每个word处理程序处
    }    


  4.单词的统计是我们程序的重点,此处使用的方法是关联容器由于基于哈希表的unordered_map查询和插入的时间复杂度是常数级,比基于红黑树的map对数级还要快,所以这里使用键值对记录的unordered_map数据结构。其中键对应单词string,值对应出现的频率int。

#include<string>
#include<iterator>
#include<unordered_map>

using namespace std;

unordered_map<string, int> strMap;  //保存的结果
void countWord(stringstream &ss)
{
    //依次读入单词
    string strTmp;
    while (ss >> strTmp)
    {
        unordered_map<string, int>::iterator it = strMap.find(strTmp);
        if (it == strMap.end()) //strMap中如果不存在当前单词则插入一个新键值对,出现频率为1
        {
            strMap.insert(unordered_map<string, int>::value_type(strTmp, 1));
        }
        else                   //如果存在则出现频率+1
            strMap[strTmp]++;
    }
}

 

 

#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<iterator>
#include<cctype>
#include<unordered_map>
using namespace std;

unordered_map<string, int> strMap;  //保存的结果
/***从字符串流中依次读入单词记录出现频率***/
void countWord(stringstream &ss)
{
    //依次读入单词
    string strTmp;
    while (ss >> strTmp)
    {
        unordered_map<string, int>::iterator it = strMap.find(strTmp);
        if (it == strMap.end())
        {
            strMap.insert(unordered_map<string, int>::value_type(strTmp, 1));
        }
        else
            strMap[strTmp]++;
    }
}

int main()
{
    //读入文档
    string strFile, tmp;
    fstream file("wf.txt");
    while(getline(file, strFile))  //!file.eof()
    {
        strFile.append(tmp);
        tmp.clear();
    }   
    //去除符号
    for (int i = 0; i<strFile.length(); i++)
    {
        if (ispunct(strFile[i]))   
            strFile[i] = ' ';
    }
    //统计字符
    stringstream ss(strFile);
    countWord(ss);    
    //打印结果
    unordered_map<string,int>::const_iterator it;
    for (it = strMap.begin(); it != strMap.end(); ++it)
        cout << it->first << "=" << it->second << endl;
    cout << endl;
    return 0;
}

 

 

 

收获

 

 整个作业下来就是自己的基础太差,重点代码还是靠网络搜索,掌握一门语言靠几个小时几天是远远不够的,查阅几个小时的资料只能懂这个知识点的浅层意思,自己练的代码量太少,缺乏锻炼,通过这次作业明白技术流也是要靠持之以恒的训练出来的,以后会更加努力的鸭,加油鸭!

posted @ 2018-09-21 10:39  蔡蔡子  阅读(205)  评论(1编辑  收藏  举报