軟體工程第一次作業
要求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總結:
我覺得以後完成項目不僅僅要合理安排好時間,學會管理時間,學會管理自我,也要學會網上尋求幫助,認真研究資料書籍等,這樣才能更好學習中成長,成長中學習。
在代碼中也學會規範代碼,讓自己以後更加嚴謹,代碼風格更加讓人眼前一亮,讓人更愉快。
自從看了我部落格裡面寫的别人用三種方法的比較,然後我發現自己的思路想法也太簡單了,希望以後能更有遠見和想法,加油!