2019全国高校计算机能力挑战赛 C 语言样卷分析


一、选择题(共 15 题,每题 3 分,共 45 分)

  1. C语言程序的基本单位是 ( )。

    A. 程序行 B. 语句 C. 函数 D. 字符

  2. 十六进制数100转换为十进制数为 ( ) 。

    A. 256 B. 512 C. 1024 D. 64

  3. 可用作C语言用户标识符的一组字符串是 ( )。

    A. void define WORD

    B. a3_b3 _123 IF

    C. For –abc Case

    D. 2a DO sizeof

  4. 在C语言中,要求运算数必须是整型的运算符是 ( )。

    A. % B. / C. < D. !

  5. 在C语言中对嵌套if语句规定else总是与 ( )配对。

    A. 第一个if

    B. 与之前最近的if

    C. 缩近位置相同的if

    D. 与之前最近的不带else的if语句

  6. 下面说法哪一个是不正确的 ( ) 。

    A. C语言函数可以没有参数

    B. C语言函数可以没有返回值

    C. C语言函数可以没有函数体

    D. 无参函数函数名后的圆括号可以省略

  7. 下面数组初始化不正确的是 ( )。

    A. int a[5]={1,2,3,4,5};

    B. int a[]={1,2,3,4,5};

    C. int a[5]={1,2,3};

    D. int a[5]={0,1,2,3,4,5};

  8. 设 C 语言中,int 类型数据占4个字节,则short 类型数据占 ( )。

    A. 1个字节 B. 2个字节 C. 4个字节 D. 8个字节

  9. 下列错误的表达式是 ( ) 。

    A. -x++ B. (-x)++ C. x+++y D. ++x+y

  10. switch(c)语句中,c不可以是什么类型 ( ) 。

    A. int B. long C. char D. float

  11. 以下叙述正确的是 ( ) 。

    A. do-while语句构成的循环不能用其它语句构成的循环来代替。

    B. do-while语句构成的循环只能用break语句退出。

    C. 用do-while语句构成的循环,在while后的表达式为非零时结束循环。

    D. 用do-while语句构成的循环,在while后的表达式为零时结束循环。

  12. 设有int (*ptr)[10] 其中的标识符ptr是 ( ) 。

    A. 10个指向整型变量的指针

    B. 指向10个整型变量的函数指针

    C. 一个指向具有10个整型元素的一维数组的指针

    D. 具有10个指针元素的一维指针数组,每个元素都只能指向整型量

  13. C语言规定,程序中各函数之间 ( )。

    A. 既允许直接递归调用也允许间接递归调用

    B. 不允许直接递归调用也不允许间接递归调用

    C. 允许直接递归调用不允许间接递归调用

    D. 不允许直接递归调用允许间接递归调用

  14. 在宏定义#define PI 3.14159中,用宏名PI代替一个 ( ) 。

    A. 单精度数 B. 双精度数 C. 常量 D. 字符串

  15. 若有定义char *s=”\”Name\Address\n”,则指针s所指字符串长度为 ( ) 。

    A. 19 B. 15 C. 18 D. 说明不合法


二、程序设计题 (5 道题,共 55 分)

  1. (10分)编写完整的程序。输入两个数,输出他们的和与差。

    输入说明:两个整数N1,N2;

    输出说明:两个整数的和与差

    输入样例:12 7

    输出样例:19 5

    #include <stdio.h>
       
    int main(int argc, char * argv[])
    {
    	int a = 0, b = 0;
    	scanf("%d %d", &a, &b);
    	printf("%d %d", a + b, a - b);
    	return 0;
    }
    


  2. (10分)编写完整的程序。输入三个数,输出其中的最大数,最小数。

    输入说明:两个整数N1 N2 N3;

    输出说明:最大数 最小数

    输入样例:5 4 9

    输出样例:9 4

    #include <stdio.h>
       
    int main(int argc, char * argv[])
    {
    	int a = 0, b = 0, c = 0;
    	scanf("%d %d %d", &a, &b, &c);
    	printf("%d %d", (a > b ? a : b) > c ? (a > b ? a : b) : c,  (a < b ? a : b) < c ? (a < b ? a : b) : c);
    	return 0;
    }
    


  3. (10分)编写完整的程序。采用顺序存储方式存储串,计算一个子串在字符串中首次出现的位置,输出这个下标。

    输入说明:字符串ms 字符串zs

    输出说明:zs在ms中首次出现下标

    输入样例:baadefaadcb aadc

    输出样例:6

    #include <stdio.h>
    #include <string.h>
       
    int main(int argc, char * argv[])
    {
    	int i = 0, j = 0, count = 0;
    	char str1[100], str2[100];
       	
    	scanf("%s %s", str1, str2);
       
    	while (i < strlen(str1) && j < strlen(str2))
    	{
    		if (str1[i] == str2[j])
    		{
    			i++;
    			j++;
    		}
    		else
    		{
    			i = i - j + 1;
    			j = 0;
    		}
    	}
       	
    	if (j == strlen(str2))
    		printf("%d", i - j);
       	
    	return 0;
    }