计算机考研C程序设计自命题必刷满分题型

一、C程序的基本数据类型、基本算术运算、简单程序的设计

  1. 题目: 若有条件表达式(exp)?a++:b++;,则以下表达式中能完全等价于表达式(exp)的是( )。

    • 选项:
      • A. exp == 0
      • B. exp != 0
      • C. exp == 1
      • D. exp != 1
    • 答案: D
    • 解释: 条件表达式(exp)?a++:b++;意味着如果exp为真(非0),则执行a++,否则执行b++。因此,等价于exp != 0
  2. 题目: 效率最高的计算2*8的方法是( )。

    • 选项:
      • A. 2*2*2*2
      • B. 2*2*4
      • C. 2<<3
      • D. 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2
    • 答案: C
    • 解释: 2<<3是位运算中的左移操作,相当于2*2^3,即2*8,这是最高效的计算方法。
  3. 题目: a=1, b=22,则表达式a|ba||b的值分别为( )。

    • 选项:
      • A. 1 3
      • B. 3 1
      • C. 1 2
      • D. 2 1
    • 答案: A
    • 解释: a|b是按位或运算,1|22的二进制表示为1010|00010110,结果为10001,即十进制的17。a||b是逻辑或运算,因为a为真,所以结果为真,即1。
  4. 题目: sizeof(float)是( )。

    • 选项:
      • A. 一种函数调用
      • B. 一个不合法的表达式
      • C. 一个整型表达式
      • D. 一个浮点型表达式
    • 答案: C
    • 解释: sizeof是一个编译时运算符,用于计算数据类型或数据结构在内存中的大小,结果是一个整型值。
  5. 题目: 若有定义int a[5], *p=a;则对a数组元素地址的正确引用是( )。

    • 选项:
      • A. p+5
      • B. *a+1
      • C. &a+1
      • D. &a[0]
    • 答案: D
    • 解释: &a[0]是取数组第一个元素的地址,这是正确的引用方式。
  6. 题目: 若有定义int a[2][3], (*p)[3]; p=a;则对a数组元素地址的正确引用是( )。

    • 选项:
      • A. *(p+2)
      • B. p[2]
      • C. p[1]+1
      • D. (p+1)+2
    • 答案: A
    • 解释: *(p+2)实际上是p[2],即第二个子数组的首地址,这是正确的引用方式。
  7. 题目: 已有定义int k = 2; int *ptr1, *ptr2;ptr1ptr2均已指向变量k,下面不能正确执行的赋值语句是( )。

    • 选项:
      • A. k = *ptr1 + *ptr2
      • B. ptr2 = k
      • C. ptr1 = ptr2
      • D. k = *ptr1*(*ptr2);
    • 答案: B
    • 解释: ptr2 = k试图将一个整型值赋给一个指向整型的指针,这是不合法的。
  8. 题目: 当有如下定义char *p = (char*)malloc(100);p被分配到( )中。

    • 选项:
      • A. 栈
      • B. 堆
      • C. 全局初始化区
      • D. 以上说法均不对
    • 答案: B
    • 解释: malloc函数用于在堆上动态分配内存。
  9. 题目: 输入三个数,并从大到小输出。

    • 代码:
      #include<stdio.h>
      void swap(int* x,int* y)
      {
             
          int tmp = *x;
          *x = *y;
          *y = tmp;
      }
      int main()
      {
             
          int a, b, c;
          printf("请输入三个数:>\n");
          scanf("%d %d %d", &a, &b, &c);
          if (a < b) swap(&a, &b);
          if (a < c) swap(&a, &c);
          if (c > b) swap(&b, &c);
          printf("%d %d %d", a, b, c);
          return 0;
      }
      
    • 解释: 该程序通过比较和交换确保a是最大的,c是最小的,然后按从大到小的顺序输出。
  10. 题目: 打印100~200的素数(质数)。

    • 代码:
      #include <stdio.h>
      #include <math.h>
      int main() {
             
          int i, j;
          for (i = 101; i <= 200; i += 2) {
              // 从101开始,每次i+2,只考虑奇数
              int isPrime = 1;
              for (j = 2; j <= sqrt(i); j++) {
             
                  if (i % j == 0) {
             
                      isPrime = 0;
                      break;
                  }
              }
              if (isPrime) printf("%d ", i);
          }
          printf("\n");
          return 0;
      }
      
    • 解释: 该程序使用试除法来判断素数,只考虑奇数,并且只试除到sqrt(i),提高了效率。

二、条件选择语句if和switch的语法及其应用

  1. 题目: 下面代码的执行结果是什么?

    #include <stdio.h>
    int main() {
         
        int x = 3;
        int y = 3;
        switch (x % 2) {
         
            case 1:
                switch (y) {
         
                    case 0: printf("first"); 
                    case 1: printf("second"); break;
                    default: printf("hello");
                }
            case 2:
                printf("third");
        }
        return 0;
    }
    

    答案: 输出为 “hellosecondthird”。
    解释: 由于switch语句中case后面没有break,所以会执行到switch结束。

  2. 题目: switch(c)语句中,c不可以是什么类型?

    • 选项:
      • A. int
      • B. long
      • C. char
      • D. float
        答案: D
        解释: switch选择语句中,switch(整型表达式/枚举类型)case整型常量表达式/枚举常量;字符类型char本质上也属于整型家族,因为char类型在内存中以ASCII码进行存储,ASCII码本质上是一组整数。
  3. 题目:func(1) =( )

    int func(int a)
    {
         
        int b;
        switch (a)
        {
         
            case 1: b = 30;
            case 2: b = 20;
            case 3: b = 16;
            default: b = 0;
        }
        return b;
    }
    
    • 选项:
      • A. 30
      • B. 20
      • C. 16
      • D. 0
        答案: D
        解释: 由于casedefault后没有跟break,不会跳出switch语句,会顺延执行下去,直到switch语句结束。
  4. 题目: 关于switch说法不正确的是:

    • 选项:
      • A. switch语句中的default子句可以放在任意位置
      • B. switch语句中case后的表达式只能是整形常量表达式
      • C. switch语句中case子句必须在default子句之前
      • D. switch语句中case表达式不要求顺序
        答案: C
        解释: switch语句中对于case子句与default子句摆放位置是不要求的,因为switch语句是根据switch()中()里的为准,进行选择,并不是顺序执行。
  5. 题目: 程序的输出结果是?( )

    #include <stdio.h>
    int main()
    {
         
        int a = 0, b = 0;
        for (a = 1, b = 1; a <= 100; a++)
        {
         
            if (b >= 20) break;
            if (b % 3 == 1)
            {
         
                b = b + 3;
                continue;
            }
            b = b - 5;
        }
        printf("%d\n", a);
        return 0;
    }
    
    • 选项:
      • A. 10
      • B. 9
      • C. 8
      • D. 7
        答案: C
        解释: 由于continue语句的存在,当b % 3 == 1时,b增加3并继续循环,不执行b = b - 5;。因此,b的值在达到20之前,a的值会先达到8。
  6. 题目: 下列哪一项不是C语言的特点?

    • 选项:
      • A. 运算符丰富,是完全模块化和结构化的语言
      • B. 语言简洁、紧凑,使用方便、灵活
      • C. 生成的目标代码质量高,程序执行效率高
      • D. 允许直接访问物理地址,可以用来编写系统软件,但该语言与硬件相关,编写的程序很难移植到不同系统上运行
        答案: D
        解释: C语言与硬件无关,编写的程序可以移植到不同系统上运行。
  7. 题目: 下面哪一条语句是定义一个常变量(其值为255,存在期间不能改变)的正确语句?

    • 选项:
      • A. #define MASK 255
      • B. const int mask = 255;
      • C. #define MASK 255;
      • D. const int mask 255;
        答案: B
        解释: const关键字用于定义常量,其值在定义后不能改变。
  8. 题目: 在C语言程序中,表达式356%8的值是?

    • 选项:
      • A. 44.5
      • B. 44
      • C. 4
      • D. 0
        答案: C
        解释: %是取模运算符,356%8的结果是4。
  9. 题目: 下面哪一语句与“if(x<=y)r=1;else r=0;”等价?

    • 选项:
      • A. r= (x<=y);
      • B. r = (x>y)?1:0;
      • C. r = (x<=y)?0:1;
        答案: A
        解释: if语句可以转换为三元运算符的形式,但在这里r的值应该是1或0,而不是根据条件直接为真或假,因此选项A是正确的。
  10. 题目: 已知学生成绩(100分为满分)与等级的对应关系,编写一个程序,要求输入学生成绩,输出学生成绩对应的等级。

    int main(int argc, const char *argv[])
    {
         
       int grade;
       scanf("%d",&grade);
       grade = grade / 10;
       switch(grade){
         
           case 10:case 9:
                   printf("A");break;
           case 8:
                   printf("B");break;
           case 7:
                   printf("C");break;
           case 6:
                   printf("D");break;
           default:
                   printf("E");break;
       }
       return 0;
    }
    

    答案: 程序正确地根据输入的成绩输出对应的等级。
    解释: 程序使用switch语句根据成绩的十分之一来确定等级,这是一种简单且有效的方法来处理成绩等级的判断。

三、for、while、do-while三种循环控制语句的语法特点和应用

1. for循环的语法和应用

题目: 写出一个for循环,计算并打印1到100的和。
答案:

#include <stdio.h>
int main() {
   
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
   
        sum += i;
    }
    printf("Sum = %d\n", sum);
    return 0;
}

解释: for循环由三部分组成:初始化表达式、条件表达式和更新表达式。在本例中,初始化表达式int i = 1初始化循环变量i,条件表达式i <= 100控制循环直到i超过100,更新表达式i++在每次循环后递增i的值。循环体内计算累计和并最终打印结果。

2. while循环的语法和应用

题目: 使用while循环打印字母表中的所有大写字母。
答案:

#include <stdio.h>
int main() {
   
    char c = 'A';
    while (c <= 'Z') {
   
        printf("%c ", c);
        c++;
    }
    return 0;
}

解释: while循环在执行循环体之前会先评估条件。只有当条件为真时,才会执行循环主体。在本例中,只要c的值小于等于'Z',循环就会继续执行,打印从'A''Z'的所有大写字母。

3. do-while循环的语法和应用

题目:do-while循环实现一个程序,至少执行一次循环体,并在用户输入非’y’字符时结束循环。
答案:

#include <stdio.h>
int main() {
   
    char input;
    do {
   
        printf("请输入(输入y结束):");
        scanf(" %c", &input);
    } while (input == 'y');
    return 0;
}

解释: do-while循环在执行循环体之后才检查条件,因此循环体至少执行一次。在本例中,循环会一直执行直到用户输入'y'字符,循环体至少执行一次,即使第一次输入的就是'y'

4. for循环与数组

题目: 给定一个整型数组int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};,使用for循环打印数组的所有元素。
答案:

#include <stdio.h>
int main() {
   
    int arr[10] = {
   1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    for (int i = 0; i < 10; i++) {
   
        printf("%d ", arr[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值