第一次個人編程作業


這個作業屬於哪個課程 軟件工程 (福州大學至誠學院 - 計算機工程系
這個作業要求在哪里 第一次個人編程作業
這個作業的目標 完成老師布置的編程任務並總結分析
作業正文 如下正文
其他參考文獻
我的GitHub倉庫地址 JackWany

作業要求

發布一篇隨筆,使用markdown語法進行編輯。
在隨筆前附上github倉庫地址。

編程題目

漢字是迄今為止持續使用時間最長的文字,也是上古時期各大文字體系中唯一傳承至今者,中國歷代皆以漢字為主要的官方文字。我們在感嘆漢字的源遠流長時,也不禁感慨,為什么沒有一門使用漢字編程的語言?
小楊同學想到:用漢字來進行編程一定很有趣,來請你幫幫他。

編程要求

請編寫一個程序,制作一個簡易的中文語言編譯器,即使用中文語法進行編程,輸入為逐行輸入,每行為一個語句,一個語句代變一個操作,滿足以下語法要求(括號內代變格式類型,具體參考樣例):

變量定義:整數 (變量名) 等於 (數字)
運算(加法):(變量名) 增加 (數字)
運算(減法):(變量名) 減少 (數字)
輸出:看看 (變量名) or 看看 “(字符串內容)”

樣例1

輸入:

整數 氣溫 等於 十
氣溫 減少 三
氣溫 增加 二
看看 氣溫
如果 氣溫 大於 八 則 看看 “你好,世界” 否則 看看 “凍死我了”

輸出:

九
你好,世界

樣例2

輸入:

整數 小楊年齡 等於 八
整數 小楊零花錢 等於 二
小楊年齡 增加 一
如果 小楊年齡 大於 八 則 小楊零花錢 增加 一 否則 無
看看 小楊零花錢

輸出:

附加要求:

選擇:如果 (判斷語句) 則 (操作語句) 否則 (操作語句)
若否則后沒有任何操作使用(無)來進行填充(參考樣例2)。

注意事項

輸入輸出采用utf-8編碼,請在編碼過程中注意。
數字只會出現:零一二三四五六七八九十。(此條作廢,可先完成0-10的情況)
字符串輸出的雙引號是全角,即中文雙引號。
變量類型要求只有整數,如有余力,可以自己實現更多。
測試數據會相較於樣例復雜,請考慮充分需求。
不限制編程語言。
不能使用eval函數動態執行代碼,或調用系統指令。
數據輸入形式為交互式運行,類似於shell。

github要求

創建一個github倉庫。
使用git或其他git圖形應用程序(Github Desktop,TortoiseGit等)將程序代碼傳到倉庫,commit信息遵守一定的git規范。
加入.gitignore文件和開源license。

隨筆要求

要求記錄包括但不限於以下內容:

記錄自己的代碼行數,需求分析時間,編碼時間。
分解需求的思路,分解成多個模塊,並闡述為什么這么分,優勢在哪,可以附上代碼片段。
記錄不會的知識的學習過程以及修改優化的過程;可以附上資料網站。
自我發揮。

一、分析過程

首先我認為樣例1和樣例2無法同時實現,可能我的直覺是錯了,所以下面給出了針對樣例1和樣例2的不同的代碼段。樣例2是在樣例1的基礎上修改的,所以簡單的介紹一下樣例1的代碼。

需求分析

1.編程語言方面涉及較廣的是C和Python,我覺得C寫起來更容易些。
2.需要解決的問題有漢字字符如何轉化為數字、如何匹配或識別字符串從而進行加減運算(乘除就暫時不考慮了,加減還沒搞明白呢!)、輸入輸出字符串的順序問題。
3.第二題在第一題的基礎上哪些邏輯變化了、多行輸入字符串什么時候匹配結束(判斷字符串資源結束)。
4.循環條件語句、三目運算法則(如果 則 否則)。

代碼模塊

主要是由函數和主函數構成,包括零到十中文字符轉換為數字、通過識別增加和減少返回加減運算值、大於和小於的條件轉換,還有主函數包括整體字符串的輸入,匹配結束,然后根據匹配的值算出結果,再根據最后的條件語句和前面的加減結果判斷輸出的輸入的字符串部分!
至於為什么這么分?就是主函數對結果進行輸出,其過程會調用其他自定義函數!優勢就是代碼審核的時候容易一些,比較容易找出錯誤並改正!

二、還有疑惑

不會的東西但是后來會了

1.大概是時間久了忘了,后來網上查了判斷兩個字符串是否相等的內置函數是 是strcmp(字符串1,字符串2),如果其返回值為0的話就是一樣的,如果為1的話就不一樣,這個主要用作判斷。
2.一開始寫的時候,每次結果都是錯誤的,由於輸入的是多行有間隔的字符串,C無法自動判斷結束把? 然后上網查了可以加個while循環,里面加個字符串判斷end of file縮寫(EOF)就是一直到匹配完輸入的字符串為止。

還不會的東西

最主要的是不懂最后匹配得到結果結果判斷輸出的字符串,如果輸入是同一段還好,但是如果是不同的測試數據,條件的結果(順序)被限制了。

三、代碼如下

//樣例1

#include<stdio.h>//必備
#include<string.h>//必備
//定義整數字符串
char integer[100][100] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
int A(char a[]) {
    int i;
    for (i = 0; i < 11; i++) {
        if (strcmp(integer[i], a) == 0) {
            return i;
        }
    }
    return 0;
}//漢字轉數字

int compare(char a[], char b[], char c[]) {
    int x;
    x = A(a);
    if (strcmp(a, "大於") == 0)
        printf("%s", b);
    else if (strcmp(a, "小於") == 0)
        printf("%s", c);
}//本來是要給自己增加難度分兩種情況 但是后面發現沒用到

int figure(int n, char a[], char b[]) {
    int sum;
    sum = A(b);
    if (strcmp(a, "增加") == 0)
        return n + sum;
    if (strcmp(a, "減少") == 0)
        return n - sum;
    return 0;
}//運算

int main() {
    int outcome;
    char a[100], b[100], c[100], d[100], e[100], f[100], g[100], h[100], i[100], j[100],k[100];
    scanf("%s %s %s %s", a, b, c, d);
    //  printf("\n");
    outcome = A(d);
    while (scanf("%s %s", b, c) != EOF) {
        if (strcmp(b, "看看") != 0) {
            scanf("%s", d);
            outcome = figure(outcome, c, d);
        } else {
            scanf("%s %s %s %s %s %s %s %s %s %s",e,c,f,g,h,b,i,j,b,k);
            if (outcome < A(g)) {
                printf("%s\n", integer[outcome]);
                printf(i);
            } else if (A(g) < outcome<10 ) {
                printf("%s\n", integer[outcome]);
                printf(k);
            } else if (10 < outcome < 20) {
                printf("十%s\n", integer[outcome - 10]);
                printf(k);
            }

        }
    }
    return 0;
}

//樣例2

#include<stdio.h>//必備
#include<string.h>//必備
//定義整數字符串
char integer1[100][100] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
char integer2[100][100] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};

int A1(char a[]) {
    int i;
    for (i = 0; i < 11; i++) {
        if (strcmp(integer1[i], a) == 0) {
            return i;
        }
    }
    return 0;
}//漢字轉數字1year
int A2(char a[]) {
    int i;
    for (i = 0; i < 11; i++) {
        if (strcmp(integer2[i], a) == 0) {
            return i;
        }
    }
    return 0;
}//漢字轉數字2money
int compare(char a[], char b[], char c[]) {
    int x;
    x = A1(a);
    if (strcmp(a, "大於") == 0)
        printf("%s", b);
    else if (strcmp(a, "小於") == 0)
        printf("%s", c);
}//本來是要給自己增加難度分兩種情況 但是后面發現沒用到

int figure(int n, char a[], char b[]) {
    int sum;
    sum = A1(b);
    if (strcmp(a, "增加") == 0)
        return n + sum;
    if (strcmp(a, "減少") == 0)
        return n - sum;
    return 0;
}//運算

int main() {
    int outcome1, outcome2;
    char a[100], b[100], c[100], d[100], e[100], f[100], g[100], h[100], j[100], k[100];
    scanf("%s %s %s %s %s %s %s %s %s %s %s", a, b, c, d, a, g, c, h, b, j, k);
    printf("\n");
    outcome1 = A1(d);
    outcome2 = A2(h);
    scanf("%s %s", f, g);
    while (scanf("%s %s", f, g) != EOF) {
        if (strcmp(f, "看看") != 0) {
            scanf("%s", k);
            outcome1 = figure(outcome1, j, k);
            if (outcome1 > A1(d))
                printf("%s", integer2[outcome2 +1]);
        }
    }
}

四、代碼運行結果截圖

樣例1

樣例2

五、心得體會

代碼行數(包括文檔注釋和單元測試 : 125
需求分析時間:2.5小時左右
完成編碼時間:5~6小時左右

1.最后結果比如‘’你好,世界“,最后的輸出結果應該沒有雙引號,的確不清楚如何解決,嘆息完成作業了,后期將會改善!
2.此次編程花費大量時間,也從側面反映出自己基本語法、函數掌握得不夠牢固,寒假這幾天要多花花時間復習那幾門編程語言!
3.雖然花了不少時間寫出了代碼,也得出了測試結果,但是細節過程有待改善。例如樣例中的條件如果后面的條件改掉,也就是數字改掉,則必須將代碼改掉,才可以運行成功!
4.接下來可以嘗試用其他語言比如python,c++嘗試着寫同樣的題目,我個人認為C語言雖然基礎萬能,但是有更方便快捷的語言代替它!

代碼尚有不足之處,望不吝賜教,敬請斧正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM