C语言之数组及其应用

  • Post author:
  • Post category:其他


第5关:幻方

幻方(

Magic Square

)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个连续的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。例如有如下表所示的一个三阶幻方,幻和为

15

4

9

2

3

5

7

8

1

6

本关任务:编写程序判定

N×N

(规定

N

为奇数,且

N<20

)的矩阵是否是”幻方”,(

N×N

的二维数组各元素的值由用户在程序运行时输入) “幻方”的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。

输入: 第一行为一个整数,代表矩阵维数

N

。 第二行开始为矩阵输入数据。

输出: 判断结果,若是幻方则输出

Yes

不是则输出

No

测试输入:


3


4 9 2


3 5 7


8 1 6

预期输出:

Yes

#include <stdio.h>
#include <string.h>
int main()
{
    int N;
    scanf("%d",&N);
	int a[N][N];
	//输入二维数组
	for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            scanf("%d",&a[i][j]);
        }
	}

	//判断是否是幻方
	int sum1[100]={0};//注意不能写成sum1[N];数组长度不能是变量
	int sum2[100]={0};
	for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
             sum1[i]= sum1[i]+a[i][j];//求第i行数据之和
        }
        //printf("---%d----\n",sum1[i]);
    }
    //求第j列数据之和
    for(int j=0;j<N;j++){
        for(int i=0;i<N;i++){
             sum2[j]= sum2[j]+a[i][j];//求第j列数据之和
        }
        //printf("***%d**\n",sum2[j]);

    }
    //求主对角线之和和反对角线之和
    int sum3=0,sum4=0;
    for(int i=0;i<N;i++){
        sum3=sum3+a[i][i];
        sum4=sum4+a[i][N-i-1];

	}
	//判断是否行的和等于列的和等于两条对角线之和
	for(int i=0;i<N;i++){
        //printf("%d,%d,%d,%d\n",sum1[i],sum2[i],sum3,sum4);
        if(sum1[i]==sum2[i]&&sum1[i]==sum3&&sum3==sum4){
            printf("Yes");
            break;
        }else{
            printf("No");
            break;
        }
	}
	//输出二维数组

	/*for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
                printf("%d ",a[i][j]);
        }
        printf("\n");
	}*/


	return 0;
}

第4关:数组元素交换

本关任务:有一个

3*4

矩阵,找出每行中最大的元素并与第

1

列元素交换。

具体要求如下:


1.

使用二维数组存放该

3*4

矩阵


2.

为二维数组输入数据。


3.

输出原矩阵并和处理后的矩阵进行比较。

输入:

第一行为两个整数,表示

3x4

的矩阵。 第二行开始为矩阵赋值。

输出:

第一行输出提示”原矩阵:”。

第二行开始输出原矩阵数据。

接下来一行输出提示”处理后:”。

接下来一行开始输出处理后的矩阵数据。

平台会对你编写的代码进行测试:

测试输入:


3 4


1 2 3 4


5 6 7 8


9 10 11 12

预期输出:


原矩阵:


1 2 3 4


5 6 7 8


9 10 11 12


处理后:


4 2 3 1


8 6 7 5

1

2 10 11 9

#include <stdio.h>
#include <string.h>
int main()
{
    int M,N,k=0;
    char b[100];
    scanf("%d %d",&M,&N);
	int a[M][N];
	//输入二维数组
	for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            scanf("%d",&a[i][j]);
        }
	}
	//输出原来的二维数组
	printf("原矩阵:\n");
	for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
	}
	//处理,找到每行中最大元素
	int t;
	for(int i=0;i<M;i++){
        int max=a[i][0],row=i,col=0;
        for(int j=0;j<N;j++){
            
            if(max<=a[i][j]){
                max=a[i][j];
                col=j;
            }
        }
         //与第一列元素交换
        t=a[i][0];
        a[i][0]=a[i][col];
        a[i][col]=t;


	}


	//输出处理后的二维数组
	printf("处理后:\n");
	for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
                printf("%d ",a[i][j]);
        }
        printf("\n");
	}


	return 0;
}

第3关:二维数组的展开

本关任务:

编写程序,功能是将

M



N

列的二维数组中的字符数据按列的顺序依次放到一个字符串(一维数组)中。

例如,二维数组中的数据为:


SSSS


YYYY


XXXX


YYYY

则字符串中的内容应是:

SYXYSYXYSYXYSYXY

输入:

第一行为两个整数

M



N

代表数组

M



N

列大小。

第二行开始为输入的二维数组数据。

输出:

处理后输出的一维数组。

测试输入:


4 4


SSSS


YYYY


XXXX


YYYY

预期输出:

SYXYSYXYSYXYSYXY

#include <stdio.h>
#include <string.h>
int main()
{
    int M,N,k=0;
    char b[100];
    scanf("%d %d",&M,&N);
	char a[M][N];
	for(int i=0;i<M;i++){
        scanf("%s",&a[i]);
	}
	//输出二维数组
	/*for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            printf("%c",a[i][j]);
        }
        printf("\n");
	}*/


	for(int j=0;j<N;j++){
        for(int i=0;i<M;i++){
                b[k]=a[i][j];
                k++;
        }
	}
	for(int i=0;i<k;i++){
            printf("%c",b[i]);
	}

	return 0;
}

第2关:二位数组操作

#include <stdio.h>

int main()
{
    int N;
    scanf("%d",&N);
	int a[N][N];
	for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            scanf("%d",&a[i][j]);
        }
	}
	for(int i=0;i<N;i++){
        for(int j=0;j<=i;j++){
                a[i][j]=0;
        }
	}
	for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
                printf("%d ",a[i][j]);
        }
        printf("\n");
	}

	return 0;
}

第1关:折半查找

本关任务:由

N

个有序整数组成的数列已放在一维数组中,给定程序的功能是:利用折半查找法查找整数

m

在数组中的位置。若找到,返回其下标值,否则返回

-1

#include <stdio.h>
#define   N   10
int main()
{  
	int i, a[N]={-5,4,9,15,28,45,66,89,100,180 }, k=-1, m;
	int low=0, high=N-1, mid;

	for(i=0;i<N;i++)  
		printf("%d ", a[i]);
	printf("\n");
	
	scanf("%d",&m);
	while(low <= high)
	{  
		mid = (low + high) / 2;
		if(m < a[mid])
			high = mid-1;
			
		/***** 以下一行有错误 *****/
		else if(m > a[mid])     low=mid+1;
		
		
		/***** 以下一行有错误 *****/
		else {k=mid;break;}
	}
	
	if(k>=0)  
		printf("m=%d,index=%d\n",m,k);
	else      
		printf("Not be found!\n");
	
	return 0;
}



版权声明:本文为weixin_46305053原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。