指针实验报告-201621033002杨晓琪

一、PTA实验作业

题目1:6-4 字符串的连接

1. 本题PTA提交列表

最终代码:

2. 设计思路(包括流程图)

设计思路:首先记录字符串s的最后一个值的下标,然后将字符串t依次加到字符串s后面,最后在s后面加入结束标志‘\0’。

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

由于看到题目中包含有#include<string.h>文件,于是我直接用strcat函数,提交结果答案错误。

于是我又改用strlen函数,

发现t给s赋值的时候t的值设置错了,导致漏掉t的第一个值,于是我把*(s+i)=*(t+i-slen+1)改为*(s+i)=*(t+i-slen),问题解决。

题目2:6-11 查找子串

1. 本题PTA提交列表

最终代码:

2. 设计思路(包括流程图)

 

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

调试中出现的问题主要是如上代码的if(flag==0)判断语句的位置放到了外一层的 } 之外,局部代码如下:

label++;
}
}
if(flag==0)

也就是,每当最外层循环一开始,flag置零,但如果第一个*(s+i)!=*(t+j),那么将不会执行flag=1的语句,那么即使未找到子串,flag也依旧是0,所以结果出错如下

修改后问题未解决,原因是在s字符串中字符与t的第一个字符相等时,在进行子循环时,语句*(s+label)!=*(t+j)被我写成*(s+i)!=*(t+j),固然除非子串t全为同一个字符之外,结果都会出错,修改后结果正确。

题目3:6-7 输出月份英文名

 1. 本题PTA提交列表

最终代码:

2. 设计思路(包括流程图)

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

一开始是采用将所有月份先储存在一个二维数组中:

{ char *month; char mon[12][10]={"January","February","March","April","May","June","July","August","September","October","November","December" };

month=NULL;

if(n<=0||n>12)

return month;

month=mon[n-1];

 return month; }

但执行后结果一直出错,原因是定义的二维数组是在函数内部定义的,属于局部变量,只在函数内部起作用。在执行函数调用时,系统在栈上为函数内部的局部变量及形参分配内存,函数执行结束时,自动释放这些内存。所以,这时我们需要动态分配这些内存。 

修改后代码如下:

char *month; char **mon; int i;

mon=(char **)malloc(12*sizeof(char *));

mon[0]=(char *)malloc(12*10*sizeof(char));

for(i=1;i<12;i++)

mon[i]=mon[0]+i*10;

但代码太长了看起来好麻烦,于是改成了最终以上的版本。

二、同学代码结对互评

1.我的代码、互评同学代码截图

我的代码:       

 

同学的代码(李怡婷):

2.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

我的代码太长太拖沓,分出了三个子函数,结果还是有出现各种问题,主要是两人的思路方向不同,导致了程序代码执行的不同。同学的代码简洁明了,而我的代码看起来更像绕了许多弯子,但我的代码的优点是封装出了三个子函数。但我还是更喜欢同学的代码。

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

四、本周学习总结

1.对指针、地址有了较深的理解,但运用任然不熟练。

取地址运算:&

int *p=&a,表示取变量a的地址,并将这个地址值作为指针p的值,使指针p指向a

间接访问运算符:*

它有两个作用:定义指针,访问指针所指向的变量。

*p即a的值

指针的赋值:只能赋值给相同变量的指针。

2.对子函数运行内存的分配内存仍然不是很理解,对分配内存还打不出代码。

malloc()利用sizeof计算存储块大小。

malloc()返回值为(void *)类型,需要强制转化。

 

转载于:https://www.cnblogs.com/kiyomi7/p/8296053.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值