C语言初阶测评题:测试你的基础知识和编程技能!!

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: C语言初阶测评题:测试你的基础知识和编程技能!!


🎈前言:

欢迎来到这个关于C语言的初阶测评题博客!在这里,我们将为您呈现一系列考察基础知识和编程技能的问题,帮助您巩固对C语言的了解并提升编程能力。这次的测评题包含 15个选择题+2个编程题,希望大家看完能够有所收获!!🥇


🌴选择题

  1. 下列程序执行后,输出的结果为( )
#include <stdio.h>
int cnt = 0;
int fib(int n) 
{
  cnt++;
  if (n == 0)
    return 1;
  else if (n == 1)
    return 2;
  else
    return fib(n - 1) + fib(n - 2);
} 
void main()
{
  fib(8);
  printf("%d", cnt);//67
}

A 41

B 67

C 109

D 177

🔎正确答案:B 67

【解析】:

  1. cnt 是一个全局变量,用于统计递归调用次数。
  2. fib 函数用于计算斐波那契数列的第 n 项。在每次递归调用时,会将 cnt 增加 1。
  3. main 函数调用 fib(8),即计算斐波那契数列的第 8 项,同时会统计递归调用次数。
  4. 最后,printf 输出递归调用次数,这里输出结果为 67。

需要注意的是,这段代码使用递归来计算斐波那契数列,但是递归在计算较大的斐波那契数时会存在重复计算,效率较低。可以考虑使用循环或者记忆化递归等方法来优化计算。、

  1. 以下程序的输出结果是?
int x = 1;
do 
{
    printf("%2d\n", x++);
} while (x--);

A 1

B 无任何输出

C 2

D 陷入死循环

🔎正确答案: D 陷入死循环

【解析】:

  1. do while循环语句会先执行循环内语句再判断,x初值为1
  2. printf语句中打印的是x++的值,由于x是后置++,所以打印的值为1,执行完printf语句后x的值变为2
  3. 随后进行循环条件的判断(即判断x--是否为真),由于是后置–,所以此时x的值还是2,判断结果为结果为真
  4. 当再次进入循环后x的值变为1,再次循环上述步骤,所以该程序会陷入死循环。
  1. 下面的代码段中,执行之后ij的值是什么()
int i = 1;
int j;
j = i++;

A 1,1

B 1,2

C 2,1

D 2,2

🔎正确答案: C 2,1

【解析】:

在给定的代码段中,i 被赋值为 1,然后通过 j = i++; 因为是后置++,所以先将 i 的值赋给 j,然后 i 的值自增。 所以,i 的值变为 2j 的值为 1

  1. 以下程序的k最终值是:
int i = 10;
int j = 20;
int k = 3;
k *= i + j;

A 90

B 50

C 70

D 30

🔎正确答案: A 90

【解析】:

首先,计算 i + j,得到 10 + 20 = 30

然后,将 k 乘以 30,所以 k 的值将变为 3 * 30= 90

  1. 以下程序的最终的输出结果为:
#include<stdio.h>
#include<stdlib.h>
int a = 1;
void test() 
{
    int a = 2;
    a += 1;
}
int main()
{
    test();
    printf("%d\n", a);
    return 0;
}

A 1

B 2

C 3

D 4

🔎正确答案: A 1

【解析】:

  • 在这段代码中,首先在全局作用域中定义了一个名为 a 的全局变量并初始化为 1。然后在 test 函数中定义了一个同名的局部变量 a,其初始值为 2,然后通过 a += 1; 进行自增操作。由于这个自增操作仅在 test
    函数的局部作用域内有效,它不会影响到全局变量 a
  • main 函数中调用了 test 函数,然后打印全局变量 a 的值。由于全局变量 a 没有在 test 函数内被修改,所以 main 函数中的 printf 语句会输出全局变量 a 的值,即 1
  1. 下列描述中正确的是()

A 表示m>n为true或者m<n为true的表达式为m>n&&m<n

B switch语句结构中必须有default语句

C 如果至少有一个操作数为true,则包含“||”运算符的表达式true

D if语句结构中必须有else语句

🔎正确答案: C 如果至少有一个操作数为true,则包含“||”运算符的表达式true

【解析】:

  • 选项 A 错误,因为 m>n&&m<n表达式表示的是 m 大于 n 并且同时小于 n,这是不可能的,因此整个表达式永远为 false
  • 选项 B 错误,switch 语句不必须包含 default 语句,只有在需要处理没有匹配的情况时才需要使用 default语句。
  • 选项 D 错误,if 语句可以没有 else 语句,只要它满足特定的逻辑需求。
  1. C 语言规定,在一个源程序中,main函数的位置()。

A 必须在最开始

B 必须在系统调用的库函数的后面

C 可以任意

D 必须在最后

🔎正确答案: C 可以任意

【解析】:

在C语言中,编译器会从程序的入口函数 main 开始执行,而 main 函数可以放置在源文件的任何位置。

  1. 以下叙述不正确的是()

A 一个C源程序可由一个或多个函数组成

B 一个C源程序必须包含一个main函数

C C程序的基本组成单位是函数

D 在C程序中,注释说明只能位于一条语句的后面

🔎正确答案: D 在C程序中,注释说明只能位于一条语句的后面

【解析】:

在C程序中,注释可以位于一条语句的后面,也可以位于一行的开头,或者在任何有效的位置。注释用于解释代码的含义,提高代码的可读性,而不影响程序的执行。在C语言中,有两种类型的注释:

  1. 单行注释:以 // 开始,从双斜杠后面的内容一直到行末都被视为注释。
  2. 多行注释:以 /* 开始,以 */ 结束,之间的内容被视为注释。

所以,在C程序中,注释可以位于任何位置,不仅仅是一条语句的后面。

  1. 以下叙述正确的是()

A 在C程序中,main函数必须位于程序的最前面

B C程序的每行中只能写一条语句

C C语言本身没有输入输出语句

D 在对一个C程序进行编译的过程中,可发现注释中的拼写错误

🔎正确答案: C C语言本身没有输入输出语句

【解析】:

  • 选项A错误,main函数可以放在C程序的任何位置,只要程序是按顺序编译的即可;
  • 选项B错误,在C语言中,一条语句可以跨多行,也可以一行写多条语句;
  • 选项C正确,C语言本身没有输入输出语句,需要调用函数实现输入输出(例如printfscanf函数);
  • 选项D错误,注释中的拼写错误对编译没有影响,编译不会检查注释中的内容。
  1. 执行如下代码, c的值是:()
int a = 0, c = 0;
do 
{
    --c;
    a = a - 1;
} while (a > 0);

A 0

B 1

C -1

D 死循环

🔎正确答案: C -1

【解析】:

该循环会一直执行,直到 a 的值不大于 0。初始时,a 的值为 0,因此循环会至少执行一次。

在每次循环中,c 会递减 1,a 会减少 1。因此,第一次循环时,c 的值会从 0 减少到 -1,而 a 的值会从 0 减少到 -1。由于 a 的值已经不大于 0,因此循环会在第一次执行后终止。

因此,最终 c 的值是 -1。

  1. 假定 x 和 y 为 double 型,则执行 x=2 ; y=x+3/2; 后 y 的值为()

A 3.500000

B 3

C 2.000000

D 3.000000

🔎正确答案: D 3.000000

【解析】:

在 C 语言中,整数除法的结果会被截断为整数部分,所以 3/2 的结果是 1。然后这个结果 1 会与 x(初始值为 2)相加,所以 y 的计算过程是 y = x + 1,即 y = 2 + 1,结果是 3.000000

  1. 以 下 for 循 环 的 执 行 次 数 是()。
for(x=0,y=0; (y=123)&&(x<4); x++) ;

A 是无限循环

B 循环次数不定

C 4次

D 3次

🔎正确答案: C 4次

【解析】:

  1. 这个 for 循环的执行次数取决于条件 (y=123)&&(x<4) 的值。
  2. y的初始值被设为0,然后在每次循环中,y的值都会被重新赋值(y=123)。那么条件表达式就会变为 (123 && x < 4),由于 123true,所以整个表达式的结果就取决于 x < 4。因此,只要 x 的值小于 4for 循环就会一直执行下去。
  3. 因此,for 循环会执行 4 次,因为x初始值10,当 x 的值等于 4 时,条件 (x < 4) 就为 false,循环会停止执行。
  1. 若有定义语句: int year=1009 , *p=&year ;以下不能使变量 year 中的值增至 1010 的语句是()

A *p+=1;

B (*p)++;

C ++(*p)

D *p++

🔎正确答案: D *p++

【解析】:

  • A. *p+=1;:这将通过指针 p 访问year再修改 year 变量的值,将其增加 1,变为 1010。
  • B.(*p)++;:同上,先访问year变量再将变量的值加 1。
  • C. ++(*p);:同上,只是后置++改为前置++了。
  • D.*p++;:这将会对指针 p 先进行自增操作,这会将 p 指向下一个地址,但不会修改 year 的值。
  1. 选择表达式 11|10 的结果(本题数值均为十进制)

A 11

B 10

C 8

D 2

🔎正确答案: A 11

【解析】:

| 是按位或运算符。将两个数字的二进制表示进行按位或运算,即对应位上只要有一个为1,结果就为1,否则为0。 11 的二进制表示是1011,而 10 的二进制表示是 1010。 按位或运算后,对应位上得到 1、0、1、1,转换为十进制就是 11,因此结果为 11|10 = 11

11:  1011
      10:  1010
     -----------
按位与结果: 1011
  1. char a ; int b ; flat c ; double d ;则表达式 a*b+d-c 值的类型为()

A float

B int

C char

D double

🔎正确答案: D double

【解析】:

知识点根据C语言中的类型转换规则,表达式中涉及到的操作数会被自动提升为更大的类型,以使得表达式能够正常计算。在这里,我们可以考虑操作数的类型提升顺序:char -> int -> float -> double。

所以,根据表达式 a*b+d-c,其中 ab 的类型是 charint,它们会被提升为 int 类型,而 c 的类型是float,会被提升为 double 类型。因此,整个表达式会以 double 类型进行计算,结果的类型也是 double


🌴编程题

📌求两个数的最小公倍数

【题目信息】:

【方法一】:暴力求解,假设最小公倍数为mm1开始每次增加1 ,直到m能同时整除输入的这两个数时,m就是最小公倍数。

#include<stdio.h>
int main() 
{
  int a, b;
  while (scanf("%d %d", &a, &b) != EOF)//多组输入
  {
    int m = 1;
    while (1)
    {
      if (m % a == 0 && m % b == 0)
        break;
      m++;
    }
    printf("%d\n", m);
  }
  return 0;
}

【方法二】:用其中一个数(假设为a* ii1 开始依次递增 1,再利用这个数(即a* i% 另一个数(假设为b),直到 (a*i % b == 0)时,a * i 即为最小公倍数。(相比于方法一大大提高了效率)

#include <stdio.h>
int main() 
{
  int a, b;
  while (scanf("%d %d", &a, &b) != EOF)//多组输入
  {
    int i = 1;
    while (i * a % b != 0)
    {
      i++;
    }
    printf("%d\n", i * a);
  }
  return 0;
}

【方法三】:两个数乘积除以它们的最大公因数(求最大公因数方法:辗转相除法)。

辗转相除法介绍:

辗转相除法,也称为欧几里德算法,是一种用于计算两个数的最大公约数(GCD)的方法。该算法基于以下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

以下是辗转相除法求最大公约数的详细步骤和示例:

  1. 假设要求两个数 a 和 b 的最大公约数,其中 a >= b。
  2. 计算 a 除以 b 的余数,记为 r(a = b * q + r,其中 q 是商,r 是余数)。
  3. 若 r 等于 0,则 b 即为最大公约数,算法结束。
  4. 若 r 不等于 0,则将 b 赋值给 a,将 r 赋值给 b,然后回到步骤 2。

重复执行步骤 2~4,直到余数为 0。此时的 b 就是两个数的最大公约数。

以下是一个示例,求解最大公约数 GCD(48, 18):

  1. 初始值:a = 48,b = 18。
  2. 计算商和余数:48 ÷ 18 = 2 余 12。
  3. 更新 a 和 b:a = 18,b = 12。
  4. 计算商和余数:18 ÷ 12 = 1 余 6。
  5. 更新 a 和 b:a = 12,b = 6。
  6. 计算商和余数:12 ÷ 6 = 2 余 0。
  7. 余数为 0,算法结束。最大公约数为 6。

通过上述步骤,我们得出了最大公约数 GCD(48, 18) = 6。

辗转相除法的优点在于它的迭代过程非常简单且有效。它被广泛用于计算最大公约数和最小公倍数,以及其他一些数学和算法问题中。

#include <stdio.h>
int main() 
{
  int a, b;
  while (scanf("%d %d", &a, &b) != EOF)//多组输入
  {
        int product=a*b;//计算a、b的乘积
        int r=a%b;
        while(r!=0)
        {
            a=b;
            b=r;
            r=a%b;
        }//当c==0时,b的值就是最大公因数
    printf("%d\n",product/b);
  }
  return 0;
}

📌倒置字符串

【牛客网链接:OR62 倒置字符串

【题目信息】:

【方法一】:直接逆序打印,从后往前依次打印单词,因为单词间以空格字符为界,所以可以从字符串末尾遍历计算出空格的位置,每次计算到空格的位置,那么此位置+1就是单词首字母的位置,拿到这个地址打印字符串即可,打印完后将空格位置改成 ‘\0’ ,依次重复上述步骤,直到遍历完这个字符串为止。

#include<stdio.h>
#include<string.h>
int main()
{
  char arr[100] = { 0 };
  gets(arr);
  int sz = strlen(arr);
  while (sz)
  {
    if (arr[sz] == ' ')
    {
      printf("%s ", &arr[sz + 1]);
      arr[sz] = '\0';//打印完将字符串截断,去除打印完的字符
    }
    sz--;
  }
  printf("%s", arr);
  return 0;
}

【方法二】:先逆序整个字符串,再逆序每个单词(也可以反过来,先逆序每个单词,再逆序整个字符串)

#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)//逆序字符串函数
{
  while (left < right)
  {
    char temp = *left;
    *left = *right;
    *right = temp;
    left++;
    right--;
  }
}
int main()
{
  char str[101] = {0};
  //I like beijing.\0
  // 注意不能使用scanf,scanf遇到空格,一次输入接收就结束了
  gets(str);//输入字符串
  //scanf("%[^\n]s", str);//输入一串字符,不包含\n。(第二种输入字符串方法)
  // int ch = 0;
  // int i = 0;
  // while ((ch = getchar()) != '\n')
  // {
  //  str[i++] = ch;
  // } //第三种输入字符串的方法(使用getchar)
  int len = strlen(str);
  //1.逆序字符串
  reverse(str, str + len - 1);
  //2.逆序每个单词
  char* cur = str;
  while (*cur)
  {
    char* start = cur;//记录单词首字符的位置
    while(*cur != ' ' && *cur != '\0')
    {
      cur++;
    }
    char* end = cur - 1;//记录单词末尾的位置
    reverse(start, end);
    if (*cur != '\0')
    {
      cur++;
    }
  }
  printf("%s\n", str);
  return 0;
}

🔥今天的内容就到这里了,有什么问题的话欢迎大家在评论区讨论,也可以私信博主为你解答,如果觉得博主的文章还不错的话, 请👍三连支持一下博主哦🤞

目录
相关文章
|
3月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
85 8
|
4月前
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
113 5
|
4月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
110 4
|
4月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
78 1
|
5月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
896 12
|
6月前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
6月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
6月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
6月前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
6月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。

热门文章

最新文章

  • 1
    小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
  • 2
    3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密
  • 3
    Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 5
    基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
  • 6
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 7
    「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
  • 8
    用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
  • 9
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
  • 10
    阿里云零门槛、轻松部署您的专属 DeepSeek模型体验测试