C语言博客05--指针

1.本章学习总结(2分)

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

本周学习感受:自从接触了指针,感觉打开了新世界的大门。原先在数组、字符串的学习中已经对于地址这个概念有了一个较为深刻的了解,通过本章对指针的学习,对于内存、地址有了更加全面的认识,并且掌握了如何使用指针去访问内存单元。相较之前的数组、字符串来说,直接用指针去访问内存单元会更加直观。指针被称为c语言的灵魂是有依据的,因为它确实很方便,同时也是c语言的特色。但同时,指针也是一个难点。比如野指针的概念,我刚开始使用指针的时候就老是犯错误。而且对于指针的更深层次的研究,如二次指针,就有些复杂,需要仔细思考一番才能理解它的意思。总而言之,本周对于指针的学习较为顺利,个人认为指针的引入十分的有意义,指针使得访问内存单元更加直观,确实很好用;但是要用得熟练,仍需要训练

1.2.2 代码累计

2.PTA总分(2分)

2.1

2.2 我的总分:110

3.PTA实验作业(1分)

3.1 PTA题目1

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

3.1.1 算法分析

定义字符串a存放单词串,字符型指针p存放a的首地址
输入字符串a
定义整数len存放a的长度,i、j为循环变量,变量flag控制是否输出空格
for i=len-1 to 0 do
    if 此时p指向的字符为单词首字母 then 
        if flag==1 then
            输出空格
        end if
        for j=i to p+j指向的字符为空格或为字符串末字符 do
            输出该字符
        end for
        if flag==0 then
            flag=1
        end if
    end if
end for

3.1.2 代码截图

其实这题我本来用的字符串做的......后来强行改成了指针

3.1.4 PTA提交列表及说明

  • Q1:最早尝试用指针来做,发现到处都是bug(指针基础不扎实)纠结了好久......其中陷入了野指针的误区致错。
  • A1:干脆先用字符串做一遍,理清楚思路再尝试用指针做
  • Q2:在运用指针的过程中,没有去记录指针所记录的初始地址就开始利用指针所存地址自增来遍历字符串,于是导致输出时输出了奇怪的东西。
  • A2:后来改用i自增来用地址加i来遍历字符串,避免了这个问题。当然,事先记录地址也可以解决这个问题。

4.大作业(5分)

声明:由于我的第一次大作业代码几乎没有使用全局变量,所以只是对原有的程序结构及功能进行完善

4.1.改造函数介绍

声明:由于在第一次大作业时我的代码中这三个函数的功能都集中在一个大函数Calculate中,因此这次改进,我主要把该函数拆分并改善

1.函数1:CreateExp

传入用于储存计算式的地址,储存到字符型指针变量exp中,传入等级level
整型变量i,j为循环变量
字符数组“+-*/”
if level=1 then
    生成一步一位数加减乘除计算式,并储存
    while *(exp+2)==0 do    //保证分母不会出现0
        *(exp+2)=rand()%10+'0'
    end while
else if level==2 orlevel==3 then
    生成两步2/3位加减计算式,并储存
end if
输出 请输入“计算式”的答案 

2.函数2:IsExp

传入计算式的地址,由字符型指针exp存放
整形sign=1
if 前一个数不能整除后一个数 then
    sign=0
end if
if 当运算符为-或/且前一个数小于后一个数时 then
    sign=0
end if
返回 sign

3.函数3:ComputeExp

传入算式字符串的地址给字符指针变量exp,传入答案地址给整型指针变量answer
*answer初始化为0,oldop记录旧的计算符,初始化为'+'
定义i为循环变量m为中间变量,记录每个数字的值
while *(exp+i-1)!=0 do
    if *(exp+i)是数字字符 then
        m=m*10+*(exp+i)-'0'    //计算m的值
    else
        if oldop为'+' then
            *answer+=m;
        else if oldop为'-' then
            *answer-=m;
        else if oldop为'*' then
            *answer*=m;
        else if oldop为'/' then
            *answer/=m;
        end if
        oldop=*(exp+i);   //新的字符取代旧的字符
        m=0 //重新初始化为0
    i++
end while

4.3 与原有函数代码比较

原先只有一个长得吓人的大函数:

  • 1.二者不同:原先的大函数一个函数囊括了所有的功能,新的多个函数来实现原函数的功能,还有所提升。
  • 2.二者优点:新函数分块实现功能显然比旧函数有更好的可读性以及拓展性,以后要修改程序的功能也会更加方便。旧函数虽然很长,但是能实现的功能比新函数要强,也会更加稳定,bug少。
  • 3.二者缺点:新函数的分块实现虽然将功能分块实现,但是功能有待完善,同时参数间的传递较为复杂,不便阅读。旧函数的缺点就很明显,功能集中导致代码冗长,可读性差,拓展性也很弱。

4.4 改进大作业总结

第一次写大作业时:第一次写还算比较顺利,因为不需要大量调用函数(因为构思时的函数模块划得不是特别好),主要困难是调试一些bug,以及在程序的交互性上花了比较大的功夫。因为是重头开始写,所以花的时间还算久。
第二次写大作业时:第二次进行改良的时候明显就困难多了,因为改代码要比从头开始写代码难得多(个人观点),虽然是自己的代码,但毕竟也有一段时间了,所以改之前还是瞅了好久hh。然后这次的修改主要有两个方面:第一是对之前安全输入bug的修复(我加了个安全输入的函数),第二就是为了程序的拓展性而把大函数拆分成几个函数,这也是重难点。在写程序的时候,明显感觉到在进行参数传递的时候,不够熟练(因为写得还是太少)。再就是这次得代码中加入了被调函数中再调用函数的情况,导致代码写得很慢,思路也比较乱。

posted @ 2018-12-17 19:33  super饭团君  阅读(465)  评论(1编辑  收藏  举报