• 计算与软件工程 作业四_2


    作业一:代码规范复审

    见链接:代码规范复审

    作业二:结对编程

    作业要求见链接: 作业要求中的作业2
    参考的博客: 关于C++的文件操作:博客1博客2
    关于CSV文件:博客1博客2

    本次的作业是在我和舍友的合作下共同完成,两人进行结对编程,最后是通过C++语言实现对红楼梦和水浒传简单的按章节的人物统计。中间经历了前期准备、线上结对编程以及后期完善,并将代码托管到了gitee上。

    结对编程的过程

      第一次体验结对编程,不可否认的是结对编程的的确能够带来很多独自编程没有的好处,它有助于我们对作业更全面的认识,包括经验的共享与知识的共享、对于为什么做、怎么做和做什么会有更明确思路和清晰的想法;并且与同伴间的互相交流和鼓励能使我们在编程的路上走得更远。
    一、前期准备
      在老师发布作业后,先是大致了解了一下作业内容,在作业一(代码复审)大致完成后逐步开始了作业二的准备。本次的结对编程我和舍友李晓萱组的队,她的博客主页见-->_L_L<--.前期我们先各自进行一些相关的网页文献和程序代码的查阅和搜集,然后分享和交流。发现网上实现对红楼梦等名著的人物统计的程序大多是通过Python,Python的确很强大,emm但是没有接触过,电脑内存也比较紧张,所以两人商量后,决定先用平时接触较多的C++来试试。因为C++无法直接绘制图表,而CSV文件可以直接用Excel打开,于是我们决定,仅用C++程序来统计数据,结果输出到CSV文档后,使用Excel进行图表的绘制。在人物的统计方面,最后决定选择:"宝玉","黛玉","贾母","凤姐","袭人","探春","宝钗","贾琏","平儿","贾政"这十个人作为初始的统计人物(可根据自己需要进行修改)。

    二、线上结对编程
      因为暂时还没开学,与同伴相距的较远,故采用QQ屏幕共享的方式进行结对编程
    1.远程连线中···



    2.与代码的斗争···
      在连线前先是各抒己见讨论了一下如何下手,然后选择在现有代码的基础上进行改动。将网上实现C++对TXT文件的读取(包括按行和逐字符)的代码和将数据写入到CSV文件中的代码先适当的修改并连接起来,后检验一下其可用性,发现都能实现其对应的简单功能。后和队友进行远程连线,讨论了一下修改思路,包括如何查找对应的章节、如何进行字符的匹配等。有了大概思路后,由我进行代码的主要修改和完善,队友进行检查和测试,即共同担任领航员和驾驶员,并灵活转换;在改码的同时我们进行想法的交流和思路的探讨。初步改码主要是为了实现对中文字符的匹配和统计。
      程序初步完成时,我们发现运行结果出现问题,加入一些测试代码发现读入的字符一直是乱码,一开始不清楚是程序的整个设计有问题,还是TXT文件读取的方式有问题,于是上网查阅相关问答和博客,最终发现一个关于乱码问题的问答(见->):乱码问题。最终结论是:乱码是TXT文档的问题,老师上传的TXT文档默认是utf8的编码格式,读取这种格式的中文字符是会出现乱码问题,于是将其改为ANSI的编码格式。修改后进行测试,发现的确能够准确的读取中文字符并输出。(要注意的是,一个中文字符含两个字节,在进行字符匹配时要注意)
      接着,我们创建一个包含红楼梦部分内容的TXT文档,利用修改后的代码统计结果,看其统计的正确性。发现的确能够统计,但是数字不准确,最后确定是文件读入那边的问题,于是进行了相应的修改;与此同时我们确定了章节查找的方法,即通过每个章节处的很多个‘-’字符作为章节分割的标识。对整个红楼梦文件进行读取和统计,一开始会出无法读取或者结果不准确,后面对章节查找处以及字符匹配那边进行了完善。(为了方便和提高程序的运行速度,故章节的查找使用的是按行读入的方法,查找到对应的章节后使用按字符读入进行人物的统计)。
    程序运行后的界面

    对某一章节的统计

    结果文件(CSV文件)
    运行程序后对应的CSV文件生成:

    CSV的内容

    图表的绘制
    随意选取了《红楼梦》几个章节,并将其统计结果利用柱状图展现出

    3.《水浒传》···
    &emsp;&emsp;在实现了《红楼梦》按章节的人物统计后,我们看了一下《水浒传》内容的特点,修改了章节查找部分的代码,人物统计部分代码不变,并选择各个章节的人物对他们进行出现次数地统计。并简单地统计了几个回合,统计结果如下:

    三、收尾工作
      将完成的代码、运行后的到的数据以及绘制的图片整合到博客中,并将完成的代码托管到gitee中,最后进行个人总结。

    总结

    个人部分
      在结对编程的过程中团队间的交流和讨论非常重要。向队友阐述自己的想法,可以使自己的思路更加清晰,队友也会对我的想法进行点评,进而及时发现初步想法中的一些不足和可改善之处;同样的,队友提出想法时,我会学习到一些自己没有考虑过的地方,这样可以注意到自己未注意到的问题或者产生一些新的想法。在这个过程中,我们也出现过懈怠和拖沓,但结对编程开始后,我和队友之间讨论交流会有一种督促的作用使我们有更高的生产率——更好地集中精力来应对更高的工作强度。结对编程最重要的是团队之间的规划和配合,只有合理的规划和默契的配合才能够使结对编程产生的效益大于各个人单独产生的效益之和,这就需要我们在开始后要抛开懒散和拖沓,用认真的与队友交流讨论,互相督促。在结对编程过程中,我主责程序编改,队友(李晓萱)负责一些文献资料的搜集,我们在整个过程中都认真负责地完成了相应的任务。
    代码部分
      目前代码能够实现简单人物统计,实现的过程也比较简单,不足的地方是人数的统计是在主函数中直接进行,没有设计一些函数来优化程序结构。因为目前和队友两个人能力和时间有限,故没有做进一步的优化。
    代码的码云链接:红楼梦水浒传
    这里附上红楼梦任务统计的代码:

    #include <iostream>
    #include <cstdlib>
    #include <string>  
    #include <vector>  
    #include <fstream> 
    #include <sstream> 
    #include <assert.h>
    
    using namespace std;
    
    const int rangeNum = 10;
    const int bufferSize = 8192;
    char buffer[bufferSize];
    char print[rangeNum][100] = {"宝玉","黛玉","贾母","凤姐","袭人","探春","宝钗","贾琏","平儿","贾政"};
    int ans[rangeNum];
    
    int main()
    {
    	ifstream fin;
    	fin.open("E:\大三下\计算与软件工程\程序\C++\HLM\红楼梦.txt");   //将文件流对象与文件连接起来 
    	memset(ans, 0, sizeof(ans));
    	int ch, t = 0;
    	char c,cc,ccc,cccc;
    	cout << "请输入统计的章节号:";
    	cin >> ch;
    	//第 回
    	bool flg;
    	while (fin.getline(buffer, bufferSize))//查找章节
    	{
    		flg = false;
    		int k;
    		for (k = 0; k < 12; k++)
    		{
    			if (buffer[k] != '-') break;
    		}
    		if (k == 12)
    		{
    			t++;
    			if (t == (ch + 1))
    			{
    				flg = true;
    				break;
    			}
    		}
    	}
    	if(flg)
    	{
    		c = fin.get();
    		cc = fin.get();
    		ccc = fin.get();
    		while (c != EOF && c != '-')
    		{
    			cccc = fin.get();
    			for (int i = 0; i < rangeNum; i++)
    			{
    				if (c == print[i][0]&&cc == print[i][1]&& ccc == print[i][2]&& cccc== print[i][3])
    				{
    					++ans[i];
    				}
    			}
    			c = cc;
    			cc = ccc;
    			ccc = cccc;
    		}
    	}
    
    	for (int i = 0; i < rangeNum; ++i) 
    	{
    		cout << print[i] << ":" << ans[i] << endl;
    	}
    	fin.close();           //关闭文件输入流 
    	// 写文件
    	ofstream outFile;
    	outFile.open("Role.csv", ios::out); // 打开模式可省略  
    	//outFile << "第"<<ch<<"回"<< endl;
    	outFile << "名称" << ',' << "第" << ch << "回出现次数" << endl;
    	for (int i = 0; i < rangeNum; i++)
    	{
    		outFile << print[i] << ',' << ans[i] << endl;
    	}
    	outFile.close();
    	getchar();
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    windows2000/xp运行命令全集
    IP数据包的校验和算法C#版(原)
    做系统清理的批处理
    Combox用ValueMember 之后再添加一项
    安装部署基础——Windows Application
    文件编码
    Left/right join 和inner join 区别
    应用Url重写时CSS引用问题
    数据绑定控件单选框
    算法题:水杯倒水的问题
  • 原文地址:https://www.cnblogs.com/w1010/p/12616351.html
Copyright © 2020-2023  润新知