2022-2023学年湖北省黄冈市全国计算机等级考试C语言程序设计预测试题(含答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2022-2023学年湖北省黄冈市全国计算机等级考试C语言程序设计预测试题(含答案) 学校:________ 班级:________ 姓名:________ 考号:________
一、单选题(12题)
1. 有以下程序
#include <stdio.h>
void fun(char *t,char *s)
{ while(*t!=0) t++;
while((*t++=*s++)!=0);
}
main()
{ char ss[10]="acc",aa[10]="bbxxyy";
fun(ss,aa); printf("%s,%s\n",ss,aa);
}
程序的运行结果是
A.accxyy,bbxxyy
B.acc,bbxxyy
C.accxxyy,bbxxyy
D.accbbxxyy,bbxxyy
2.
3. 下列程序段的输出结果是( )。
char a=9,b=020;prihtf("%o\n",~a&b<<1);
A.100000
B.8
C.40
D.77
4.sizeof(float)是()。
A.一个双精度型表达式
B.一个整型表达式
C.一种函数调用
D.一个不合法的表达式
5.设串s1='ABCDEFG',s2='PQRST',函数StrCat(x,y)返回x和y串的连接串,StrSub(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,StrLen(s)返回串s长度,则StrCat(StrSub(s1,2,StrLen(s2)),StrSub(s1,StrLen(s2),2))的结果串()。
A.BCDEF
B.BCDEFG
C.BCPQRST
D.BCDEFEF
6.执行下列程序后,输出的结果是( )。
#include<stdio.h>
#define S(X) X*X
void main
{ int a=9,k=3,m=2;
a/=S(k+m)/S(k+m):
printf("%d",a);
}
A.1
B.4
C.9
D.0
7. 若有说明int a[][3]={1,2,3,4,5,6,7,8,9},则a数组第一维的大小是( )。
A.2
B.3
C.4
D.无确定值
8.程序运行后的输出结果是( )。
A.3
B.4
C.5
D.6
9.以下选项中关于C语言常量的叙述错误的是()。
A.所谓常量,是指在程序运行过程中,其值不能被改变的量
B.常量分为整型常量、实型常量、字符常量和字符串常量
C.常量可分为数值型常量和非数值常量
D.经常被使用的变量可以定义成常量
10. 若二维数组a有m列,则在a[i][j]刚前的元素个数为( )。
A.i*m+j-1
B.i*m+j
C.j*m+i
D.i*m+j+1
11.设有如下定义和语句:
FILE *fp;
int data[10],i,n;
fp=fopen(“abc. txt”, “r”);
文本文件abc. txt中的数据为5 81 92 76 51 90,其中第1个数据代表的是它后面数据的个数。
若文件已正确打开,则以下程序段中能将文件的最后5个数据依次正确读入数组data[0]~data[4]中的是()。
A.fscanf(fp, “%d”,&n);
for(i=0;i<n;i++)
fscanf(fp, “%d”, &data[i]);
B.i=0;
while( ! feof(fp))
{fscanf(fp, “%d”, &data[i]);
i++;
}
C.for(i=0;! feof(fp);i++)
fscanf( fp, “%d”, &data[i]);
D.i=0;
fscanf( fp, “%d”, &n);
i ++ ;
while( ! feof(fp))
{
fscanf( fp, “%d”, &data[i]);
i ++ ;
}
12.有以下程序:
main
{int a=0,b=0;
a=10;/*给a赋值
b=20;给b赋值*/
printf(“a+b=%d\n”,a+b);/*输出计算机结果*/
}
程序运行后的输出结果是( )。
A.a+b=10
B.a+b=30
C.30
D.出错
二、2.填空题(12题)
13. 下列程序段的运行结果是______。
int x=0,y=0;
while(x<15) y++,x+=++y;
pfintf("%d,%d",y,x);
14. 在数据库系统中,实现各种数据管理功能的核心软件称为【】。
15. 数据结构分为逻辑结构与存储结构,线性链表属于【】。
16. 以下程序运行后的输出结果是______。
int a=5;
fun (int B)
{ static int a=10;
a+=b++;
printf("%d",A) ;
}
main()
{ int c=20;
fun(C) ,
a+=C++;
printf("%d\n",A) ;
}
17. "printf("%d\n",strlen("\t\"'\023\xABC\n"));"语句的输出结果是______。
18. 以下函数fun用于求两个整数a和b的最大公约数。
fun(a,B)
int a,b;
{int i,j,m,n;
if(a>B)
{m=a;a=b;【】;}
i=a;j=b;
while((n= 【】)!=0)
{j=i;i= 【】;}
return(i);
}
19. 下列语句的输出结果是______。
char s[20]= "aaaa",*sp=s;
puts(strcat(sp,"AAAAA"));
20. 有以下程序:
#include <stdio.h>
main()
{ int t=1,i=5;
for(;i>=0;i--) t*=i;
printf("%d\n",t);
}
执行后的输出结果是【】。
21.下列程序的输出结果是______。
long fun5(int n)
{ long s;
if((n==1)‖(n==2))
s=2;
else
s=n+fun5(n-1);
return(s);
}
main()
{ long x;
x=fun5(4);
printf("%1d\n",x);}
22. 设一棵完全二叉树共有500个结点,则在该二叉树中有【】个叶子结点。
23. 若有定义doublea [5];,则a数组元素下标的上限为______。
24. 若有如下程序:
main()
{int x=5,y,*t;t=&x;
y=++(* t);
printf("%d,%d",x,y);}
则程序执行后的x值为【】,y的值为【】。
三、3.程序设计题(10题)
25. 假定输入的字符串中只包含字母和*号。
请编写函数fun(),它的功能是:将字符串中的前导*号全部删除,中间和后面的*号不删除。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G*******。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。
试题程序;
#include <stdio. h>
#include <conio. h>
void fun (char *a)
{
}
main()
{
char s[81];
printf("Enter a string :\n");
gets (s);
fun (s);
printf ("The string after deleted: \n");
puts (s);
}
26. 请编写函数fun(),其功能是;计算井输出下列多项式值。
S=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/2n)
例如,若主函数从键盘给n输入8后,则输出为S-0.662872。
注意;部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。
试题程序;
# include<stdio. h>
double fun(int n)
{
}
main ()
{
int n;
double s;
printf("\nInput n: ");
scanf ("%d", &n);
s=fun (n);
printf ("\ns=%f\n ", s);
}
27. 请编写函数fun(),其功能是:将s所指字符串中除了下标为奇数、同时ASCII值为偶数的字符外,其余的全部删除,串中剩余字符所形成的一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为edB2A4Dsdg,其中字符A的ASCII 码值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为偶数,因此也应当删除:而字符2的ASCII码值为偶数,所在数组中的下标为奇数,因此不应当删除,其他依此类推。
最后t所指的数组中的内容应是d24。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <conio.h>
#include <stdio.h>
#include<string, h>
void fun(char*s, char t[])
{
}
main()
{
char s[100] ,t[100];
clrscr();
printf("\nPlease enter string S: ");
scanf("%s",s);
fun(s,t);
printf("\nThe result is: %s\n",t);
}
28. 请编写函数fun(),该函数的功能是:移动字符串中的内容,移动的规则是把第1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。
例如,字符串中原有的内容为ABCDEFGHIJK,m的值为3,移动后,字符串中的内容应该是DEFGHIJKABC。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <stdio. h>
#include <string.h>
#define N 80
void fun (char *w, int m)
{
}
main ( )
{
char a[N]= "ABCDEFGHIJK";
int m;
printf ("The origina string : \n");
puts (a);
printf("\n\nEnter m: ");
scanf ("%d", &m);
fun (a, m);
printf (" \nThe string after moving : \n");
puts (a);
printf ("\n\n");
}
29. 下列程序定义了N×N的二维数组,并在主函数中自动赋值;请编写函数fun(int a[][N]),该函数的功能是:使数组左下半三角元素中的值全部置成0。
例如a数组中的值为
a=1 9 7
2 3 8
4 5 6
则返回主程序后a数组中的值应为
0 9 7
0 0 8
0 0 0
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define N 5
int fun (int a[] [N])
{
}
main()
{
int a[N] [N],i,j;
clrscr();
printf("*****The array*****\n");
for(i=0;i<N;i++)
/*产生—个随机的5*5矩阵*/
{ for(j=0;j<N;j++)
{a[i][j]=rand()%10;
printf("%4d", a[i][j]);
}
printf("\n");
}
fun (a);
printf("THE RESULT\n");
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
printf("%4d",a[i][j));
printf("\n");
}
}
30. 程序定义了NxN的二维数组,并在主函数中赋值。
请编写函数fun,函数的功能是:求出数组周边元素的平均值并作为函数值返给主函数中
的s。
例如:a数组中的值为:
则返回主程序后s的值应为:3.375。
注意:部分源程序存在文件PROGl.C文件中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
31. 请编写函数fun(),该函数的功能是:将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在
形参n所指的存储单元中。
例如,若二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应该是33 33 33 33 44 44 44 AA,55 55 55 55
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <stdio. h>
void fun (int (*s)[10], int *b, int *n,
int mm, int nn)
{
}
main ( )
{
int w[10] [10]={{33,33,33,33},{44,44,
44,44},{55,55,55,55}}, i, j;
int a[100]={0},n=0 ;
printf ("The matrix: \n" );
for (i=0; i<3; i++)
{for (j+0; j<4; j++)
printf ("%3d",w[i] [j] );
printf ("\n");
}
fun (w,a, &n, 3, 4);
printf ("The A array: In");
for(i=0; i<n; i++)
printf ("%3d", a [i] );
printf ("\n\n");
}
32. 请编写函数fun(),该函数的功能是:计算并输出
S=1+(1+20.5)+(1+20.5+30.5)+…+(1+20.5+30.5+…+n0.5)
例如,若主函数从键盘给n输入20后,则输出为
s=534.188884。
注意;部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。
试题程序:
#include <math. h>
#include <stdio. h>
double fun(int n)
{
}
main()
{
int n;
double s;
printf("\n\nInput n: ");
scanf ("%d", &n);
s=fun (n)
printf ("\n\ns=%f\n\n", s);
}
33. 编写函数fun(),它的功能是;根据以下公式求p的值,结果由函数值带回。
m与n为两个正数且要求m>n。
P=m!/n!(m-n)!),例如:m=12,n=8时,运行结果为495.000000。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括
号中填入所编写的若干语句。
试题程序:
#include <conio.h>
#include <stdio.h>
float fun (int m, int n)
{
}
main()
{
clrscr() ;
printf ("p=%f\n", fun (12,8) ) ;
}
34. 下列程序定义了N×N的二维数组,并在主函数中自动赋值。
请编写函数fun(int a[][N],int n),该函数的功能是:使数字右上半三角元素中的值乘以m。
例如,若m的值为2,a数组中的值为
a=1 9
2 7
则返回主程序后a数组的值应为
2 18
2 14
注意:部分源程序给出如下.
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define N 5
int fun(int a[] [N], int m)
{
}
main()
{
int a[N] [N],m, i, j;
clrscr ();
printf {"*****The array*****\n");
for (i=O; i<N; i++)
/*输出一个随机的5×5矩阵*/
{ for(j=0; j<N; j++)
{a[i] [j]=rand()%20;
printf("%4d", a[i] [j]);
}
printf ("\n");
}
do
m=rand () %10;
while (m>=3); /*产生一个上于3的随机数*/ printf ("m=%4d\n", m);
fun (a,m);
printf ("THE RESULT\n");
for (i=0; i<N; i++)
{for(j=0;j<N;j++)
printf ("%4d",a[i] [j]);
printf ("\n");
}
}
四、单选题(0题)
35.有下列程序:
main
{ char s[]="abcde";
s+=2:
printf("%d\n",s[0]);
}
执行后的结果是( )。
A.输出字符a的ASCII码
B.输出字符c的ASCII码
C.输出字符c
D.程序出错
五、单选题(0题)
36.最坏情况下时间复杂度不是n(n-1)/2的排序算法是()
A.快速排序
B.冒泡排序
C.直接插入排序
D.堆排序
六、单选题(0题)
37.有以下程序:
#include<stdio.h>
main()
{int i,j,m=1;
for(i=1;i<3;i++)
{for(j=3;j>0;j--)
{if(i*j>3)break;
m*=i+j;
}
}
printf("m=%d\n",m);
}
程序运行后的输出结果是()。
A.m=6 B.m=2 C.m=4 D.m=3
参考答案
1.D解析:本题中fun函数实现了字符串函数strcat的功能,将字符串aa 连接到字符串ss的末尾。
调用fun函数时,形参t和s分别指向了字符串ss和aa,然后通过一个while循环使t指向字符串ss的结束符的位置,第二个while循环将字符串aa中的字符(包括结束符'\\0')逐个复制到字符串ss的末尾处。
2.B
3.C解析:将变量a按位求反,再与b按位与,最后左移1位。
9的二进制表示为00001001,020的二进制表示为00010000。
a按位求反为11110110,再与b按位与结果为00010000,左移1位结果为00100000。
按八进制输出为040。
4.B
该函数用于数据类型和变量。
注意: sizeof操作符不能用于函数、不完全类型或位字段。
不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、void类型等。
5.D
6.D
本题主要考查带参数的宏定义,过程如下:由于定义为define(x) x*x 没有括号优先级,所以:a= a/(S(k+m)/S(k+m))=a/(k+m*k+m/
k+m*k+m) =9/(3+2*3+2/3+2*3+2)=0。
7.B解析:本题考查二维数组第一维的大小如何确定。
二维数组第一维的大小由下列规则确定:①当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小:②当初值的个数不能被第二维的常量表达式的值除尽时,第一维的大小等于所得商数加1。
8.B
[解析] &按位与,如果两个相应的二进制位都为1.则该位的结果值为1.否则为0.按位或两个相应的二进制位中只要有一个为1.该位的结果值为1.2的二进制为0000010.4的二进制为000000所以做或运算结果为0000110.该数与5即00000101做与操作结果为0000100.即4.
9.D
此题考查的是常量和变量的定义,常量不是经常使用的变量,而是一个确定的数值,所以答案选择D。
10.B解析:二维数组的元素可以看成是按矩阵形式存放的,总是先存放第一行的元素,再存放第二行的元素。
数组第一维的下标是i,说明它前面还有i行,有i*m个元素,数组第二维的下标是j,说明它前面还有j列,有j个元素,所以共有i*m+j个元素。
11.A由题意可知,文件abc.txt中存放了6个整数。
其中第1个表示后续数据的个数。
要将最后5个数据读入数组data中,需要读取数据的个数为5,所以首先调用fscanf函数,将5读入整型变量n中;接着通过
for循环,i分别取值0~n-1,调用fscanf函数将n个整数读入data[0]~data[n-1]中。
故本题答案为A选项。
12.A
C 语言规定,注释语句可以换行写,并且一个“ /* ” 和其后紧跟的第一个“ */ ” 中间的部分是注释内容,并且注释部分的内容不参与程序的执行,因此本题中没有执行“ b=20 ” ;这条语句。
13.8208,20 解析:本题考查while循环和++运算符的运用。
x=0符合条件x<15,则执行y++,x+=++y后,y=1,x=0+2=2后y=2,符合条件继续循环,y=3,x=x+4=6后y=4,再循环y=5,x=x+6=6+6=12后,y=6,继续循环y=7,x=x+8=12+8=20,此时y=8。
14.数据库管理系统或DBMS数据库管理系统或DBMS 解析:数据库管理系统(Database Management System,DBMS)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。
它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。
它提供多种功能,可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。
因此,数据库系统中,数据库管理系统是实现各种数据管理功能的核心软件。
本题的答案是数据库管理系统或DBMS。
15.存储结构
16.30 2530 25 解析:本题考核的知识点是变量的存储属性和算术运算的应用。
本题涉及了自动变量、静态变量和外部变量。
外部变量是定义在
所有函数之外的变量,本题中int a=5定义了一个外部变量a,它是一个全局变量,即作用域是从定义的位置开始到本文件的结束;静态变量的存储空间在程序的整个运行期间是固定的(static),本题函数fun()中static int a=10定义个一个静态变量a,此静态变量a是个静态的局部变量,即它的值只能在本函数中使用;自动变量是C程序中使用最多的一种变量,它的建立和撤消都是由系统在程序执行过程中自动进行的,auto是自动变量的存储类别标识符,如果省略auto,系统隐含认为此变量为auto,本题中main()中int c=20定义了一个自动变量c,此自动变量c是个静态的局部变量.算术运算中a+=b++相当于a=a+b,b=b+1.所以,在第一个ptine('%d',a)中a=a+b=10+20=30,第二个printf('%d',
a)中a=a+c=5+20=25,即输出30 25。
17.66 解析:strlen()函数的作用是计算字符串的长度并作为函数的返回值,这里的长度不包括串尾的结束标志\'\\0\'。
\'\\t\'是转义字符,代表横向跳若干格:\'\\\''是转义字符,代表双引号:\'\\023\'只代表一个字符,而不管转义字符后面有几个字符;\'\\xAB\'是以两位十六进制数AB表示的ASCII码字符,只代表一个字符;\'\\n\'是转义字符,代表回车换行。
5个字符常量各代表一个字符,再加上字母C,所以返回的长度是6。
18.b=m j%i.nb=m\r\nj%i.\r\nn 解析:函数中的变量i和j分别存放两个形参的最小数和最大数,在语句i=a和j=b执行之前,要将a和b分别变为最小数和最大数,当a>b时,程序使用中间变量将两者交换,所以题中第—个空中应当填写“b=m”;为求两个整数的最大公约数,程
序的where循环条件必须为j整除i成立,所以题中第二个空中应当填写“j%i”;程序要通过i的值返回最大公约数,因此在循环中要将每次整除的公钓数赋给i,以保证最后返回的是两个,整数的最大公约数,所以第三个空中应当填写“n”。
19.aaaaAAAAAaaaaAAAAA 解析:函数strcat(sp,'AAAAA')的作用是将字符中“AAAAA”连接到字符串sp的末尾,并自动覆盖字符数组sp末尾的\'\\0\'。
20.00 解析:本题是计算5*4*3*2*1*0的值,结果为0。
21.
考查if else语句,n=4不满足条件,所以fun5(4)=4+fun5(3),n==3也不满足条件,fun5(3)=3+ fun5(2),n==2满足条件fun5(2)=2,故
x=4+3+2=9。
\r\n
\r\n
22.250250 解析:所谓完全二叉树是指除最后一层外,每—层上的结点数均达到最大值;在最后—层上只缺少右边的若干结点。
具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。
本题n=500,故父结点数等于int(500/2)=250,叶子结点数等于500-25=250。
23.44 解析:一维数组元素的定义形式为:数组名[N],则该数组中元素的下限是0,上限是N-1。
24.6 6
25.void fun (char *a) { char*p=a;while(*P==‘+’) p++; /*指针p指向字符串第一个字母*/ for(;*p!=‘\0’;p++a++) *a=*p;/*从第—个字母开始其
后的字符都放入指针a所指的字符串中*/ *a=‘\0’;/*在字符串最后加上
结束标记符*/ }void fun (char *a)\r\n {\r\n char*p=a;\r\n while(*P==‘+’) p++; /*指针p指向字符串第一个字母*/\r\n for(;*p!=‘\\0’;p++,a++)\r\n
*a=*p;/*从第—个字母开始,其后的字符都放入指针a所指的字符串
中*/\r\n *a=‘\\0’;/*在字符串最后加上结束标记符*/\r\n } 解析:在前面
的改错题和编程题中,相关试题已经出现好多次了,我们在此提供另一
种解答方法。
#include<string.h>
void fun (char *a)
{char *p=a;
while (*p==‘*’)p++;
strcpy (a,p);
}
26.double fun(int n) { int i; double s=0.0; for (i=1; i<=n; i++) s=s+(1.0/(2*i-
1)-1.0/(2*i)); /*计算S= (1-1/2) + (1/3-1/4) +…+ (1/(2n-1)-l/2n) */ return
s; }double fun(int n)\r\n {\r\n int i;\r\n double s=0.0;\r\n for (i=1; i<=n;
i++)\r\n s=s+(1.0/(2*i-1)-1.0/(2*i)); /*计算S= (1-1/2) + (1/3-1/4) +…+
(1/(2n-1)-l/2n) */ return s;\r\n } 解析:本题中s=s+(1.0/(2*i-1)-1,O/(2*i));
语句是用C程序去表达题目中的每一项,这是关键,其他问题不难理解。
27.void fun(char*s char t[]) { int ij=0; for(i=0;s[i]!='\0';i++) if(i%2!=0&&s[i]%2==0) /*将s所指字符串下标为奇数同时ASCII值为
偶数的字符放入数组t中*/ t[j++]=s[i]; t[j]='\0'; /*在字符串最后加上结束
标志位*/ }void fun(char*s, char t[])\r\n {\r\n int i,j=0;\r\n for(i=0;s[i]!='\\0';i++)\r\n if(i%2!=0&&s[i]%2==0) /*将s所指字符串下标
为奇数同时ASCII值为偶数的字符放入数组t中*/\r\n t[j++]=s[i];\r\n t[j]='\\0'; /*在字符串最后加上结束标志位*/\r\n } 解析:本题要求除了下标为奇数同时ASCII值为偶数的字符之外,其他字符都删除。
即题目要求留下下标为奇数同时ASCII值为偶数的字符。
C语言中并没有直接删除字符的算法,请大家在做题的时候注意。
28.void fun(char *wint m) { int ij;char t;for(i=1;i<=m;i++) /*进行m次的循环左移*/ {t=w[0];for(j=1/w[j]!='\0';j++) /*从第2个字符开始以后的每个字符都依次前移一个字符*/ w[j-1]=w[j];w[j-1]=t;/*将第1个字符放到最后一个字符中*/ } }void fun(char *w,int m)\r\n {\r\n int i,j;\r\n char t;\r\n for(i=1;i<=m;i++) /*进行m次的循环左移*/\r\n {t=w[0];\r\n for(j=1/w[j]!='\\0';j++) /*从第2个字符开始以后的每个字符都依次前移一个字符*/\r\n w[j-1]=w[j];\r\n w[j-1]=t;/*将第1个字符放到最后一个字符中*/\r\n }\r\n } 解析:我们在学习C语言的时候,应该广泛地应用到循环的方法,本题应采用“循环左移”的算法。
即从第2个字符开始以后的每个字符都依次前移一个字符,而原来的第1个字符放在串中的最后一个字符。
当要平移m个字符时,则要进行m次的循环左移。
内嵌的循环的作用是完成从第2个字符开始以后的每个字符都依次前移一个字符,w[j-1]=t的作用是将第1个字符放到最后一个字符中。
29.int fun (int a[][N]) { int ij; for(i=0;i<N;i++) for(j=0;j<=i;j++) a[i][j]=0; /*将数组左下半三角元素中的值全部置成0*/ }int fun (int a[][N])\r\n {\r\n int i,j;\r\n for(i=0;i<N;i++)\r\n for(j=0;j<=i;j++)\r\n a[i][j]=0; /*将
数组左下半三角元素中的值全部置成0*/\r\n } 解析:本题旨在考查控制数组中左下半三角元素的算法,也就是两个千篇一律的循环语句,希望学习者能够掌握消化。
30.解析:该程序功能是求出数组周边元素的平均值。
其中周边元素是指第一行的元素的行下标为0,或者第n行的元素行下标为n-1,或者第一列元素的元素列下标为0,或者第n列的元素的列下标为n-1。
31.void fun (int (*s)[10] int *b int *n int mm int nn) { int i j k=0; for (i=0; i <mm; i ++ ) / *将二维数组s中的数据按行的顺序依次放到一维数组b 中* / for (j=0; j<nn; j++) b[k++]=s [i] [j]; /*通过指针返回元素个数*/ *n=k }void fun (int (*s)[10], int *b, int *n, int mm, int nn) \r\n {\r\n int i, j, k=0;\r\n for (i=0; i <mm; i ++ ) / *将二维数组s中的数据按行的顺序依次放到一维数组b中* /\r\n for (j=0; j<nn; j++) \r\n b[k++]=s [i] [j]; /*通过指针返回元素个数*/\r\n *n=k\r\n } 解析:我们可以用两个循环来处理问题,由于是按行的顺序取出,所以第1个循环用于控制行下标,第2个循环用于控制列下标;若改成按列的顺序取出,则循环应改成:
for(i=0;i<nn;i++)
for(j=0;i<mm;j++)
b[k++]=s[j][i];
要注意s[j][i]的下标,不能用s[i][j]。
若按行取出则列标变化最快,若按列取出则行标变化最快。
再根据循环嵌套时,越在内层的循环,其循环变量变化就越快。
上题程序中只有当j从头到尾变化完时,i才变化一次(即加1);由于二数组的第1个下标为行下标,第2个下标为列下标,所以第1个程序列变化最快、第2个程序行变化最快。
32.double fun(int n) { int i; double s=0.0s1=0.0;for(i=1;i<=n; i++) {s1=s1+pow(i0.5);/*求每—项*/ s=s+s1;/*按公式求出s*/ } return s;}double fun(int n)\r\n {\r\n int i;\r\n double s=0.0,s1=0.0;\r\n for(i=1;i <=n; i++)\r\n {s1=s1+pow(i,0.5);/*求每—项*/\r\n s=s+s1;/*按公式求出s*/\r\n }\r\n return s;\r\n } 解析:我们先用数学的思路读懂该程序,并用1个字符表示“()”内的值。
在本程序中用s1来表示题中每个小括号内的值,第1项相当于有1个10.5次方(它还是1),第2项相当于第1项的值加上200.5次方,第3项相当于第2项的值加上30.5次方,…,依次类推。
函数pow (x,y)的功能是求出x的y次方,该函数已在库函数<math. h>中定义(即可直接使用)。
要程序中用s来表示总的结果,每1次循环加1次s1即加1项。
33.float fun (int m int n) { int i; double p=1.0; for(i=1;i<=m;i++) p=p*i; /*求m!*/ for(i=1;i<=n;i++) p=p/i; /*求m!/n!*/ for(i=1;i<=m-n;i++) p=p/i; /*求m!/(n!(m-n)!)*/ return p; }float fun (int m, int n)\r\n {\r\n int i;\r\n double p=1.0;\r\n for(i=1;i<=m;i++) p=p*i; /*求m!*/\r\n for(i=1;i<=n;i++) p=p/i; /*求m!/n!*/\r\n for(i=1;i<=m-n;i++) p=p/i; /*求m!/(n!(m-n)!)*/\r\n return
p;\r\n } 解析:本题中,欲求P的值,需要先求m,n,m-n的阶乘值,可用循环语句实现。
注意阶乘值应当是double类型,若定义x,y,z为整型变量,则p=x/(y*z)中的除法为整数除法。
34.int fun(int a[] [N] int m) { int ij; for (i=0; i<N; i++) for (j=i; j<N; j++) a
[i] [j] =a [i] [j] *m; /*右上半三角元素中的值乘以m*/ }int fun(int a[] [N], int m)\r\n {\r\n int i,j;\r\n for (i=0; i<N; i++)\r\n for (j=i; j<N; j++)\r\n a [i] [j] =a [i] [j] *m; /*右上半三角元素中的值乘以m*/\r\n } 解析:本题考查表示右上关三角元素的算法。
行下标肯定是从0到N-1,而列下标要根据行下标来定,当到第i行时列下标要从第i列开始,所以我们在编写程序时,第2个for()中有j=i(不是1);若要表示左下半三角元素时,行下标也是从0到N-1,列下标也是从0开始,但当到第i行时列只到i。
所以要把上述的第2个for()改成for(j=0;j<=i;++)。
35.D
因为字符数组s[]中的数组名s表示的是一个地址常量。
所以语句
“s+=2;”不能将指针在当前位置的基础上再向后移动两位。
因而程序
编译时出错。
36.D
37.A
本题考查了多重for循环。
当(i*j)>3时,跳出循环,本题中i=1,j=3,i*J后值为3,所以执行下边语句:m*=i+j,也可写成m=m*i+j,这时
要注意优先级,所以m的值为6。