一、PTA实验作业
题目1(6-5)
(1).本题PTA提交列表
(2)设计思路
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
- 头一次的段错误,是因为循环条件写成了
*f<=*l
,而不是f<=l
- 当只输入一个字符时,出现了问题
- 原因在于当只有一个字符时j就为负数,不进入循环
- 所以就改换为用strlen函数,去除无用的flag变量,使循环正常结束时输出1,在循环里如果满足条件的话就返回0
题目2(6-8)
(1).本题PTA提交列表
(2)设计思路
//定义循环变量i
//输入t字符串
for i=0 to *(t+i)!=\'\\0\';//遍历字符串
//判断m和i的关系
if m > i
for i=0 to MAXN
*(s+i)=\'\\0\';
end i
else
for i=0 to *(t+m-1)!=\'\\0\' //赋值
*(s+i)=*(t+m-1);
m++;
end i
*(s+i)=\'\\0\';//加上结束符
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
- 这里我看错了题目,以为是找到和m相同的数,于是整个写错了。之所以拿到了一分,是因为当m的值超过t的长度时输出的是空。
- 并且试了几次之后发现要在自定义函数里输入t字符串的值,于是加上了
gets(t)
一句 - 这两个的错误原因是一样的,都是因为我把输出空字符串的条件设为m>=i,而题目要求的是在这种情况下要输出第m位字符
题目3 (6-10)
(1).本题PTA提交列表
(2)设计思路
//定义循环变量i,最大值所在的下标k,存放最大值的max
max=*p//给max一个初始值
//遍历寻找max,并记录其下标
for i=0 to *(p+i)!=\'\\0\'
if *(p+i) >= max
max=*(p+i);
k=i;
end if
end i
//循环后移
for i=k to i=1
*(p+i)=*(p+i-1);
end i
*p=max;//把max放在第一位
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
- 这里的错误就是在于把i--写成了i++,于是字符串开始无限增长,所以就段错误了
二、截图本周题目集的PTA最后排名。
PTA排名
三、阅读代码
1)strstr函数
const char *mystrstr (const char *s, const char *sub_s)
{
int i, j;
int tmp = 0;
for (i = 0; s[i] != \'\\0\'; i++) { // i遍历主串,包含子串即返回i下标位置
j = 0; // 子串位置每次从头开始
while (s[tmp++] == sub_s[j++]) { // tmp遍历主串,主做判断下标0到字符串末尾\\0
if (sub_s[j] == \'\\0\')
return &s[i];
}
}
return NULL;
}
- 从代码可看出,其功能为返回第一次子串的下标。
- 遍历主串,找到子串的首字符,并开始判断,若完全符合子串,就直接返回下标的位置;若循环正常结束,就返回空。
- 优点就是使用自增的方式让下标变化,以及对主串遍历的处理方式。
2)strcpy函数
char *mystrcpy (char *dest, char *src)
{
char *p = dest;
while (*dest++ = *src++);
return p;
}
- 巧妙的使用字符串的结束符和自增,使得只用一行就可以完成指针自增,将字符串src赋值到字符串dest里,最后返回指向字符串dest开头的指针p,简洁巧妙的风格。
四、本周学习总结(3分)
1、学习总结
- 结构体的运用——尤其是结构体数组和指针的运用在解决一部分编程题目(像是多个事物的不同属性都要用到)时对我们有极大的帮助。
- 结构体数组或是指针都可以像普通变量一样被使用
- 将结构体作为函数的形参时实际上是再次创建了一个结构体,所以不如直接使用结构指针指向结构体所在的内存来的方便。
- 如何设置结构体使得题目难度降低也是一个要学习的地方
2、罗列本周一些错题
- 错误原因是对于循环的边界条件没有想清楚
- 错误原因在于没有完全理解结构体的使用方式,然后就没有发现d选项的错误:它的下标超出了数组长度。