C语言阶段性测试错题纠正与拓展

news2024/11/23 21:58:24

引言:在2024年4月26日,我进行了C语言知识“期末考试”。通过这次考试,我发现了我的知识漏洞。所以,我写下这篇博客来记录我的错题,并进行纠正,然后对于以前遗忘知识的回顾

更多有关C语言的知识详解可前往个人主页:计信猫

目录

一,选择题

1,第一题

2,第二题

3,第三题

4,第四题

5,第五题

二,编程题

1,第一题

2,第二题

三,遗忘知识的回顾

 1,整型提升和算术提升

Ⅰ,整型提升例题

​编辑 四,勉励自己


一,选择题

1,第一题

 原因分析:在刚看到这道题时,我其实就已经想到了解题的关键,那就是以前所讲到的unsigned char类型的变量的取值范围,如下图:

        可是,就在我进行对i值的不断减三时,我好似发现了一个可以秒杀这道题的地方,那就是unsigned char无符号整型,那这个值i就永远不可能为负数对吧,那退出for循环的条件肯定永远都不会被满足啊,那么不直接就死循环了吗?那答案就是B啊。

        所以这道题我就败在了看题的准确度上,仔细读题,才发现for循环的判断条件是i>0,那么也就意味着,i=0时也可以退出循环

 题目正解:正如前面所提到的unsigned char类型的取值范围只可以为0~255,所以i初始化为7,那么对其不断地减去三,i的值则会如下变化:

        那么每减去一次三,就++j,那么具体的减三次数如下图所示:

        那么2+1+84+1+85=173次,所以答案应该选C。 

2,第二题

原因分析:说实话,这道题错了真该挨巴掌。我当时其实也是分析出来了,x首先为1,经过printf语句后,打印x值为1,之后x加一为2,通过while循环判断条件后x又减一为1,如此往复循环,那么应该是陷入了死循环。但是我当时脑子一抽,认为A选项的1表示的就是死循环的打印1,只是太长了,就没有全部写出来。现在一回想真的是后悔莫及啊!

题目正解:直接上图,不废话了:

        所以如图所示,1,2过程一直循环,始终跳不出while循环,故死循环打印1,答案选D。 

3,第三题

原因分析: 这道题我错的原因是知识点掌握不牢固,感觉每一句话都有模有样很有道理,最后迫不得已扣了字眼,认为D选项不对,一个普普通通的#define的宏定义这么简单的写法,怎么可能比函数(如此强大的工具)效率更高?而事实证明我还是错了,计算机语言做题是十分严谨的,不能去抠字眼,每一道题的答案都要选的有根有据

题目正解:这道题虽然涉及到了C++的语法知识,但是通过排除法还是可以做出来的。从我的笔记来看,我所能归纳出的#define宏的优缺点如下

优点:

1,宏的规模和速度更胜于函数一筹

2,宏的类型与参数的类型无关

缺点:

1,宏在替换时会延长代码

2,宏无法通过调试判断是否出错

3,宏无类型,不严谨

4,宏会带来运算符优先级的问题

        所以根据如上归纳,选项ACD都是对的,那么排除法就是选B。 

4,第四题

 原因分析:这道题的错误原因是知识点掌握错误,而导致了这道题的错误,我的错误笔记如下:

        做这道题时,我还保留着错误的认知,认为int*为4个字节,char*为1个字节,那么不就大小不同吗?所以我就选择了错误答案B(现在错误的笔记已被改正) 

题目正解:我们直接在x86和x64的环境下进行代码实操就行了:

#include <stdio.h>
int main()
{
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(long*));
	return 0;
}

x86环境:

x64环境:

        可以看出,指针变量的大小只与平台有关,32位机为4,64位机则为8。而这道题真正错误的是A选项当我们使用free函数释放掉某个指针所指向的内容时,该指针并不会自动置为NULL,必须我们手动置空。 

5,第五题

原因分析: 这道题错误的原因也是我的知识点掌握不牢固,别无其他原因。

题目正解:我将如下归纳预处理,编译,链接,执行的作用:

一,预处理:展开宏定义,展开头文件,甚至进行更多预处理指令操作(如#error #pragma #line等预处理指令)。

二,编译:将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,发现语法错误,⽣成相应的汇编代码⽂件。

三,链接:地址和空间分配,符号决议和重定位等这些步骤,链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题(于此中发现函数未被定义)。

四,执行:不会引发调试器或测试框架,只是简单地启动应用程序并按照程序代码的逻辑执行代码。

二,编程题

1,第一题

题目正解:首先,我们可以使用以前学到的%10来获取数字的最后一位,/10来去掉数字的最后一位,然后,再将所得到的数字以字符的形式储存到字符数组中,并且每隔三个字符,就额外储存一个“,”,最后,我们再将字符串打印出来就可以了。那么代码如下:

#include <stdio.h>
int main()
{
	int input = 0;
	scanf("%d", &input);
	char arr[100] = { 0 };
	int save = 0;
	int i = 0;
	int count = 0;
	while (input)
	{
		if (count != 0 && count % 3 == 0)
		{
			arr[i++] = ',';
		}
		save = input % 10;//获取数字的最后一位
		input /= 10;//删除数字的最后一位
		arr[i++] = save + '0';//将得到的数字以字符形式储存
		count++;
	}
	i -= 1;//在while循环最后一次时,i++使i多了个1,所以要将i减1
	printf("%s", arr);
	return 0;
}

2,第二题

题目正解:对于这道题目,我们的思路就是首先创造两个字符数组,我们将第一个字符数组的每一个字符于第二个字符数组中遍历,如果第二个字符数组中有该字符,则不打印;反之,就打印该字符所以代码如下:

#include<stdio.h>
int is_exist(char ch, char arr[])
{
	int i = 0;
	while (arr[i])
	{
		if (arr[i] == ch)
		{
			//在第二个字符串中
			return 0;
		}
		i++;
	}
	//不在第二个字符串中
	return 1;
}
int main()
{
	char arr1[101] = { 0 };
	char arr2[101] = { 0 };
	//获得字符串放入两个字符数组
	gets(arr1);
	gets(arr2);
	int i = 0;
	while (arr1[i])
	{
		if (is_exist(arr1[i], arr2))
		{
			printf("%c", arr1[i]);
		}
		i++;
	}
	return 0;
}

三,遗忘知识的回顾

 1,整型提升和算术提升

        在考试中,曾有这么一道题:

        而这道题中,就涉及到了整型提升和算术提升的知识点。整型提升:当变量类型的级别低于int时,算数运算时就会将变量的类型提升为int。算术提升:当变量类型的级别高于int时,算数运算时就会将变量的类型提升为更高的类型

        如此,答案为D选项

Ⅰ,整型提升例题

        那我们现在来看一道与整型提升有关的例题:

#include<stdio.h>
int main()
{
	char a = 5;
	char b = 28;
	char sum = a + b;
	printf("%d\n", sum);
	printf("%c\n", sum);
	return 0;
}

        那么这段代码的输出结果是什么呢?

题目解答: 这道题之中,我们将数字228分别赋给字符变量ab,后面再执行a+b并将结果赋值给sum。那么很明显,在相加的时候,就会发生前面是所提到的整型提升

        所以sum=a+b33,再将33对应的阿斯克码值换算出为'!',故打印出的结果如下:

小问题的解答: 在做这道题时,其实我就会想到一个问题,我们使用字符类型来定义变量a,b和sum,为什么我们却使用整型变量来初始化它们呢?这不就乱套了吗?

        其实,这样初始化并没有错误。因为在计算机中,任何数据都是以二进制代码进行储存的,而每一个字符都有自己对应的阿斯克码值阿斯克码值不就是整型数字吗?那么我们就可以理解为其实字符变量类型储存的其实也是数字,所以我们拿整型对某个字符变量初始化并无不妥

        请注意!如下两种初始化是有区别的!

#include<stdio.h>
int main()
{
	char a = 0;//将数字0初始化a,0的阿斯克码值所对应的字符为NULL(无法被打印)
	char b = '0';//将字符0初始化b
	printf("%c\n", a);
	printf("%c\n", b);
	return 0;
}

        代码一走,结果如下:

 四,勉励自己

        虽然这次考试成绩不理想,但是经过这次的写博客进行总结,感觉学到了很多东西,越来越上道了

        虽然这篇博客的技术含量不高,但是对我来说意义重大这篇博客不仅让我搞懂了以前没有搞懂的知识,并且还让我有了以前上高中时,对着自己没考好的数学卷子改错纠错记错题的感觉,这种记错题的好习惯真的让我受益匪浅。加油吧,每天学习一点点,百万年薪正等着我呢!!!

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

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

相关文章

螺栓的预紧力与夹紧力——​SunTorque智能扭矩系统​

预紧力与夹紧力是紧固件使用中两个重要的力学概念。了解它们之间的关系以及如何正确地应用它们&#xff0c;对于确保机械系统的稳定性和安全性至关重要。本文SunTorque智能扭矩系统将从紧固件的基本概念和用途出发&#xff0c;深入探讨预紧力与夹紧力的概念、影响因素以及实际应…

四信数字孪生水库解决方案,加快构建现代化水库运行管理矩阵

近年&#xff0c;水利部先后出台《关于加快构建现代化水库运行管理矩阵的指导意见》与《构建现代化水库运行管理矩阵先行先试工作方案》等文件&#xff0c;明确总体要求及试点水库、先行区域建设技术要求等&#xff0c;为全面推进现代化水库运行管理矩阵建设工作提供依据。 《2…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

NGINX发布动态页面的方法

一、建立 [rootserver100 html]# vim index.php [rootserver100 html]# pwd /usr/share/nginx/html 二、下载PHP文件 [rootserver100 conf.d]# dnf install php.x86_64 -y 正在更新 Subscription Management 软件仓库。 无法读取客户身份 本系统尚未在权利服务器中注册。可…

【C++】:const成员,取地址及const取地址操作符重载

目录 一&#xff0c;const成员二&#xff0c;取地址及const取地址操作符重载 一&#xff0c;const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的…

微信私域:如何管理多号聊天

我经常要在不同的微信号之间来回切换&#xff0c;这真是既麻烦又容易漏回消息&#xff0c;让我头疼不已。我试过了很多方法&#xff0c;但效果都不太理想。直到有一天&#xff0c;朋友分享了一个微信私域流量管理系统给我&#xff0c;我决定试试看。试用之后&#xff0c;我感觉…

机器学习理论基础—聚类算法

机器学习理论基础—聚类算法 聚类的距离计算 聚类&#xff1a;物以类聚。将相似的样本聚集到一起&#xff0c;使得同一类簇的样本尽可能接近,不同类簇的样本尽可能远离。&#xff08;无监督算法&#xff09; 对于距离的定义&#xff1a;满足下面的四个特点 非负性同一性对称性…

实验 | RT-Thread:L0

1 理解 官网文档&#xff1a;RT-Thread 简介 在 RT-Thread 系统中&#xff0c;任务通过线程实现的&#xff0c;RT-Thread 中的线程调度器也就是以上提到的任务调度器。RT-Thread与FreeRTOS是同等地位的东西&#xff0c;都是属于RTOS项目设置&#xff1a;RT-Thread 4.0.2 基于…

单链表进阶算法题精析

目录 一、回文链表 1.1 题目 1.2 题解 1.3 分析 二、带环链表I 2.1 题目 2.2 题解 2.3 分析 2.3.1为什么该思路可行&#xff1f; 2.3.2为什么只能快指针走两步&#xff1f; 三、带环链表II 3.1 题目 3.2 题解 3.3 分析 四、相交链表 4.1 题目 4.2 题解 4.3 分…

uniapp:K线图,支持H5,APP

使用KLineChart完成K线图制作,完成效果: 1、安装KLineChart npm install klinecharts2、页面中使用 <template><view class="index"><!-- 上方选项卡 --><view class="kline-tabs"><view :style="{color: current==ite…

git出错、文件无法删除、文件无法访问、文件或目录损坏且无法读取 等相关问题处理

一、错误历程与解决方案 1. 在用idea时&#xff0c;突然出现 部分git的命令无法使用&#xff0c;提示错误 2. 尝试删除项目文件夹&#xff0c;重新从git拉取代码 3.发现无法删除文件夹&#xff0c;删除操作没有任何反应&#xff0c;但是可以对文件夹重命名。 4.重新clone g…

【哈希】Leetcode 219. 存在重复元素 II

题目讲解 219. 存在重复元素 II 算法讲解 class Solution { public:bool containsNearbyDuplicate(vector<int>& nums, int k) {map<int, int>Hash;for(int i 0; i < nums.size(); i){//这一步说明前面已经出现过一次这样的数字了&#xff0c;所以用后面…

Android Studio的button点击事件

xml添加onClick调用方法 public class MainActivity extends AppCompatActivity {// 创建系统时间的文本控件TextView systemTimeTextView;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activit…

Docker基本操作 Linux里边操作

docker镜像操作命令: docker images:查看所有镜像; docker rmi:删除镜像 后边可以跟镜像的名字或者id指定要删除的镜像&#xff1b; docker pull:拉取镜像&#xff1b; docker push:推送镜像到服务&#xff1b; docker save :打包镜像 后边有用法; docker load:加载镜像&…

岚图汽车与东软睿驰签署战略合作协议

4月26日,东软睿驰与岚图汽车正式签署战略合作协议,双方将结合在各自领域拥有的产业资源、技术研发和资本运作等优势,聚焦智能化产品和应用,建立长期共赢的战略合作伙伴关系,通过不断探索未来新技术、新产业、新业态和新模式,围绕用户需求共同打造极致的智能出行体验。 图为岚图…

linux,从零安装mysql 8.0.30 ,并且更新至mysql 8.0.36

前言&#xff1a; 系统使用的CentOS 7&#xff0c;系统默认最小安装。 一、基础配置 配置虚拟机IP&#xff0c;需要更改的内容&#xff0c;如下红框中 修改之后 至此&#xff0c;基础配置完成。注意&#xff1a;此处虚拟机网络适配器使用的是&#xff1a;桥接模式 二、软件…

虚拟DOM

虚拟DOM&#xff08;Virtual DOM&#xff09;是现代前端框架&#xff08;如React、Vue等&#xff09;用于优化DOM操作性能的关键技术。Vue也采用了虚拟DOM来提高性能和提供更好的开发体验。以下是虚拟DOM在Vue中的详细解释&#xff1a; 什么是虚拟DOM&#xff1f; 虚拟DOM是一…

【分治算法】【Python实现】棋盘覆盖

文章目录 [toc]问题描述分治算法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;分治算法 学习指南&#xff1a;Python学习指南 问题描述 在一个 2 k 2 k 2^{k} \times 2^{k} 2k2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&…

vue3插槽的name和v-slot的研究

slot可以分为具名插槽和默认,默认插槽name是default 在父组件的template需要些v-slot/#,没写不生效,而在父组件下,而没被template包含的默认放在template且含有#default. 1)没写slot,可以不写template,也可写default的template2)写了name的slot,即使是default也必须些template…

STM32(垃圾桶开关盖)

封装超声波的代码 一、配置引脚的连接 二、配置 三、写代码 四、配置定时器 查找合适的定时器 其实这里的是remap&#xff08;复用&#xff09;&#xff0c;不重要 重要的是看Default才对 仔细查看之后发现还是能用的 先把开关灯封装好 再封装舵机 ----------------------…