软工第二次结对作业

作业链接
结对同学博客链接
github链接

具体分工

我主要负责C++,他负责爬虫部分

PSP表格

解题思路描述与设计实现说明

代码的核心思路是利用爬虫,爬取论文网址,之后吧对应信息(标题和摘要)写入文件,然后利用上次的WordCount代码把文件读进去然后进行分析,并且要加上权重分析,之后便是统计词频,然后这次的作业还新加了一个功能叫做词项统计,在不断询问大佬之后,大佬说用队列容器,把检测到的合法单词压入队尾,如果单词不合法就清空,确认词项之后再输出队列。

1.爬虫

爬虫爬取论文地址

#定义一个函数,用来爬取网页内容
def Web(www):
    try:
        w = requests.get(www)
        w.raise_for_status()
        w.encoding = w.apparent_encoding
    except:
        print("fail!!!")
    temp = w.text
    wz = BeautifulSoup(temp,"html.parser")
    return wz

www = "http://openaccess.thecvf.com/CVPR2018.py"
wz = getWeb(www)

简单处理一下标签,获取标题和摘要,然后写入文件

#定义一个函数,用来论文页面内容
def info(paperLink):
    www = "http://openaccess.thecvf.com/" + paperLink
    wz = Web(www)
    #标签
    bq=re.compile('</?w+[>]*>')
    #消除
    title =bq.sub('', str(wz.find('div',id="papertitle"))).strip()
    abstract = bq.sub('',str(wz.find('div',id="abstract"))).strip()
    return title,abstract

2.代码组织与内部实现设计

3.算法的关键与关键实现部分流程图

void Count(string tline, int maxn, int start,int quanzhong)
{
    for (int i = start; i < tline.length(); i++)
    {

        int count = 0;//计数
        int charcounts = 0;//字符数
        int numflag = 0;//判断是否数字
        for (int k = i;; k++)//判断是否是单词
        {
            if (tline[k] >= 'a'&&tline[k] <= 'z'&&numflag == 0)
            {charcounts++;count++;}//小写字母
            else if (tline[k] >= 'A'&&tline[k] <= 'Z'&&numflag == 0)
            {charcounts++;count++;}//大写字母
            else if (tline[k] >= '0'&&tline[k] <= '9')
            {count++;numflag = 1;}//出现数字
            else break;
        }
        if (charcounts >= 4) //记录
        {   char words[100] = { "" };
        //存储单词
            for (int k = i; k < i + count; k++)
            {
                words[k - i] = tline[k];
            }
            string s = words;
            b.push_back(s);  
            s = "";
            if (b.size() == maxn)//队列以满
            {
                int nowNum = maxn;
                for (it1 = b.begin(); it1 != b.end(); it1++)
                {
                    s.append(*it1);
                    nowNum=nowNum-1;
                    if (nowNum != 0)s.append(" ");
                }
                if(start==7&&quanzhong==1)essay[s]+=10;//记录
                else essay[s]++;
                b.pop_front();
                s = "";
            }
            i += count - 1;
        }
        else if (count > 0 && count < 4)
        {
            b.clear();
            i += count - 1;
        }
        else continue;

    }
    if (start == 7)b.clear();//清空
}

性能分析

VS的性能分析工具结果

遇到的代码模块异常或结对困难及解决方法

问题描述:C++程序无法读取爬虫的结果文件然后程序崩溃
做过的尝试:将文本改为Ascll编码
最后发现是C++程序中读取每行使用的Char[]容量过小无法读取Abstarct的全部内容导致崩溃,通过增大容量解决(暂时成功)
通过各种尝试终于解决啦
收获:细节决定成败

单元测试

十个单元测试如下:

1.测试字符数是否正确(去除title,abstrac等等)
2.测试行数是否正确
3.测试不带权值的单词词频是否正确
4.测试带权值的单词词频是否正确
5.测试不带权值的词组词频是否正确
6.测试带权值的词组词频是否正确
7.测试-n限制下输出是否正确
8.测试-m限制下输出是否正确
9.测试输入文件为空时是否正确
10.测试输出文件未给是否正确
测试结果如下:

以下给出三个测试代码:

@Test
public void test4(){// 测试  不出现-m 的  -w 1 
        File file = new File("4.txt");
        WordCount count = new WordCount(file);//实例话WordCount类
        count.set_quan(true);
        int wordnum = count.getwordnum();//读取单词数
        int linenum = count.getlinenum();//获取有效行数
        assertEquals(wordnum, 29);
        assertEquals(linenum, 3);
        List<HashMap.Entry<String, Integer>> m = count.getWords();
        int aa=m.get(0).getValue();
        String bb=m.get(0).getKey();
        assertEquals( aa , 51);
        assertEquals(bb, "embodied");
}

@Test
public void test6(){ // 测试 出现-m 的 -w 1
        File file = new File("6.txt");
        WordCount count = new WordCount(file);//实例话WordCount类
        count.set_quan(true);
        int wordnum = count.getwordnum();//读取单词数
        int linenum = count.getlinenum();//获取有效行数
        int phrasenum = count.getphrasenum(3);//获取有效词组数
        assertEquals(wordnum, 29);
        assertEquals(linenum, 3);
        List<HashMap.Entry<String, Integer>> m = count.getPharses();
        int aa=m.get(0).getValue();
        String bb=m.get(0).getKey();
        assertEquals( aa , 20);
        assertEquals(bb, "embodied embodied embodied");
}

@Test
public void test8(){ // 测试 -m 参数 接收
    File file = new File("8.txt");
        WordCount count = new WordCount(file);//实例话WordCount类
        int wordnum = count.getwordnum();//读取单词数
        int linenum = count.getlinenum();//获取有效行数
        int phrasenum = count.getphrasenum(8);//获取有效词组数
        assertEquals(wordnum, 64);
        assertEquals(linenum, 3);
        List<HashMap.Entry<String, Integer>> m = count.getPharses();
        int aa=m.get(0).getValue(),cc=m.get(9).getValue();
        String bb=m.get(0).getKey(),dd=m.get(9).getKey();
        assertEquals( aa , 4);
        assertEquals(bb, "asdf zxcv jklq aaaa asdf zxcv jklq aaaa");
        assertEquals( cc , 1);
        assertEquals(dd, "aaaa wjoi oifvf nvxlj qwoei jfsiod fdss vffr2f4");
}

Github签入记录

由于时间的关系就签入了最终的

评价你的队友

真•大佬,敦厚的专业水平值得学习
只是埋头苦干需要改进,应增加沟通

学习进度条

原文地址:https://www.cnblogs.com/nwk1130/p/9774288.html