软件工程第一次作业
要求0:作业要求博客地址:
https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110
要求1:git仓库地址:
https://git.coding.net/tangjh563/wf.git
要求2:
1. PSP阶段表格
SP2.1 | 任务内容 | 计划需要时间(min) | 实际完成时间(min) |
Planning | 计划 | 50 | 40 |
Estimate | 估计开发所需要的时间,需要的工作步骤,需要的思路和方法 | ||
Development | 开发 | 800 | 1000 |
Analysis | 需求分析(软件,语言工具等) | 150 | 200 |
Design Spec | 生成设计文档 | 20 | |
Design Reviewe | 设计复审(和同事审核设计文档) | 10 | |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | ||
Desgin | 具体设计 | 250 | |
具体编码 | |||
Code Review | 代码复审 | ||
Test | 测试(自我测试,修改代码,提交修改) | ||
Record Time Spent | 记录用时 | 120 | |
Test Report | 测试报告 | 30 | |
Size Measurement | 计算工作量 | ||
Postmortem & Process Improvement Plan | 事后总结和提出过程改进计划 | 80 |
功能模块 | 具体阶段 | 预计时间 (min) | 实际时间 (min) |
功能1 | 50 | ||
测试完善 | |||
功能2 | |||
110 | |||
功能3 | |||
140 | |||
2. 预估耗时与实际耗时的差距原因:
1、不够熟练C语言,C++,还需要查书,百度来帮助写代码,需要加强训练。
2、每天都凑空出来写,不是每次都直接进入工作状态,外界有干扰,自己注意力还是不够集中,要改正。
3代码敲的不够熟练,与想象中有差距,要加强。
要求3:
1. 解题思路描述:
首先拿到题以后先看样例和要求要我做什么,第一个是单词计数,先找到特殊的点,不重复计数,大小写不区分都是同一个单词,不能用数值开头,在心中想好判定的if语句。
然后想函数框架,设计一个主函数,其下用一个统计函数来计算字符串,一个输出函数,输出函数中想好怎么读取路径,路径转换。
2.代码展示和中间的困难:
遇到很多麻烦,其中单词分割,我采用了string的方法来解决,尴尬的是我还不小心忘记了大小写,希望以后能更注意。
代码展示:
我的代码还有个经典就是加空格来分割首尾的两个单词
void Read_Txt(string filename)
{
ifstream file;
file.open(filename.c_str());//类型转化
string s;
while(getline(file, s))
{
zfc = s + ' ' + zfc;//特别强调用空格分割首尾单词
}
transform(zfc.begin() , zfc.end() , zfc.begin() , ::tolower);//大小写转化
file.close();
}/*读取文件的功能*/
然后用getchar();来防止回车吞字符的影响:
getchar();/*防止回车的影响*/
其中我遇到几个问题:
第一就是怎么读取路径。我就上网寻求帮助。来源:https://blog.csdn.net/hjl240/article/details/47132477
#include <stdio.h>
int main()
{
//下面是写数据,将数字0~9写入到data.txt文件中
FILE *fpWrite=fopen("data.txt","w");
if(fpWrite==NULL)
{
return 0;
}
for(int i=0;i<10;i++)
fprintf(fpWrite,"%d ",i);
fclose(fpWrite);
//下面是读数据,将读到的数据存到数组a[10]中,并且打印到控制台上
int a[10]={0};
FILE *fpRead=fopen("data.txt","r");
if(fpRead==NULL)
{
return 0;
}
for(int i=0;i<10;i++)
{
fscanf(fpRead,"%d ",&a[i]);
printf("%d ",a[i]);
}
getchar();//等待
return 1;
}
第二就是我不知道用那种方法来存储方便,怎么排序方便,然后我在一个博客中看到vector、map、、hash_map三种方式的比较。来源:https://blog.csdn.net/i_chaoren/article/details/78673641
//WordFrequency.cpp
#include "WordFrequency.h"
#include "StringUtil.h"
#include <algorithm>
#include <stdexcept>
#include <stdlib.h>
#include <fstream>
using namespace std;
using namespace stringutil;
WordFrequency::WordFrequency(const std::string &filename, const std::string &stopFile)
:filename_(filename),stopFile_(stopFile)
{ }
void WordFrequency::ReadStopFile()
{
ifstream in(stopFile_.c_str());
if( !in )
throw runtime_error("open file failure");
string word;
while(in >> word)
{
stopList_.push_back(word);
}
in.close();
}
void WordFrequency::ReadWordFile()
{
ifstream infile(filename_.c_str());
if( !infile )
throw runtime_error("open file failure!");
string word;
while(infile >> word)
{
erasePunct(word);
if( isAllDigit(word))
continue;
stringToLower(word);
if( !isStopWord(word))
addWordToDict(word);
}
infile.close();
}
bool WordFrequency::isStopWord(const string &word)const
{
vector<string>::const_iterator it = stopList_.begin();
while( it != stopList_.end())
{
if( *it == word)
break;
it ++;
}
return (it != stopList_.end());
}
void WordFrequency::addWordToDict(const string &word)
{
Wordit it = words_.begin();
while( it != words_.end())
{
if( it->first == word)
{
++ it->second ;
break;
}
it ++;
}
if(it == words_.end())
words_.push_back(make_pair(word, 1)) ;
}
bool cmp(const pair<string, int> &a, const pair<string, int>&b)
{
return a.second > b.second;
}
void WordFrequency::sortWordByFrequency()
{
sort(words_.begin(), words_.end(), cmp);
}
void WordFrequency::printWordFrequency()const
{
Wordkit it = words_.begin();
while(it != words_.end())
{
printf("words: %s, frequency: %d\n",it->first.c_str(),it->second);
it ++;
}
}
//WordFrequency.cpp
#include "WordFrequency.h"
#include "StringUtil.h"
#include <fstream>
#include <algorithm>
#include <stdio.h>
#include <stdexcept>
using namespace std;
using namespace stringutil;
WordFrequency::WordFrequency(const string &filename, const string &stopfile)
:filename_(filename),stopfile_(stopfile)
{ }
void WordFrequency::ReadStopFile()
{
ifstream infile(stopfile_.c_str());
if( !infile )
throw runtime_error("open file failure");
string word;
while(infile >> word)
StopList_.insert(word);
infile.close();
}
void WordFrequency::ReadWordFile()
{
ifstream infile(filename_.c_str());
if( !infile )
throw runtime_error("open file failure");
words_.clear();
string word;
while(infile >> word) //读取单词
{
erasePunct(word); //去除标点
stringToLower(word);//转为小写
if(isAllDigit(word))//去除数字
continue;
if( StopList_.count(word) == 0) //set中 count 标识 word这个单词是否存在
words_[word]++; //如果存在,int++, 如果不存在,增添至 map中
//words_[word]= cnt(词频数)
}
infile.close();
}
void WordFrequency::copyWordToVector()
{
copyWords_.clear();
//back_inserter(copyWords_)
//front_inserter
copy(words_.begin(),words_.end(),back_inserter(copyWords_));
}
bool cmp(const pair<string, int> &a, const pair<string, int> &b)
{
return a.second > b.second;
}
void WordFrequency::sortWordByFrequency()
{
sort(copyWords_.begin(), copyWords_.end(),cmp); //排序
}
void WordFrequency::printFrequency() const
{
for(vector<pair<string, int> >::const_iterator it = copyWords_.begin();
it != copyWords_.end();
++it)
{
printf("word :%s, frequency: %d\n", it->first.c_str(), it->second); //打印
}
}
//WordFrequency.h
#ifndef WORDFREQUENCY_H_
#define WORDFREQUENCY_H_
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <string>
class WordFrequency
{
public:
WordFrequency(const std::string &filename, const std::string &stopfile);
void ReadStopFile();
void ReadWordFile();
void copyWordToVector();
void sortWordByFrequency();
void printFrequency()const;
private:
std::string filename_;
std::string stopfile_;
std::unordered_set<std::string> StopList_;
std::unordered_map<std::string, int> words_;
std::vector< std::pair<std::string,int> > copyWords_;
};
#endif
通过研究这三种算法,我决定用我更能理解的map方法来完成。
测试结果:
功能1:
功能2:
功能3:
3总结:
我觉得以后完成项目不仅仅要合理安排好时间,学会管理时间,学会管理自我,也要学会网上寻求帮助,认真研究资料书籍等,这样才能更好学习中成长,成长中学习。
在代码中也学会规范代码,让自己以后更加严谨,代码风格更加让人眼前一亮,让人更愉快。
自从看了我博客里面写的别人用三种方法的比较,然后我发现自己的思路想法也太简单了,希望以后能更有远见和想法,加油!