一、PTA实验作业
题目1:7-1 将数组中的数逆序存放
1. 本题PTA提交列表
2. 设计思路
定义n,j,item,k,i,count=0几个变量及a[10]整形数组,n存放输入的个数
输入数组的个数n
for(i=0;i<n;i++){
逐个输入数组a[i]的值 end }
for(j=0;j<n/2;j++){
交换a[j]第一项与对应的后面项a[n-j-1] end}
for(k=0;k<n;k++){
if(count==0)若是printf("%d",a[k])
否则 printf(" %d",a[k]); count++; end}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
一开始我的思路就已经基本浮现,但是在提交答案的时候一直是部分正确,我就很纳闷,虽然在n=4时,我
输入是对的但是在n较大时答案错误的,如上图所示,后来我调试了很久也找不出错误,直到我用纸在上面,
按照程序的内容一步一步验证才发现是for的一个限定条件发生了错误我界定的范围是j<n-1,但是只有j<n/2
才能正确输出内容,所以有时候一个小小的错误可能就会导致很大的失误。
题目2:7-3 出生年
1. 本题PTA提交列表
2. 设计思路
定义变量n,j,item,k,i,l,year,bit,flag,m,count=0,q;及 a[4];数组存放年份的各个位数
输入出生年year
for(l=y;l<10000;l++){
q=l;i=3;i做为限定条件即年份的位数
while (i>-1){//计算出年份的各位数存放在a的数组中,且用取余的方法可以取出0
bit=q%10;a[i]=bit;q/=10;i--; end}
count=0;
for(j=0;j<3;j++){
for(k=(j+1);k<4;k++){
判断年份的位数a[j]与a[k]是否相同,相同的话count++;
之后再经过多个分支判断
if(n==4&&count==0&&j==2)
else if(n==3&&count==1&&j==2)
else if(n==2&&count==2&&j==2)
else if(n==2&&count==3&&j==2)
符合其中一个即可输出答案即
for(m=0;m<4;m++)
printf("%d",a[m]);flag=0;break; end}
end}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
这题我花了较多的时间,因为判断四位数相不相同的情况,我的理解是全排列,就是用嵌套循环让一个数逐个和其他的数比,
我得出了三个不同的情况对应年份位数的相同,但是一直不能得到全部的答案,一直是部分正确,即上图的代码,我测试了好
久仍然找不出错误,后来在舍友的点播下,我发现在n=2即有两个数字相同的情况下有2种不同的count的值,才得到正确答案。
题目3:7-5 数组循环左移
1. 本题PTA提交列表
2. 设计思路
定义整形变量int i,n,a[999],b[999],j,k,l,m,flag=0;
输入n和m的值// n m分别为左移的位数与输入的数的个数
for(i=0;i<n;i++){
输入数组的值
end}
m=m%n;//m可能大于n,m需要对n进行取余
for(j=0;j<n-m;j++){
在b[j]中存放经过左移后的a[n+m]
end}
for(k=n-m;k<n;k++){
在b[k]中存放经过左移前的几个数即a[k-n+m]
end}
for(l=0;l<n;l++){
输出左移后的数组b[l]
end}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
这道题主体思路我是清晰的,而我用的方法与老师课堂上的方法是不同的,老师是一位一位的移,我是直接找出
第m个数直接移动,但这也导致了一个问题要是m可能大n,那么就找不出这个第m个数,因为最大才n,所以我
直接傻了,后来想了好久才知道可以用取余,因为你移动后的位置和取余的位置是一样的所以这步是最关键的。
二、截图本周题目集的PTA最后排名。
三、同学代码结对互评
1.互评同学名称
徐宏伟
2.我的代码、互评同学代码截图
宏伟的代码:
我的代码:
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?
首先我和宏伟的代码最大的区别是我对于上面两行的代码是直接赋值直接等于1,因为无论N为何值都是这样的,
其次是我的下面每行的第一个和第二个也是直接给他赋值为1,而他是运用array[i][j]=array[i-1][j-1]+array[i-1][j];,
且前面还要先赋值为0,我觉得我的方法有点取巧,但是在实际的输出时却是可以的,且大大减少了代码量,而他
的是可以应对更加多的范围。
四、本周学习总结
1.你学会了什么?
1.1 C中如何存储字符串?
字符串是一种字符型数组,长为n的字符串在内存中连续存放,每个字符存贮其ASCII码,占一个字节,共n个字节,
最后填一个全0字节作为串的结束标志。空串也有一个字节,即只有结束标志字符'\0'。
1.2 字符串的结束标志是什么,为什么要结束标志?
字符串的结束标志是'\0',防止在使用数组时越界
1.3 字符串输入有哪几种方法?
三 scanf("%s",a);
scanf("%c",a);
gets(a);
1.4 数字字符怎么转整数,写个伪代码?
定义变量 number=0 a[999];
输入字符串gets(a)
for(i=0;i!='0';i++0){
number=number*10+str[i]-'0'
end}
输出number
1.5 16进制、二进制字符串如何转10进制?写伪代码?
16进制:
定义变量 number=0 a[999];
输入字符串gets(a)
for(i=0;i!='0';i++0){
if a[i]为0到9之间的数
number=number*16+hexad[i]-'0'
else if a[i]为A到F
number=number*16+hexad[i]-'A'+10;
else if a[i]为a到f
number=number*16+hexad[i]-'a'+10;
end}
输出number的值
2进制:
定义变量 number=0 a[999];
输入字符串gets(a)
for(i=0;i!='0';i++0){
number=number*2+hexad[i]-'0';
end}
输出number的值
2.本周的内容,你还不会什么?
1.上图这题我开始完全没有思路,后来在课上老师说了这题,我才知道要运用字符串中特有的'0'来判断字符子串
,而原先我是一直在考虑子串的最后一个字符,其实是'0',我发现我的对于一些小知识的运用不够,
知道但不会用,以后多注意。
3.期中考试小结
3.1 你认为为什么没考好?
这次期中考以下是我的分析本来在做pta 时感觉虽然困难但仍然可以顺利的做出题目,所以会觉
得所学内容已经基本掌握,但是在这次期中考中明明已经做过已经居然理解的地方偏偏不能得分,
还是是基础没有扎实,没有足够的了解知识点,不像在电脑上你有错误,电脑会给你指出但是在
考试中你只能凭借你的知识储备来找出错误,而我就是在这次的学习中过分的依赖电脑导致成绩
不理想,
3.2 罗列错题。
- 这题我直接先计算出了前两个选项,然后在 看第三个是把x错看成了y,这个陷阱一下就掉进去了。
- 这题最可惜的是我把sum与num看成相同的了,结果本来已经算出来了却写错了
- 这题首先随机数我不会输出,而且三题编程题我的代码没有缩进加上我的字又不是很好看导致
又没有加上注释,只得了两分,实际上我的思路是有的,所以下次编程题一定要注意书写规范。
3.3 下半学期要怎么调整C的学习?
在之后的学习中首先先做好课堂派的预习作业,因为这些都是基础,打好地基,其次在PTA的作业中遇到问题不
是只是想着怎么做对怎么做出答案,而是找出自己的缺陷在哪,自己的知识点缺陷在哪,做好每次作业,还有就
是在以后的考试中要注意书写规范,学会如何写程序,先写出框架,在补出程序主体,适当加上注释,且以后p
ta的题目中试着写好注释,养成习惯。