C語言博客做業05--指針

1.本章學習總結

1.1 思惟導圖

1.2 本章學習體會及代碼量學習體會

1.2.1 學習體會

可能由於這兩週進度的加快,感到比較吃力,知識點比較抽象,不那麼容易理解,也可能最近由於被準備考試,寫論文等事情追趕着,對C語言、PTA這方面有所懈怠(個人錯。。。T_T)。總之,在指針方面還存在不少不足,有的知識點沒有及時掌握,還要課後花時間看課本,對一些用法或者須要注意的地方還不夠熟悉,但願經過以後的時間能夠抓緊時間,掌握不熟練或者遺漏的知識點,多加練習,掌握這方面的知識。算法

1.2.2 代碼累計

2.PTA總分

2.1截圖PTA中指針題目集的排名得分

2.2 個人總分:

125分數組

3.PTA實驗做業

3.1 PTA題目

給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。函數

3.1.1 算法分析

定義 i,統計count=0;
定義 字符數組s[500001],指針*p;
gets(s); //輸入英語 
i=strlen(s)-1;//取字符串長度 
for i=strlen(s)-1 to 0   do 
    if s[i]==' '   then 
        if s[i+1]!=' '&&s[i+1]!='\0'  //出現單詞 
            p=s+i+1;
            count++;
            if count>1  then 
                printf(" ");//控制輸出最後一個單詞沒有空格 
            printf("%s",p);
        end if 
        s[i]='\0';
    end if 
    else if i==0&&s[i]!=' '  then//單獨判斷最後一個 
        p=s;
        if count>=1 then
            printf(" ");
        end if
        printf("%s",p); 
    end
end for

3.1.2 代碼截圖

3.1.3 PTA提交列表及說明

-Q1:剛開始在輸出方面沒有什麼思路
-A1:後來去請教了同窗
-Q2:一開始沒有發現最後單詞沒有空格
-A2:經過count控制學習

4.大做業

題目:實現小學四則運算。

4.1.改造函數介紹

4.1.1 函數

函數CreateExp(char *exp,int level)
    定義整型變量 題量number,答題次數times,統計count=0;item,temp;
    定義整型變量 i,j,符號sign,數字個數k,位數m,運算符種類n,a;
    static char str[100],ch[5];
    static char yourAnswer[10];//定義字符數組 字符str[100],運算符ch[5],yourAnswer[10]並初始化 
    static int num[5];//定義整型數組 數字num[5]並初始化
    提示並輸入題量; 
    for i=1 to number do 
        memset(exp,0,100*sizeof(char));//每次輸出後將存放表達式的指針的內容清空 
        if level=1 then
            k=2;m=9;n=4;a=1;break;
        else if level=2 then
            k=3;m=90;n=2;a=10;break;
        else if level=2 then
            k=3;m=900;n=2;a=100;break;//根據級別,賦予對應的參數
        num[0]=level;//將存放數字的數組的首位存放級別 
        for j=1 to k do num[j]=rand()%m+a;//生成隨機數字 
        for j=1 to k-1 do 
            sign=rand()%n+1;
            switch(sign)
                case 1:ch[j]='+';break;
                case 2:ch[j]='-';break;
                case 3:ch[j]='*';break;
                case 4:ch[j]='/';break; //隨機生成運算符,並儲存在數組中; 
        Select(num,ch);//判斷數字是否知足條件 
        for j=1 to (k*4) do 
            if j==1 or j==5 or j==9 then
                itoa(num[temp],str,10);//將數字轉換爲字符 
                temp++;
            else if j==3 or (j==7 and level!=1) then *str=ch[j/3];
            else if j==(k*4)-1 then *str='=';
            else *str=' ';
            strcat(exp,str);
            memset(str,0,100*sizeof(char));//清空 *str
        輸出算式,並提醒用戶輸入答案; 
        count=Check(num,yourAnswer,ch);//調用函數校對答案 
        詢問是否中途退出; 
        Rate(count,times)*100);//調用函數計算正確率

我使用了memset函數來清空指針裏的內容
void memset(void s, int ch, size_t n);頭文件在<string.h>中,將s中當前位置後面的n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s3d


4.1.2 函數

函數Select(int *num,char *ch)
    定義整型變量 change,result;
    if num[1]<num[2] and ch[1]=='-'
        經過變量change將二者進行交換//使1位數運算結果爲正數 
    if ch[1]=='/' then 
        while num[1]%num[2]!=0
            從新生成兩個運算數//將除法定義爲整除運算 
    if num[0]!=1 then 計算前兩個數字運算結果 
    while result<num[3]
        if ch[2]=='+' then break;
        switch(num[0])
            case 2: num[3]=rand()%90+10;break;
            case 3: num[3]=rand()%900+100;break;//  使2位數和3位數運算結果爲正數

關於這個函數,由於考慮到除數不能爲0,及一位數運算數據中出現0的無心義性,因此只隨機產生1~9;
考慮到小學運算不涉及有關負數運算及除法不整除的狀況,因此增長了些條件進行判斷;指針

4.1.3 函數

函數Check(int *num,char *yourAnswer,char *ch,int count)//計算正確率 
    定義整型變量 答案answer;
    static char str[10];//定義字符串str並初始化 
    switch(ch[1])
        根據符號進行計算; 
    switch(ch[2])
        根據符號進行計算;
        default:  break;//若只有1步計算則break 
    itoa(answer,str,10);//將正確答案轉爲字符; 
    if strcmp(str,yourAnswer)==0 then 
        輸出答案正確 
        count++;
    else 提示答案錯誤並輸出正確答案 
    return count;

由於以前篩選環節比較特殊,因此定義存放數字和運算符的兩個數組,因此在判斷正誤函數,直接經過傳遞兩個數組的地址來計算正確答案code

4.2 與原有函數代碼比較

改造前函數一、2和改造後的函數一、2

由於改造後函數一、2的功能在改造前函數是封裝在3個函數中,因此就一塊兒比較blog

  • 改造前的函數一、2




    字符串

  • 改造後的函數一、2


    get

不一樣:
1.函數封裝的不一樣,改造前將級別一、級別2&3和符號生成的函數是依次分開,而改造後的是封裝成生成運算式和判斷運算式是否合理兩個函數;
2.在生成運算式這一塊,是定義多個變量,每一個變量對應一個值,而改造後是存放在數組中
優勢:
1.改造前將級別一、級別2&3是分開的,許多語句是重複的,不利於閱讀,改造後將一些重複的語句刪除;
2.經過指針,取消了全局變量
缺點:
改造後將以前的幾個函數功能封裝在一塊兒,語句可能過於複雜

改造前函數3和改造後的函數3

  • 改造前的函數3

  • 改造後的函數3

    不一樣:
    1.改造後傳遞的輸入答案爲字符串;
    2.改造後經過傳遞數組計算正確答案
    優勢:
    1.改造後傳遞的輸入答案爲字符串,完善了以前輸入字符串時程序會直接結束的bug

4.3 改進大做業總結

第二次進行改良的時候明顯就困難多了,不只要進一步完善程序,並且還要運用新的知識,修改的時候可能由於新知識掌握的不夠熟練,仍是練習的不夠,顯得有些慌亂。不只要修改以前隱藏的bug,還要解決修改過程當中出現的新的問題,並且還要面臨從新封裝函數或者從新構造函數的問題,因此我的認爲改代碼要比從頭開始寫代碼可貴多。但好在其餘同窗的幫助下,完成了此次修改,但我的認爲還須要多多練習,提升打代碼時的熟練度。

相關文章
相關標籤/搜索