数组部分习题2


图像旋转


问题描述    
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像顺时针旋转90度。
计算机中的图像可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。例如,下面的矩阵(a)表示原始图像,矩阵(b)表示顺时针旋转90度后的图像。
输入说明    
输入的第一行包含两个整数n和m,分别表示图像矩阵的行数和列数。1 ≤ n, m ≤ 100。
接下来n行,每行包含m个非负整数,表示输入的图像,整数之间用空格分隔。
输出说明    
输出m行,每行n个整数,表示顺时针旋转90度之后的矩阵,元素之间用空格分隔。
输入样例    
2 3
1 5 3
3 2 4
输出样例    
3 1
2 5
4 3    


#include <stdio.h>


int main()
{
    //初始化 
    int m=0,n=0,i=0,j=0;
    scanf("%d%d",&m,&n);
    int num[100][100]={0};
    int Num[100][100]={0};
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&num[i][j]);
        }    
    } 
    
    //旋转
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            Num[i][j]=num[m-1-j][i];
        }    
    } 
    
    //打印
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%d ",Num[i][j]);
        }
        printf("\n");    
    } 
    
    return 0;

         
四位译码器


问题描述
 编程完成四位译码器功能,译码转换方式:大写字母==>小写字母,小写字母==>大写
字母,数字==>*,其它符号==>@。
输入格式
 输入四个字符(可以是字母、数字或其它字符),字符之间不分割;
输出格式
 输出译码转换后的结果。
样例输入 1:
A2c&
样例输入 2:
%3Ua
样例输入 3:
0 W@
样例输出 1:
a*C@
样例输出 2:
@*uA
样例输出 3:
*@w@
样例说明
 输入可以是大写字母、小写字母、数字或其他字符混合,也可以是单独一种。
评测用例规模与约定
 输入存在单独一种字符情形。

#include <stdio.h>
#include <ctype.h>

int main()
{
    //初始化 
    char password[4]; 
    gets(password);
    int i=0;
    
    //译码
    for(i=0;i<4;i++)
    {
        if(isupper(password[i]))
        password[i]=tolower(password[i]);
        else if(islower(password[i]))
        password[i]=toupper(password[i]);
        else if(isdigit(password[i]))
        password[i]='*';
        else
        password[i]='@';
    } 
    
    //输出
    for(i=0;i<4;i++)
    {
        printf("%c",password[i]);
    }
     
    return 0;

  
排序2

问题描述:    
给定N个不同的整数,要求对这N个整数按如下规则排序并输出。
规则一:所有的偶数排在奇数前面。
规则二:在规则一的前提下按照从大到小的顺序排序。
输入说明    
数据由两行构成,第一行为整数n(n<=100),表示待排序整数的数量。第二行是n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。
输出说明    
在一行输出排好序的整数,整数之间以空格间隔。
输入样例    

1 2 3 4 5
输出样例    
4 2 5 3 1

#include <stdio.h>
void bubble(int arr[],int x)
{
    int i=0,j=0;
    for(i=0;i<x-1;i++)
    {
        for(j=0;j<x-1-i;j++)
        {
            if(arr[j]<arr[j+1])
            {
                int t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }        
        }
    }    
}
int main()
{
    //初始化 
    int n=0,i=0,k=0;
    scanf("%d",&n);
    int num[100]={0};
    int odd[100]={0};
    int even[100]={0};
    for(i=0;i<n;i++)
    {
        scanf("%d",&num[i]);
        if(num[i] == 0)
        {
            k=1;
        }
    }
    
    //赋值,排序,输出 
    for(i=0;i<n;i++)
    {
        if(num[i]%2 == 0)
        {
            even[i]=num[i];
        }
        else
        {
            odd[i]=num[i];
        }
    }
    bubble(even,n);
    bubble(odd,n);
    if(k==0)
    {
        for(i=0;i<n;i++)
        {
            if(even[i]!=0)
            {
                printf("%d ",even[i]);
            }
        }
    }
    else if(k=1)
    {
        for(i=0;i<n;i++)
        {
            if(even[i]!=0)
            {
                printf("%d ",even[i]);
            }
        }
        printf("%d ",0);
    }
    
    for(i=0;i<n;i++)
    {
        if(odd[i]!=0)
        {
            printf("%d ",odd[i]);
        }
    }
    return 0;


密码编译


时间限制:1S
内存限制:10000Kb

问题描述:
有一行电文,已按照下面的规律译成密码:
A>>Z   a>>z
B>>Y   b>>y
C>>X   c>>x
.   .
.   .
.   .
等等。即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变,要求编程序将密码译成原文。 
输入说明:
输入一串字符(包含7个元素),表示密码。
输出说明:
输出其对应的字符(包含7个元素),表示原文。
输入样例:
ABCDEFG
输出样例:
ZYXWVUT
 

#include <stdio.h>
int main()
{
    char password[7];
    int i=0;
    gets(password);
    
    for(i=0;i<7;i++)
    {
        if(password[i]>='A'&&password[i]<='Z')
        {
            password[i]='A'+'Z'-password[i];
        }
        else if(password[i]>='a'&&password[i]<='z')
        {
            password[i]='a'+'z'-password[i];    
        }
        
    }
    
    puts(password);
    return 0;
}


螺旋填数


题目描述:
创建一个m行n列的数组,将1—m*n的数字螺旋填入
方向为右下左上
输入说明:
输入正整数m和n,以空格分隔
输出说明:
输出填好的数组,数组元素之间用空格分隔,数组每行之间以换行分隔
输入示例:
4 5
输出示例:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
 

#include <stdio.h>
int main()
{
    //初始化 
    int m=0,n=0,i=0,j=0;
    scanf("%d%d",&m,&n);
    int num[100][100]={0};
    
    //这里有两个方面,第一是运行的时候每次加一,第二是运行到行或者列的尽头需要转换方向
    //由于有四个方向,故分为四种情况,使用switch语句运行 
    int turn=1,k=1;
    while(k <= m*n)
    {
        switch(turn)
        {
            case 1 ://方向为右 
                while(num[i][j]==0&&j<n)
                {
                    num[i][j]=k;
                    k++;
                    j++;
                }
                turn = 2;
                j--;
                i++;
                break;
            case 2 ://方向为下
                while(num[i][j]==0&&i<m)
                {
                    num[i][j]=k;
                    k++; 
                    i++;
                } 
                turn = 3;
                i--;
                j--;
                break;
            case 3 ://方向向左
                while(num[i][j]==0&&j>=0)
                {
                    num[i][j]=k;
                    k++;
                    j--;    
                } 
                turn = 4;
                i--;
                j++;
                break;
            case 4 ://方向为上
                while(num[i][j]==0&&i>=0)
                {
                    num[i][j]=k;
                    k++;
                    i--;    
                } 
                turn = 1;
                i++;
                j++;
                break;    
        }    
    } 
    
    //输出
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
        printf("%d ",num[i][j]);    
        }
        printf("\n");
    } 
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北の风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值