C语言编程求解!~

给定程序中,函数fun的功能是:将a所指3×5矩阵中第k列的元素左移到第0列,第k列以后的每列元素行依次左移,原来左边的各列依次绕到右边。
例如,有下列矩阵:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
若k为2,程序执行结果为
3 4 5 1 2
3 4 5 1 2
3 4 5 1 2
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

#include <stdio.h>
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{ int i,j,p,temp;
/**********found**********/
for(p=1; p<= __1__; p++) (应填入k)
for(i=0; i<M; i++)
{ temp=a[i][0];
/**********found**********/
for(j=0; j< __2__ ; j++) a[i][j]=a[i][j+1]; (应填入N-1)
/**********found**********/
a[i][N-1]= __3__; (应填入temp)
}
}
能不能具体解释一下流程的含义呢?有些弄不懂也~谢谢!

/**
* 描述:解决百度知道中一位网友提出的问题
* 作者: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
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-15
流程就是:将矩阵整列的向左移动,移动的次数就是k的值

程序中p控制移动的次数,从1到k一共移动k个循环

temp=a[i][0];//每次都将数组中的第一个元素先保存起来
a[i][j]=a[i][j+1];//然后用下一个值来覆盖上一个值
a[i][N-1]= temp; //最后将temp值放到数组最后

i控制行,j控制列
第2个回答  2010-09-15
#include <stdio.h>
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{ int i,j,p,temp;
/**********found**********/
for(p=1; p<= __1__; p++) (应填入k)k是循环左移的次数
for(i=0; i<M; i++)
{ temp=a[i][0]; //这里保留每行的第一个元素。
/**********found**********/
for(j=0; j< __2__ ; j++) a[i][j]=a[i][j+1]; (应填入N-1) //这个循环就是依次左移,用第二个盖掉第一个元素,再用第三个盖第二个
/**********found**********/
a[i][N-1]= __3__; (应填入temp)//最后用开始保留的第一个元素盖在最后一个元素上
}
}
第3个回答  2010-09-15
#include <stdio.h>
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{ int i,j,p,temp;
for(p=1; p<= k; p++) /*用来控制具体要进行多少次列移动*/
for(i=0; i<M; i++) /*用来控制有多少行要进行列移动*/
{ temp=a[i][0]; /*保存第一列的值*/
for(j=0; j< N-1; j++) /*用来控制把后面一列的值移到前面一列*/
a[i][j]=a[i][j+1]; /*把后面一列的值移到前面一列*/
a[i][N-1]= temp; /*把第一列的值作为最后一列的值*/
}
}

希望回答对你有帮助
第4个回答  2010-09-15
for(i=0; i<M; i++)
{
temp=a[i][0]; //记录当前行第一个元素
//将该行第1到N个元素 左移一位
for(j=0; j< N-1 ; j++)
a[i][j]=a[i][j+1];
//将第一个元素放到最右侧
a[i][N-1]= temp;
}
比如第i行的内容为 : 1 2 3 4 5
执行完上面的代码后第i行内容为 : 5 1 2 3 4

外侧的for循环根据输入的k值控制移动多少次
for(p=1; p<= __1__; p++) (应填入k)

不明白可以 hi 我...
相似回答