第四周作业

C语言设计程序。

2019年春季学期第四周作业。

我希望能更加掌握好c语言,让我能更好学习其它的语言。

更了解了二维数组。

 

7-1 找鞍点 (20 分)

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:

输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4

1 7 4 1

4 8 3 6

1 6 1 2

0 7 8 9

输出样例1:

2 1

输入样例2:

2

1 7

4 1

输出样例2:

NONE

{
    int i,j,n,a[6][6],max[6],min[6],cp=0;
    scanf("%d",&n);
    
        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;
    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;
                    max[i]=a[i][p];
                    k=p;
                }
            }
    }
    p=0; 
    for(j=0; j<n; j++)//判断是否为列最小值
    {
            for(i=0;i<n;i++)
            {
                if(a[i][j]<=a[p][j])
                {
                    min[j]=a[i][j];
                    p=i;
                }
            }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(max[i]==min[j])
                {
                    printf("%d %d",i,j);
                    cp++;
                }
        }
    }
    if(cp==0)
        printf("NONE");
    return 0;
}

 

设计思路:很朴素的想法,输入数组后,将每一行的最大值找出来,然后将每行最大值储存下来,,再利用一个循环,这个循环是找出储存下来的最大值中的最小值,最后将这个值的下标进行输出。

 

 

所遇到的问题及其解决方法:这里在室友的提示下使用了一个cp++,来作为判断。这道题是和我室友一起写的,他的思路和我不同,他是每一行每一行的比,最后找出那个每行最大每列最小的值,他那种方法较简单但是不容易想到,可能是因为我的逻辑太简单了,就用了这个for比较多的,比较明了的方式表达出来。

7-2 选择法排序 (20 分)

本题要求将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

4
5 1 7 6

输出样例:

7 6 5 1

 

#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;
}

 

 

设计思路:这道题是利用第一个数字与后面3个数字进行比较,然后找出最大值,将其放到第一位。

 

所遇到的问题及其解决方法:这道题目呢,由于我先做的冒泡排序法,所以刚开始是用的那个方法,但是后面看到先发的那篇博客园评论,这两个还是有区别的,所以这题我是在书上找了一下,书上是找的最小值。刚开始判断列的最小值时出现了问题,经过长时间的调试室友及搭档的指点下完成了。

 

 

5-1

输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等。输入输出示例如下:

输入:

3

1 2 3

4 5 6

7 8 9

输出:

No

 

#include <stdio.h>
int main(void)    
{    
       int found, i, k, n;
       int a[10][10];

       scanf ("%d", &n);
       for (i = 0; i < n; i++)    
           for (k = 0; k < n; k++)
            scanf("%d", &a[i][k]);

     found = 1;
       for (i = 0; i < n; i++){    
           for (k = 0; k < i; k++){
               if (
a[k][i]!=a[i][k]
(3分)) {    
                
found=0
;          
                           break;
                            }
        }
        if (
found == 0
){
            break;
           }
      }

      if (found != 0){
          printf("Yes\n");
      }  
      else{
          printf("No\n");
      }  

    return 0;
}

 

填空思路:题目所给出的是沿对角线相等所以,if里判断的就是是否相等,下面就是判断跳出的条件,当found是零时跳出并判断,因为刚开始赋值为1,。

所遇到的问题及其解决方法,刚开始我将第二个if写成了a[k][i]==a[i][k],答案一直是yes,后面在搭档的提醒下改为了found==0。

 

 

 

7-1 冒泡法排序 (10 分)

输入1个正整数n(1<=n<=10),然后输入n个整数并存放在数组中,将这n个整数从大到小排序后输出,相邻数字间有一个空格,行末不得有多余空格。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

4 
75 71 77 76

输出样例:

77 76 75 71

 

#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; 
}

 

 

设计思路:这道题的思路就是将两个数进行比较,然后两个值进行互换大的值就放到第一位。

 

这道题刚开始还是按着书上的那个写的,有一个子函数,由于编译器上答案正确但是到pta上有错误,我将子函数去掉了。

 

 

#include <stdio.h>
int main(void)	
{	
   	int found, i, k, n;
   	int a[10][10];

   	scanf ("%d", &n);
   	for (i = 0; i < n; i++)	
   		for (k = 0; k < n; k++)
			scanf("%d", &a[i][k]);

 	found = 1;
   	for (i = 0; i < n; i++){	
   		for (k = 0; k < i; k++){
   			if ((3分)) {	
			    ;          
           	            break;
       	                 }
		}
		if (){
			break;
   		}
  	}

  	if (found != 0){
  		printf("Yes\n");
  	}  
  	else{
  		printf("No\n");
  	}  

	return 0;
}

 

posted @ 2019-03-22 17:30  PeanutLeo  阅读(331)  评论(0)    收藏  举报