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

news2024/11/26 13:08:28
  • 💓博客主页:江池俊的博客
  • ⏩收录专栏:C语言刷题专栏
  • 👉专栏推荐:✅C语言初阶之路 ✅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


🌴编程题

📌求两个数的最小公倍数

【牛客网链接:HJ108 求最小公倍数】

【题目信息】:
在这里插入图片描述

【方法一】:暴力求解,假设最小公倍数为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;
}

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】探讨蕴藏在表达式求解中的因素

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将探讨 操作符 和 类型转换 对表达式求解的影响。 目录&#xff1a; 隐式类型转换算术转换操作符的属性❤️ 结语 隐…

调用自实现MyGetProcAddress获得CreateFileA函数并调用创建写入文件

写文件如下 #include <iostream> #include <Windows.h>typedef HANDLE(WINAPI* CreateFileAFunc)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);DWORD MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName ){PIMAGE_DOS_HEADE…

南京邮电大学《基于编译原理的表达式计算器》

文章目录 一、课题内容和要求二、课题需求分析1 过程分析2 设计分析 三、课题相关数据结构及算法设计1 主要数据结构2 主要算法流程3 词法分析4 语法分析5 中间代码生成6 LR语法分析程序6.1识别活前缀的DFA6.2 SLR(1)分析表6.3 分析过程 四、源程序代码1 源代码层次结构2.1 ana…

第十套教程序言:阻止对Sub和Functions的直接访问

【分享成果&#xff0c;随喜正能量】引擎利用后退的力量&#xff0c;引发更大的动能&#xff1b;空气经过压缩&#xff0c;更具爆破的威力。所谓"退一步想&#xff0c;海阔天空。"正可点破我们迷妄执着的盲点。。 《VBA高级应用30例》&#xff08;10178985&#xff0…

前端Excel导入数据后端数据库表未添加主键导致Excel导入数据重复

Java对Excel等文档解析上传到数据库或服务器问题记录 临时功能展示数据库表未添加主键导致Excel导入数据重复 如图,问题发现是因为Excel表中只有两千多条数据但导入数据库后却有五千多条,当时在代码中疯狂找原因也未果,最后尝试给数据库添加主键解决问题! 去除重复数据 总条…

渗透测试漏洞原理之---【CSRF跨站请求伪造】

文章目录 1、CSRF概述1.1、基本原理1.1.1、基本概念1.1.2、关键点1.1.3、目标 1.2、CSRF场景1.2.1、银行支付转账1.2.2构造虚假网站1.2.3、场景建模 1.3、CSRF类别1.3.1、POST方式 1.4、CSRF验证1.4.1、CSRF PoC Generator 2、CSRF攻防2.1、CSRF实战2.1.1、与XSS 漏洞相结合 2.…

构建简单的Node.js HTTP服务器,发布公网远程访问的快速方法

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

超实用的快递单号一键查询方法,帮你省时又省力

快递查询是我们日常生活中经常需要进行的操作&#xff0c;然而&#xff0c;当我们有多个快递单号需要查询时&#xff0c;逐个查询就显得非常繁琐和耗时。为了解决这个问题&#xff0c;今天给大家推荐一款实用的软件——【固乔快递查询助手】。 首先&#xff0c;在浏览器中搜索并…

单片机最小系统构成

51单片机最小系统构成 &#xff1a; 四部分组成 &#xff08;1&#xff09;晶振电路 &#xff08;2&#xff09;复位电路 &#xff08;3&#xff09;电源电路 &#xff08;4&#xff09;下载电路 &#xff08;1&#xff09;晶振电路干嘛的&#xff1f; 单片机需要 时钟 来…

day27 String类 正则表达式

String类的getBytes方法 String s "腻害"; byte[] bytes s.getBytes(StandardCharsets.UTF_8); String类的new String方法 String ss "ss我的"; byte[] gbks ss.getBytes("gbk"); String gbk new String(gbks, "gbk"); String类的…

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&…

bp利用CSRF漏洞(dvwa)

打开dvwa&#xff0c;将难度调为low&#xff0c;点击CSRF&#xff0c;打开后发现有一个修改密码的输入框&#xff1a; 在这里修改密码&#xff0c;并用bp抓包&#xff0c;在http history查看数据包&#xff0c;点击engagement tools中的Generate CSRF Poc根据请求包生成一个CSR…

checkstyle检查Java编程样式:工具类应该隐藏default或者public构造器

所谓工具类&#xff0c;就是在API中只有静态的方法或者属性。对工具类应该隐藏default或者public构造器&#xff0c;方法就是构造器的访问属性设为private的、或者protected&#xff08;如果希望有子类的话&#xff09;。 背后的原理&#xff1a;对工具类进行实例化没有意义。…

Redis数据类型(list\hash)

"we had our heads in the clouds" String类型 字符串类型是Redis最基础的数据类型&#xff0c;关于字符串需要特别注意的是: ● Redis中所有的键类型都是字符串类型.⽽且其他⼏种数据结构也都是在字符串类似基础上构建的&#xff0c;例如列表和集合的元素类型是字符…

社保先关事宜

个人账户实行完全积累制 在社保账户中&#xff0c;有“统筹账户”和“个人账户”&#xff0c;缴费基数均为当地上年度在岗职工平均工资&#xff0c;单位所缴费用相当于缴费基数的20%&#xff0c;进入社会统筹账户。个人所缴费用相当于缴费基数的8%&#xff0c;进入个人账户&am…

抖店总是有人给中差评怎么办?聊下抖店的运营,对你有帮助的!

我是王路飞。 做抖店的商家&#xff0c;最想要的就是店铺爆单以及客户给出好评了。 但是也只能是想想了&#xff0c;每个做抖店或者说做网店的&#xff0c;不可能没遇到过中差评&#xff0c;我们能做的就是尽量避免。 那么抖店总是有人给中差评怎么办呢&#xff1f; 给你们…

分布式锁之mysql实现

本地jvm锁 搭建本地卖票案例 package com.test.lockservice.service.impl;import com.test.lockservice.mapper.TicketMapper; import com.test.lockservice.service.TicketService; import org.springframework.beans.factory.annotation.Autowired; import org.springframew…

定时任务库的详解与魅力应用:探索schedule的无尽可能性

文章目录 摘要一些示例其他的示例向任务传递参数取消任务运行一次任务获取所有任务取消所有任务按标签获取多个任务以随机间隔运行作业运行一项作业&#xff0c;直到某个时间距离下次执行的时间立即运行所有作业&#xff0c;无论其计划如何在后台运行多个调度器 记录日志自定义…

海康机器人工业相机 Win10+Qt+Cmake 开发环境搭建

文章目录 一. Qt搭建海康机器人工业相机开发环境 一. Qt搭建海康机器人工业相机开发环境 参考这个链接安装好MVS客户端 Qt新建一个c项目 cmakeList中添加海康机器人的库&#xff0c;如下&#xff1a; cmake_minimum_required(VERSION 3.5)project(HIKRobotCameraTest LANG…

微信小程序隐私协议接入

自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后&#xff0c;方可调用微信提供的隐私接口。 相关公告见&#xff1a;关于小程序隐私保…