软工第二次作业

githup地址:https://github.com/chendebin/personal-project

PSP表格:

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

解题思路

用infile把文件内容输入程序中,字符数逐个统计输出数值;行数用getline每执行一次line++;word统计逐行输入全部记录在word【】数组中,再分别对数组中每个单词(读取的时候碰到分隔符停下把前面读的信息存在新的数组中去比较)统计次数,重复单词跳过。

代码实现

这个题目要求四个目标,字符数,行数,单词数,词频统计。所以用四个函数实现。

求字符数

void readTxtchar(string file)
{
    ifstream infile;
    infile.open("Text.txt",ios::in);    
    assert(infile.is_open());   

    char c;
    int characters=0;
    infile >> noskipws;
    while (!infile.eof())
    {
        infile >> c;
        
        characters=characters+1;
    }
    cout << "characters:"<<characters-1<<endl;
    infile.close();             
}

输入字符,每输入一个characters++。

行数

void readTxtLINE(string file)
{
    ifstream infile;
    infile.open("Text.txt", ios::in);  
    assert(infile.is_open());   

    string s;
    int lines = 0;
    while (getline(infile, s))
    {
        lines = lines + 1;
        
    }
    cout << "lines:" << lines << endl;
    infile.close();             
}

getline输入一行,行数line+1,循环直至输入完毕。

单词数

void readTxtwords(string file)
{
    ifstream infile;
    infile.open("Text.txt", ios::in);   
    assert(infile.is_open());    
    char c;
    int words =0;
    char w[10000];
    int i = -1;
    int x;
    infile >> noskipws;
     while (!infile.eof())
   {
         i = i + 1;
    infile >> c;
    w[i] = c;
    }
     for (x = 0; x <= i - 1; x++)
     {
         if (w[x] == ' ' || w[x] == '
')
         {
             if ((w[x + 1] >= 'A'&&w[x + 1] <= 'Z') || (w[x + 1] >= 'a'&&w[x + 1] <= 'z'))
                 words = words + 1;
         }
     }
     if ((w[0] >= 'A'&&w[0] <= 'Z') || (w[0] >= 'a'&&w[0] <= 'z'))
         words = words + 1;
     cout << "words:" << words<< endl;
infile.close();             
}

逐个输入字符,全部存在w【】数组中,再对w数组遍历,每次遇到分隔符就判断一次下几个字符是不是英文字母,是的话则让words+1;

词频统计

做这小题的时候发生了一些问题,词频统计部分由于要用到的函数过多,再加上时间有点来不及了,心一急干脆就不弄函数了,直接把剩下统计的所有代码都直接打在主函数下面了。尴尬。这样导致了另一个问题就是之后我封装的时候一直出错,后面才想到我的词频统计函数有一大半是在主函数里的。封装之后就出现了一堆变量没定义。难受极了,下次再也不这么做了,本来想省点事的结果反而更加麻烦了。

封装

#pragma once
__declspec(dllexport) void readTxtchar(string file);
__declspec(dllexport) void readTxtLINE(string file);
__declspec(dllexport) void readTxtwords(string file);

从来没用过封装,所以从头学起,自己去网上百度。百度了很多,结果也没一个靠谱的。后来问了舍友蔡子阳,他教我一步一步地完成了封装的全部过程。不过后面由于出现了上述原因,所以词频统计我并没有封装起来,只能先这样交工。一开始真的没想到学这个学了这么久。。。时间没安排好,下次一定注意。在把这次作业交工后我会回去把函数改好重新封装的。

程序运行界面

总结

这是我第一次做软工实践的作业,第一次做软工作业的感觉还不错。花的时间非常的多,但是大多数都是花在学习新的语法,新的工具这方面。这对于自己的自学能力是个非常大的挑战。上学期做数据库的时候用到过vs来做数据库。不过这次用到了更多vs的东西,越学习真的就越发现自己不会的东西实在是太多了。真的要更加努力才行。

原文地址:https://www.cnblogs.com/chendebin/p/9637895.html