7-2 选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格
#include<stdio.h>
int main (void)
{
int i,j,n,a[10],ndex,temp;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(j=0;j<n;j++)
{
ndex=j;
for(i=0;i<n-1;i++)
{
if(a[i]<a[ndex])
{
ndex=i;
temp=a[ndex];
a[ndex]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d",a[i]);
if(i<n-1)
{
printf(" ");
}
}
return 0;
}
1)设计思路:
第一步:引用头文件,定义自己需要的整数型变量;
第二步:用for语句把数据输入进去,
第三步:就是开始寻找最大值,从第一个开始找到最后;
第四步:依次进行寻找之后,进行储存数据,最后进行输出排序;
流程图:
2)遇到的问题:
一开始根据书本上的,把寻找最大值弄成了找最小值,结果导致了有错误出现,经过多次的查找才找出这个错误,因为
赋值语句比较,所以搞混淆了;
3)解决方法:
出现了答案错误之后就去编译器进行调试,通过查看变量,最后发现了是一开始把最小值弄出来了;
导致了一开始就出现6,之后就又对了,所以调试后就发现了;
4)正确和错误截图:
7-1 找鞍点 (20 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
1)实验代码:
int main()
{
int i,j,n,a[6][6],max[6],min[6],point=0;
int m=0,k=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0; i<n; i++)
{
for(m=0;m<n;m++)
{
if(a[i][k]<=a[i][m])
{
k=m;
max[i]=a[i][m];
k=m;
}
}
}
m=0;
for(j=0; j<n; j++)
{
for(i=0;i<n;i++)
{
if(a[i][j]<=a[m][j])
{
min[j]=a[i][j];
m=i;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(max[i]==min[j])
{
printf("%d %d",i,j);
point++;
}
}
}
if(point==0)
printf("NONE");
return 0;
}
2)设计思路:
第一步:应用头文件,定义自己需要的数组以及其他整形变量;
第二步:按行列进行数组数据的输入,
第三步:用两个for语句控制行列,找出每一行中的最大值;
第四步:同样的用两个for语句,找出每一列中的最小值;
第五步:再把找出来的最大值和最小值放入数组中,看这两个值是否同时满足题目要求;最后输出行列;
3)流程图:
3)遇到的问题:
一开始看这个题目经过理解之后很快就找到了这个思路,然后再写完代码之后发现找不出鞍点,经过了多次尝试之后还是找不出错误的原因,
因为是结对编程,所以用了另外一种思路,找出行的最大值之后,记下列,然后再看这个数是不是列的最小值,最后发现这个好像看似简单
但是操作比较复杂,容易搞混淆,所以就坚持了第一种方法,经过同学和助教的帮助,最后是输出结果的判断条件错误;
4)解决方法:
一开始通过调试的方法去看最大值和最小值是否正确,经过无数次的调试和修正终于把最大值和最小值找出来了,再同学的帮助和提示下发现了
最后判断条件错误,经过修正后,结果正确;
5)截图:
7-1 冒泡法排序 (10 分)
输入1个正整数n(1<=n<=10),然后输入n个整数并存放在数组中,将这n个整数从大到小排序后输出,相邻数字间有一个空格,行末不得有多余空格。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
1)实验代码:
#include<stdio.h>
void bubble(int a[],int n);
int main (void)
{
int n,i,a[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
bubble(a,n);
printf("%d",a[0]);
for(i=1;i<n;i++)
{
printf(" %d",a[i]);
}
return 0;
}
void bubble(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
}
2)设计思路:
第一步:引用头文件,并且用bubble()函数;
bubble()函数是实现数组元素的的排序。它有两个形参,a是等待数组排序的整形数组名,n是指明数组a待处理的数组元素的数量。
第二步:用for语句循环找出最大值;输出结果;
3)流程图
4)遇到的问题:
这个题目和选择排序法类似,况且书本上也有类似的题目,虽然没学但是不是太难;在这个过程中把找最大值弄成了找最小值:
5)解决方法:
答案错误,我就去编译器运行,刚开始还是没有发现这个问题,最后看了输出提示之后才发现,弄反了;
6)截图:
心得:
这一周的学习是老师上课说的二维数组的练习,二维数组和一维数组差不多,就是在输入输出方面差不多,有差别的地方就是,
二维数组要同时控制行列,在进行判断方面也要复杂一点点,在这一周的编程过程中,发现了自己对赋值数据不是很清楚,很容易
弄混淆,同时在二维数组条件判断中也存在不足,还有就是编程过程中细节主要有了提高,但是省题还需要加强;
这一周所花的时间就是每天晚上九点到十一点半,不懂的地方就是二维数组的应用和条件的处理;