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 改进大做业总结

此次改进大做业我并无进行太多的改动,只是合并了一些函数,并新增了以个本来没有的函数,其他的地方几乎仍是原代码,不过这只是我初步的改进,并非我最终的改进,但因为时间关系,本次博客我只能先用我初步的改进来写了。我如今已经开始着手于大做业的最后一次改进了,本次改进的最终改动将与大做业的最后一次改进一同完成。函数

相关文章
相关标签/搜索