二维数组基础

二维数组基础

一、班级成绩输入输出

题目描述

输入一个班级5个学生各5科成绩,输出5个学生各5科成绩及总分。
输入描述:
五行,每行输入一个学生各5科成绩(浮点数表示,范围0.0~100.0),用空格分隔。
输出描述:
五行,按照输入顺序每行输出一个学生的5科成绩及总分(小数点保留1位),用空格分隔。

#include<stdio.h>
int main()
{
    double arr[5][5];
    for(int i=0;i<5;++i)
    {
       scanf("%lf %lf %lf %lf %lf",&arr[i][0],&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4]);
    }//当然,我们也可以用双层循环输入
    for(int i=0;i<5;++i)
    {
         double sum=0;//记得每次都要归零
        for(int j=0;j<5;++j)
        {
             printf("%.1f ",arr[i][j]);
            sum+=arr[i][j];
        }
        printf("%.1f\n",sum);//在循环外输出一次总的
    }
    return 0;
}

二、矩阵求最大值

题目描述

给出一个矩阵,求出其中的最大值及所在的行号和列号。
输入描述:
共n+1行
第一行输入一个整数n,
接下来的n行输入一个n行n列的矩阵(1≤n≤20),每行输入n个整数,用空格隔开。
输出描述:
一个行,3个整数,分别为最大值,其所在的行,其所在的列,用空格隔开。保证最大值唯一。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a=0,b,c,n;
    int arr[21][21];
	cin >>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin >>arr[i][j];
            if(arr[i][j]>a)
            {
                a=arr[i][j];
                b=i;
                c=j;
            }
        }
    }
	cout <<a<<" "<<b<<" "<<c;
	return 0;
}

三、矩阵统计

题目描述

KiKi想知道一个n阶矩阵中0的个数,请编程帮他实现。
输入描述:
第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (2≤n≤10)
从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。
输出描述:
一行,一个整数,表示统计n阶矩阵中0的个数。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n,cnt=0;
    cin>>n;
    int a[n][n];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>a[i][j];
            if(a[i][j]==0)
                cnt++;
        }
    }
    cout<<cnt;
    
}

四、稀疏矩阵

题目描述

给你一个n行m列的矩阵,判断他是不是稀疏矩阵,稀疏矩阵中零的个数超过矩阵中总元素个数的一半。
输入描述:
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数
输出描述:
一行,如果该矩阵是稀疏矩阵输出"YES",否则输出"NO"。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a=0,n,m;
    int arr[21][21];
	cin >>n>>m;
    int k=m*n/2;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin >>arr[i][j];
            if(arr[i][j]==0)
            {
                a++;
            }
        }
    }
    if(a>k)
	    printf("YES");
    else
        printf("NO");
	return 0;
}

五、矩阵相等判定

题目描述

KiKi得到了两个n行m列的矩阵,他想知道两个矩阵是否相等,请你回答他。(当两个矩阵对应数组元素都相等时两个矩阵相等)。
输入描述:
第一行包含两个整数n和m,表示两个矩阵包含n行m列,用空格分隔。
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入nm个数,表示第一个矩阵中的元素。
从n+2行到2n+1,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n
m个数,表示第二个矩阵中的元素。
1 < n,m < 10
输出描述:
一行,如果两个矩阵相等输出"Yes"并换行,否则输出"No"并换行。

第一种写法,遍历数组,判断相等的元素个数是否等于数组总元素个数

#include <iostream>
using namespace std;
int main()
{
	int n, m, cnt = 0;
	cin >> n >> m ;
	int a[n][m], b[n][m];
	
	for(int i = 0 ; i < n ; i ++)
	{
		for(int j = 0 ; j < m ; j ++)
		{
			cin >> a[i][j];
		}
	}
	for(int i = 0 ; i < n ; i ++)
	{
		for(int j = 0 ; j < m ; j ++)
		{
			cin >> b[i][j];
			if(a[i][j] == b[i][j]) cnt ++; 
		}
	}
	if(cnt == n * m) 
	{
		cout << "Yes";
	}
	else
	{
		cout << "No";
	}
	
	return 0;
}

第二种判断方法,只要有元素不同就跳出

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a=0,n,m;
    cin >>n>>m;
    int arr1[n][m];
    int arr2[n][m];
    bool flag=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin >>arr1[i][j];
        }
    }
        for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin >>arr2[i][j];
            if(arr2[i][j]!=arr1[i][j])
            {
                flag=0;
                break;
            }
        }
    }
    if(flag)//1真0假
	    printf("Yes");
    else
        printf("No");
	return 0;
}

六、KiKi判断上三角矩阵

题目描述

KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。
输入描述:
第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (2≤n≤10)
从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。
输出描述:
一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出"NO"并换行。

#include<bits/stdc++.h>
int main()
{
	int n;
	scanf("%d", &n);
	int a[10][10];
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < n; j++) 
			scanf("%d", &a[i][j]); 
	int sum = 0;
	for (int i = 1; i < n; i++) 
		for (int j = 0; j < i; j++) 
			sum += a[i][j]; //或者一个一个判断是否为0
	if (sum == 0)
		printf("YES\n");
	else
		printf("NO\n");
	return 0;
}

七、求矩阵各列元素最大值

题目描述

求一个给定的m行n列矩阵各列元素的最大值。
输入描述:
输入第一行给出两个正整数m和n(1≤m,n≤10)。随后m行,每行给出n个整数,其间以空格分隔。
输出描述:
一行,共n个整数,分别为n列的最大值,用空格分隔。

法一,设新数组

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m,a[100][100],b[100];
    cin >>n>>m;
	for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin >>a[i][j];
        }
    }
	for(int i=1;i<=m;i++)
    {
        b[100]={0};
        int p=1;
        for(int j=1;j<=n;j++)
        {
            b[p]=a[j][i];
            p++;
        }
        sort(b+1,b+1+n);
        cout <<b[n]<<" ";
    }
	
	return 0;
}

法二,颠倒行列

#include <iostream>
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m ;
	int a[n][m];
	
	for(int i = 0 ; i < n ; i ++)  //i:行 
	{
		for(int j = 0 ; j < m ; j ++) //j:列 
		{
			cin >> a[i][j];
		}
	}
	for(int i = 0 ; i < m ; i ++) // i:列
	{
		int maxJ = 0;  //假设a[maxJ][i]最大值 
		for(int j = 0 ; j < n ; j ++) //j:行,在循环内调整行列顺序即可
		{
			if(a[j][i] > a[maxJ][i] )
			{
				maxJ = j;
			}
		 } 
		 cout << a[maxJ][i] << " ";
	 } 
	return 0;
}

八、矩阵转置

题目描述

KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答。
输入描述:
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
输出描述:
输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。
示例1
输入
2 3
1 2 3
4 5 6
输出
1 4
2 5
3 6

#include<bits/stdc++.h>
using namespace std;
int main()
{ 
    int n, m, a[11][11]; 
    scanf("%d %d", &n, &m); 
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++) 
            scanf("%d", &a[i][j]); 
    for(int i = 0; i < m; i++){ 
        for(int j = 0; j < n; j++) 
            printf("%d ", a[j][i]); 
        printf("\n"); //换行,换行!
    } 
    return 0; 
}

总结

二维数组基础题目大同小异,无非就是查找特定行列或者更改行列罢了。
点个关注,球球了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值