C语言博客作业04--数组
1. 本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量
1.2.1 学习体会
学习了数组,指针,结构之后,不懂的东西成倍增长,因为总是会用到以前的知识,导致了恶性循环。
数组可以用于解决之前一些需要大量代码的问题,让代码量下降,比如循环。
运用数组时,需要主义开头以及结尾,下标不可越界,定义数组时不可使用变量等。
1.2.2 代码累计
2. PTA总分
2.1 一维数组,二维数组排名得分
2.2 我的总分:
134+55=189
3. 实验作业
3.1 PTA题目1
- 用二分法在一个有序数列{1,2,3,4,5,6,7,8,9,10}中查找key值,若找到key则输出其在数组中对应的下标,否则输出not found。
3.1.1算法分析
int num;
int i;
int right=9,left=0; 左边的数的下标为0,右边为9
int b[]={1,2,3,4,5,6, 7,8,9,10};
int a;
scanf("%d",&num); 循环输入数组
while(right>left)
{
a=(right+left)/2; 使用二分法,找到新下标的位置
if(num==b[a]){
printf("weizhi:%d",a); 正确即输出weizhi
break;
}
else if(num>b[a]) 当数字大于新的数时,左边下标+1,循环上述的操作
{
left=a+1;
}
else
{
right=a-1; 当小于时,右边下标-1,循环上述操作
}
}
if(num>10||num<1){
printf("not found"); 超出范围,输出not found
}
3.1.2 代码截图
3.1.3 PTA提交列表及说明
- Q1:一开始不知道何为二分法,以为和数学中定义一样。导致错误
- A1:后经同学指正,理解了二分法。
3.2 PTA题目2
- 求整数序列中出现次数最多的数
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
3.2.1算法分析
int m=0,n,i,j;
int max;
int b[1000]={0}; 定义数组,初始为0
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf(" %d",&a[i]);
}
for(i=0;i<n;i++) 用数组b来存放数组a中的每一个数的出现次数,数组b的次数与数组a的数字对应
{
for(j=0;j<n;j++)
{
if(a[i]==a[j])
{
b[m]++;
}
}
m++;
}
max=0; 在数组b找出最大的次数,这个次数的下标对应数组a的数
for(i=0;i<m;i++)
{
if(b[max]<b[i])
{
max=i;
}
}
printf("%d %d\n",a[max],b[max]);
return 0;
3.2.2 代码截图
3.2.3 PTA提交列表及说明
- Q1:一开始没有想到如何去记录出现的次数,导致用简单的a++、b++,在某些地方出错。
- A1:上网查找之后意识到可以使用数组去记录出现次数。
- Q2:在b[m]++后,没有m++,导致数组的下标和数组a中的数字没有对应
- A2:百度一下后改正。
3.3 PTA题目3
- 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
3.3.1算法分析
int a[6][6];定义二维数组
int n;
scanf("%d",&n); 定义
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
scanf("%d",&a[i][j]); 输入
}
int k=0,y=0,flag=1,p=0;
if(n==1)
printf("0 0"); 只有一个点时,一定是鞍点
else
{
for(i=0; i<n; i++)
{
y=i;
for(p=0; p<n; p++) 找行最大值
{
if(a[i][k]<=a[i][p]) 数组元素之间比较,若比a[i][k]大,则将数组列标赋给k
{
k=p;
}
}
for(j=0; j<n; j++) 判断是否为列最小值
{
if(a[y][k]>a[j][k]) 若此行最大值不是列所在最小值,把小的行标赋给y
{
y=j;
break;
}
}
if(i==y) 行最大且列最小,判断条件行标不改变
{
flag=0;
break;
}
}
if(flag==0)
printf("%d %d",i,k);
else printf("NONE");
}
return 0;
3.3.2 代码截图
3.3.3 PTA提交列表
- Q1:在只有一个数字时,没有考虑此情况。
- A1:在百度后解决。
- Q2:在找到一列最大数字时,不知如何如何去继续找一行的最小数字。
- A2:经过同学的指点 if(a[y][k]>a[j][k]),找到最小数字之后赋值给y。
4.代码互评
4.1 代码截图
- 同学的代码
- 我的代码
4.2 不同之处
- 同学的代码运用了函数来计算,但步骤和变量很多,显得很复杂。
- 相较之下,我的代码虽然简单,但是表达的逻辑并不清晰