天天看點

軟體工程第一次作業

軟體工程第一次作業

軟體工程第一次作業

要求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總結:

我覺得以後完成項目不僅僅要合理安排好時間,學會管理時間,學會管理自我,也要學會網上尋求幫助,認真研究資料書籍等,這樣才能更好學習中成長,成長中學習。

在代碼中也學會規範代碼,讓自己以後更加嚴謹,代碼風格更加讓人眼前一亮,讓人更愉快。

自從看了我部落格裡面寫的别人用三種方法的比較,然後我發現自己的思路想法也太簡單了,希望以後能更有遠見和想法,加油!

上一篇: 第一次作業
下一篇: 第二次作業