7-1 找鞍点 (20 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
一,实验代码:
#include<stdio.h>
int main()
{
int i,I,j,J,N,value[6][6],a[6],max[6],min[6],index=0,point=0;
scanf("%d",&N);
for(i=0;i<=N-1;i++) //用来输入行
{
for(I=0;I<=N-1;I++) //用来控制列
{
scanf("%d",&value[i][I]);
a[I]=value[i][I];
if(i==0)
min[I]=a[I];
}
max[i]=a[index];
for(I=0;I<=N-1;I++) //找当前行最大的数
{
if(a[index]<a[I])
{
max[i]=a[I];
index=I;
}
}
for(j=0;j<=N-1;j++) //找当前每列最小值
{
if(min[j]>a[j])
{
min[j]=a[j];
}
}
index=0;
}
for(I=0;I<N;I++) //比较最大值与最小值
{
for(i=0;i<N;i++)
{
if(max[I]==min[i])
{
printf("%d %d",I,i); //相等则输出下标
point++;
}
}
}
if(point==0)
printf("NONE");
return 0;
}
二,设计思路:
大致思路是先输入一行数,然后开始找这一行的最大值和每列当前的最小值。
代码分为四部分,第一部分为6-15行,用来输入一行数。第二部分为16-24行,用来找这一行的最大值,最大值保存在max数组中。第三部分为25-32行。用来找当前每列的最小值,最小值保存在min数组中。第四部分为34-46行。用来寻找max数组与min数组中相等的数,若有,则这个数为鞍点,并输出坐标;若无,则无鞍点,输出‘NONE’。
以下为流程图:
三,调试时遇到的问题及解决方案:
如何找每列的最小值?
一开始我有两种思路,第一种是在矩阵输入完整后,建立一个两层嵌套循环,外循环控制列,内循环控制行,从第0列第0个开始逐个向下比较,将最小值保存到min数组中,比完N-1次就换列,直到第N列第N行。第二种是每输入完一行就开始找当前每列的最小值。而我实际使用的是第二种,因为代码较第一种更简单。如下:
for(j=0;j<=N-1;j++) //j表示列
{
if(min[j]>a[j])
{
min[j]=a[j];//替换min数组与a数组中的值
}
}
min数组需要初始化,所以在第13,14行用来初始化min数组,这里a数组用来保存当前循环输入的行的数。我们只需要比较a数组的数与min数组中的数即可,若小于就需要替换min数组中的值,反之则不需要。
四,运行结果截图:
7-2 选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
一,实验代码:
#include<stdio.h>
int main()
{
int N,i,j,value[10],t;
scanf("%d",&N);
for(i=0;i<N;i++) //输入整数于数组中
{
scanf("%d",&value[i]);
}
for(i=0;i<N;i++) //控制比较数的位置
{
for(j=0;j<N;j++) //控制被比较数的位置
{
if(value[i]>value[j]) //大于则将大值的位置调至前面
{
t=value[i];
value[i]=value[j];
value[j]=t;
}
}
}
for(i=0;i<N;i++)
{
printf("%d",value[i]); //按顺序输出调整完后的数组
if(i<N-1)
printf(" ");
}
return 0;
}
二,设计思路:
我的思路是先将数组中0位置的数与1到N-1位置的数相比较,如果遇到小于的数就将该位置的数与0位置的数交换,比较完第一轮后,就再从1位置的数开始与之后位置的比较,此时0位置的数不参加比较,以此类推,直到比完为止,我们就得到一个从大到小顺序的数组。
以下为流程图:
三,调试过程遇到的问题及解决方案:
这题比较简单,调试时没有语法错误和逻辑错误,基本上一次过。
四,运行结果截图:
7-1 冒泡法排序 (10 分)
输入1个正整数n(1<=n<=10),然后输入n个整数并存放在数组中,将这n个整数从大到小排序后输出,相邻数字间有一个空格,行末不得有多余空格。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
一,实验代码:
#include<stdio.h>
int main (void)
{
int n,a[10];
int i,j,t;
scanf("%d",&n);
for(i=0;i<n;i++) //输入数组
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++) //控制比较的轮数
{
for(j=0;j<n-1;j++) //控制相邻数的比较
{
if(a[j]<a[j+1]) //前一位小于后一位,交换位置
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(j=0;j<n;j++) //按顺序输出调整后的数组
{
printf("%d",a[j]);
if(j<n-1) //防止最后一位输出空格
printf(" ");
}
return 0;
}
二,设计思路:
冒泡排序法的思路就是让相邻的数进行比较,将大的数调到前面,小的调到后面,然后再用小的与后一位相邻的比较,以此类推。如:2,3,1,4 先让2与3比较,3>2,交换位置,数组变为3,2,1,4 再让2与1比较,2>1,不换,再用1与4比较,交换,数组变为3,2,4,1。至此,第一轮比完,进行第二轮……。
以下为流程图:
三,调试时遇到的问题及解决方案:
这题思路与上题相似,且比较简单,所以暂无问题。
四,运行结果截图:
作业时间:
题目 | 完成时间 |
---|---|
选择排序法 | 大约一小时 |
找鞍点 | 两小时三十分钟 |
冒泡排序法 | 三十分钟 |
总计 | 四小时 |