一、选择题下列各题四个选项中,只有一个选项是正确的。
18. 有以下程序
#include<stdio.h>
main()
{ int a=1,b=0;
if(--a)b++;
else if(a==0) b+=2;
else b+=3;
printf("%d\n",b);
}
程序运行后的输出结果是
。
A B C D
C
[解析] 由于变量a的初始值等于1,所以在程序中执行if(--a)后,a的值等于0,执行else if(a==0)b+=2;这条语句后,变量b的值等于2。
20. 有以下程序
#include <stdio.h>
main()
{ int a=7;
while(a--);
pfintf("%d\n",a);
}
程序运行后的输出结果是
。
A B C D
A
[解析] 在while语句中,先判断while后面的表达式是否为0,如果为0,则退出循环,否则执行循环体。在本题中,当变量a的值经过几次循环后,其值等于0时,退出while循环语句,变量a再执行自减运算,所以其值等于-1。
22. 有以下程序(注:字符a的ASCII码值为97)
#include<stdio.h>
main()
{ char*s={"abc"};
do
{ printf("%d","s%10);++s;)
while(*s);
}
程序运行后的输出结果是
。
A B C D
B
[解析] 因为小写字符a,b,c的ASCII的值分别为97,98,99,而在do while循环语句中,每次对字符的ASCII的值取余数并输出,第一次循环输出7,第二次循环输出8,第三次循环输出9。
24. 有以下程序
#include<stdio.h>
double f(double x);
main()
{ double a=0;int i;
for(i=0;i<30;i+=10)a+=f(double)i);
printf("%5.0f\n",a);
}
double f(double x)
{return x*x+1;}
程序运行后的输出结果是
。
A B C D
A
[解析] 由于函数f的作用是对形参x求平方再加1,所在在主函数中,循环第一次执行后变量a的值等于1,第二次执行后,变量a的值等于102,第三次执行后,变量a的值等于503。
26. 以下定义数组的语句中错误的是
。
- A.int num[]={1,2,3,4,5,6};
- B.int num[][3]={{1,2},3,4,5,6);
- C.int num[2][4]=({1,2},{3,4},{5,6));
- D.int num[][4]={1,2,3,4,5,6};
A B C D
C
[解析] 在选项C)的数组定义中,赋值号左边定义了一个2行4列的二维数组,而在右边定义了一个3行2列的二维数组。
27. 有以下程序
#include <stdio.h>
void fun(int *p)
{ printf("%d\n",p[5]);}
main()
{ int a[10]={1,2,3,4,5,6,7,8,9,10};
fun(&a[3]);
}
程序运行后的输出结果是
。
A B C D
D
[解析] 函数fun的功能是输出数组p的第5个元素,在主函数中,把元素a[3]的地址赋给函数fun,因为在C语言中,数组的下标是从0开始,所以输出数组a中的第8个元素,即9。
28. 有以下程序
#include<stdio.h>
#define N 4
void fun(int a[][N],int b[])
{ int i;
for(i=0;i<N;i++)b[i]=a[i][i]-a[i][N-1-i];
}
void main()
{ int x[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},y[N],i;
fun(x,y);
for(i=0;i<N;i++)printf("%d,",y[i]);printf("\n");
}
程序运行后的输出结果是
。
- A.-12,-3,0,0,
- B.-3,-1,1,3,
- C.0,1,2,3,
- D.-3,-3,-3,-3,
A B C D
B
[解析] fun函数的功能是求出二维数组a中第i行第i个元素与第N-1-i元素的差,赋给b[i]。在主函数中,把实参二维数组x和一维数组y传递给形参a和b,最后输出一维数组y中元素的值。
29. 有以下函数
int fun(char *x,char *y)
{ int n=0;
while((*x==*y)&&*x!='\0'){x++; y++; n++;}
return n;
}
函数的功能是
。
- A.查找x和y所指字符串中是否有'\0'
- B.统计x和y所指字符串中最前面连续相同的字符个数
- C.将y所指字符串赋给x所指存储空间
- D.统计x和y所指字符串中相同的字符个数
A B C D
B
[解析] 在while循环中的判断表达式为(*x==*y)&&*x!='\0',所以只要字符串x与y的当前字符不相等时,循环就结束。
31. 以下程序的主函数中调用了在其前面定义的fun函数
#include <stdio.h>
┇
main()
{ double a[15],k;
k=fun(a);
┇
}
则以下选项中错误的fun函数受部是
。
- A.double fun(double a[15])
- B.double fun(double *a)
- C.double fun(double a[])
- D.double fun(double a)
A B C D
D
[解析] 由函数fun在主函数中的调用形式可以看出,函数fun()的函数返回值类型为double,形参为一维数组或指针变量。
32. 有以下程序
#include<stdio.h>
#include<string.h>
main()
{char a[5][10]={"china","beijing","you","tiananmen","welcome");
int i,j; char t[10];
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(strcmp(a[i],a[j])>0)
{strcpy(t,a[i]);strcpy(a[i],a[j]);strcpy(a[j],t);}
puts(a[3]);
}
程序运行后的输出结果是
。
- A.Beijing
- B.china
- C.welcome
- D.tiananmen
A B C D
C
[解析] 由程序中的两层for循环可知,对数组串数组进行从小到大的排序,所以字符串数组a[][],经过排序后值应该为{"beijing","china","tiananmen","welcome","you"),输出字符串a[3]的值为“welcome”。
33. 有以下程序
#include<stdio.h>
int f(int m)
{ static int n=0;
n+=m;
return n;
}
main()
{ int n=0;
printf("%d,",f(++n));
printf("%d\n",f(n++));
}
程序运行后的输出结果是
。
A B C D
A
[解析] 由于在函数f中,变量n为静态局部变量,所以在主函数中第一次调用函数f后,变量n的值等于1,当第二调用函数f时,在函数f的内部静态局部变量n的值仍然保留等于1,所以返回函数值等于2。
34. 有以下程序
#include<stdio.h>
main()
{char ch[3][5]={"AAAA","BBB","CC"};
printf("%s\n",ch[1]);
}
程序运行后的输出结果是
。
A B C D
D
[解析] 字符串数组ch的元素下标是从0开始的,所以数组元素ch[1]值为字符串“BBB”。
35. 有以下程序
#include<stdio.h>
#include<string.h>
void fun(char*w,int m)
{char s,*p1,*p2;
p1=w;p2=w+m-1;
while(p1<p2){s=*p1;*p1=*p2;*p2=s;p1++;p2--;}
}
main()
{char a[]="123456";
fun(a,strlen(a));puts(a);
}
程序运行后的输出结果是
。
- A.654321
- B.116611
- C.161616
- D.123456
A B C D
A
[解析] 函数fun的功能是将字符串w中的元素从大到小进行排列,所以在主函数中调用函数fun后,字符串a的元素从大到小进行了排列。
36. 有以下程序
#include<stdio.h>
#include<string.h>
typedef struct{char name[9];char sex;int score[2];}STU;
STU f(STU a)
{ STU b={"Zhao",'m',85,90);
int i;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++)a.score[i]=b.score[i];
return a;
}
main()
{ STU c={"Qian",'f',95,92),d;
d=f(c);
printf("%s,%c,%d,%d,",d.name,d.sex,d.score[0],d.score[1]);
printf("%s,%c,%d,%d,",c.name,c.sex,c.score[0],c.score[1]);
}
程序运行后的输出结果是
。
- A.Zhao,m,85,90,Qian,f,95,92
- B.Zhao,m,85,90,Zhao,m,85,90
- C.Qian,f,95,92,Qian,f,95,92
- D.Qian,f,95,92,Zhao,m,85,90
A B C D
A
[解析] 在C语言中,函数实参与形参之间数据的传递是传值,也就是说在用实参调用形参时,是把实参的值拷贝一份给形参,而实参的值并不变化,仍是原来的值。所以对于本题来说,在主函数中调f(e)后,实参e的值并不会变化,仍是原值。在函数f中把局部变量b的值依次返回给变量d。
37. 有以下程序
#include<stdio.h>
main()
{ struct node{int n;struct node *next;} *p;
struct node x[3]={{2,x+1},{4,x+2},{6,NULL}};
p=x;
printf("%d,",p->n);
printf("%d\n",p->next->n);
}
程序运行后的输出结果是
。
A B C D
B
[解析] 在程序中由结构休node的数组x[3]组成了一个线性链表,指针p指向链表的第一结点x[0],所以首先输出2,p->next指向第二个结点x[1],所以输出4。
38. 有以下程序
#include<stdio.h>
main()
{ int a=2,b;
b=a<<2;pfinff("%d\n",b);
}
程序运行后的输出结果是
。
A B C D
D
[解析] 表达式a<<2,把a向左移动2位,相当于扩大4倍。
40. 有以下程序
#include<stdio.h>
main()
{ FILE*fp;
int k,n,i,a[6]={1,2,3,4,5,6};
fp=fopen("d2.dat","w");
for(i=0;i<6;i++)fprintfffp,"%d\n",a[i]);
fclose(fp);
fp=fopen("d2.dat","r");
for(i=0;i<3;i++)fscanf(fp,"%d%d",&k,&n);
fclose(fp);
printf("%d,%d\n",k,n);
}
程序运行后的输出结果是
。
A B C D
C
[解析] 在程序中首先把数组a中的各个元素写入到文件d2.dat中,然后利用循环语句每次从d2.dat中读出两个元素赋给变量k,n;,循环共执行3次,所以最后变量k,n的随等于5,6。
二、填空题1. 数据结构分为线性结构与非线性结构,带链的栈属于______。
线性结构
[解析] 一般将数据结构分为线性结构与非线性结构两大类。如果一个非空的数据结构满足以下两个条件:
①有且只有一个根结点;
②每一个结点最多有一个前件,也最多有一个后件。
则称该数据结构为线性结构,所以带链栈为线性结构。
2. 在长度为n的顺序存储的线性表中插入一个元素,最坏情况下需要移动表中______个元素。
n
[解析] 在顺序存储的线性表中插入一个元素时,一般是从最后的元素向后移动一位,移动到插入的位置后,插入元素。在最坏情况下,需要移动n个元素。
3. 常见的软件开发方法有结构化方法和面向对象方法。对某应用系统经过需求分析建立数据流图(DFD),则应采用______方法。
结构化
[解析] 采用结构化方法开发软件时,需求分析阶段建立数据流图。
4. 数据库系统的核心是______。
数据库管理系统 (或DBMS)
[解析] 一般认为,数据库系统包括四个部分:数据库、数据库管理系统、数据库应用程序、数据库管理员。其中DBMS是为数据库的建立、使用和维护而配置的软件,是数据库系统的核心。
5. 在进行关系数据库的逻辑设计时,E-R图中的属性常被转换为关系中的属性,联系通常被转换为______。
关系
[解析] 在实体-关系图中的联系通常被转换为关系。
6. 若程序中已给整型变量a和b赋值10和20,请写出按以下格式输出a、b值的语句______。
****a=10,b=20****
printf("****a=%d,b=%d****",a,b);
[解析] 要按照题目所要求的格式****a=10,b=20****输出,所以要在输出函数的格式中定义****a=%d,b=%d****料这个字符串。
7. 以下程序运行后的输出结果是______。
#include<stdio.h>
main()
{ int a=37;
a%=9;printf("%d\n",a);
}
8. 以下程序运行后的输出结果是______。
#include<stdio.h>
main()
{ int i,j;
for(i=6;i>3;i--)j=i;
printf("%d%d\n",i,j);
}
34
[解析] 在for循环中,当变量i的值等于4时,把4赋给变量j,同时变量i的值减1等于3,所以程序输出结果为34。
9. 以下程序运行后的输出结果是______。
#include<stdio.h>
main()
{ int i,n[]={0,0,0,0,0);
for(i=1;i<=2;i++)
{n[i]=n[i-1]*3+1;
printf("%d",n[i]);
}
printf("\n");
}
14
[解析] 在for循环第一次执行结束后,n[1]的值等于1,输出1;循环第二次执行结束后,n[2]的值等于4,输出4,所以输出结果为14。
10. 以下程序运行后的输出结果是______。
#include<stdio.h>
main()
{ char a;
for(a=0;a<15;a+=5)
{ putchar(a+'A');}
printf("\n");
}
AFK
[解析] 在程序中,for循环共执行三次,第一次输出字符A,第二次输出字符F,第三次输出字符K。
11. 以下程序运行后的输出结果是______。
#include<stdio.h>
void fun(int x)
{ if(x/5>0)fun(x/5);
printf("%d",x);
}
main()
{ fun(11);pfintf("\n");}
211
[解析] 这个题目主要考查函数的递归调用,当把实参11传递给形参x时,因为11除以5得2,所以要调用f(2),输出2,再执行f(11)中的输出语句,输出11。所以结果为211。
12. 有以下程序
#include<stdio.h>
main()
{ int c[3]={0},k,i;
while((k=getchar())!='\n')
c[k-'A']++;
for(i=0;i<3;i++)printf("%d",c[i]);printf("\n");
}
若程序运行时从键盘输入ABCACC<回车>,则输出结果为______。
213
[解析] 这个题目考查的是从键盘输入的大写字母的个数,数组元素c[0]存放的是大写字母A的个数,c[1]存放的是大写字母B的个数,c[2]存放的是大写字母C的个数,所以当从键盘输出ABCACC时,输出结果为213。
13. 以下程序运行后的输出结果是______。
#include<stdio.h>
main()
{ int n[2],i,j;
for(i=0;i<2;i++)n[i]=0;
for(i=0;i<2;i++)
for(j=0;j<2;j++)n[j]=n[i]+1;
printf("%d\n",n[1]);
}
3
[解析] 在两层for循环中当外层的循环变量i的值等于0时,执行内层的for循环,其结果是n[0]=1,n[1]=2;,当外层的循环变量i的值等于1时,执行内层的for循环,其结果是n[0]=3,n[1]=3;,所以结果为3。
14. 以下程序调用fun函数把x中的值插入到a数组下标为k的数组元素中。主函数中,n存放a数组中数据的个数。请填空。
#include<stdio.h>
void fun(int s[],int *n,int k,int x)
{ int i;
for(i=*n-1;i>=k;i--)s
=s[i];
s[k]=x;
*n=*n+
;
}
main()
{int a[20]={1,2,3,4,5,6,7,8,9,10,11},i,x=0,k=6,n=11;
fun(a,&n,k,x);
for(i=0,i<n,i++)printf("%4d",a[i]);printf("\n");
}
i+1
(15) 1
[解析] 在函数fun中,使用for循环语句,把数组s[]中下标大于k的元素向后移动一位,所以应该填入i+1。
因为变量n的值表示数组元素的个数,插入一个元素后,其值加1,所以填入1。