2022秋 - C实验A类 –实验6 二维数组与字符数组

7-1 矩阵

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:

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

输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

输出样例:

35

代码段:

#include <stdio.h>

int main()
{
    int n,i,j,sum=0;
    scanf("%d",&n);
    int a[n][n];
    int *p;
    p=a[0];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
        	scanf("%d",p);
        	p++;
		}
    for(i=0;i<n;i++)
        a[n-1][i]=0;
    for(i=0;i<n;i++)
        a[i][n-1]=0;
    for(i=0;i<n;i++)
    {
        j=n-i-1;
        a[j][i]=0;
    }
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            sum+=a[i][j];
    printf("%d",sum);
}

7-2 求矩阵的局部极大值

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:

输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:

每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:

4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1

输出样例1:

9 2 3
5 3 2
5 3 4

输入样例2:

3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1

输出样例2:

None 3 5

代码段:

#include <stdio.h>

int main()
{
    int m,n,i,j,count;
    scanf("%d %d\n",&m,&n);
    int a[m][n];
    int *p;
    p=a[0];
    for(i=0;i<m*n;i++)
    {
        scanf("%d",p);
        p++;
    }
    for(i=1;i<m-1;i++)
        for(j=1;j<n-1;j++)
        {
            if(a[i][j]>a[i+1][j]&&a[i][j]>a[i-1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i][j-1])
            {
                printf("%d %d %d\n",a[i][j],i+1,j+1);
                count++;
            }
        }
    if(count==0)
        printf("None %d %d",m,n);
}

7-3 构建n阶幻方阵

幻方阵又称魔方阵,是将1~n×n的整数放置在1个n×n的方阵中(n的值为奇数),且保证每行、每列及主对角线、副对角线上的数值之和相等。

本题要求实现n-幻方阵(阶数最大为15),n的值从键盘读入。
N为奇数时,N幻方构造算法为:

(1) 将1放在第一行中间一列;

(2)从2开始直到n×n为止各数依次按下列规则存放:按右上方向行走,即每一个数存放的行比前一个数的行数减1,列数加1。

(3) 如果行列范围超出矩阵范围,则回绕。

(4) 如果按上面规则确定的位置上已有数,则将其放在上一个数的下面。

输入格式:

输入一个正奇数n。

输出格式:

按照样例的格式输出n级幻方阵,每列占4个字符,右对齐。

输入样例:

5

输出样例:

  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

代码段:

#include<stdio.h>
int main(){
	int n,i,sta,k,chu,kkk=1;
	scanf("%d",&n);
	int a[n][n];
	sta=(n-1)/2;
	chu=0;
	for(i=0,k=0;i<n*n;i++){
		a[chu][sta]=kkk;
		kkk++;k++;
		if(k==n){
			chu=chu+1;
			k=0;
			continue;//结束此次循环进入下一次
		}//此时下一个数输到当前数字的下方
 
		if(chu==0){
			chu=n-1;
		}//第一行转到最后一行
		else chu--;
		if(sta==n-1){
			sta=0;
		}//最后一列提到最前
		else sta++;
		}
	for(i=0;i<n;i++){
		for(k=0;k<n;k++){
			printf("%4d",a[i][k]);
		}
		printf("\n");
	}
	return 0;
}

7-4 组个最小数

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:

在一行中输出能够组成的最小的数。

输入样例:

2 2 0 0 0 3 0 0 1 0

输出样例:

10015558

代码段:

#include<stdio.h>
int main()
{
	int a[10],i,j,k;
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	for(i=1;i<10;i++)
		if(a[i]>0)
		{
			printf("%d",i);
			a[i]--;
			break;
		}
	if(a[0]>0)
		for(k=0;k<a[0];k++)
			printf("0");
	for(j=0;j<a[i];j++)
		printf("%d",i);
	for(i++;i<10;i++)
		for(j=0;j<a[i];j++)
			printf("%d",i);
	printf("\n");
	return 0;
}

7-5 字符串排序

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:

After sorted:
每行一个字符串

输入样例:

red yellow blue black white

输出样例:

After sorted:
black
blue
red
white
yellow

代码段:

#include <stdio.h>
#include <string.h>

int main()
{
    char a[5][80];
    char s[80];
    int i,j; 
    for(i=0;i<5;i++)
        scanf("%s",a[i]);
    for(i=0;i<4;i++)
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(strcmp(a[j],a[j+1])>0)
            {
                strcpy(s,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],s);
            }
        }
    }
    printf("After sorted:\n");
    for(i=0;i<5;i++)
        printf("%s\n",a[i]);
}

7-6 IP地址转换

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

输入格式:

输入在一行中给出32位二进制字符串。

输出格式:

在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。

输入样例:

11001100100101000001010101110010

输出样例:

204.148.21.114

代码段:

#include <stdio.h>
int a[8]={128,64,32,16,8,4,2,1};

int main(){
    char str[33];
    int ans1=0,ans2=0,ans3=0,ans4=0;
    scanf("%s",&str);
    for(int i=0;i<8;i++){
        ans1+=a[i%8]*(str[i]-'0');
    }
    for(int i=8;i<16;i++){
        ans2+=a[i%8]*(str[i]-'0');
    }
    for(int i=16;i<24;i++){
        ans3+=a[i%8]*(str[i]-'0');
    }
    for(int i=24;i<32;i++){
        ans4+=a[i%8]*(str[i]-'0');
    }
    printf("%d.%d.%d.%d",ans1,ans2,ans3,ans4);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值