一、程序填空题1. 给定程序中,函数fun的功能是:判定形参a所指的N×N(规定N为奇数)的矩阵是否是“幻方”,若是,则函数返回值为1;若不是,则函数返回值为0。“幻方”的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。
例如,以下3×3的矩阵就是一个“幻方”:
4 9 2
3 5 7
8 1 6
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:部分源程序给出如下。
不得增行或删行,也不得更改程序的结构!
试题程序: #include<stdio.h>
#define N 3
int fun(int(*a)[N])
{int i,j,m1,m2,row,colum;
m1=m2=0;
for(i=0;i<N;i++)
{j=N-i-1;m1+=a[i][i];
m2+=a[i][j];}
if(m1!=m2)return 0;
for(i=0;i<N;i++){
/******************found******************/
row=colum=______;
for(j=0;j<N;j++)
{row+=a[i][j];colum+=a[j][i];}
/******************found******************/
if((row!=colum)______(row!=m1))retur0;
}
/******************found******************/
return______;
}
main()
{int x[N][N],i,j;
printf("Enter number for array:\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&x[i][j]);
printf("Array:\n");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%3d",x[i][j]);
printf("\n");}
if(fun(x))printf("The Array is a magic square.\n");
else printf("The Array isn't a magic square.\n");
}
(1)0
(2)||
(3)1
[解析]
填空1:变量row存放每行的总和,变量colum存放每列的总和,应给row、colum赋初值为0,因此应该填0。
填空2:if判断每行的总和是否与列的总和相等、每行的总和与对角线的总和是否相等,两个条件若有一个不满足,即返回0,因此应该填写||。
填空3:矩阵是“幻方”函数返回1,因此应该填写1。
二、程序改错题1. 下列给定程序中,函数fun的功能是:根据整数形参m的值,计算如下公式的值。

例如,若m中的值为5,则应输出0.536389。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<stdio.h>
double fun(int m)
{double y=1.0;
int i;
/********found********/
for(i=2;i<m;i++)
/********found********/
y-=1/(i*i);
return(y);
}
main()
{int n=5;
printf("\nThe result is%lf\n",fun(n));
}
for(i=2;i<=m;i++) y-=1.0/(i*i);
[考点]本题关键字有:for循环变量取值范围;除法运算;数据类型。
[解析] (1)根据给出的计算公式可知包含的m,所以应改为for(i=2;i<=m;i++)。
(2)在除法运算中,两个整数相除的结果也是整数,因此应改为y-=1.0/(i*i)。
三、程序设计题1. 编写程序,实现矩阵(3行3列)的转置f即行列互换)。
例如,输入下面的矩阵:
100 200 300
400 500 600
700 800 900
程序输出:
100 400 700
200 500 800
300 600 900
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include<stdio.h>
void fun(int array[3][3])
{
}
main()
{
int i, j;
int array[3][3]={{100, 200, 300},
{400, 500, 600},
{700, 800, 900}};
for(i=0; i<3; i++)
{ for(j=0; j<3; j++)
printf("%7d", array[i][j]);
printf("\n");
}
fun(array);
printf("Converted array:\n");
for(i=0; i<3; i++)
{ for(j=0; j<3; j++)
printf("%7d", array[i][j]);
printf("\n");
}
}
void fun(int array[3][3])
{
int i, j, t;
for(i=0; i<3; i++) /*将右上三角和左下三角对换,实现行列互换*/
for(j=i+1; j<3; j++)
{t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
[解析] 要实现矩阵转置,即将右上角数组元素和左下角数组元素对换,本题通过数组元素交换方法,完成矩阵转置操作。
因为对矩阵转置后仍然存回其本身,所以只能循环矩阵中的一个角(本程序是右上半三角)。控制右上半三角的方法是在内层循环中循环变量j从i+1或j开始。