C語言博客05--指針

1.本章學習總結

1.1 思惟導圖

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

1.2.1 學習體會

在本週的學習中,我學到了算法

1.數組各元素的地址與數組名的關係,以及指針在數組中的應用
2.字符串的儲存方式,以及衆多的字符串處理函數
3.動態內存的分配

1.2.2 代碼累計

代碼量(行)
15 412

2.PTA總分

2.1截圖PTA中函數題目集的排名得分

2.2 個人總分:110

3.PTA實驗做業

3.1 PTA題目1

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

    3.1.1 算法分析

定義字符指針怕,字符數組a[500001]
定義整型變量i,j,flag,其中flag=0
gets(a);//輸入字符串 
j = strlen(a);
p = a + j - 1;//p指向字符串的最後一個字符 
while *p == ' ' do //跳過字符串末尾的空格 
    *p = 0;
    p--;
    j--;
end while
for j= j to 1 do
    if j == 1 then//若p指向字符串的首元素 
        if p != 0 then
              if flag==1 then
                printf(" ");
              end if
            printf("%s", p);
        end if  
    else if *(p-- - 1) == ' ' then//若p指向字符的前一個字符爲空格 
          if flag==1 then
            printf(" ");
           end if
        printf("%s", p+1);
        flag=1;
        while *p == ' ' do//跳過全部空格 
            *p = 0;
            p--;
            j--;
        end while
    end if
end for

3.1.2 代碼截圖


3.1.3 PTA提交列表及說明

  • 這道題在一開始的時候我並無考慮到多空格的問題,所以我也幾個點上卡了一會了,直到以後注意的了可能有多個空格以後這個問題以後才過了所有的測試點

4.大做業

4.1.改造函數介紹

1.函數1

定義變量 flag;
srand(time(0));
定義整型數組_num[3],字符數組_op[3] 
num = _num, op = _op; /*全局指針num和op分別指向兩個數組*/ 
定義變量 i, m, j;
m = pow(10, level);
exit:
for i = 0 to 3 do
    _num[i] = rand() % m;
    j = rand() % 4;
    switch j then
        case 0:_op[i] = '+'; break;
        case 1:_op[i] = '-'; break;
        case 2:_op[i] = '*'; break;
        case 3:_op[i] = '/'; break;
    end switch
end for
flag = IsExp(); /*判斷生成的題目是否合法*/
if flag == 0 then /*若不合法則從新執行上述過程*/ 
    goto exit;
end if 
if level == 1 then /*將題目寫入exp中*/ 
    sprintf(exp, "%d%c%d", num[0], op[0], num[1]);
else
    sprintf(exp, "%d%c%d%c%d", num[0], op[0], num[1], op[1], num[2]);
end if

最終代碼:

2.函數2

定義變量 p;
if op[0] == '/' then
    if num[1] == 0 then return 0;/*若除數爲0*/ 
    end if
    if num[0] % num[1] == 0 thrn return 1;/*判斷是否能整除*/ 
    else return 0;
    end if
end if
if op[1] == '/' then
    if num[2] == 0 then return 0;/*若除數爲0*/ 
    end if
    if op[0] == '+' || op[0] == '-' then/*判斷是否能整除*/ 
        if num[1] % num[2] == 0 then return 1;
        else return 0;
        end if
    else
        if op[0] == '*' then p = num[0] * num[1] % num[2];
        else p = num[0] / num[1] % num[2];
        end if
        if p == 0 then return 1;
        else return 0;
        end if
    end if
end if

最終代碼:


3.函數3

定義整型變量 i, j, k, m, answer 
定義整型數組 num[10];
定義字符數組 op[10];
i = 0, m = 0, j = -1, k = -1;
do
    if exp[i]<='9'&&exp[i]>='0' then 
        m = m * 10 + exp[i] - '0';
    else
        op[++k] = exp[i];
        num[++j] = m;
        m = 0;
    end if
    if k >= 1 then /*先計算算式優先級較高的乘除法*/ 
        if  op[k-1] == '*' || op[k-1] == '/' then
            if op[k - 1] == '*' then
                num[k] = num[k - 1] * num[k];
            else if op[k - 1] == '/' then
                    num[k] = num[k - 1] / num[k];
            end if
            num[k - 1] = 0;
            if k - 2 >= 0 then
                op[k - 1] = op[k - 2];
            else
                op[k - 1] = '+';
            end if
        end if
    end if
while exp[i++] != '='  do 
answer = 0;
char _op = '+';
j = 0, k = 0;
while 1 do /*計算算式中剩下的加減法*/ 
    if _op == '+' then answer += num[j++];
    else if _op == '-' then answer -= num[j++];
    else if _op == '=' break;
    end if
    _op = op[k++];
end while
return answer;


4.2 與原有函數代碼比較

1.函數1

  • 函數1相較於我本來的代碼來講,它是我本來幾個函數合併以後的函數,總體思路並無太多變化,只不過我藉助合併刪除了本來的一些多餘的代碼,使得代碼看上去更加的簡短一些

2.函數2

  • 函數2的功能是我本來沒有的,是此次改動新增的,因此就很少說了

6.函數3

  • 函數3相較於我原來代碼來講會更好,原來的代碼只能計算一步或兩部的運算,而新的代碼已經不侷限於一步或兩步的運算了,能夠計算更多步的算式

4.3 改進大做業總結

此次改進大做業我並無進行太多的改動,只是合併了一些函數,並新增了以個本來沒有的函數,其他的地方几乎仍是原代碼,不過這只是我初步的改進,並非我最終的改進,但因爲時間關係,本次博客我只能先用我初步的改進來寫了。我如今已經開始着手於大做業的最後一次改進了,本次改進的最終改動將與大做業的最後一次改進一同完成。函數

相關文章
相關標籤/搜索