1、国家二级 C语言机试(操作题)模拟试卷 68及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是:有 NN矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为 0。 例如,若 N=3,有下列矩阵: 1 2 3 4 5 6 7 8 9 计算结果为 1 0 0 6 5 0 10 14 9 请在程序的下划线处填入正确的内容并把下划线删除,使程 序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! #include #define N 4 /*found*/ void fun(int(*t)
2、_1_ ) int i, j ; for(i=1; i #include #include /*found*/ #define FU(m, n) (m/n) float fun(float a, float b, float c) float value; value=FU(a+b, a b)+FU(c+b, C b); /*found*/ Return(Value); main() float x, y, z, sum; printf(“Input x y z: “); scanf(“ f f f“, &x, &y, &z); printf(“x= f, y= f, z= fn“, x, y
3、, z); if(x=y| y=z)printf(“Data error!n“); exit(0); sum=fun(x, y, z); printf(“The result is: 5 2fn“, sum); 三、程序设计题 3 规定输入的字符串只包含字母和 *号。请编写函数 fun,它的功能是:将字符串中的前导 *号全部删除,中间和尾部的 *号不删除。 例如,字符串中的内容为: *A*BC*DEF*G*,删除后,字符串中的内容应当是: A*BC*DEF*G*。在编写函数时,不得使用 C语言提供的字符串函数。 注意:部分源程序在文件 PROG1 C中。 请勿改动主函数 main和其他函数中的
4、任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include void fun(char*a) main() char S81; void NONO(); printf(“Enter a string: n“); gets(s); fun(s); printf(“The siririg after deleted: n“); puts(s); NONO(); void NONO() /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE * in, *out; int i; char s81; in=fopen(“in dat“, “r“); out=
5、fopen(“out dat“, “w“); for(i=0 ; i10; i+) fscanf(in, “ s“, s); fun(s); fprintf(0ut, “ sn“, s) ; fclose(in); fclose(out); 国家二级 C语言机试(操作题)模拟试卷 68答案与解析 一、程序填空题 1 【正确答案】 (1)N (2)tij (3)tji 【试题解析】 第一空:在主函数中 fun函数的调用形式是 “fun(t); ”, t是数组名,故 fun函数的参数是指针,因此第一空处应为 “N”。 第二空: “_1 _=tij+tii; ”是将对称元素相加存放在左下三角元素中,
6、左下三角元素可表示为 tij,故第二二空处应 为 “tii”。 第三空: “_3 _=0; ”是将右上三角元素置 0,右上三角元素可表示为tDi,故第三空为 “tji” 二、程序修改题 2 【正确答案】 (1)#define FU(m, n) (m)/(n) (2)return (value); 【试题解析】 (1)函数 fun两次调用宏 FU来计算 “value=FIJ(a+b, a-b)+FU(c+b,c-b); ”。检查宏的定义是否正确,可以用实参代入宏进行展开:(a+b/a-b),由此看到, FU(a+b,a-b)进行的计算不是 (a+b)/(a-b),而是 (a+b/a-b),因为
7、“/”的优先级高于 “+”或 “-”,所以要使用括号限定计算优先顺序。所以将 “#define FU(m,n)(rn/n)”改为 “#define FU(m,n)(m)/(n)”。 (2)第二个标识下返回语句的关键字有误。所以,第二个标识下 “Return(value); ”应该改为 “retum(value); ”, C语言中没有 “Retum”这个关键字。 三、程序设计题 3 【正确答案】 int j=0; char *p=a; while(*p=*)p+; while(*p) aj+=*p; p+; aj=0; 【试题解析】 (1)首先,使用一个指针 p指向串的起始位置,然后对指针 p指向的字符进行判断,并且如果是 “*”,那么跳过该字符,这样确定了由头开始的第一个非 “*”的位置。 (2)然后,在循环过程中将第一个非 “*”字符起始到串尾的字符拷贝到字符串 a。 (3)最后,在新生成的字符串尾加 0。