练习7-5原题:给二维数组赋值时,如果把列下标作为外循环的循环变量,行下标作为内循环的循环变量,输入的数据在二维数组中该如何存放?用下列 for 语句替换例7-7中的对应语句,将输入的6个数存入二维数组中,假设输入数据不变,输出什么?与例7-7中的输出结果一样吗?为什么?
for(j=0;j<2;j++)
for(i=0;i<3;i++)
scanf("%d",&a[i][j]);
把例7-7的代码贴一下吧
#include<stdio.h>
int main()
{
int col,i,j,row;
int a[3][2];
//将输入的数存入二维数组
printf("Enter 6 integers:\n");
for(i=0;i<3;i++)
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
//按矩阵的形式输出二维数组 a
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf("%4d",a[i][j]);
printf("\n");
}
//遍历二维数组,找出最大值a[row][col]
row=col=0;
for(i=0;i<3;i++)
for(j=0;j<2;j++)
if(a[i][j]>a[row][col])
{
row=i;
col=j;
}
printf("max=a[%d][%d]=%d\n",row,col,a[row][col]);
return 0;
}
修改后其实这就是变成了 a [ 2 ] [ 3 ] 的一个数组,也就是两行三列的一个数组,如果测试数据还是
3 2
10 -9
6 -1
那么他在计算机中就会变成
3 2 10
-9 6 -1
所以此时的最大值是10,下标是a[0][2]。
#include<stdio.h>
int main()
{
int col,i,j,row;
int a[3][2];
//将输入的数存入二维数组
printf("Enter 6 integers:\n");
for(j=0;j<2;j++)
for(i=0;i<3;i++)
scanf("%d",&a[i][j]);
//按矩阵的形式输出二维数组 a
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf("%4d",a[i][j]);
printf("\n");
}
//遍历二维数组,找出最大值a[row][col]
row=col=0;
for(i=0;i<3;i++)
for(j=0;j<2;j++)
if(a[i][j]>a[row][col])
{
row=i;
col=j;
}
printf("max=a[%d][%d]=%d\n",row,col,a[row][col]);
return 0;
}
好吧以上属于我的瞎掰扯,真正运行告诉我too young,too simple。。。
因为即使是 j 先然后再到 i ,但 scanf 那里写的还是 [i][j],所以还是得一点点地列出来,所以运行结果:
练习7-6原题:在例7-9的程序中,如果将遍历上三角阵改为遍历下三角阵,需要怎样修改程序?运行结果有变化吗?如果改为遍历整个矩阵,需要怎样修改程序?输出是什么?为什么?
先贴例7-9的代码:
#include<stdio.h>
int main()
{
int n,i,j,temp;
int a[6][6];
//给二维数组赋值
printf("Enter n: ");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=i*n+j+1;
//行列互换
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i<=j) //只遍历上三角
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
//按矩阵的形式输出a
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
emmm。。。其实也不难,可以自己在草稿纸上先画个正方形,如果是遍历上三角那就是先 for(i=0;i<n;i++),再for(j=0;j<n;j++),要改为下三角那就是先 for(j=0;j<n;j++),再for(i=0;i<n;i++)。就比如下三角的第一列吧,是j=0,然后i是各种数。
不管是上三角还是下三角都不影响矩阵交换的结果。
但是如果要遍历整个矩阵那就是将下列语句改成 i<n或者 j<n
if(i<=j) //只遍历上三角
但是输出的结果和原来无差,因为上三角交换一次已经使矩阵转置了,再来一次让下三角交换,就使矩阵恢复原样。
练习7-7原题:矩阵运算。读入一个正整数n(1<=n<=6),再读入 n 阶方阵 a,计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i,j,a[6][6];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
int sum=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
if(i+j!=n-1)
sum+=a[i][j];
}
printf("%d\n",sum);
return 0;
}
也不是很难我就不注释了
练习7-8原题:方阵循环右移。读入2个正整数 m 和 n(1<=n<=6),再读入 n 阶方阵 a,将该方阵中的每个元素循环向右移 m 个位置,即将第0、1、···、n-1列变换为第n-m、n-m+1、···、n-1、0、1、···、n-m-1列,移动后的方阵可以存到另一个二维数组中。
我自己写的老错,下面是博主 我是一只菜鸟pp 的代码:
#include<stdio.h>
int main()
{
int a[6][6];
int i,j,n,m;
scanf("%d %d",&m,&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
m=m%n; //可能会出现m比n还大所以取余数
for(i=0;i<n;i++)//行
{
for(j=n-m;j<n;j++) //列,先输出右移超出的部分
printf("%d ",a[i][j]);
for(j=0;j<n-m;j++) //列,输出右移在n内的部分
printf("%d ",a[i][j]);
printf("\n");//换行
}
return 0;
}
学到了学到了
因为练习7-9的代码之前出现过了我就不写这部分了。
主要用到函数引用与调用、二维数组、闰年的判断等知识点。