一、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 *)类型,需要强制转化。