2019年大一下学期第四周作业编程总结

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。至此,第一轮比完,进行第二轮……。
以下为流程图:

三,调试时遇到的问题及解决方案:

这题思路与上题相似,且比较简单,所以暂无问题。

四,运行结果截图:

作业时间:

题目 完成时间
选择排序法 大约一小时
找鞍点 两小时三十分钟
冒泡排序法 三十分钟
总计 四小时
原文地址:https://www.cnblogs.com/noacgnnolife/p/10580498.html