C语言---指针

一、PTA实验作业

题目1:使用函数实现字符串部分复制

1. 本题PTA提交列表

1231949-20171216184955468-367488276.png

1231949-20171216185003733-685551331.png

2. 设计思路

主函数:
   定义字符数组t,s
   定义整型变量m,表示从第m个字符开始复制
   输入m
   调用函数
   输出新的字符数组s
被调函数:
    定义循环变量k,赋初值m-1
       循环结束
       只要满足*(t+k)不是终止符
       将*(t+k)赋给*s
        k++;
    s++;
        数组t遍历结束
        给新数组s添终止符

3.代码截图

1231949-20171216191310405-337423648.png

4.本题调试过程碰到问题及PTA提交列表情况说明

这一题一开始想的是遍历数组,记录原数组长度j,在比较m和j的大小,如果m<j,从第m个元素开始赋给新数组,但是编译器一直运行不了,提交也先显示错误,设的变量也比较多。后来发现循环条件其实就有考虑今m超出数组长度的情况了,因为不会进入循环,所以干脆直接就让循环从第m个元素开始,只设置了一个循环变量。虽然编译器还是运行不了,但PTA通过了。

题目2:求子串在母串中最后一次出现的地址

1. 本题PTA提交列表

1231949-20171216193351514-851692222.png

2. 设计思路

主函数
    定义字符数组s, t, 指针变量*p;
    输入字符数组s(母串)
    输入字符数组t(子串)
    调用函数
    如果找到了子串在母串中最后一次出现的地址,输出新的字符数组
    如果没找到输出Not found !
被调函数
    定义循环变量i,j,k
        定义变量m;
    定义变量count,并赋初值0;
    定义变量p,并赋初值0;
    只要满足*(t+p)不是终止符
        p++;
    for i=0 to (s+i)=='\0'
        如果*(s+i)d等于子串的首字符*t相等
            for j=1 to *(t+j)!='\0'
                如果*(s+i+j)和*(t+j)不相等了,跳出循环
                   如果循环正常结束且*(s+i+j)!='\0'
                     m=i,m存放子串在母串中开始位置
                     i加上子串长度,存放循环后i的值
                       当j==p,count++,count记录母串中子串出现次数
    end for
    for i=m,k=0  to *(s+i)!='\0'
        *(s+k)=*(s+i)
        实现从最后一次子串出现位置到字符数组结束的复制
    *(s+k)='\0';
     如果count==0
         说明母串中没有出现子串
        返回  NULL;
         否则返回 s;

3.代码截图

1231949-20171216230520046-459468350.png

1231949-20171216230541405-1459810971.png

4.本题调试过程碰到问题及PTA提交列表情况说明

这一题寻找母串中子串,我用到了欧阳上课分享的方法,出现的一次错误是返回值弄反了,问题的话,寻找子串不是很熟练,主要照着欧阳的方法类似写出来的。

题目3:字符串串动变化

1. 本题PTA提交列表

1231949-20171216231223233-878925597.png

2. 设计思路

1231949-20171217002941702-95202202.png

1231949-20171217015505874-1438552000.png

1231949-20171217015344671-1239937020.png

(没选好题目,一不小心就画不下了,画了好久。。。)

3.代码截图

1231949-20171217014155811-1554997410.png

4.本题调试过程碰到问题及PTA提交列表情况说明

一开始把max 赋给*p,运行结果总是开头是e,但是整个字符串没有A,删除这一语句,又有了,说明A被e覆盖了,改了几次没有改正确。只能采用很笨的办法,把max赋给最后一项,再冒泡到第一项(写这一题是想评论里可以分享这题他们的简便做法)

二、截图本周题目集的PTA最后排名

1231949-20171216183845468-108906120.png

三、阅读代码

找两篇优秀代码贴图展示,并说明该代码功能是什么,优点是什么?

1231949-20171217110222311-2109372994.png

代码功能:删除母串中子串,并且删除后如果新的母串中还有子串继续删除

优点:比较简单好懂,利用了库函数。先找母串中子串,如果没有,返回NULL,如果有,注意记录母串中子串中开始位置,因为后面要将子串后元素接到这部分后面形成新的母串,然后重复上面步骤,最后输出删除完毕后最后的母串

1231949-20171217110658874-288293626.png

代码功能:实现逆序输出

优点:其实这种方法上课老师也有分享过,适合数组比较大的,效率会高很多,因为常规方法就是遍历数组,记录数组长度,然后从最后一个开始输出,数组越大,效率越低。而这种方法,直接将最后一个数和第一个对调,第二个和倒二个对调,,,,,,循环次数少了很多

四、本周学习总结

1.自己总结本周学习内容。

1.1结构体类型定义一般形式

struct 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
···
类型名 结构成员名n;
};

注意:不要忘记}后的;
数据类型名是struct和它后面的结构名一起组成的

1.2 结构体的嵌套定义

注意:先定义成员结构类型,再定义主结构类型

1.3结构类型的初始化

(1)采用初始化表的方法,大括号内各项用逗号隔开,按顺序赋给结构变量内各个成员,且要求数据类型一致
(2)结构变量的储存布局按照类型定义中成员的先后顺序排列
(3)一个数据结构变量所占内存空间是各个成员所占内存空间之和,用sizeof计算,单位是字节

1.4结构变量的引用

(1)格式: 结构变量名.结构成员名
(2)嵌套定义的结构变量中,每个成员按从左到右,从外到内的方式引用

1.5补充用法

(1)结构运算符优先级高于一般运算符
(2)如果俩个结构变量具有相同的类型,允许将一个结构变量的值直接赋给另一个
(3)结构变量可以作为函数参数,可以传递多个数据且参数形式较简单,但是传参时进行的结构数据复制使得效率较低。

1.6结构数组

与普通数组类似,不同之处在于每个数组元素都是一个结构类型的数据
对结构数组元素成员的引用一般格式: 结构数组名【下标】.结构成员名

1.7结构指针

(1)结构指针的值实际是结构变量的首地址,即第一个成员的地址
(2)访问结构成员的俩种方法
1.用p 如(P),num=101 括号不可少
2.用指向运算符-->访问指针指向的结构成员 如 p-->num=101

1.8结构指针作为函数参数

当结构成员众多的时,参数传递过程中就需要消耗很多空间,而使用指针作为函数参数只要传递一个地址值,极大提高了效率

2.罗列本周一些错题。

1231949-20171217024326327-2081519289.png
上面总结有如何引用结构体变量成员,要么用(*p)要么用指向运算符,所以选D

1231949-20171217024839639-114936549.png
空1,根据主函数知道应该传给一个指针变量,结合被调函数,应该是将m的值传给n,所以填int n
空2,是数组元素与x值相同的情况,应填a[i]==x
空3,是循环条件,应填j<n-1
空4,表示从i开始,后面的元素往前移一位,所以字符数组长度缩短,填n=n-1

转载于:https://www.cnblogs.com/tajiyu/p/8047481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值