/**
* 描述:解决百度知道中一位网友提出的问题
* 作者:QQwen
*/
#include <stdio.h>
#define M 3 //定义数组的一维
#define N 5 //定义数组的二维
//定义一个测试用数组,用来调试程序
int testArray[3][5] =
{
{ 11, 12, 13, 14, 15 },
{ 21, 22, 23, 24, 25 },
{ 31, 32, 33, 34, 35 }, };
/**
* 数组转换函数
* @param int (*a)[N] 需要转换的二维数组
* @param int k 从第k列左移
*/
//在这里第一个参数是很有说法的,这个直接影响到函数中的写法,如果函数中出现“a[i][j]”这种操作的时候
//一定要这样定义参数,否则编译器会提示你对a的下标操作是错误的,也就是说只有这样定义第一个个参数在函数
//体中才能以下标的形式操作数组中的元素
void fun(int (*a)[N], int k)
{
//int i, j, p, temp; //ij为循环变量,temp用来存储每行第一个元素,p这个变量意义不大用来配合k使用
int i, j, temp;
for (; k>0; k--)
//for (p = 1; p <= k; p++) //这里的p定义的有些多余,改为上面的方式更好
for (i = 0; i < M; i++)
{//行循环
temp = a[i][0]; //将每行的第一个元素先存储在临时的变量中,
//这样就空出了自己的位置,即使后面的变量覆盖了数据也不会丢失
//下面的操作是将数组中后一个元素搬运到前面一个位置,比如testArray[0][0] = 11,在执行
//完下面操作一次之后testArray[0][0] = 12。
for (j = 0; j < N - 1; j++)
a[i][j] = a[i][j + 1];
//再一行的元素都向前移动一位之后将先前保存的第0个元素赋值给本行最后的
a[i][N - 1] = temp;
}
}
/**
* 打印数组中的元素
*/
void printArray()
{
int i, j;
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
printf("%d \t", testArray[i][j]);
}
printf("\n"); //换行
}
}
int main()
{
int column = 0; //从哪列左移
printf("请输入要从第几列左移(1--5):\n");
scanf("%d",&column);
printf("二维数组转换之前为:\n");
printArray();
fun(testArray, column);
printf("二维数组转换之后为:\n");
printArray();
return 0;
}
程序输出为:
请输入要从第几列左移(1--5):
2
二维数组转换之前为:
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
二维数组转换之后为:
13 14 15 11 12
23 24 25 21 22
33 34 35 31 32
温馨提示:答案为网友推荐,仅供参考