用c語言基本實現wc.exe功能

来源:https://www.cnblogs.com/abc123def456/archive/2018/09/15/9649762.html
-Advertisement-
Play Games

網址:https://github.com/3216005214/wc.exe wc項目要求 wc.exe 是一個常見的工具,它能統計文本文件的字元數、單詞數和行數。這個項目要求寫一個命令行程式,模仿已有wc.exe 的功能,並加以擴充,給出某程式設計語言源文件的字元數、單詞數和行數。 實現一個統計 ...


網址:https://github.com/3216005214/wc.exe

wc項目要求

wc.exe 是一個常見的工具,它能統計文本文件的字元數、單詞數和行數。這個項目要求寫一個命令行程式,模仿已有wc.exe 的功能,並加以擴充,給出某程式設計語言源文件的字元數、單詞數和行數。

實現一個統計程式,它能正確統計程式文件中的字元數、單詞數、行數,以及還具備其他擴展功能,並能夠快速地處理多個文件。
具體功能要求:
程式處理用戶需求的模式為:

wc.exe [parameter] [file_name]

 基本功能列表:

wc.exe -c file.c     //返迴文件 file.c 的字元數

wc.exe -w file.c    //返迴文件 file.c 的詞的數目  

wc.exe -l file.c      //返迴文件 file.c 的行數

擴展功能:
    -s   遞歸處理目錄下符合條件的文件。
    -a   返回更複雜的數據(代碼行 / 空行 / 註釋行)。

空行:本行全部是空格或格式控制字元,如果包括代碼,則只有不超過一個可顯示的字元,例如“{”

代碼行:本行包括多於一個字元的代碼。

註釋行:本行不是代碼行,並且本行包括註釋。一個有趣的例子是有些程式員會在單字元後面加註釋:

    } //註釋
在這種情況下,這一行屬於註釋行。

[file_name]: 文件或目錄名,可以處理一般通配符。

高級功能:

 -x 參數。這個參數單獨使用。如果命令行有這個參數,則程式會顯示圖形界面,用戶可以通過界面選取單個文件,程式就會顯示文件的字元數、行數等全部統計信息。

需求舉例:
  wc.exe -s -a *.c

返回當前目錄及子目錄中所有*.c 文件的代碼行數、空行數、註釋行數。

已實現wc項目要求

1、計算文件字元數

2、計算文件單詞數

3、計算文件行數

4、計算文件空行數

遇到的困難及解決辦法

▪  困難描述

大學前兩年對課程學習的疏忽,對c語言的知識的記憶已經大大減少,以至於老師要求我們做這個單人項目的時候,心裡是慌的,因為對c語言等編程的不熟悉,所以我要花幾天時間重新把丟下的知識重新拾取回來,所以,我也就比別人的時間要更緊張。首先我先做了下嘗試,嘗試用JAVA和C語言寫這個項目,最後還是選擇了C語言。在寫代碼的過程中,有許多新的函數未接觸過,需要花時間去瞭解。還有github的使用方法也不是太瞭解,也要花時間去做。對於傳參的形式也是想了很久,做出了很多嘗試。

▪  做過哪些嘗試

對於要重拾C語言知識這件事情,幸好大一的時候買了一本較為詳細的C語言教科書,幫助我能更快的把丟下的知識拿回來。當演算法真的不懂的時候,到網上參考了一些代碼,然後把它理解為自己的東西再寫到自己的代碼中。在把第一個基本功能寫出的時候,運行的時候發現總是只能讀取文件中的第一個字元,通過不斷的檢查,嘗試,終於才可以正確的實現計算字元數的功能。對於傳參形式,首先嘗試用了指針,然後發現行不通(可能以我現在水平不能很好的使用這種方法),最後用了數組,選擇了一種比較簡單的方式。在函數的選擇方面,也是一個一個認為可以實現的函數去嘗試(雖然最後沒有用到多少函數)

▪  是否解決

拓展功能的註釋行和代碼行的計數演算法尚未解決,空行的計數方法存在缺陷。基本功能已實現。

▪  有何收穫

瞭解並基本掌握關於處理文件的演算法函數

重拾C語言相關知識

認識到需要不斷鞏固知識的重要性

關鍵代碼及說明

 

int main(){//主函數 
    char input[10],File[200];
    while(1){
        printf("請輸入用戶命令:wc.exe-");
        scanf("%s",&input);
        if(input[0]=='c'){
           printf("請輸入文件名:");
           scanf("%s",&File);
           int charcount=0;
           charcount=CharCount(File);
           printf("文件的字元數為:%d\n",charcount);
           continue;    
        }
        if(input[0]=='w'){
            printf("請輸入文件名:");
            scanf("%s",&File); 
            int wordcount=0;
            wordcount=WordCount(File);
            printf("文件的詞數為:%d\n",wordcount);
            continue;
        }
        if(input[0]=='l'){
            printf("請輸入文件名:");
            scanf("%s",&File); 
            int linecount=0;
            linecount=LineCount(File);
            printf("文件的行數為:%d\n",linecount);
            continue;    
        }
        if(input[0]=='a'){
            printf("請輸入文件名:");
            scanf("%s",&File); 
            ComplexCount(File);
            continue;
        }
    }
    system("pause");
    return 0;
}

 

 

主函數:運用傳參的方法

int CharCount(char file[]){//字元數統計函數 
    FILE *pf=NULL;
    int ccount=0;
    pf=fopen(file,"r");
    if(pf==NULL){
        printf("尋找文件失敗\n");
        exit(-1);
    }
    char mychar;
    mychar = fgetc(pf);
    while(mychar!=EOF){
        mychar = fgetc(pf);
        ccount++;
    }
    fclose(pf);
    return ccount;
}

字元統計函數:在每次讀取文件中的字元時,ccount+1

int WordCount(char file[]){//單詞數統計函數 
    FILE *pf=NULL;
    int wcount=0;
    pf=fopen(file,"r");
    if(pf==NULL){
        printf("尋找文件失敗\n");
        exit(-1);
    }
    char mychar;
    mychar = fgetc(pf);
    while(mychar!=EOF){
        if(mychar>='a'&&mychar<='z'||mychar>='A'&&mychar<='Z'||mychar>='0'&&mychar<='9'){
            while(mychar>='a'&&mychar<='z'||mychar>='A'&&mychar<='Z'||mychar>='0'&&mychar<='9'||mychar=='_'){
                mychar=fgetc(pf);
            }
            wcount++;
            mychar=fgetc(pf);
        }
        mychar=fgetc(pf);
    }
    fclose(pf);
    return wcount;
}

 

單詞統計函數

int LineCount(char file[]){//行數統計函數 
    FILE *pf=NULL;
    int lcount=0;
    pf=fopen(file,"r");
    if(pf==NULL){
        printf("尋找文件失敗\n");
        exit(-1);
    }
    char mychar;
    mychar = fgetc(pf);
    while(mychar!=EOF){
        if(mychar=='\n'){
            lcount++;
            mychar = fgetc(pf);
        }
        else{
            mychar = fgetc(pf);
        }
    }
    
    fclose(pf);
    return lcount+1;
}

 

行數統計函數

int ComplexCount(char file[]){
    FILE *pf=NULL;
    int spacecount=0;
    pf=fopen(file,"r");
    if(pf==NULL){
        printf("尋找文件失敗\n");
        exit(-1);
    }
    char mychar;
    mychar = fgetc(pf);
    while(mychar!=EOF){
        if(mychar=='\n'){
            mychar=fgetc(pf);
            if(mychar=='\n' ){
                spacecount++;
                mychar=fgetc(pf);
            }
        }
        else if(mychar=='}'){
            mychar=fgetc(pf);
            if(mychar=='\n'){
                spacecount++;
                mychar=fgetc(pf);
            }
        }
        else mychar=fgetc(pf);
    }
    printf("文件空行數為%d\n",spacecount);
    return 0;
}

空行統計函數:該演算法有缺陷,不嚴謹

測試結果

                    

              

PSP

PSP2.1

Personal Software Process Stages

預估耗時(分鐘)

實際耗時(分鐘)

Planning

計劃

30

30

· Estimate

· 估計這個任務需要多少時間

24*60

2*24*60

Development

開發

10*60

12*60

· Analysis

· 需求分析 (包括學習新技術)

15

10

· Design Spec

· 生成設計文檔

5

5

· Design Review

· 設計覆審 (和同事審核設計文檔)

10

10

· Coding Standard

· 代碼規範 (為目前的開發制定合適的規範)

15

15

· Design

· 具體設計

30

60

· Coding

· 具體編碼

5*60

5*60

· Code Review

· 代碼覆審

15

30

· Test

· 測試(自我測試,修改代碼,提交修改)

15

15

Reporting

報告

20

30

· Test Report

· 測試報告

15

20

· Size Measurement

· 計算工作量

10

10

· Postmortem & Process Improvement Plan

· 事後總結, 並提出過程改進計劃

15

15

合計

 

2535

4150

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 遞四方速遞發燒qwerwee 阿斯頓發斯蒂芬 廢物廢物權恩菲 ...
  • (“#panel”).bind(“click”,function(){ 與$(“#panel”).click(function(){ 有什麼區別 ? 綁定可以同時加多個事件 為每一個匹配元素一個或多個事件綁定事件處理器函數。 你可以在事件處理之前傳遞一些附加的數據。 ...
  • HeBeiTianQi.jsp頁面 HeBeiTianQi.js ...
  • 1 <head> 2 <link href="static/bootstrap-3.3.5-dist/css/bootstrap.css" rel="stylesheet" /> 3 <link href="static/bootstrap-table/bootstrap-table.css" re ...
  • layer_test.jsp bootstrap_model_test.jsp ...
  • 網路編程 一. 1.網卡: 電腦中有網卡,網卡中有mac地址. 2.IP: 插上網線,路由器或交換機中的DHCP服務會自動分配IP地址. IP:192.168.13.150 IPv4: 00000000.00000000.00000000.00000000 0-255 0-255 0-255 0-2 ...
  • Can't debug c++ project because unable to static library start program *.lib Can't debug c++ project because unable to static library start program *. ...
  • RPC調用 多個服務協同完成一次業務時,由於業務約束(如紅包不符合使用條件、賬戶餘額不足等)、系統故障(如網路或系統超時或中斷、資料庫約束不滿足等),都可能造成服務處理過程在任何一步無法繼續,使數據處於不一致的狀態。傳統的基於資料庫本地事務的解決方案只能保障單個服務的一次處理具備原子性、隔離性、一致 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...