(总分100,考试时间90分钟)
一、选择题
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。
1. 下列叙述中正确的是(   )。
    A) 算法的效率只与问题的规模有关,而与数据的存储结构无关
    B) 算法的时间复杂度是指执行算法所需要的计算工作量
    C) 数据的逻辑结构与存储结构是一一对应的
    D) 算法的时间复杂度与空间复杂度一定相关
2. 栈和队列的共同点是(   )。
    A) 都是先进后出    B) 都是先进先出
    C) 只允许在端点处插入和删除元素    D) 没有共同点
3. 下列关于队列的叙述中正确的是(   )。
    A) 在队列中只能插入数据    B) 在队列中只能删除数据
    C) 队列是先进先出的线性表    D) 队列是先进后出的线性表
4. 下面概念中,不属于面向对象方法的是(   )。
    A) 对象    B) 继承    C) 类    D) 过程调用
5. 软件是指(   )。
    A) 程序    B) 程序和文档
    C) 算法加数据结构    D) 程序、数据与相关文档的完整集合
6. 信息隐蔽的概念与下述哪一种概念直接相关(   )。
    A) 软件结构定义    B) 模块独立性    C) 模块类型划分  D) 模块耦合度
7. 下列选项中,不属于模块间耦合的是(   )。
    A) 数据耦合    B) 标记耦合    C) 异构耦合    D) 公共耦合
8. 对于现实世界中事物的特征,在实体—联系模型中使用(   )。
    A) 属性描述    B) 关键字描述    C) 二维表格描述  D) 实体描述
9. 下列数据模型中,具有坚实理论基础的是(   )。
    A) 层次模型    B) 网状模型    C) 关系模型    D) 以上三个都是
10. 关系表中的每一横行称为一个(   )。
    A) 元组    B) 字段    C) 属性    D) 码
11. 用C语言编写的代码程序(   )。
    A) 可立即执行    B) 是一个源程序
    C) 经过编译即可执行    D) 经过编译解释即可执行
12. 以下叙述中正确的是(   )。
    A) 构成C程序的基本单位是函数    B) 可以在一个函数中定义另一个函数
    C) main()函数必须放在其他函数之前    D) 函数定义的格式是K&R格式
13. 以下叙述中正确的是(   )。
    A) C程序中的注释只能出现在程序的开始位置和语句的后面
    B) C程序书写格式严格,要求一行内只能写一个语句
    C) C程序书写格式自由,一个语句可以写在多行上
    D) 用C语言编写的程序只能放在一个程序文件中
14. 有以下程序:
    #include <stdio.h>
    main() 
        int x=1, y=2, z=3; 
    if (x>y) 
    if (y<z) printf("%d", ++z); 
    else printf("%d", ++y); 
    printf("%d\n", x++); 
  
    程序的运行结果是(    )。
    A) 331    B) 41    C) 2    D) 1
15. 下列程序的运行结果是(   )。
    #include <stdio.h>
    main() 
        int x=-9, y=5, z=8; 
    if(x<y) 
    if(y<0) z=0; 
    else z+=1; 
    printf("%d\n", z); 
    A) 6    B) 7    C) 8    D) 9
16. 在嵌套使用if语句时,C语言规定else总是(   )。
    A) 和之前与其具有相同缩进位置的if配对
    B) 和之前与其最近的if配对
    C) 和之前与其最近的且不带else的if配对
    D) 和之前的第一个if配对
17. 有以下程序:
    #include <stdio.h>
    main() 
    char k; int i; 
    for(i=1; i<3; i++) 
    scanf("%c",&k); 
    switch(k) 
    case '0': printf("another\n"); 
    case '1': printf("number\n"); 
    
    
  
    程序运行时,从键盘输入:01<回车>,程序执行后的输出结果是(   )。
    A) another
    number
    B) another
    number
    another
    C) another
    number
    number
    D) number
    number
18. 有以下程序:
     #include <stdio.h>
         main() 
        int i; 
     for(i=0; i<3; i++) 
    switch(i) 
        case 0: printf("%d", i); 
    case 2:printf("%d", i); 
    default: printf("%d", i); 
    
  
    程序运行后的输出结果是(   )。
    A) 022111    B) 021021    C) 000122    D) 012
19. 以下选项中不属于字符常量的是(   )。
    A) 'C'    B) "C"    C) '\xCC'    D) '\072'
20. 有以下程序:
    #include <stdio.h>
    main() 
    char c1, c2, c3, c4, c5, c6; 
    scanf("%c%c%e%c", &c 1, &c2, &c3, &c4); 
    c5=getchar(); c6=getchar(); 
    putchar(c1); putchar(c2); 
    printf("%c%c\n", c5, c6); 
  
    程序运行后,若从键盘输入(从第1列开始) :
    123<回车>
    45678<回车>
    则输出结果是(   )。
    A) 1267    B) 1256    C) 1278    D) 1245
21. 在C语言中,函数返回值的类型最终取决于(   )。
    A) 函数定义时在函数首部所说明的函数类型
    B) return语句中表达式值的类型
    C) 调用函数时主调函数所传递的实参类型
    D) 函数定义时形参的类型
22. 下面的函数调用语句中func函数的实参个数是(   )。
    func(f2(v1, v2), (v3, v4, v5), (v6, max(v7, v8) ) ); 
    A) 3    B) 4    C) 5    D) 8
23. 有以下程序:
    #include <stdio.h>
    void f(intv, intw) 
        int t; 
    t=v; v=w; w=t; 
    
    main() 
    int x=1, y=3, z=2; 
    if(x>y) f(x, y); 
    else if(y>z) f(y, z); 
    else f(x, z); 
    printf("%d, %d, %d\n", x, y, z); 
    
    执行后输出结果是(   )。
    A) 1, 2, 3    B) 3, 1, 2    C) 1, 3, 2    D) 2, 3, 1
24. 设有以下定义和语句:
    int a[3][2]=1, 2, 3, 4, 5, 6, *p[3]; 
    p[0]=a[1]; 
    则*(p[0]+1) 所代表的数组元素是()。
    A) a[0][1]    B) a[1][0]    C) a[1][1]    D) a[1][2]
25. 若有定义:int a[2][3]; ,以下选项中对a数组元素正确引用的是(   )。
    A) a[2][1]    B) a[2][3]    C) a[0][3]    D) a[1>2][!1]
26. 下列程序的输出结果是(   )。
    #include<stdio. h>
    #define  N 3
    #define  M 3
    void fun(int a[M][N]) 
     printf("%d\n", *(a[1]+2) ); 
    main() 
        int a[M][N]; 
    int i, j, 
    for(i=0; i<M; i++) 
    for(j=0; j<N; j++) 
    a[i][j]=i+j-(i-j); 
    fun(a); 
    A) 3    B) 4    C) 5    D) 6
27. 若有定义:int w[3][5];,则以下不能正确表示该数组元素的表达式是(   )。
    A) *(*w+3)         B) *(w+1) [4]      C) *(*(w+1) )      D) *(&w[0][0]+1)
28. 下列程序执行后的输出结果是(   )。
    #include <stdio. h>
    main() 
      int a[3][3],*p, i; 
    p=&a[0][0]; 
    for(i=1; i<9; i++) p[i]=i+1; 
    printf("%d\n", a[1][2]); 
    A) 3    B) 6    C) 9    D) 随机数
29. 有以下程序:
    #include <stdio.h>
    int fun(int(*s) [4], int n, int k) 
        int m, i; 
    m=s[0][k]; 
    for(i=1; i<n; i++) if(s[i][k]>m) m=s[i][k]; 
    return m; 
    
    main() 
    int a[4][4]=1, 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34; 
    printf("%d\n", fun(a, 4, 0) ); 
    
    程序的运行结果是(   )。
    A) 4    B) 34    C) 31    D) 32
30. 下面程序段的运行结果是(   )。
    char *p=" 123defgh"; 
    p+=3;
    printf("%d\n", strlen(strcpy(p, " ABCD") ) ); 
    A) 8    B) 12    C) 4    D) 7
31. 对下述程序的判断中,正确的是(   )。
    #include<stdio.h>
    void main() 
     char*p, s[128]; 
    p=s; 
    while(strcmp(s, "End") ) 
     printf("Input a string:"); gets(s); p=s; 
    while(*p) 
    putchar(*p++); 
    A) 此程序循环接收字符串并输出,直到接收字符串“End”为止
    B) 此程序循环接收字符串,接收到字符串“End”则输出,否则程序终止
    C) 此程序循环接收字符串并输出,直到接收字符串“End”为止,但因代码有错误,程序不能正常工作
    D) 此程序循环接收字符串并将其连接在一起,直到接收字符串“End”为止,输出连接在一起的字符串
32. 阅读下列程序,当运行函数时,输入asd af aa z67,则输出为(   )。
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    int fun (char *str) 
        inti, j=0; 
    for(i=0; str[i]!='\0'; i++) 
    if(str[i]!=' ') str[j++]=str[i]; 
    str[j]='\0'; 
    
    main() 
    char str[81]; 
    int n; 
    printf("Input a string:"); 
    gets(str); 
    puts(str); 
    fun(str); 
    printf("%s\n", str); 
  
    A) asdafaaz67    B) asd af aa z67    C) asd    D) z67
33. 在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,则(   )。
    A) 称为函数的直接递归调用    B) 称为函数的间接递归调用
    C) 称为函数的循环调用    D) C语言中不允许这样的递归调用
34. 有以下程序:
    #include <stdio.h>
    int fun(int x[], int n) 
        static int sum=0, i; 
    for(i=0; i<n; i++) sum+=x[i]; 
    return sum; 
    
    main() 
      int a[]=1, 2, 3, 4, 5, b[]=6, 7, 8, 9, s=0; 
    s=fun(a, 5) +fun(b, 4); printf("%d\n", s); 
  
    程序执行后的输出结果是(   )。
    A) 45    B) 50    C) 60    D) 55
35. 以下程序的输出结果是(   )。
    #include<stdio.h>
    int a[3][3]=(1, 2, 3, 4, 5, 6, 7, 8, 9), *p; 
    main() 
        p=(int*) malloc(sizeof(int) ); 
    f(p, A); 
    printf(; % d\n", *p); 
    free(p); 
    f(int *s, int p[][3]) 
    *s=p[1][1]; 
    A) 1    B) 4    C) 7    D) 5
36. 有以下程序:
    struct STU
    char name[10]; 
    int num; 
    ; 
    void f1(struct STU c) 
        struct STU b="LiSiGuo", 2042; 
    c=b; 
    
    void f2(struct STU *c) 
        structSTU b="SunDan", 2044; 
    *c=b; 
    
    main() 
        struct STU a="YangSan", 2041, b="WangYin", 2043; 
    f1(a); f2(&b); printf("%d, %d\n", a.num, b.num); 
    
    程序执行后的输出结果是(   )。
    A) 2041 2044    B) 2041 2043    C) 2042 2044    D) 2042 2043
37. 设有如下说明:
    typedef struct ST
    long a; int b; char c[2]; NEW; 
    则下面叙述中正确的是(   ) 
    A) 以上的说明形式非法    B) ST是一个结构体类型
    C) NEW是一个结构体类型    D) NEW是一个结构体变量
38. 设有以下语句:
    char x=3, y=6, z; 
    z=x^y<<2; 
    则z的二进制值是(   )。
    A) 00010100    B) 00011011    C) 00011100    D) 00011000
39. 表达式0x13&0x17的值是(   )。
    A) 0x17    B) 0x13    C) 0xf8    D) 0xec
40. 以下叙述中错误的是(   )。
    A) gets函数用于从终端读入字符串
    B) getchar函数用于从磁盘文件读入字符
    C) fputs函数用于把字符串输出到文件
    D) fwrite函数用于以二进制形式输出数据到文件
二、程序填空题
给定程序中,函数fun的功能是:将形参s所指字符串中的所有数字字符顺序前移,其他字符顺序后移,处理后新字符串的首地址作为函数值返回。
    请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
    注意:部分源程序给出如下。
    不得增行或删行,也不得更改程序的结构!
    试题程序:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h<
    #include <ctype.h<
    char *fun(char *s)
        inti, j, k, n; char *p, *t; 
    n=strlen(s)+1; 
    t=(c har*)malloc (n*sizeof(char)); 
    p=(char*)malloc(n*sizeof(char)); 
    j=0; k=0; 
    for(i=0; i<n; i++)
        if(isdigit(s[i]))
    /******************found*******************/
    p[  (1)  ]=s[i]; j++; 
    else
    t[k]=s[i]; k++; 
    
   /******************found*******************/
    for(i=0; i<  (2)  ; i++)p[j+i]=t[i]; 
    p[j+k]=0; 
   /******************found*******************/
    return  (3)  ; 
    
    main()
    
    char s[80]; 
    printf("Please input:"); 
    scanf("%s", s); 
    printf("\nThe result is: %s\n", fun(s)); 
    
1. 
2. 
3. 
三、程序改错题
1. 给定程序中函数fun的功能是:首先把b所指字符串中的字符按逆序存放,然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指的数组的尾部。例如,当a所指字符串中的内容为“abcdefg”,b所指字符串中的内容为“1234”时,c所指数组中的内容应“a4b3c2dlefg”;而当a所指字符串中的内容为“1234”,b所指字符串的内容为“abcdefg”时,c所指数组中的内容应该为“lg2f3e4dcba”。
    请改正程序中的错误,使它能得出正确的结果。
    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
    试题程序:
    #include <stdio.h>
    #include <string.h>
    void fun (char*a, char*, char *c)
    
    inti, j; char ch; 
    i=0; j=strlen(b)-1; 
    /******************found*******************/
    while(i>j)
        ch=b[i]; b[i]=b[j]; b[j]=ch; 
    i++; j--; 
    
    while (*a|| *b)
    /******************found*******************/
    If(*a)
    *c=*a; c++; a++; 
    if(*b)
    *c=*b; c++; b++; 
    
    *c=0; 
    
    main()
    
    char s1[100], s2[100], t[200]; 
    printf("\nEnter s1 string:"); scanf("%s", s1); 
    printf("\nEnter s2 string:"); scanf("%s", s2); 
    fun(s1, s2, t); 
    printf("\nThe result is: %s\n", t); 
    
四、程序设计题
1. 函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除,s所指串中剩余的字符形成的新串放在t所指的数组中。
    注意:部分源程序给出如下。
    请勿改动mam函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
    试题程序:
    #include <stdio.h>
    #include <string.h>
    void fun(char *s, char t[])
    
    
    main()
    
    char s[100], t[100]; 
    printf("\nPlease enter string S:"); 
    scanf("%s", s); 
    fun(s, t); 
    printf("\nThe result is:%s\n", t); 
    
 

02-04 09:18