14,15周作业(一维,二维数组)
题目:14-3选择法排序
1.实验代码
#include<stdio.h>
int main()
{
int n,i,j,t,k;
scanf("%d",&n);
int a[n+1];
for(i=1;i<=n;i++)
{
scanf("%d ",&a[i]);
}
for(j=1;j<=n-1;j++)
{
k=j;
for(i=1+j;i<=n;i++)
{
if(a[k]<a[i]){k=i;}
}
if(k!=j){t=a[k];a[k]=a[j];a[j]=t;}
}
printf("%d",a[1]);
for(i=2;i<=n;i++)
{
printf(" %d",a[i]);
}
return 0;
}
2 设计思路
(1)主要描述题目算法
第一步:写好基本框架。
第二步:题目要求输入第一行给出一个不超过10的正整数n,第二行给出n个整数。我就先用scanf语句输入这个n,然后定义数组a[n+1](我让这个数组从a[1]到a[n],省略了a[0]。)
第三步:要连续输入这n个数,如果用n个scanf显然太费事了,所以我用for循环来输入这n个数(我感觉for循环比while和do-while循环好用)。
第四步:题目要求在一行中输出从大到小有序的数列,如果输入的数是乱序的,用一个for循环只能将最小值这一个数换到最后面,而其它数字就不一定能按到要求了。所以我就想到再用一个for循环。这就可以让每一个数都进行比较。将j的值赋给k。然后将a[k]与a[i]进行比较,如果a[k]小于a[i],就将i的值赋给j。如果k!=j,就引入中间变量t,使a[k](实际上就是a[i])与a[j]的值进行交换。最终就可以达到题目要求的了。
第五步:题目要求相邻数字间有一个空格,行末不得有多余空格。我就先单独输出前面没有空格的a[1],然后再用for循环输出前面带又空格的a[i]。
第六步:输出从大到小有序的数列。
(2)流程图
3.本题调试过程碰到问题及解决办法
<1>一开始出现了下面这样的错误,输入和输出是一样的,中间还要多输入一个3(我也不知道为什么,但将最后正确答案放到pta上时是对的,可能是我的dvc++有问题。),然后我就仔细检查了一遍,发现内循环的i的循环次数有问题,i应该是i<n,而不是i<n-j,我把它当作冒泡循环来做了。
<2>我改正了上面的错误后,结果还是有错误,如下图所示。经过我仔细调试之后,发现再交换值的地方有问题,经过改正之后就对了。
<3>我个人更喜欢用冒泡排序发,也许是用的多的缘故。其实这题我一开始是用冒泡排序法做的,然后又用了选择排序法。
4,提交列表
题目:15-3 求整数序列中出现次数最多的数
1.实验代码
#include<stdio.h>
int main()
{
int i,j,n,b[1000]={0},k=0;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[i]==a[j]){b[j]++;break;}
}
b[i]++;
}
int max=b[0];
for(i=1;i<n;i++)
{
if(b[i]>max){max=b[i];k=i;}
}
printf("%d %d",a[k],max);
return 0;
}
2 设计思路
(1)主要描述题目算法
第一步:写好基本框架。
第二步:输入在一行中给出序列中整数个数N(0<N≤1000),再用for语句输入N个整数。
第三步:用双重for语句使输入的N个数一个一个进行比较。只要某个数一出现(不管这个数是否和前面的数或者后面的数相等)就用 b[i]++计数。如果后面出现了与前面相同的数,就用b[j]++使前面的数加1,由于后面的数的位子与前面数的位子不同,所以还要用 b[i]++处理后面的数(其实后面的数用这个处理没什么作用, b[i]++只对刚出现的数起作用)。
第四步:令max=b[0](让第一个数出现的次数的值赋给max),然后用for循环比较出出现次数最大的b[i]。
第五步:输出出现次数最多的整数及其出现次数。
(2)流程图
3.本题调试过程碰到问题及解决办法
<1>下面这个错误太坑了,我花了大量的时间去调试,终于发现原来我将a[j]写错成了a[i].就这一个小问题就让我脑力透支,身心俱疲。
4,提交列表
题目:15-4 数组元素循环右移问题
1.实验代码
#include<stdio.h>
int main(){
int a[200];//只用一个数组,将原数组元素复制到紧邻的数组空位置中
int n, m,i;
scanf("%d%d", &n, &m);
m = m%n;
for (i = 0; i < n;i++){
scanf("%d", &a[i]);
a[i + n] = a[i];//备份数组元素
}
for (i = 0; i < n; i++){
a[i] = a[i + n -m];
}
for (i = 0; i < n; i++){
if (i == n - 1)//对应题目要求:“序列结尾不能有多余空格”
printf("%d", a[i]);
else
printf("%d ", a[i]);
}
return 0;
}
2 设计思路
(1)主要描述题目算法
第一步:题目要求在不允许使用另外数组的前提下来完成,所以我定义一个容量为200的数组a[200]。a[101]到a[200]相当于数组b[100]。
第二步:然后输入n,m,因为m(向右移的次数)可能大于n(数组中数的个数),所以要m取余n,这样就可以知道数据实际相当右移的次数。
第三步:输入a[i]的值,然后用 a[i+n]=a[i]做备用数组。
第四步:因为a[0]到a[2n-1]的值都知道了,所以用for语句加 a[i]=a[i+n-m](左边相当与位子,右边相当于人,依次将符合要求的人往a[0]到a[n-1]的位置上安排)
第五步:题目要求各数之间用空格分隔,序列结尾不能有多余空格,所以我就在for循环加一个if-else语句,当i等于n-1时输出前后无空格的数,其他的则输出后带空格的数。
(2)流程图
3.本题调试过程碰到问题及解决办法
题目要求在不允许使用另外数组的前提下来完成,我一开始做附加题时确实想不出来,且花了大量的时间,然后参透了互联网,才彻底搞明白,才发现它特简单,没有问题了。
4,提交列表
这两周学习内容总结
<1>学习内容:
1,这俩周学习了一维数组,二维数组。粗略关于它们的定义,初始化,引用,以及应用。
2,一维数组的三大重要题型:
①选择排序
②冒泡排序
③求最小值及下标
3,二维数组的重要题型:
①找出矩阵中最大值及其所在位子
②方正转置
<2>重点难点:
1,选择排序,冒泡排序一开始学感觉还是比较难得,需要不断的温习来巩固这两种题型。
<3>个人收获:
1,熟练掌握了一维数组和二维数组的应用知识,对上面所述的题型有了深入的理解,拓展了编程方面的知识。
<4>在学习中发现的问题
1,虽然我在课后做pta练习做的很好,但有一部分老师上课讲的内容没有深入掌握(比如找出从1到100之间的素数),我以为老师上课讲的内容很简单,所以没太重视,但我发现这是不行的。以后我要对老师给的每一道例题认真专研。
<5>不明白的知识点:
暂时还没有。
点评其他同学
孙娜
http://www.cnblogs.com/sun-na-/p/7875394.html
郭志康
http://www.cnblogs.com/gzk08-20/p/7953871.html
张乐
http://www.cnblogs.com/1999-09-22/p/7966613.html
我的GIT地址
https://git.coding.net/AI1452349541/H.K.2.2.git
上传截图:
14周学习进程
15周学习进程