【C刷题记录】矩阵相关

题目1·幻方矩阵
检验并打印幻方矩阵
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个5×5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。
输入格式: “%d”
输出格式:
如果是幻方矩阵,输出提示信息: “It is a magic square!\n”
矩阵元素的输出: “%4d”(换行使用"\n")
如果不是幻方矩阵,输出提示信息: “It is not a magic square!\n”
输入样例1:

17_24_1_8_15
23_5_7_14_16
4_6_13_20_22
10_12_19_21_3
11_18_25_2_9

(输人样例中“_”代表空格)
输出样例1:

It is a magic square!
**17**24***1***8**15
**23***5***7**14**16
***4***6**13**20**22
**10**12**19**21***3
**11**18**25***2***9

(输出样例中“*”代表空格)
输入样例2:

1_0_1_6_1
3_1_1_1_1
1_1_1_1_2
1_1_1_1_1
9_1_7_1_1

(输人样例中“_”代表空格)
输出样例2:

It is not a magic square!

注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输人样例中“_”代表空格,输出样例中“*”代表空格)

程序

#include <stdio.h>
#include <stdlib.h>
#define N 10
void FindSaddlePoint(int a[][N], int m, int n);


void FindSaddlePoint(int a[][N], int m, int n)
{
    int max, min, x, y, k, l , p, q, r;
    for(p = 0; p < m; p++)
    {
        max = a[p][0];
        x = p;
        y = 0;
        for(q = 0; q < n; q++)
        {
            if(a[p][q] > max)
            {
                max = a[p][q];
                x = p;
                y = q;
            }

        }
        min = a[0][y];
        k = 0;
        l = y;
        for(r = 0; r < m; r++)
        {
            if(a[r][y] < min)
            {
                min = a[r][y];
                k = r;
                l = y;
            }
        }
        if(x == k && y == l)
        {
            printf("a[%d][%d] is %d\n", x, y, a[x][y]);
            return;
        }
    }
    printf("No saddle point!\n");
    return;
}

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


题目2·鞍点
请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!”
已知函数原型:
void FindSaddlePoint(int a[][N], int m, int n);
在该函数中输出有无鞍点的信息。
程序运行结果示例1:

Input m,n:
3,3↙
Input matrix:
1 2 34 5 67 8 9↙
a[0][2] is 3

程序运行结果示例2:

Input m,n:
3,4↙
Input matrix:
3 4 7 50 1 8 29 3 2 6↙
No saddle point!

输入提示: “Input m,n:\n”“Input matrix:\n"
输入格式:
输入矩阵大小: “%d,%d”
输入矩阵元素: “%d”
输出格式:
找到鞍点的输出格式:“a[%d][%d] is %d\n”
没找到鞍点的输出格式:“No saddle point!\n”

程序

#include <stdio.h>
#include <stdlib.h>
#define N 10
void FindSaddlePoint(int a[][N], int m, int n);


void FindSaddlePoint(int a[][N], int m, int n)
{
    int max, min, x, y, k, l , p, q, r;
    for(p = 0; p < m; p++)
    {
        max = a[p][0];
        x = p;
        y = 0;
        for(q = 0; q < n; q++)
        {
            if(a[p][q] > max)
            {
                max = a[p][q];
                x = p;
                y = q;
            }

        }
        min = a[0][y];
        k = 0;
        l = y;
        for(r = 0; r < m; r++)
        {
            if(a[r][y] < min)
            {
                min = a[r][y];
                k = r;
                l = y;
            }
        }
        if(x == k && y == l)
        {
            printf("a[%d][%d] is %d\n", x, y, a[x][y]);
            return;
        }
    }
    printf("No saddle point!\n");
    return;
}

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


题目3·矩阵转置
某二维数组存放的数据构成一个nn的方阵,其中n<=5。写程序,从键盘输入n的值(n<=5),该nn矩阵中各元素的值按下面的公式计算:
a[i][j] = i * n + j + 1
其中,a[i][j]表示第i行第j列的元素。要求分别输出该矩阵和它的转置矩阵。
注意:定义数字大小N时,请用
#define N 10
输入格式: “%d”
输出提示:“The original matrix is:\n”
输出提示:“The changed matrix is:\n”
输出格式: 矩阵的列与列之间为%3d,行与行之间为\n
输入样例1:
5↙
输出样例1:

The_original_matrix_is:
__1__2__3__4__5
__6__7__8__9_10
_11_12_13_14_15
_16_17_18_19_20
_21_22_23_24_25
The_changed_matrix_is:
__1__6_11_16_21
__2__7_12_17_22
__3__8_13_18_23
__4__9_14_18_24
__5_10_15_20_25

(输出样例中下划线“_”代表空格)
输入样例2:
4↙
输出样例2:

The original matrix is:
__1__2__3__4
__5__6__7__8
__9_10_11_12
_13_14_15_16
The changed matrix is:
__1__5__9_13
__2__6_10_14
__3__7_11_15
__4__8_12_16

程序

#include <stdio.h>
#include <stdlib.h>
#define N 10

int main()
{
    int n,a[N][N],i,j,m=1;
    scanf("%d",&n);
    printf("The original matrix is:\n");
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            a[i][j] = i * n + j + 1;
            printf("%3d",a[i][j]);
        }
            printf("\n");
    }
    printf("The changed matrix is:\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%3d",a[j][i]);
        }
        printf("\n");
    }
    return 0;
}

题目4·蛇形矩阵
从键盘任意输入一个自然数n(n表示矩阵的大小,假设不超过100),请编程输出一个n*n的蛇形矩阵。如果输入的n不是自然数或者输入了不合法的数字,则输出"Input error!"。
函数原型: void ZigzagMatrix(int a[][N], int n);
函数功能:计算n*n的蛇形矩阵
提示:用两个双重循环分别计算n*n矩阵的左上三角和右下三角,设置一个计数器从1开始记录当前要写入矩阵的元素值,每次写完一个计数器加1,在计算左上角和右下角矩阵元素时,分奇数和偶数两种情况考虑待写入的元素在矩阵中的行列下标位置。
程序运行结果示例1:

Input n:
51   2   6   7  15
   3   5   8  14  16
   4   9  13  17  22
  10  12  18  21  23
  11  19  20  24  25

程序运行结果示例2:

Input n:
41   2   6   7
   3   5   8  13
   4   9  12  14
  10  11  15  16

程序运行结果示例3:

Input n:
-5↙
Input error!

程序运行结果示例4:

Input n:
105↙
Input error!

程序运行结果示例5:

Input n:
w↙
Input error!

输入提示信息:“Input n:\n”
输入错误提示信息:“Input error!\n”
输入格式: “%d”
输出格式:"%4d"
数据换行: “\n”

程序

#include <stdio.h>
#define N 100
void ZigzagMatrix(int a[][N], int n);

void ZigzagMatrix(int a[][N], int n)
{
    int i,j,count,temp;
    //处理左上三角,从a[0][0]开始正序输出
       for(i=0;i<n;i++)
       {
           if(i%2==0)
           {
               temp=i*(i+1)/2+1;
               a[i][0]=temp;
               for(j=1;j<=i;j++)
               {
                   temp++;
                   a[i-j][j]=temp;
               }
           }
           if(i%2==1)
           {
               temp=i*(i+1)/2+1;
               a[0][i]=temp;
               for(j=1;j<=i;j++)
               {
                   temp++;
                   a[j][i-j]=temp;
               }
           }
       }

       //处理右下三角,从a[n][n]开始倒序输出
       for(i=0;i<n-1;i++)
       {
           if(i%2==0)
           {
               temp=n*n-i*(i+1)/2;
               a[n-1-i][n-1]=temp;
               for(j=1;j<=i;j++)
               {
                   temp--;
                   a[n-1-i+j][n-1-j]=temp;
               }
           }
           if(i%2==1)
           {
               temp=n*n-i*(i+1)/2;
               a[n-1][n-1-i]=temp;
               for(j=1;j<=i;j++)
               {
                   temp--;
                   a[n-1-j][n-1-i+j]=temp;
               }
           }
       }

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

int main()
{
	int n,s;
	int a[N][N] = {0};
	printf("Input n:\n");
	s = scanf("%d", &n);
	if(s < 1 || n < 0 || n > 100)
	{
		printf("Input error!\n");
	}
	else
	{
		ZigzagMatrix(a, n);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值