高階軟體工程實驗 將menu設計為可重用的子系統

2021-08-10 10:10:05 字數 2627 閱讀 2458

版本庫url:

1)為menu子系統設計介面,並寫使用者範例**來實現原來的功能;

2)使用make和make clean來編譯程式和清理自動生成的檔案;

3)使menu子系統支援帶引數的複雜命令,並在使用者範例**中自定義乙個帶引數的複雜命令;

4)可以使用getopt函式獲取命令列引數。

callback增強可重用鍊錶實現包含於linkedlist.h與linkedlist.c中

shell中各命令功能的實現包含在cmdopt.h與cmdopt.c中

main函式包含於shelllet.c中

編譯時請使用

make
1.子系統設計介面

//用於使用者向命令列新增新的命令功能

int shellletconfig(linkedlist *head, char * cmd, int (*handler)());

//用於啟動命令列程式

int executeshelllet(linkedlist *head);

具體實現

int shellletconfig(linkedlist *l, char *cmd, int (*handler)())

p = (cmdnode *)malloc(sizeof(cmdnode));

p->cmd = cmd;

p->handler = handler;

addnode(l, (node *)p);

return0;}

int executeshelllet(linkedlist *l)

return

0;}

2.makefile編譯檔案

#

# makefile for shelllet program

#cc_pthread_flags = -lpthread

cc_flags = -c

cc_output_flags = -o

cc = gcc

rm = rm

rm_flags = -f

target = test

objs = linkedlist.o cmdopt.o shelllet.o

all:

$(objs)

$(cc) $(

cc_output_flags) $(

target) $(

objs)

.c.o:

$(cc) $(

cc_flags) $<

clean:

$(rm) $(

rm_flags) $(

objs) $(

target) *.bak

3.複雜指令解析

void cmd2arg(int *argc, char **argv)

if (*argc == 1)

}

使用者實現的複雜指令函式

int test(int argc, char *argv)
4.獲取命令列參

經cmd2arg處理後argv[1]開始均為命令列引數

void cmd2arg(int *argc, char **argv)

if (*argc == 1)

}

執行效果

我對老師的寫法做了一些修改,還是去掉了全域性鍊錶,這樣的話每次使用者(程式設計師)在使用這個程式的時候都得自己先建立乙個鍊錶,初始化之後再將鍊錶傳入executeshelllet函式中執行命令列程式。

這樣應該算是物件導向的實現思路吧,畢竟c中沒有類,不能定義乙個menu類再向其新增start方法。

其實這個程式有bug,不論輸什麼命令第一次都會失效。

我除錯之後發現是在第一次解析命令時字串比對函式strcmp出現錯誤,沒有返回正確結果的同時還改變了形參cmd的值。

就很神秘,這個函式的原型不是加了const麼,怎麼還能改變形參值的,還只出現一次。

感覺可能是標頭檔案include的問題,之前在沒加string.h的時候函式strtok也出現了一樣的問題。

試了很多沒有解決,就擱置了。

還有就是像加減乘除這樣有指令執行中含有scanf呼叫的命令2,執行結束後程式會執行乙個空指令(即「」)。

這個肯定是fget和scanf混用的問題,估計是add執行結束之後有個換行符\n還在輸入流裡,下一輪開始的時候被fget讀到了。

雖然在每個scanf後面單獨加個fget應該能解決,但是感覺這種方式非常蠢,也沒想到更好的方式,就算了。

這程式再拓展幾次估計就要不能維護了。

【swegnhan + 《軟體工程(c編碼實踐篇)》mooc課程作業

軟體工程實驗一

任務一 自行選擇乙個軟體專案,有背景說明 功能需求概述 專案名稱 互動新聞 背景說明 隨著社會的進步,網際網路技術日漸成熟,網路新聞成為人們獲取資訊的主要渠道。與傳統新聞相比,網路新聞具有自身的特點 不但具有報紙 電視等的一般功能,而且具有數位化 多 等的特殊優勢。所以網際網路中的網路新聞傳播變得越...

軟體工程實驗三

一 實驗名稱 詳細設計 二 實驗目的 根據需求分析 概要設計,完成系統的詳細設計 三 實驗主要內容 詳細設計的主要任務是設計每個模組的實現演算法 所需的區域性資料結構。詳細設計的目標有兩個 實現模組功能的演算法要邏輯上正確和演算法描述要簡明易懂。四 實驗原理 1 模組說明。說明該模組需要實現什麼功能...

軟體工程實驗三

部落格班級 ahpu軟體工程 作業要求 實驗三作業目標 學會使用 rational rose畫uml圖 學號3180701118 目錄5.飛機訂票系統 1 用例圖 1.使用 rational rose 建立執行者 actors 2.使用 rational rose 建立用例 3.使用 rationa...