软件1801-1803班《面向过程程序设计》(6)二维数组和字符数组

7-1 螺旋方阵 (15 分)
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式:
输入在一行中给出一个正整数N(<10)。

输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:
5
输出样例:
  1  2  3  4  5
 16 17 18 19  6
 15 24 25 20  7
 14 23 22 21  8
 13 12 11 10  9
#include<stdio.h>
int a[100][100];
int main()
{
    int n;
    scanf("%d",&n);
    int t=1;
    int x=0,y=0;
    a[x][y]=1;
    while(n*n>t)
    {
        while(y+1<n && !a[x][y+1]) a[x][++y] = ++t;
		while(x+1<n && !a[x+1][y]) a[++x][y] = ++t;
		while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++t;
		while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++t;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%3d",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
7-2 找最小的字符串 (10 分)
本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串。

输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:
在一行中用以下格式输出最小的字符串:

Min is: 最小字符串
输入样例:
5
Li
Wang
Zha
Jin
Xian
输出样例:
Min is: Jin
#include<stdio.h>
#include<string.h>
struct N{
    char Name[81];
}name[1000]; //开始开了100说段错误  开了1000就过了


int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",name[i].Name);
    }
    for(int i=0;i<n-1;i++)
    {

        for(int j=0;j<n-i-1;j++)
        {
            if(strcmp(name[j].Name,name[j+1].Name)>0)
            {
                char tempname[100];
                strcpy(tempname,name[j].Name);
                strcpy(name[j].Name,name[j+1].Name);
                strcpy(name[j+1].Name,tempname);
            }
        }
    }

    printf("Min is: %s",name[0].Name);
    return 0;

}
7-3 英文单词排序 (17 分)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:
blue
red
yellow
green
purple
#
输出样例:
red blue green yellow purple 
#include<stdio.h>
#include<string.h>
struct {
    char name[50];

}Vocabulary[50];


int main()
{
    int Count=0;
    while(1)
    {
       scanf("%s",Vocabulary[Count].name);
       if(Vocabulary[Count].name[0]=='#')
        break;
       Count++;
    }
    for(int i=0;i<Count-1;i++)
    {
        for(int j=0;j<Count-i-1;j++)
        {
            if(strlen(Vocabulary[j].name)>strlen(Vocabulary[j+1].name))
            {
                char temp[50];
                strcpy(temp,Vocabulary[j].name);
                strcpy(Vocabulary[j].name,Vocabulary[j+1].name);
                strcpy(Vocabulary[j+1].name,temp);
            }
        }

    }
   //  test printf("%s \n",Vocabulary[0].name);
    for(int i=0;i<Count;i++)
    {
        printf("%s ",Vocabulary[i].name);
    }
    return 0;
}
7-4 将字符串中数字字符替换成$字符 (10 分)
将字符串中每一个数字字符都替换成一个$字符。

输入格式:
在一行中输入长度小于20的含有数字字符的字符串。在字符串中不要出现换行符,空格,制表符。

输出格式:
直接输出变化后的字符串。

输入样例:
as123rf
输出样例:
as$$$rf
#include<stdio.h>
#include<string.h>

int main()
{
    char arr[100];
    gets(arr);
    int len=strlen(arr);
    for(int i=0;i<len;i++)
    {
        if(arr[i]<=57&&arr[i]>=48)
            arr[i]='$';

    }
    puts(arr);
    return 0;

}
7-5 矩阵A乘以B (15 分)
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R
​a
​​ 行、C
​a
​​ 列,B有R
​b
​​ 行、C
​b
​​ 列,则只有C
​a
​​ 与R
​b
​​ 相等时,两个矩阵才能相乘。

输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3
nclude<iostream>
#include<stdio.h>
//using namespace std;
int main()
{
    int ra,ca,rb,cb;
    scanf("%d%d",&ra,&ca);
    int a[ra][ca];
    for(int i=0;i<ra;i++)
    {
        for(int j=0;j<ca;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d%d",&rb,&cb);
    int b[rb][cb];
    for(int i=0;i<rb;i++)
    {
        for(int j=0;j<cb;j++)
        {
            scanf("%d",&b[i][j]);
        }
    }
    if(ca!=rb){
        printf("Error: %d != %d",ca,rb);
    }
    else{
            printf("%d %d\n",ra,cb);
        int c[ra][cb];
        for(int i=0;i<ra;i++){
            for(int j=0;j<cb;j++){
                int sum=0;
    for(int k=0;k<ca;k++){
        sum+=a[i][k]*b[k][j];
    }
    if(j<cb-1)
        printf("%d ",sum);
    else
        printf("%d\n",sum);
            }
        }
    }
    return 0;
}
7-6 找鞍点 (12 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的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
#include<stdio.h>
int main()
{
	int i,j,n,a[6][6],b[6],c[6];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		int max=0;
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]>max)
			{
				max=a[i][j];
				b[i]=max;
			}
		}
	}
	for(j=0;j<n;j++)
	{
		int min=9999;
		for(i=0;i<n;i++)
		{
			if(a[i][j]<min)
			{
				min=a[i][j];
				c[j]=min;
			}
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(b[i]==c[j])
			{
				printf("%d %d\n",i,j);
				return 0;
			}
		}
	}
	puts("NONE");
	return 0;
}
7-7 方阵右上三角元素和 (10 分)
求一个5×5数组右上三角(含对角线)元素的和。

输入格式:
输入5行5列的方阵,每行第一个数前没有空格,每行的每个数之间各有一个空格。

输出格式:
直接输出结果。没有其它任何附加字符。

输入样例:
1 2 4 5 8
1 4 7 4 1
1 2 3 6 9
5 6 9 8 4
7 5 3 6 8
输出样例:
74
#include<stdio.h>
#define N 5
int main()
{
    int a[20][20];
    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=0;i<N;i++)
    {
        for(int j=i;j<N;j++)
        {
            sum+=a[i][j];
        }
    }
    printf("%d\n",sum);

    return 0;
}
发布了55 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42612338/article/details/89531336