1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。

本文介绍了如何使用C语言实现二维数组的顺时针旋转90度,详细解释了旋转过程中涉及的数组元素交换原理,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.6给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。

解答1.6

图片的旋转可以将像素划分成一圈一圈,然后从最外层一圈一圈上来旋转。旋转某一圈的某个元素的时候,相当于对应的上下左右依次交换。

   ===>>

void Rotate90(int mat[N][N])
{
	int first,last;
	int top,offset;
	for (int layer=0;layer<N/2;layer++)
	{
		first=layer;
		last=N-1-first;
		//顺时针
		for (int i=first;i<last;i++)
		{
			offset=i-first;
			top=mat[first][i];//保存上
			mat[first][i]=mat[last-offset][first];//上<----------左
			
			mat[last-offset][first]=mat[last][last-offset];//左<----------下
			
			mat[last][last-offset]=mat[i][last];//下<----------右
			mat[i][last]=top;//右<----------上
			
		}
	}
/*
   //逆时针
	for (int layer=0;layer<N/2;layer++)
	{
		first=layer;
		last=N-1-first;
		for (int i=first;i<last;i++)
		{
			offset=i-first;
			top=mat[first][i];//保存上
	     	mat[first][i]=mat[i][last];//上<----------右
			mat[i][last]=mat[last][last-offset];//右<----------下
			mat[last][last-offset]=mat[last-offset][first];//下<----------左
			mat[last-offset][first]=top;//左<----------上
			
		}
	}
	*/
}

注意:关于函数参数为二维数组的情况:

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指定所有维数的大小,也可以省略第一维的大小说明,如:              

void  Func(int array[3][10]);            

 void  Func(int array[][10]);              

二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

 void  Func(int  array[][]); 

因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放), 而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:

void  Func(int  array[3][]);

实参数组维数可以大于形参数组,例如实参数组定义为:

               void  Func(int array[3][10]);

而形参数组定义为: int  array[5][10];  

这时形参数组只取实参数组的一部分,其余部分不起作用。



相关题目:输入n*n的字符矩阵,把它旋转90度后输出

#include <stdio.h>
#include <malloc.h>

void main()

{
	char **p;
	int i,j,n,a;
	printf("请输入n*n矩阵的n值:");
	scanf("%d",&n);
	getchar();
	p = (char**)malloc(n*sizeof(char*));
	for(i=0;i<n;i++)
	{
		p[i] = (char*)malloc(n*sizeof(char));
		for(j=0;j<n;j++)
		{
			p[i][j] = getchar();
		}
		getchar();		//换行输入,去掉回车符的影响
	}	//动态分配n*n的数组空间,并逐行输入字符串
	
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			printf("%c",p[i][j]);
		}
		printf("\n");
	}

	printf("请输入选择方向\n1.顺时针\n2.逆时针\nmake your choice!	(1 or 2)\n");
	scanf("%d",&a);
	switch(a)
	{
	case 1:
		printf("顺时针旋转90后的矩阵为: \n");
		for(i=0; i<n; ++i)
		{
			for(j=0; j<n; ++j)
				printf("%c ", p[n-1-j][i]);
			printf("\n");
		}
		break;
	case 2:
		printf("逆时针旋转90后的矩阵为: \n");
		for(i=0; i<n; ++i)
		{
			for(j=0; j<n; ++j)
				printf("%c ",p[j][n-1-i] );
			printf("\n");
		}
		break;
	default:
		printf("input error!\n");
		break;
	}
}


如上已测试运行成功,

输入 2

ab

cd

1    //选择1顺时针输出

ca

bd

2    //选择2逆时针输出

bd

ac

 

 

中间有空格模式的话,再输入过程修改成空格输入即可。

scanf函数族在用%c接受输入时要接收空格和回车。%s时接受空格。
getchar函数族接受所有字符包括回车。

for(i=0;i<n;i++)
	{
		p[i] = (char*)malloc(n*sizeof(char));
		for(j=0;j<n;j++)
		{
			p[i][j] = getchar();
                        getchar();//接收空格或者回车符号
		}
	}	//动态分配n*n的数组空间,并逐行输入字符串




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值