C语言阶段的题目解析

前言

我们C语言已经学习的差不多了,但是C语言之中存在的一些问题与难点我们还不一定能够又快又好地解决,为了夯实我们的基础,我们来练习几道稍微有点难度的C语言习题吧

例题一

题目

int main(void)
{
	unsigned char i = 7;
	int j = 0;
	for (; i > 0; i -= 3)
	{
		++j;
	}
	printf("%d\n", j);
	return 0;
}

题解

在开始解题之前,我们需要知道 unsigned char 类型的取值范围是 0~255

所以 i 的取值不可能是一个负数;

所以跳出循环的条件只有可能是 i=0 ;

我们来画一个图分析一下 unsigned char 类型的变量的取值范围的变化过程:

已知 i 的初始值是7,所以当 i 减到1的时候下一次执行-3操作的时候得到的值是254

因为:254 / 3 = 84……2,此时 i 在减去了84个3之后执行 -3 操作得到的值仍然不是0而是2,所以我们还需要向下执行 -3 操作,此时得到的值是255

因为:255 / 3 = 85 ,此时255是3的倍数在执行了85次 -3 操作以后i的值成功变成了0,此时也就跳出了循环;

所以 j 的值就应该是 2 + 1 + 84 + 1 + 85 = 173 次

例题二

题目

以下那个选项一定可以将flag的第二个bit位置0?

A.flag &=~2

B.flag |= 2

C.flag ^= 2

D.flag >>= 2

题解

我们发现:原题目中与flag执行操作的数都是2

因为2是一个正数,所以2的原码就是补码

所以2的二进制补码为:

00000010

而2的反码就是:

11111101

我们直接带入一个特殊的值就可以解决问题:

假设我们有一个二进制的数:

11111111

假设我们要把第二个bit位置为0,我们必须要保证与这个二进制数按位与(&)的二进制数的第二个bit位必须是0

而且其它位上的值不能改变,所以除了第二个bit位,其它位置上的数都必须是1

此时这个二进制数为:

11111101

这个二进制数的二进制形式刚好符合2的反码,所以我们知道这个题目选 A

题目三

题目

struct One
{
	double d;
	char c;
	int i;
};

struct Two
{
	char c;
	double d;
	int i;
};

计算在#pragma pack(4)和#pragma pack(8)的情况下,结构体大小分别是?

题解

该题目只需要把图画出来,就可以很轻松的解决问题

由图片可以知道:

在#pragma pack(4)和#pragma pack(8)的情况下,结构体大小分别是:

16                16                16                24

例题四

题目

在上下文和头文件均正常的情况下,下列程序的输出结果是:

int x = 1;
do
{
	printf("%2d\n".x++);
} while (x--);

A.1

B.无任何输出

C.2

D.陷入死循环

题解

因为题目中打印的是x++,x++是先使用后+1,所以我们就可以知道先打印出的值是1打印完成以后,x执行++操作变成了2

接着我们进入while循环之中的判断,此时条件是x--,因为x是先使用后--,所以判断时x的值是2,而判断完以后x执行--操作变成了1

我们通过分析知道了,x的取值会一直在1和2之中跳动,所以循环永远不会结束

故选:D

例题五

题目

下列程序执行后c输出的结果为?(32位)

void main()
{
	int a = -3;
	unsigned int b = 2;
	long c = a + b;
	printf("%ld\n", c);
}

A.-1

B.4294967295

C.0x7FFFFFFF

D.0xFFFFFFFF

题解

在解题的时候,我们需要知道 -3 的原码、反码、补码

-3 的原码:10000000000000000000000000000011

10000000000000000000000000000011

-3 的补码:11111111111111111111111111111101

11111111111111111111111111111101

2的补码:0000000000000000000000000000010

00000000000000000000000000000010

c的二进制序列:11111111111111111111111111111111

11111111111111111111111111111111

c的补码:10000000000000000000000000000001

10000000000000000000000000000001

此时打印出来的值就是-1

所以答案选:A

例题6

题目

int fun(int a)
{
	a ^= (1 << 5) - 1;
	return a;
}

fun(21)的运行结果是?

A.10

B.5

C.3

D.8

题解

我们知道,1的补码是:

00000001

所以1向左移动5位之后为:

00100000

该二进制位-1得到的是:

00011111

因为我们传入的参数a是21,所以我们应该用21去异或这个值:

00010101
00011111

此时得到的二进制序列为:

00001010

所以打印出来的值是:10

故答案是:A

例题7

题目

下列关于C/C++的宏定义,不正确的是?

A.宏定义不检查函数正确性,会有安全隐患

B.宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量

C.宏的嵌套定义过多会影响程序的可读性,而且很容易出错

D.相对于函数调用,宏定义可以提高程序的运行效率

题解

A、C、D三个选项正确

我们知道,定义一个常量有两种方法:

#define M 10
const int m = 10;

C语言之中,const修饰的变量叫常变量

C++中const修饰的对象就是一个常量

所以在C++中能使用const定义常量就尽量使用const修饰常量,C语言中则相反

所以答案是:B

例题8

题目

#define N 3+1
#define Y(n)((N+1)*n)

执行 z=2*(N+Y(5+1)) 后,z的值为?

A.60

B.190

C.248

D.上述答案都不对

题解

在解决这个问题的时候,我们需要注意:不能提前把N的值和表达式的值计算出来,需要将表达式整体代入,然后按照运算的先后顺序进行运算

此时z可以转化为:z = 2 * (3+1+( (5)*5 +1)

这样计算出来的值就是60

所以答案就是:D

例题9

题目

char a; int b; float c; double d;

则表达式 a * b + d - c 的值的类型是?

A.float

B.int

C.char

D.double

题解

我们知道:a是char类型的,b是int类型的;

所以在计算的时候,char类型的a需要整型提升为int类型

int类型的值乘一个int类型的值结果也是一个int类型的值

当a*b得到的int类型的值与double类型的d计算的时候:

int类型的值会被强制算术转换为double类型的值;

所以a*b+d得到的值就是double类型的值;

同理,float类型的c在与double类型的值计算的时候也会算术转换为double类型的值

所以 a*b+d-c 的值就是double类型的

所以答案选:D

编程题1:

题目

对于一个较大的整数N(1<=N<=2,000,000,000)

比如说489275936,我们常常需要一位一位的数这个数是几位数,但是如果在这个数每三位加上一个“,”,它就会更加易于朗读:489,275,936

请写出一个程序来完成这个内容

题解

我们先来分析一下:(以12345为例子)

1.我们需要采取从右往左处理的顺序,因为如果使用从左往右处理的顺序还需要判断

2.因为我们采取的是从右往左处理的顺序,所以我们需要先提取出数的最后一位5

我们知道,对数采取 %10可以提取出最后一个位的数字,对一个数采取 /10 操作可以去掉最后一个位上面的数字

一直采取 %10 和 /10 操作,最后n的取值就会变成0

3.当我们每次处理完3个数字的时候就加上一个“,”

4.我们可以把提取出来的数放到一个字符数组里面去,当n=0跳出循环的时候再倒着打印数组里面的内容

5.我们每次%10之后的取值是数字5,因为数组是字符数组,此时我们只需要给数字5加上一个'0',就可以变成字符'5'

6.每放三位,就添加一个“,”,此时我们需要定义一个变量k,用来判断是否处理到了3个数。注意:k == 0的时候 %3 也是0,要排除这个情况

7.当我们处理完数组的时候,此时i指向数组最后一个元素的下一个元素所以我们还要加入一个i--操作,让它指向数组里面的最后一个元素

有了这些思路,我们就可以很轻松的写出代码:

int main(void)
{
	char arr[20] = { 0 };
	int N = 0;
	scanf("%d", &N);
	int k = 0;
	int i = 0;
	while (N)
	{
		if (k != 0 && k % 3 == 0)
		{
			arr[i++] = ',';
		}
		arr[i++] = N % 10 + '0';
		N = N / 10;
		k++;
	}
	for (i--; i >= 0; i--)
	{
		printf("%c", arr[i]);
	}
	return 0;
}

编程题2

题目

题解

我们先来分析一下:

1.再输入字符串的时候最好不使用scanf函数,因为scanf函数在遇到空格的时候就不会再往后读取了,此时我们需要用到gets函数

2.我们需要逐步判断arr2字符数组里面的每一个元素,如果arr1数组里面有这个元素,就把它删除

   思路一:在删除完一个元素以后,我们要把这个元素以后的所有元素全部往前挪

   思路二:我们遍历arr1数组,看arr1数组里面的每个元素在不在arr2数组中存在,如果在arr2数组中存在,就不打印出来,反之则打印

(因为思路二的效率更高,所以我们采用思路二)

3.当arr1数组遍历到 \0 的时候,跳出循环

有了这些理论基础,我们就可以写出代码如下:

int is_exist(char ch, char arr[])
{
	int i = 0;
	while (arr[i])
	{
		if (ch == arr[i])
		{
			return 1;
		}
		i++;
	}
	return 0;
}


int main(void)
{
	char arr1[200] = { 0 };
	char arr2[200] = { 0 };
	gets(arr1);
	gets(arr2);

	int i = 0;
	while (arr1[i])
	{
		if(is_exist(arr1[i], arr2) == 0)
		{
			printf("%c", arr1[i]);
		}
		i++;
	}
	return 0;
}

上述代码中的is_exist其实可以用库函数实现,库函数中有一个函数叫做strchr

如果出现了某个字符,就返回这个字符的地址,如果没有出现这个字符,就会返回NULL

strchr的头文件是<string.h>

所以此时我们还有一种写法:

#include <stdio.h>
#include <string.h>
int main(void)
{
	char arr1[200] = { 0 };
	char arr2[200] = { 0 };
	gets(arr1);
	gets(arr2);

	int i = 0;
	while (arr1[i])
	{
		if(strchr(arr2, arr1[i]) == NULL)
		{
			printf("%c", arr1[i]);
		}
		i++;
	}
	return 0;
}

如果此时我们使用scanf也可以实现,只不过格式有点复杂:

int main(void)
{
	char arr1[200] = { 0 };
	char arr2[200] = { 0 };
	scanf("%[^\n]s", arr1);
	getchar();
	scanf("%[^\n]s", arr2);

	int i = 0;
	while (arr1[i])
	{
		if(strchr(arr2, arr1[i]) == NULL)
		{
			printf("%c", arr1[i]);
		}
		i++;
	}
	return 0;
}

此时需要用getchar清除缓冲区,会比较复杂,难以理解,所以不建议使用

结尾

本节我们练习了9个选择题和2个编程题,有助于我们夯实C语言的基础,查漏补缺,那么本节的内容就到此结束了,希望可以给您带来帮助,谢谢您的浏览!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PyTorch 实战3:YOLOv5检测模型】10min揭秘 YOLOv5 检测网络架构、工作原理以及pytorch代码实现(附代码实现!)

YOLOv5简介 YOLOv5&#xff08;You Only Look Once, Version 5&#xff09;是一种先进的目标检测模型&#xff0c;是YOLO系列的最新版本&#xff0c;由Ultralytics公司开发。该模型利用深度学习技术&#xff0c;能够在图像或视频中实时准确地检测出多个对象的位置及其类别&…

千锤百炼之每日算法(三)

题外话 不会再水了,先把算法任务完成! 正题 第一题 简写单词 规定一种对于复合词的简写方式为只保留每个组成单词的首字母,并将首字母大写后再连接在一起 比如“College English Test"可以简写成“CET",“Computer Science 可以简写为"CS"&#xff0c;I a…

【深度学习】【Lora训练1】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境&#xff1a; 项目源码获取&#xff1a; 通过以下命令轻松克隆项目及所有子模块至您的Linux系统&#xff1a; git clone --recu…

《ElementUI 基础知识》el-tabs header 监听鼠标中键滚动时左右滑动(ElementPlus同样适用)

前言 收到需求&#xff0c;可监听 el-tabs 头在鼠标 hover 时。滑动鼠标中键&#xff0c;可左右滑动&#xff01; 效果 鼠标中键上下滑动时&#xff1b;向上滑&#xff0c;向左移动&#xff1b;向下滑&#xff0c;向右移动&#xff1b; 实现 代码56 - 60行&#xff0c;添加…

寝室快修|基于SprinBoot+vue的贵工程寝室快修小程序(源码+数据库+文档)

贵工程寝室快修目录 目录 基于SprinBootvue的贵工程寝室快修小程序 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 在线报修管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&a…

操作系统安全:安全审计,Windows系统日志详解,Windows事件ID汇总

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

C++深度解析教程笔记2

C深度解析教程笔记2 第3课 - 进化后的 const 分析实验-C与C的const区别实验-C与C的const区别&const作用域 第4课 - 布尔类型和引用小结 本文学习自狄泰软件学院 唐佐林老师的 C深度解析教程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 第3课 - 进化后…

Unity 递归实现数字不重复的排列组合

实现 private void Permutation(List<int> num, int leftIndex, List<string> strs) {if (leftIndex < num.Count){for (int rightIndex leftIndex; rightIndex < num.Count; rightIndex){Swap(num, leftIndex, rightIndex);Permutation(num, leftIndex 1…

HarmonyOS 鸿蒙下载三方依赖 ohpm环境搭建

前言 ohpm&#xff08;One Hundred Percent Mermaid &#xff09;是一个集成了Mermaid的命令工具&#xff0c;可以用于生成关系图、序列图、等各种图表。我们可以使用ohpm来生成漂亮且可读性强的图表。 本期教大家如何搭建ophm环境&#xff1a; 一、在DevEco Studio中&#…

前端可以掌握的nginx相关操作

一、前言&#xff1a; 在日常开发中&#xff0c;前端工程师可以把打好的前端包直接放到测试服务器上&#xff0c;自己再验证功能是否改好&#xff0c;这样可以提高开发效率&#xff0c;写篇笔记记录一下我个人用到的命令 二、使用的工具 用MobaXterm完成相关操作&#xff0c…

Vue3 + TS 项目实战 - 后台管理系统 - 按钮权限

前期回顾 网站的打赏 —— 新一代的思路-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136704914?spm1001.2014.3001.5501 目录 &#x1f6a9; XX银行_系统管理_按钮权限控制_前端_提测单 项目信息 提测版本信息 功能列表 测试范围 测试环境 ✅ 步…

[paper note]代码生成评估模型-CodeBLEU原理分析

论文信息 论文标题&#xff1a;CodeBLEU: a Method for Automatic Evaluation of Code Synthesis 发表时间&#xff1a;2020年9月 论文原文&#xff1a;CodeBLEU: a Method for Automatic Evaluation of Code Synthesis 论文内容 摘要 评价指标对一个领域的发展起着至关重…

大厂常见算法50题-替换空格

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法一 String类replace方法解法二 遍历替换总结 题目 解法一 String类replace方法 String类自带的replace&#xff0c;方法传入两个char类型的参数&#xff0c;分…

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CNN-GRU…

蓝牙低能耗安全连接 – 数值比较

除了 LE Legacy 配对之外&#xff0c;LE Secure Connections 是另一种配对选项。 LE 安全连接是蓝牙 v4.2 中引入的增强安全功能。它使用符合联邦信息处理标准 (FIPS) 的算法&#xff08;称为椭圆曲线 Diffie Hellman (ECDH)&#xff09;来生成密钥。对于 LE 安全连接&#xff…

【Stream流基础篇】Java中的函数、函数对象、函数接口和方法引用及转换

什么是函数 在数学中&#xff0c;函数是这样定义的&#xff1a;它是给定一个数集A&#xff0c;假设其中的元素为x&#xff0c;对A中的元素x施加对应法则f&#xff0c;记作f&#xff08;x&#xff09;&#xff0c;得到另一数集B&#xff0c;假设B中的元素为y&#xff0c;则y与x…

pytorch中的过拟合和欠拟合

基本概念 我们知道&#xff0c;所谓的神经网络其实就是一个复杂的非线性函数&#xff0c;网络越深&#xff0c;这个函数就越复杂&#xff0c;相应的表达能力也就越强&#xff0c;神经网络的训练则是一个拟合的过程。   当模型的复杂度小于真实数据的复杂度&#xff0c;模型表…

GMSSL编译iOS

一、GMSSL-2.x 国密SDK源码下载&#xff0c;对GMSSL库进行编译生成对应的静态库。执行如下命令&#xff1a; cd到SDK源码目录 cd /Users/xxxx/Downloads/GMSSLV2-master查看SDK适用环境 ./config上图中错误解决方法 使用文本编辑器打开SDK目录下Configure、test/build.info、…

【STM32F407+CUBEMX+FreeRTOS+lwIP之UDP记录】

STM32F407CUBEMXFreeRTOSlwIP之UDP记录 基本信息cubemx配置GPIONVICRCCSYSETHFREERTOSlwIP UDP&#xff08;SOCKET&#xff09;效果 UDP广播&#xff08;SOCKET&#xff09;效果 UDP组播&#xff08;SOCKET&#xff09;cubemx注意以下ethernetif.c效果 可参考正点原子和野火的手…

深度学习论文:Local Feature Matching Using Deep Learning: A Survey

深度学习论文: Local Feature Matching Using Deep Learning: A Survey Local Feature Matching Using Deep Learning: A Survey PDF: https://arxiv.org/pdf/2401.17592 1 概述 近年来&#xff0c;深度学习模型的引入引发了对局部特征匹配技术的广泛探索。本文旨在全面概述局…