软工实践寒假作业(2/2)

这个作业属于哪个课程 2021春软件工程实践|S班
这个作业要求在哪里 软工实践寒假作业(2/2)
这个作业的目标 阅读《构建之法》并提出问题和WordCount程序
其他参考文献 《构建之法》

阅读《构建之法》并提问

问题1.

对于一个全新的创新,我认为判定产品功能是否是用户刚需是很难的,因为没有人使用过。但如果是在现有基础上的发展创新,那么我认为更应该注重辅助功能,因为基本刚需大家都可以满足,那么比拼的应该是辅助功能谁做的更加人性化,更被人接收。

问题2.

看了这个例子我想知道大牛到底是想干什么,他创造“屁股魔方”如果是创新的话并没有得到收益,因为他没有卖出魔方也无法卖出魔方。如果只是为了给小芳看的话为什么不一开始就给小芳看,所以大牛其实也不知道自己想干什么,只是单纯的想玩“屁股魔方”。

问题3.

2004年报道中国软件还在手工作坊阶段。然而下文写走进自己的小作坊才有可能创新。作坊的存在和多少到底是否是有益的软甲发展还是不利的?

我觉得不管何时作坊都是越多越好,在没有核心时,更多的小作坊可以更快发展成为核心。而核心不再容易创新,所以需要更多的小作坊来创新。

问题4.

对创新的疑问?

我觉得在软件上的创新更大的是依赖硬件的发展。4G的发展才带来了直播行业,带来了短视频和线上直播聊天。5G即将到来,我相信它带来的肯定不止更快的网速,肯定会慢慢影响我们生活的方方面面。所以我是否可以认为我们学习软件的创新其实就是跟随着硬件发展来完善硬件所带来的功能。就好像在我看来现在的手机很难在有新的突破,不管是更清晰的屏幕还是更更多的存储,更高清的拍照,在我看来都不是真正的创新。

问题5.

是不是只有技术大师才可以创新?

我觉得不是,创新包含生活的方方面面,更好更快的算法是创新,更好的使用工具也是创新,但是只有技术大师才能做到大的创新,所以说创新的大小与自己的水平有关。

我以后估计很难成为一个技术大师,我所需要做的就是在小工作中不断地创新,新的方法新的思考对自己总是好的。

附加题

也许最令人难以置信的是,历史上第一名程序员是位女性。她的名字是Ada Lovelace。在1843年,这位英国数学家Ada Lovelace,翻译了意大利工程师Luigi Menabreaw撰写的分析引擎文章。在翻译过程中,她把自己的理解都批注到每篇文章下,而这举动加快了计算机编程技术的发展。在这之后,她又设计出了第一种能够利用分析引擎计算伯努利数的算法,这也是第一个用电脑编写的算法。

源自百度搜索

感受:所以软件工程并不是不适合女孩子,女孩子也能顶半边天,冲冲冲!

GitHub项目地址

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
• Estimate • 估计这个任务需要多少时间 15 15
Development 开发
• Analysis • 需求分析 (包括学习新技术) 240 180
• Design Spec • 生成设计文档 0 0
• Design Review • 设计复审 0 0
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30 20
• Design • 具体设计 60 60
• Coding • 具体编码 480 720
• Code Review • 代码复审 30 60
• Test • 测试(自我测试,修改代码,提交修改) 60 120
Reporting 报告
• Test Report • 测试报告 30 10
• Size Measurement • 计算工作量 10 10
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 60 30
合计 1015 1225
解题思路

1.命令行操作:为main传递参数。

2.文件读写。

3.函数设计:五个函数字符统计,行数统计,单词统计,写入文以及测试函数(后期删除)

4.程序优化:能否进行大文件的读取,内存优化,运行速度优化。

代码规范
实现过程

使用字符数组存文件读取的字符。

字符统计:读取文件,每读取一个字符,数量加一。

行数统计:每读取一个回车,数量加一。

单词统计:

 while (wordTest(para[i]))
        {
            i++;
            j++;
            if (!wordTest(para[i]))
            {
                if (j >= 4)
                {
                    wordcount++;
                    for (int h = i - j; h < i; h++)
                    {
                        duan = duan + para[h];
                    }
                    duan += " ";
                }
                j = 0;
            }
        }

para为字符数组,wordTest判断是否为英文字母,例如file1235,读到e时下一次读取为非单词且j=4(单词含字母个数),此时判定这是一个单词,单词数加一,并存入duan字符串后并且加上“ ”(空格)以便后面操作。

istringstream iss(duan);
    string word;
    int i;
    while (iss >> word)

istringstream类型可以根据分隔符分隔字符类型,使用解释:

string str="i am a boy";  
    istringstream is(str);  
    string s;  
    while(is>>s)  {  
        cout<<s<<endl;  
    } 
输出结果:
i
am
a
boy

利用istringstream就可以把我存在duan里并加上“ ”的单词取出来统计(已经通过函数将duan里的单词小写化)。统计使用vector,Record为包含一个string存单词和一个int存个数的结构。

此为判断单词个数过程:

while (iss >> word)
    {
        for (i = 0; i < _words.size(); ++i) 
        {
            if (word == _words[i].word)
            {
                ++_words[i].count;
                break;
            }
        }
        if (i == _words.size()) 
        {
            Record record;
            record.word = word;
            record.count = 1;
            _words.push_back(record);
        }
    }

最后使用自带的快速排序sort根据个数从大到小排序向量并输出文件:

ofile << "字符数:" << character << endl;
    ofile << "单词数:" << wordcount << endl;
    ofile << "行数:" << line  << endl;
    sort(_words.begin(), _words.end(), sortType);//排序并输出
    for (int i = 0; i < _words.size(); ++i)
    {
        ofile << _words[i].word << ": " << _words[i].count << endl;
    }

sortType()为自己写的逆序排序函数。

性能改进
char para[10000];

 while (!ifile.eof()) 
    {
        line++;
        ifile.getline(para, 10000);

由于使用字符数组存文件读出来的字符,首先字符数组声明不能很大,导致不能读一行很多单词的文件

而且,文件过小时也增加了没必要的循环次数

改为使用,vector,可以读一行很多单词的文件,并且动态分配空间,节约了内存。

vector<char> para;

while ((wordd = ifile.get()) != EOF)
    {
        para.push_back(wordd);
        i++;
    }

我的四个函数分别对应字符统计,行数统计,单词统计和写入文件,若果写在一起可以减少2次读取文件,但是缺少了模块化。

单元测试

对不起,完成作业较晚,还没搞懂,作业截止后我会继续学习。

main函数覆盖率,38是异常判断和测试程序。

异常测试

命令行输入参数判断:

if (argc != 3) {
        cout << "程序出错";
        return 0;
    }

对文件读写的判断(尤其是读文件时判断是否存在文件):

if (!ifile.good())
    {
        cout << "输入文件打开失败" << endl;
        return;
    }
心路历程与收获

一开始看到题目时举得不难,因为自己之前自学过git的知识,虽然学的不多,但是有了解。但是对于WordCount的程序设计还是没有头绪,不知道怎么把判断的单词存下来。然后找了java和c++很多方法,看到c++的istringstream可以分隔开字符串就有了初步的设计。然后后面也是不停的改bug和优化。收获很多,已经很久没有坐电脑前好几天不停的写代码了,很充实。

posted @ 2021-03-05 20:21  宋大帅  阅读(82)  评论(5编辑  收藏  举报