• 软工实践第二次作业


    WordCount

    GitHub项目地址

    PSP表格:

    解题思路描述:

    由于程序要求从命令行读入文件,所以需要c++输入输出流的知识,题目要求得到文件的字符数,我是逐个字符累计,对于求文件行数,文件单词数,所以我采取按行读取文件的字符串,每一行再分别统计单词数的方法。重点就在于文件流的操作和对字符串的操作。我通过网络和书本了解到了相关资料。

    设计实现过程

    从命令行读入文件,用ifstream类读取文件信息,用ofstream类写入文件。对于得到的字符串,用到了vector类,能方便的储存字符串数组及其相关信息,题目的关键是分割字符串,提取其中的单词,我用到split()方法,但c++标准库中没有这个方法,需要自己实现。将单词的信息,存放在结构体数组中,再进行排序,即可得到结果。每个功能模块都独立为一个函数,每实现一个模块,就用单元测试对其测试。

    改进的思路

    一开始用同结构体数组保存单词的数据,发现静态的数组面对大文本时,程序会崩溃,所以改用vector,动态保存单词数据。
    vector的排序直接用了自带的快速排序,效率比冒泡排序高。

    代码说明

    //对字符串用指定的分隔符分割
    vector<string> split(const string &s, const string &t) {//s为待处理的字符串,t中存放分隔符
    	vector<string> result;//存放产生的字符串数组
    	typedef string::size_type string_size;
    	string_size i = 0;
    
    	while (i != s.size()) {
    		//找到字符串中首个不等于分隔符的字母;
    		int flag = 0;
    		while (i != s.size() && flag == 0) {
    			flag = 1;
    			for (string_size x = 0; x <t.size(); ++x)
    				if (s[i] == t[x]) {
    
    					++i;
    					flag = 0;
    					break;
    				}
    		}
    
    		//找到又一个分隔符,将两个分隔符之间的字符串取出;
    		flag = 0;
    		string_size j = i;
    		while (j != s.size() && flag == 0) {
    			for (string_size x = 0; x < t.size(); ++x)
    				if (s[j] == t[x]) {
    					flag = 1;
    					break;
    				}
    			if (flag == 0)
    				++j;
    		}
    		if (i != j) {
    			result.push_back(s.substr(i, j - i));
    			i = j;
    		}
    	}
    	return result;
    }
    

    收获

    通过第一次的实践,我发现我的c++基础太薄弱了,一些文件流的知识很生疏,知识的拓展也不够,一些很好的头文件不会使用,好多次代码做到后面,发现前面的功能模块实现有问题,思路比较乱,做一个项目感觉与以往的作业有很大不同之处,不仅要考虑到算法的实现,能得到正确答案,一些模块的独立性或代码排版布局规划也需要重视。但是,通过这次实践,我也学到了很多,比如单元测试和性能测试的方法。通过查找资料也了解到了c++一些方便的数据结构。总之,这是一次很有意义的实践作业。

  • 相关阅读:
    js 数组去重求和 (转载)
    表格插件汇总(转载)
    SQL Server 用一张表的数据更新另一张表的数据(转载)
    C#创建DataTable(转载)
    C# DataTable 和List之间相互转换的方法(转载)
    维度表,实体表,事实表之间的关系
    Scala中foldLeft的总结
    Scala集合Map
    从合并两个Map说开去
    UDAF(用户自定义聚合函数)求众数
  • 原文地址:https://www.cnblogs.com/void-lambda/p/9629816.html
Copyright © 2020-2023  润新知