C语言博客作业--一二维数组
一、PTA实验作业
题目1:简化的插入排序
1. 本题PTA提交列表
2. 设计思路
定义循环变量i,交换变量时的暂存变量t,第一行输入几个数据n,判断标志变量flag=0,插入的变量number
输入n,定义一维数组num[n+1]为有序序列
for i=0 to n-1
输入num[i]
end
输入要插入数
for i=0 to n
如果flag为0且number>=num[i] 结束这轮循环,进入下一轮循环
否则交换num[i]和number并且flag 为1
end
for i=0 to n
输出num[i]
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
多种错误
1:找到了插入的位置,最后一位的值异常
分析:因为我用的是continue,遍历数组,如果number比num[i]小不再跳过后面的语句,所以能找到正确的位置,且刚开始交换出来的数会比后面的数小,会继续叫唤下去,但是到达最后一位时由于,没定义最后一位数,比较结果无法确定,所以排序后最后一位无法确定。
解决方法:引入flag,判断是否进行了交换,一旦进行交换,便一直交换到数组结束
2:格式错误
没有仔细看题目,以为还是和之前一样,最后一个数没空格,以为很对,还是错误
解决方法:输出后跟空格就可以
题目2:加法口诀表
1. 本题PTA提交列表
2. 设计思路
定义循环变量i,j,k,输入n和repeat
输入repeat
for k=1 to repeat
输入n
定义二维数组array[n+1][n+1]
for i=0 to n
for j=0 to n
array[i][j]=0初始化数组为0
end
end
for j=1 to n
array[0][j]=j首列为递增数列
end
for i=1 to n
array[i][0]=i首行为递增数列
end
for i=1 to n
for j=1 to i
题目要求位置的数等于列数加行数
end
end
for i=0 to n
for j=0 to n
if首行首列输出+
else if到每行末或为0时,换行并结束该行输出
else
if 最后一个输出array[i][j]不加空格
else输出array[i][j]并占4个空格
end
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
格式错误
刚开始全部的输出%-4d,输出结果看着都一样,到就是格式错误
解决方法:加了几句判断条件,让它在每行最后一个输出时不加空格
题目3:杨辉三角
1. 本题PTA提交列表
2. 设计思路
定义i,j,k为循环变量,n为输入的数
输入n
定义二维数组array[n][n]
for i=0 to n-1
for j=0 to n-1
array[i][j]=0初始化数组
end
end
for i=0 to n-1
array[i][0]=1第一列赋值为1
end
for j=0 to n-1
array[0][j]=0第一行除第一个数赋值为0
end
for i=1 to n-1
for j=1 to n-1
array[i][j]等于上一行数加左上方的数
end
end
for i=0 to n-1
for j=0 to n-1
if为首行或行数和列数相等,输出array[i][j]换行,结束该行输出
else 输出%4d的array[i][j]
end
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
格式错误
题目说每个数据占4列,因为前面的题目,便以为是%-4d,结果写出来后格式错误,有想办法去掉后面多出来的空格,还是格式错误
解决方法:看了同学的代码,意识到了是哪里出错,很快就改对了
二、截图本周题目集的PTA最后排名。
三、同学代码结对互评
1.互评同学名称
李金谣
2.我的代码、互评同学代码截图
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
-
不同点:
1.数组定义:
我的代码是先输入长度再定义数组,同学的代码是定义数组长度,再决定用的范围,而且他定义两个数组,我只有一个。
2.数列顺序的重新排列
我是在原有的数组中进行操作,同学是将原来的数组中的数转移到另一个数组中。
3.其他不同
同学的代码还添加了几种条件的判断才可以实现题目要求的功能,而我的代码不用 -
各自优势
我的优势:代码长度短,数组的使用较少,根据要求定义数组长度,节省使用内存
同学的优势:思路直白简单,只要将数组的数转移到宁一个数组即可,比起我还要改变原有数组的值,操作简单。 -
代码风格
我更喜欢我的代码,比较简短,不用判断数组为0时的情况,而且数组的定义较少,能更有效利用数组。
四、本周学习总结
1.你学会了什么?
1.1 C中如何存储字符串?
定义字符型数组
1.2 字符串的结束标志是什么,为什么要结束标志?
结束标志:‘\0’
原因:定义字符数组是由于无法直接知道字符串中字符个数,通常会定义一个长度远大于要存入字符串的长度,所以如果没有结束标志,数组将全部遍历完才能停止,这样可能造成运行超时,或者无法预料的错误,所以要在使用的字符范围后加上结束标志。
1.3 字符串输入有哪几种方法?
设ch为字符变量或字符数组的数组名
1.scanf("%c",&ch);输入单个字符
2.ch=getchar();输入单个字符
3.scanf("%s",ch);输入字符串,不用&,直接放数组名,遇到空格停止
4.gets(ch);输入字符串,可以吸收空格
1.4 数字字符怎么转整数,写个伪代码?
单个转换:数字字符-‘0’
多位转换:
假设字符数组中有a[1]='1',a[2]='2',a[3]='3',转换成123
1.定义循环变量i,sum=0
2.i=0
3.如果a[i]!='\0',进行以下循环
4.sum=sum*10+(a[i]-'0')
5.i++
1.5 16进制、二进制字符串如何转10进制?写伪代码?
假设字符数组a[]中存了该16进制数或二进制数的每一位
- 16进制
1.定义循环变量i,sum=0
2.i=0
3.如果a[i]!='\0'进行以下循环
4.如果a[i]是数字字符,则sum=sum16+(a[i]-'0')
5.如果a[i]是A-F,则sum=sum16+(a[i]-'A'+10)
6.如果a[i]是a-f,则sum=sum*16+(a[i]-'a'+10)
7.i++
- 二进制
1.定义循环变量i,sum=0
2.i=0
3.如果a[i]!='\0',进行以下循环
4.sum=sum*2+(a[i]-'0')
5.i++
2.本周的内容,你还不会什么?
虽然会了一点点编程,但是明显感觉自己的代码量明显不够,思路跟不上,同样的题要花比别人长的时间才能写出,而且有些错误要调很久才能完全正确,对于字符数组要用的范围完全不能掌握,提交pta运行时错误只能不断扩大数组范围。
以下为错题:
1.有以下定义:char x[ ]="abcdefg"; char y[ ]={'a', 'b', 'c', 'd', 'e', 'f', 'g'}; 则正确的叙述为()。
A、数组x和数组y等价
B、数组x和数组y的长度相同
C、数组x的长度大于数组y的长度
D、数组x的长度小于数组y的长度
答案:C,错选B
数组中,字符与字符串存到数组中长度是不同的,字符串存入数组时会自动添加一个结束符号‘\0’,因而字符串会比单个字符输入多一个长度
2.输入10个整数,用选择法排序后按从小到大的次序输出。
#define N 10
main( )
{
int i,j,min,temp,a[N];
for(i=0;i<N;i++)
scanf("%d", 【1】);
printf("\n");
for(i=0; 【2】; i++)
{min=i;
for(j=i;j<N;j++)
if(a[min]>a[j]) 【3】 ;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for (i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");
}
参考答案
&a[i]
i<N-1
min=j
我的作答&a[i] i<N a[min]=a[j]
应该是下标交换即可
3.期中考试小结
3.1 你认为为什么没考好?
1.选择题的题目基本错在了较为基础的内容,如赋值语句正确定义,逻辑判断符的优先级,不同类型变量的作用域和生存周期,函数的形参与实参等
2.写出程序运行结果题目主要是对递归的算法不熟悉,误判了输出的次数
3.程序填空题主要错在对科学计数法没有熟练掌握,及粗心大意
4.手写程序题真的是不熟练,以前都是在电脑上编程,手写的一下子写不出来
基础没有掌握得一清二楚,选择题犹豫较长时间,分析程序时花的时间较多,说明在代码量方面还有不足,导致最后的程序题只用了较短的时间就写完,其质量也不好。总之,基础不牢固,时间没安排好。
3.2 罗列错题。
选择题:
忽略B选项后面还有||,当&&前面0时以为整个式子就是0,其实还要与后面的式子比较,因为||后面是1,所以整个式子还是1
填空题:
第7空只填了ch,还要加=getchar,当时对字符输入还不熟悉所以填的太快就错了
改错题:
做的时候只找到了4个错误,怕被扣分,不敢乱改,term=-termxx/(n+1)(n+2);//改为term=-termxx/((n+1)(n+2));未找出
编程题:
做完前面的题,这题没剩多少时间,所以按照以前写过的和这题相似的题的代码写了一遍
答案:
#ifndefFUNC
#defineFUNC
#include<stdio.h>
#include<math.h>
doubleFactorial(intnum);
doubleCnr(intn,intr);
#endif
doubleFactorial(intnum)
{
inti;
doublefac=1;
for(i=1;i<=num;i++)
fac*=i;
returnfac;
}
doubleCnr(intn,intr)
{
doublek;
k=Factorial(n)/Factorial(r)/Factorial(n-r);
returnk;
}
intmain(){
intn,r;
intx=15,y=0;
doublek;
printf("输入:");
scanf("%d%d",&n,&r);
while(n!=0||r!=0){
}
printf("输入:");
scanf("%d%d",&n,&r);
}
printf("程序结束");
return0;
}
3.3 下半学期要怎么调整C的学习?
熟读书本重要知识内容,多看看别人好的代码,提高自己写代码和读代码的速度。