1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量
1.2.1 学习体会
- 本章主要学习了指针的相关知识,指针是c语言中一个非常重要的概念,使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值。指针相当于箭头,指引着文件的读取方向,这个指引地址不受限于局部程序,相当家庭住址不受限于国家,只要存在就是唯一。我发现,在运用指针时经常和数组结合,或者能代替数组解决问题,可以看出来数组和指针在很多方面能处理同一类问题,但本质问题是数组a是指针常量而指针p是变量;且数组的操作较为直观而指针的效率高、更灵活。在本章同时也学习到了字符串的不同输入输出方式以及新技巧——复制、连接、比较长度、求长度;还有用指针实现内存动态分配等知识。
- 通过对指针的学习,使程序从以前的表面上升到立体,数据处理从以前的逐个转化成逐层,新的知识已经开始引入文件内存和数据储存的理念,这使得我在这次的学习中明显跟不上节奏,函数的运用没有理解,导致后面的很多知识都不能学好。本学期的c语言学习即将结束,但学到的知识却只是小部分,真正的程序编写还需要自己的努力,也希望在接下来的学习中能补缺补漏,学到实质。
1.2.2 代码累计
2.PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
指针:110
总分:110
3.PTA实验作业
3.1 PTA题目1
给定一句英语,将句中所有单词的顺序颠倒输出。
3.1.1 算法分析
定义i为计量数
定义指针p
定义储存字符串的字符数组word[510000]
读入字符串到word
for i=0 to word[i]==0 do //把i移向最后一个字符
i++
end for
while word[i-1]==' ' do //舍去最后的空格
i--
end while
word[i]=' '//在末尾加上终止符
for i to i==0 do
if word[i]==' ' then//当出现空格时
p=&word[i+1]//指向空格后的一个数
while word[i-1]==' ' do //舍去空格
i--
end while
if i==0 then //处理开头有空格的情况
输出p所指字符串
else 输出p所指字符串加空格
end if
word[i]=' '//在每个单词末尾加上终止符
end if
end for
p=&word[0]//指向第一个单词
输出p所指字符串
3.1.2 代码截图
3.1.3 PTA提交列表及说明
- Q1:由于二维数组判断和输出方便,所以刚开始用二维数组进行储存
- A1:单词的不限定性使得要定义横纵长度都为50w的二维数组,内存越界使得段错误,后来相试着用结构体等价替换,也不能正常储存;而后用一维数组将整个字符串输入再进行处理,才解决数据过大的问题。
- Q2:对一串多单词长句进行单词倒序输出,题目有两个不同的输出顺序使得要求断点判断
- A2:采用逆向思维,先从最后进行判断,直接指向最后一个单词的最后一个字符,然后开始指针往前走,走到空格时停下,对指针后的单词进行输出;然后舍去空格,再接着往前走,以此类推,不断截点输出后方单词;到最后要注意第一个单词前有空格时需要分开讨论,将空格全部舍去后若还有单词则输出单词,若没有则不输出。
注意点:庞大的数据需要用合适的方法储存,输出的顺序有交替变换需要逆向分析,最重要的还是指针和终止符的结合运用。
4.大作业
4.1.改造函数介绍
1.函数1和2
- 伪代码
定义计量数i
定义算式字符数组Exp[20]
引用时间函数创造随机数
定义数组a[4]存放'+','-','*','/'
switch (*DegreePtr)//对已选择难度进行处理
case 1: Exp[0]=rand()%10+'0'
Exp[1]=a[rand()%4]
if Exp[1]=='/' then//重构除数为0的非法题目
Exp[2]=rand()%9+'1'
else Exp[2]=rand()%10+'0'
end if
Exp[3]='='
Exp[4]=' '
退出
case 2: for i=0 to 8 do//输入算式的字符串
if(i+1)%3==0 then
Exp[i]=a[rand()%2]
else Exp[i]=rand()%10+'0'
end if
end for
Exp[i]='='
Exp[i+1]=' '
退出
case 3: for i=0 to 11 do//输入算式的字符串
if (i+1)%4==0 then
Exp[i]=a[rand()%2]
else Exp[i]=rand()%10+'0'
end if
end for
Exp[i]='='
Exp[i+1]=' '
退出
end switch
*AnswerPtr=calculate(Exp)//引入"计算"的函数得到答案
- 函数截图
2.函数3
- 伪代码
定义答案为answer
定义数据为num
定义运算符op
while *ch<='9'&&*ch>='0' do //先得出第一个数作为答案
answer=10*answer+*ch-'0'
ch++
end while
输出answer
while *(ch+1)!=' ' do//字符处理
num=0//初始化数据
op=*ch
ch++//指针下移
输出op
while *ch<='9'&&*ch>='0' do//字符转数字
num=10*num+*ch-'0'
ch++//指针下移
end while
输出num
switch(op)//四则运算
case '+':answer+=num 退出
case '-':answer-=num 退出
case '*':answer*=num 退出
case '/':answer/=num 退出
end switch
end while
输出"="
返回answer
- 函数截图
4.2 与原有函数代码比较
-
函数1和2
不同点:原来的多个数字改为用数组统一存放;将每个算式改用字符数组存放并用指针传递到下一个函数。
- 优点:
1.不同难度的题目生成的相同点多了,更好地合并程序;
2.字符数组存放算式能通过指针直接传递给其他函数,减少全局变量的使用,增强程序安全性;
3.从根源解决了除数为0的非法情况。- 缺点:没有以前数字直接生成的程序可读性好,情况处理变繁杂。
-
函数3
不同点:之前采用参数传递每个数字,而改进为传递地址指针直接读取数据
- 优点:指针的运用使算式的读取更为简便,不局限于算式的长短。
- 缺点:字符到数据的转化需要转变大部分原有思路。
4.3 改进大作业总结
- 程序的改进需要的是前面的不断探索,如果没有之前的反复尝试,也很难能在这次的短时间内完成改进。指针的改进需要通读程序,不断引用地址参数才能减去全局变量的使用,字符数组的引入则需要将合适的变量组合才能发挥作用。从刚开始的频繁调用函数的程序,到现在指针的引入后,使得各函数的结合性增强;同时在函数间传递指针的做法使全局变量能全部更改为局部变量和函数参数,防止各函数间相互干扰;数组的运用也使得各同类数据能结合在一起,提高数据处理效率和程序可读性。经过封装的程序就是不一样,更加容易理解,结构更加灵活。
- 而后文件知识和项目管理的运用,既能提高函数的关联性,又能将代码运用到实际。大作业的目的是使我们能更好地学以致用,不会在以后突然的大程序设计上陷入困境;写代码,修代码,完善代码,程序员的生活悄然临近……