题目链接:
解题思路及示例代码:
#include <stdio.h>
int main ()
{
int row = 0,line = 0;
scanf("%d %d\n",&row,&line); //输入二维数组的行数和列数
int arr[10][10] = {0};
int i = 0;
for (i = 0;i < row;i++)
{
int j = 0;
for (j = 0;j < line;j++)
{
scanf("%d ",&arr[i][j]); //输入二维数组中的数据
}
}
int perform = 0;
scanf("%d\n",&perform); //输入执行次数
/*因为这里有多个scanf函数,当第一个scanf函数读
*取输入的值时,它会将\n也读取了进去,而这第一个scanf
*函数并不会将\n也读取进去,所以\n会一直留在缓冲区中
*而下一个scanf函数在读取属于%c内容时,会连带的将\n也一起
*接收,
*所以这会造成程序错误
*其解决办法是:
*在%c之前加上一个空格从而将缓冲区中的\n吸收掉
*/
char type = '0';
int perform1 = 0,perform2 = 0;
int y = 0;
for (y = 0;y < perform;y++)
{ //只有读取%c时才会有上述的要求,如果是%d则没有,
//由《现代方法》里的scanf读取原理可以知道
scanf("%c %d %d\n",&type,&perform1,&perform2);//输入字符与行或列
if (type == 'r') //交换行
{
/* int m = 0;
* for (m = 0;m < line;m++)
* {
* printf("%d ",arr[perform2-1][m]);
* }
* printf("\n"); //这样交换的算法只是在执行一次操作
* 时才有用,而当执行次数大于一次时,其它操作在执行时就需要
* 用到未被操作的数据
* int n = 0;
* for (n = 0;n < line;n++)
* {
* printf("%d ",arr[perform1-1][n]);
* }
* */
int m = 0;
for (m = 0;m < line;m++)//注意这里的判定条件
{
int change = 0;
change = arr[perform1-1][m];
arr[perform1-1][m] = arr[perform2-1][m];
arr[perform2-1][m] = change;
}
}
else if (type == 'c')
{
/* int m = 0;
* for (m = 0;m < row;m++)
* {
* printf("%d \n",arr[m][perform2-1]);
* } //这样交换的算法只是在执行一次操作
* 时才有用,而当执行次数大于一次时,其它操作在执行时就需要
* 用到未被操作的数据
* int n = 0;
*for (n = 0;n < row;n++)
*{
* printf("%d \n,",arr[n][perform1-1]);
* }
*/
int m = 0; //交换列
for (m = 0;m < row;m++)
{
int change = 0;
change = arr[m][perform1-1];
arr[m][perform1-1] = arr[m][perform2-1];
arr[m][perform2-1] = change;
}
}
/* else
*{ 因为当输入非法字符时,题目要求程序不会执行此操作
* 而没有说终止程序
* 所以就不需要这一行代码
* return 0;
* }
* */
}
for (i = 0;i < row;i++) //打印二维数组中的数据
{
int j = 0;
for (j = 0;j < line;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n"); //不要忘了printf函数不会在每一行
//结束时自动添加换行符
}
return 0;
}