第一部分 历年真题及详解
2016年9月全国计算机等级考试《二级C语言程序设计》真题及详解
(考试时间120分钟 满分100分)
一、选择题(每题1分,共40分)
1下列链表中,其逻辑结构属于非线性结构的是( )。
A.二叉链表
B.循环链表
C.双向链表
D.带链的栈
【答案】A
【解析】一个非空的数据结构为线性结构需要满足两个条件:①有且只有一个根结点;②每一个结点最多有一个前件,也最多有一个后件。不是线性结构的就是非线性结构。二叉链表是二叉树的存储结构,结点中存在含有两个后继结点的结点,是非线性结构。BCD三项均满足线性结构的要求。答案选择A选项。
2下列线性链表的叙述中,正确的是( )。
A.各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致
B.各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续
C.进行插入与删除时,不需要移动表中的元素
D.以上三种说法都不对
【答案】C
【解析】AB两项错误,在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。线性链表在插入与删除过程中不发生数据元素移动的现象,只需改变有关结点的指针,选项C正确。答案选择C选项。
3某二叉树共有7个结点,其中叶子结点只有1个,则该二叉树的深度为( )。(假设根结点在第1层)
A.3
B.4
C.6
D.7
【答案】D
【解析】在任意一个二叉树中,度为0的叶子结点总比度为2的结点多一个,所以本题中度为2的结点为1-1=0个,即二叉树的每一个结点都只有一个孩子,7个结点共7层。答案选择D选项。
4软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属于系统软件的是( )。
A.编辑软件
B.操作系统
C.教务管理系统
D.浏览器
【答案】B
【解析】系统软件是控制和协调计算机及外部设备,支持应用软件开发和运行的软件,操作系统是系统软件;支撑软件是支撑各种软件的开发与维护的软件,又称为软件开发环境,浏览器属于支撑软件;应用软件是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合,编辑软件、教务管理软件属于应用软件。答案选择B选项。
5在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。
A.O(n)
B.O(n2)
C.O(log2n)
D.O(nlog2n)
【答案】C
【解析】二分查找的最坏情况是不断的二分直至无法再分时,仍然没有查找成功。对于有序的线性表,二分查找法只需比较log2n次。答案选择C选项。
6有三个关系R、S和T如下:
R
S
T
则由关系R和S得到关系T的操作是( )。
A.自然连接
B.并
C.差
D.交
【答案】C
【解析】差运算,是在关系R中删除S中存在的元组。R和S的差是由属于R但不属于S的元组组成的集合,运算符为“-”。记为T=R-S。根据本题关系R和关系S运算前后的变化,可以看出此处进行的是关系运算的差运算。答案选择C选项。
7下面描述中,不属于软件危机表现的是( )。
A.软件过程不规范
B.软件开发生产率低
C.软件质量难以控制
D.软件成本不断提高
【答案】A
【解析】软件的危机表现包括:①软件需求的增长得不到满足,用户对系统不满意的情况经常发生;②软件开发成本和进度无法控制;③软件质量难以保证;④软件不可维护或维护程度非常低;⑤软件的成本不断提高;⑥软件开发的生产效率的提高赶不上硬件的发展、生产率等问题。答案选择A选项。
8一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员与实体计算机之间的联系是( )。
A.一对一
B.一对多
C.多对多
D.多对一
【答案】C
【解析】实体集之间通过联系来建立连接关系,其中有一对一、一对多、多对多这几种联系。本题中,一个工作人员可以使用多台计算机,而一台计算机又可被多个人使用,所以是多对多的关系。答案选择C选项。
9数据库应用系统中的核心问题是( )。
A.数据库设计
B.数据库系统设计
C.数据库维护
D.数据库管理员培训
【答案】A
【解析】数据库应用系统是在数据库管理系统(DBMS)支持下建立的计算机应用系统,其核心问题是数据库设计。答案选择A选项。
10软件详细设计产生的图如下:
该图是( )。
A.N-S图
B.PAD图
C.程序流程图
D.E-R图
【答案】C
【解析】N-S图是由若干基本框图构成的流程图,其特点是没有流程线;PAD图即问题分析图,它是一种由左往右展开的二维树形结构;程序流程图用于描述问题解决的过程和步骤,其中方框表示处理步骤,菱形框表示逻辑判断,箭头表示控制流向;E-R图即实体-联系图,用来描述现实世界的概念模型,构成元素有实体、属性和联系,分别用矩形、椭圆形和菱形表示。所以答案选择C选项。
11以下叙述正确的是( )。
A.C语言程序是由过程和函数组成的
B.C语言函数可以嵌套调用,例如:fun(fun(x))
C.C语言函数不可以单独编译
D.C语言中除了main函数,其他函数不可作为单独文件形式存在
【答案】B
【解析】一个函数的返回值可以作为参数然后传给另一个函数,因此函数是可以嵌套调用的。A项错误,C语言程序只有函数构成,没有过程;C项错误,编译系统的任务在于检查语法错误,只要符合语法规则的C程序都可以通过编译,就算是单独的函数也可以;D项错误,在C语言中除main()函数以外的其他函数可以和main()函数在同一个C文件中,也可以单独处于其他的C文件,只要在使用到这些函数的main()函数的C文件中用预编译指令“#include”包含进来即可。答案选择B选项。
12阅读以下程序:
#include <stdio.h>
main()
{
int case;
float printF;
printf("请输入2个数:");
scanf("%d %f",&case,&printF);
printf("%d %f\n",case,printF);
}
该程序编译时产生错误,其出错原因是( )。
A.定义语句出错,case是关键字,不能用作用户自定义标识符
B.定义语句出错,printF不能用作用户自定义标识符
C.定义语句无错,scanf不能作为输入函数使用
D.定义语句无错,printf不能输出case的值
【答案】A
【解析】在C语言中,关键字又称保留字,它是系统预先定义的,具有特定含义的标识符,故不允许用户重新定义。case为C语言中的关键字,因此用户不能再定义标识符为case的变量。答案选择A选项。
13以下选项中不能作为C语言合法常量的是( )。
A.'cd'
B.0.1e+6
C."a"
D.'\011'
【答案】A
【解析】常量包括整型常量、实型常量、字符常量和字符串常量等。单引号表示字符常量,但不能包含字符串。表达字符串常量时需用双引号。A项,在C语言中,字符常量是用单引号括起来的一个字符,'cd'包含了2个字符;B项,0.1e+6是实型常量的指数形式,代表0.1×106;C项,"\a"是合法的字符串常量,\a是一个非打印的转义字符表示响铃;D项,'\011'是一个字符常量,\011是一个用3位八进制表示的转义字符。答案选择A选项。
14以下定义语句中正确的是( )。
A.int a=b=0;
B.char A=65+1,b='b';
C.float a=1,*b=&a,*c=&b;
D.double a=0.0;b=1.1;
【答案】B
【解析】A项错误,变量定义的时候不能用连续等号,等号在定义中是初始化的一种;C项错误,b是指针变量,*c=&b表示将一个二级指针赋值给一个一级指针,应该为*c=b或者**c=&b;D项,变量前为分号“;”表示前面的语句定义完毕,变量b的定义没有指明变量类型。答案选择B选项。
15有以下程序:
int i,n;
for(i=0; i<8; i++)
{
n=rand()%5;
switch(n)
{
case 1:
case 3:printf("%d\n",n);break;
case 2:
case 4:printf("%d\n",n);continue;
case 0:exit(0);
}
printf("%d\n",n);
}
以下关于程序执行情况的叙述中,正确的是( )。
A.for循环语句固定执行8次
B.当产生的随机数n为4时结束循环操作
C.当产生的随机数n为1和2时不做任何操作
D.当产生的随机数n为0时结束程序运行
【答案】D
【解析】当产生随机数为1或3时,会顺序执行case1或case2下面的语句,进而输出结果;当产生随机数为2或4时,会继续执行循环;当产生随机数为0时,正常结束程序的运行。for循环语句随着产生的随机数的不同,执行的次数也不相同。答案选择D选项。
16若有定义语句:int a=10;double b=3.14;,则表达式'A'+a+b值的类型是( )。
A.char
B.int
C.double
D.float
【答案】C
【解析】在多目运算符相关联的运算数中,如果类型不一致,系统将自动进行类型转换,使两边的类型达到一致后,再进行运算,转换的规则是由“低到高”。'A'是字符型,a是整型,b是double型。字符型数据占1个字节,整型占2个字节,doub1e型占8个字节,故三者相加后为double型,答案选择C选项。
17若有定义double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是( )。
A.a=a++,i++
B.i=(a+k)<=(i+k)
C.i=a%11
D.i=!a
【答案】C
【解析】C项错误,在C语言的算术运算符中,取余运算符“%”的左右两侧的两个运算分量必须是整数。A项,赋值运算符的优先级高于“,”运算法,先进行赋值;B项,将“=”右边的逻辑表达式的计算结果赋给变量i;D项,首先对变量a求逻辑非操作,然后将结果赋值给变量i。答案选择C选项。
18程序段:
int x=12;
double y=3.141593;
printf("%d%8.6f",x,y);
输出结果是( )。
A.123.141593
B.12 3.141593
C.12,3.141593
D.123.1415930
【答案】A
【解析】输出的x与y间没有空格,“%8.6f”代表总共8位宽度,包括小数点,小数点后有6位小数。答案选择A选项。
19已知字母A的ASCII码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是( )。
A.kk>='A'&&kk<='Z'
B.!(kk>='A'||kk<='Z')
C.(kk+32)>='a'&&(kk+32)<='z'
D.isalpha(kk)&&(kk<91)
【答案】B
【解析】B项,表达式等价为kk<'A'&&kk>'Z',无法判断kk中的值是否为大写字母,逻辑错误。大写字母的ASCII码值是65~90,小写字母的ASCII码值是97~122,isalpha(kk)是判断kk是否是字母的函数,是字母并且字母ASCII值小于91的一定为大写字母。答案选择B选项。
20若以下选项中的变量全部为整型变量,且已正确定义并赋值,则语法正确的switch语句是( )。
A.
switch(a+9)
{
case c1:y=a-b;
case c2:y=a+b;
}
B.
switch a*b
{
case 10:x=a+b;
default:y=a-b;
}
C.
switch(a+b)
{
case1:case2:case3:y=a+b;break;
case0:case4:y=a-b;
}
D.
switch(a*a+b*b)
{
default:break;
case 3:y=a+b;break;
case 2:y=a-b;break;
}
【答案】D
【解析】A项错误,case后面的应该为整形或字符型常量;B项错误,switch后面的表达式需要在括号内;C项错误,case和后面的常量表达式应该由空格隔开。答案选择D选项。
21下列叙述中正确的是( )。
A.可以用关系运算符比较字符串的大小
B.空字符串不占用内存,其内存空间大小是0
C.两个连续的单引号是合法的字符常量
D.两个连续的双引号是合法的字符串常量
【答案】D
【解析】A项错误,关系运算符不能比较字符串大小,可以用函数库中的字符串比较函数来比较字符串的大小;B项错误,空字符串占用一个字节的内存;C项错误,字符常量是用单引号把一个字符括起来;D项正确,两个连续的双引号是一个字符串常量,称为空串。答案选择D选项。
22有以下程序:
#include<stdio.h>
main()
{
int i,j,k,a=5,b=6;
i=(a==b)?++a:--b;
j=a++;
k=b;
printf("%d,%d,%d\n",i,j,k);
}
程序的运行结果是( )。
A.7,6,5
B.5,5,5
C.7,5,5
D.5,6,5
【答案】B
【解析】条件表达式i=(a==b)?++a:--b;中先执行a==b,值为假,根据三元运算符语法规则,执行--b,此时b为5,赋给i,i=5。j=a++,将a=5先赋给j,再进行a++,j=5,a=6,k=b=5,故最后输出的是5,5,5。答案选择B选项。
23设有如下程序段:
char s[20]="Beijing",*p;
p=s;
则执行p=s;语句后,以下叙述正确的是( )。
A.可以用*p表示s[0]
B.s数组中元素的个数和p所指字符串长度相等
C.s和p都是指针变量
D.数组s中的内容和指针变量p中的内容相等
【答案】A
【解析】A项正确,p=s;后,指针p指向s的首地址,*p=s[0]。B项错误,p指针所指向的字符串为"Beijing",其长度为7,而数组a中元素的个数为20;C项错误,s为字符数组名;D项错误,数组s中有20个元素,其中s[7]~s[19]都为0,而p中只有7个元素;答案选择A选项。
24有以下程序:
#include <stdio.h>
void f(int *p,int *q);
main()
{
int m=1,n=2,*r=&m;
f(r,&n);
printf("%d,%d",m,n);
}
void f(int *p,int *q)
{
p=p+1;
*q=*q+1;
}
程序运行后的输出结果是( )。
A.1,3
B.2,3
C.1,4
D.1,2
【答案】A
【解析】语句p=p+1;只改变指针p的地址,与p的内容无关,所以m值没有改变,而语句*q=*q+1;是改变该指针所指地址中的内容,所以n变为3,m不变,仍为1,答案选择A选项。
25以下关于return语句的叙述中正确的是( )。
A.一个自定义函数中必须有一条return语句
B.一个自定义函数中可以根据不同情况设置多条return语句
C.定义成void类型的函数中可以有带返回值的return语句
D.没有return语句的自定义函数在执行结束时不能返回到调用处
【答案】B
【解析】B项,一个自定义函数可以根据不同的情况设置多条return语句,但注意函数的返回值必须只有一个;A项,一个自定义函数中可以没有返回值,只要定义为void型即可;C项,定义成void类型的函数没有返回值,所以其中不可以有return语句;D项,程序执行结束后无论是否有return语句都自动返回到调用处。答案选择B选项。
26有以下程序:
#include<stdio.h>
main()
{
int x=1,y=0;
if(!x)y++;
else if(x==0)
if(x)y+=2;
else y+=3;
printf("%d\n",y);
}
程序运行后的输出结果是( )。
A.3
B.2
C.1
D.0
【答案】D
【解析】else子句总是与前面最近的不带else的if相结合,与书写格式无关。本题中的层次关系是:if(!x)与else if(x==0)是一组,位于条件判断的最外层。而if(x)与else是一组,位于else if(x==0)条件的内层。由此可知条件均不成立,所以y未进行任何操作,仍为0。答案选择D选项。
27设有如下定义语句:
int m[ ]={2,4,6,8},*k=m;
以下选项中,表达式的值为6的是( )。
A.*(k+2)
B.k+2
C.*k+2
D.*k+=2
【答案】A
【解析】本题中k指向数组m的首地址。*(k+2)先将指针后移两个元素,即为m[2]的地址,然后取出m[2]的值6。B项,k+2是m[2]的地址;C项,*k表示m[0]的值,然后再加上2,所以为4;D项,表示给m[0]的值加2,也为4。答案选择A选项。
28若有定义语句
int year=2009,*p=&year;
以下不能使变量year中的值增至2010的语句是( )。
A.*p+=1;
B.(*p)++;
C.++(*P);
D.* p++;
【答案】D
【解析】A项,p所指内容执行增1操作;B项,先取P指针所指的内容,再执行后++运算;C项,先取P指针所指内容,再执行前++运算;D项,实际上是p指针执行++操作,而后取值。答案选择D选项。
29有以下程序
#include<stdio.h>
void f(int *p);
main()
{
int a[5]={1,2,3,4,5},*r=a;
f(r);
printf("%d\n",*r);
}
void f(int *p)
{
p=p+3;
printf("%d,",*p);
}
程序运行后的输出结果是( )。
A.1,4
B.4,4
C.3,1
D.4,1
【答案】D
【解析】在调用f函数时,形参p通过传递参数指向了数组a的起始地址,执行语句“p=p+3;”后指向了a[3]的地址,所以输出4;主函数中,指针r仍指向数组a的首地址,所以输出1。答案选择D选项。
30有以下程序:
#include<stdio.h>
main()
{
int m=1,n=2,*p=&m,*q=&n,*r;
r=p;
p=q;
q=r;
printf("%d,%d,%d,%d\n",m,n,*p,*q);
}
程序运行后的输出结果是( )。
A.1,2,1,2
B.1,2,2,1
C.2,1,2,1
D.2,1,1,2
【答案】B
【解析】本题首先让指针变量p和q分别指向m和n的地址空间,然后将p赋值给r,让r指向m,q赋值给p,让p指向n,再将r赋值给q,让q指向m,因此最后p指向n,q指向m。答案选择B选项。
31以下叙述中错误的是( )。
A.同一个数组中所有元素的类型相同
B.不可以跳过前面的数组元素,给后面的元素赋初值0
C.定义语句:int a[10]={0};,给a数组中所有元素赋初值0
D.若有定义语句:int a[4]={1,2,3,4,5};,编译时将忽略多余的初值
【答案】D
【解析】数组初始化时,若赋初值的个数多于所定义数组的元素个数时,编译器会报错。答案选择D选项。
32有以下函数:
#include <stdio.h>
void func(int n)
{
int i;
for(i=0;i<=n;i++)printf("*");
printf("#");
}
main()
{
func(3);
printf("????");
func(4);
printf("\n");
}
程序运行后的输出结果是( )。
A.****#????***#
B.***#????*****#
C.**#????*****#
D.****#????*****#
【答案】D
【解析】从main函数开始,执行func(3)函数,for循环执行4次,连续输出四个“*”,然后输出一个“#”;输出“????”;再次调用func(4),for循环执行5次,连续输出五个“*”,然后输出一个“#”;最后输出换行符。答案选择D选项。
33有以下程序:
#include <stdio.h>
struct ord
{int x,y;}dt[2]={1,2,3,4};
main()
{
struct ord *p=dt;
printf("%d,",++p->x);
printf("%d",++p->y);
}
程序运行后的输出结果是( )。
A.1,2
B.2,3
C.3,4
D.4,1
【答案】B
【解析】dt是一个结构体数组,所以初始化的结果为dt[0]={1,2},dt[1]={3,4}。*p=dt;表示p指向dt[0]。++p->x中,->的优先级大于++,所以表达式等价于++(p->x),因为p->x为1,所以输出这个值为2,同理,第二个++p->y的值为2+1=3。答案选择B选项。
34设有定义:
struct complex
{int real,unreal;}data1={1,8},data2;
则以下赋值语句中错误的是( )。
A.data2=data1;
B.data2=(2,6);
C.data2.real=data1.real;
D.data2.real=data1.unreal;
【答案】B
【解析】B项,对结构体进行初始化时,应该用花括号括起来的一组值,而不是用小括号,而且需要强制转换数据类型,应该为data2=(struct complex){2,6};。答案选择B选项。
35有以下程序:
#include <stdio.h>
#define PT 3.5
#define S(x) PT*x*x
main()
{
int a=1,b=2;
printf("%4.1f\n",S(a+b));
}
程序运行后的输出结果是( )。
A. 14.0
B. 31.5
C. 7.5
D.程序有错无输出结果
【答案】C
【解析】宏定义分为两种:①无参数的宏定义,即#define PT 3.5;②带参数的宏定义,即#define S(x) PT*x*x。S(a+b)的运算过程即3.5*1+2*1+2,最后结果为 7.5,注意,7前面有一个空格字符。%4.1f要求输出的浮点数的宽度为4(包括小数点),且小数点后保留一位小数。若数字宽度不够则添加空格。答案选择C选项。
36设有定义语句
int(*f)(int);
则以下叙述中正确的( )。
A.f是基类型为int的指针变量
B.f是指向函数的指针变量,该函数具有一个int类型的形参
C.f是指向int类型一维数组的指针变量
D.f是函数名,该函数的返回值是基类型为int类型的地址
【答案】B
【解析】在C语言中函数名代表该函数的入口地址,因此可以定义一种指向函数的指针来存放这类地址,int(*f)(int);,其中f为指向函数的指针变量,指向有一个整型变量且返回值也为整型的函数,第一个int为函数返回值的类型,第二个int为函数的形参类型。答案选择B选项。
37有以下程序:
#include<stdio.h>
void fun(int n)
{
static int num=1;
num=num+n;
printf("%d",num);
}
main()
{
fun(3);
fun(4);
printf("\n");
}
程序运行后的输出结果是( )。
A.48
B.34
C.35
D.45
【答案】A
【解析】静态变量在第2次调用fun函数时不会被重新初始化,在整个程序运行结束时才会被释放。第一次调用后num的值为1+3=4,第二次调用时,num=num+4=4+4=8。答案选择A选项。
38以下选项中叙述错误的是( )。
A.C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值
B.在C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内
C.C程序函数中定义的自动变量,系统不自动赋确定的初值
D.C程序函数的形参不可以说明为static型变量
【答案】A
【解析】函数内定义的静态变量,在整个程序运行期间,占据静态存储区的永久性存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。对未赋初值的静态局部变量,C编译程序自动给它赋初值0。因此,在函数中定义的静态变量,只在第1次调用赋值,以后调用保留上次的值。答案选择A选项。
39有以下程序:
#include<stdio.h>
main()
{
short c=124;
c=c______;
printf("%d\n",c);
}
若要使程序的运行结果为248,应在下画线处填入的是( )。
A.>>2
B.|248
C.&0248
D.<<1
【答案】D
【解析】要输入248,是124的两倍,124为01111100,248为11111000,因此只要左移一位即可。答案选择D选项。
40假定已建立以下数据链表结构,且指针p和q已指向如下图所示的结点:
则以下选项中可将q所指结点从链表中删除并释放该结点的语句是( )。
A.(*)p.next=(*q).next;free(p);
B.b=q->next;free(q);
C.p=q;free(q);
D.p->next=q->next;free(q);
【答案】D
【解析】要删除结点q,首先要将q的上一个结点P的指针域指向q的指针域所指向的结点,防止删除q结点后丢失q结点后的链表,即p->next=q->next,然后释放结点q,free(q);。答案选择D选项。
二、程序填空题(共18分)
给定程序中,函数fun的功能是:将形参s所指字符串中所有ASCII码值小于97的字符存入形参t所指字符数组中,形成一个新串,并统计出符合条件的字符个数作为函数值返回。
例如,形参s所指字符串为:Abc@1x56*,程序执行后t所指字符数组中的字符串应为:A@156*。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
【试题源程序】
#include<stdio.h>
int fun(char *s,char *t)
{
int n=0;
while(*s)
{
if(*s<97)
{
*(t+n)=①______;
n++;
}
②______;
}
*(t+n)=0;
return ③______;
}
void main()
{
char s[81],t[81];
int n;
printf("\nEnter a string:\n");
gets(s);
n=fun(s,t);
printf("\nThere are %d letter which ASCII code is less than 97:%s\n",n,t);
}
答:
①* s
②s++
③n
【解析】
填空1:while循环的功能是将s所指字符串中ASCAII码值小于97的字符存入t所指字符串中,显然此处应该填s所指字符串中的内容,即*s。
填空2:从前一语句中可以想到,当把s所指字符串中的字符赋给t所指字符串后,应该修改指针,使指针s指向下一个字符。所以这里应该填s++。
填空3:根据题意,需要返回符合要求的字符个数。从程序中可以看出,变量n一直在记录符合条件的字符个数,所以这里应填n。
三、程序修改题(共18分)
下列给定程序中,函数fun()的功能是:计算n的5次方的值(规定n的值大于2且小于8),通过形参指针传回主函数:并计算该值的个位、十位、百位上数字之和作为函数值返回。例如:7的5次方是16807,其低3位数的和是15。
请改正程序指定部位的错误,使它能得到正确结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
【试题源程序】
#include<stdio.h>
#include<math.h>
int fun(int n,int *value)
{
int d,s,i;
/**************found************/
d=0;
s=0;
for(i=1;i<=5;i++)d=d*n;
*value=d;
for(i=1;i<=3;i++)
{
s=s+d%10;
/**************found************/
d=d\10;
}
return s;
}
main()
{
int n,sum,v;
do
{
printf("\nEnter n(2<n<8):\n");
scanf("%d",&n);
}while(n<=2||n>=8);
sum=fun(n,&v);
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}
答:
(1)错误:d=0;
正确:d=1;
(2)错误:d=d\10;
正确:d=d/10;
【解析】函数的思路是:先定义两个型变量d和s,分别用于累乘和累加;第一个for循环用于实现求n的5次方,用指针返回结果;第2个for循环计算个位、十位和百位数字之和,用return语句返回结果。实现fun()函数的功能的关键在于累乘和累加初值的设定及算法的实现。
错误1:变量d用于保存已经累乘的数并用于下次累乘,初值不能为0。所以d=0;应改为d=1;。
错误2:C语言中整除的符号是“/”,不是“\”。
四、程序设计题(共24分)
请编写函数fun(),该函数的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。例如,若输入:abc4EFg,则输出为:aBc4EFg。
注意:部分源程序给出如下。
请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
【试题源程序】
#include <stdio.h>
#include <string.h>
void fun(char *ss)
{
}
main()
{
char tt[51];
printf("\nPlease enter an character string within 50 characters:\n");
gets(tt);
printf("\n\nAfter changing, the string\n \"%s\"",tt);
fun(tt) ;
printf("\nbecomes\n \"%s\"",tt);
}
答:
void fun(char *ss)
{
int i;
for(i=0;ss[i]!='\0';i++)
if(i%2==1&&ss[i]>='a'&&ss[i]<='z')
ss[i]=ss[i]-32;
}
【解析】本题的设计思路是:①利用循环遍历字符串;②利用if语句判断字符是否为小写字母且其下标为奇数,如果是则把字符减32转换成对应的大写字母。