- 博客(40)
- 收藏
- 关注
原创 【C语言】深入理解指针
他的四个参数分别是要进行排序的数组base的首地址,base数组的元素个数,每个元素的大小,以及一个函数指针,这个函数指针指向了一个函数,这个函数的参数是两个void*类型的指针,返回类型是int,要求这个函数能够比较参数(这个函数的参数是两个指针)指向的两个元素的大小,规定如果elem1指向的元素比elem2指向的元素大,那这个函数就返回一个大于零的数,反之就返回一个小于零的数,如果elem1和elem2指向的元素一样大,就返回0。指向的元素是int [10]类型的,存放的内容是arr的地址。
2024-02-08 15:11:54 4976 3
原创 【Linux】生物信息学常用命令
如果搭配>,比如我写cat>file ,(这里如果没有file这个文件,则会自动创建一个名为file的文件)按回车,再输入123,我们发现屏幕上什么也没有,然而根据前面的经验我们知道cat已经输出了123,原因在于>把cat的结果重定向了,重定向顾名思义就是重新定义输出方向,此时cat的输出结果也就是123已经输出到了file文件里面,使用>的效果是覆盖原本文件的内容,或者说是先把原文件内容清空然后再把内容输出进去,要想不覆盖掉文件原本内容应该使用>>,使用方法和>一样,写作cat>>file。
2024-07-02 15:55:36 881
原创 【Linux】生物信息学常用基本命令
其中tar是用于打包的命令,-c表示创建一个新文件,-f后面跟的是创建的文件的文件名,最后是要把哪些文件打包,当然可以把这几个文件名全复制下来写在这里,但是比较麻烦,我们发现这几个文件的文件名唯一不同的地方就是1 2 3 4这里的数字,我们使用*替代这个位置,*在这里是通配符的作用,表示只要含有TAIR10_chr什么什么.fas的文件名都要打包起来。yy这个方式就是一次复制一行,但是如果我们想要一次复制好几行,比如三行,就按3y,如果要选择性的复制某些内容,就要按v先进入可视化模式,如图。
2024-06-25 19:45:09 1150
原创 【R语言数据分析】数据类型与数据结构
检查字符串中是否包含目标子串grep("目标字符",字符串变量),grepl(目标字符,字符串变量),表示在字符串变量中寻找目标字符,其中grep函数返回哪些行有目标字符,grepl函数的返回值是逻辑值,有目标字符的行对应位置返回TREU,没有的返回FALSE,由于在R语言中T和F代表1和0,因此通过把基于grepl函数的结果借助as.numeric函数转换成数值型之后,可以在原有数据框添只有1,0的列,当然不转换成数值型也可以,那就添加的是T和F的列。类型全都修改对了之后就可以进行日期时间的差的计算了。
2024-05-01 21:20:21 1435 1
原创 【Python】异常、模块与包
在导入模块的过程中有时候某些模块或者模块中某些功能的名字很长,每次调用就很不方便,我们就可以使用关键字as把这种名字定义成一个别的简单的名字,比如import time as t:这样就把time这个模块的名字用t代替掉了,在下面调用time模块里面的功能的时候就可以写成t.sleep等比如from time import sleep as s:这句代码表示把time中名为sleep的功能名字改成s,这样我们在下面调用sleep函数的时候就可以写成s(5)等,表示暂停五秒。
2024-04-25 19:36:56 806
原创 【Python】函数
函数是组织好的,可重复使用的,用于实现特定功能的代码段,将功能封装在函数内,可供随时随地重复利用,提高代码的复用性,减少重复代码,提高开发效率。函数定义的一般格式为通过def这个关键字来作为定义函数的标识,return是需要缩进的。注:① 参数如不需要,可以省略② 返回值如不需要,可以省略③ 函数必须先定义后使用比如我们要自定义一个用来计算字符串长度的函数,代码如下运行结果为字符串hello的长度为5。
2024-04-19 20:15:11 428
原创 【Python】数据容器及其常用操作
修改列表中的元素,语法为列表[下标]=值。可以发现除了删除列表中的del 列表[]和列表.pop()中使用的是下标,其余的方法()中用的都是内容也就是元素或者容器,在记忆的时候可以把删除的操作记作列表.remove,这样对列表的所有操作的方法中的()均是内容了。数据容器是一种可以容纳多份数据的类型,容纳的每一份数据成为此数据容器的一个元素,根据数据容器是否支持重复元素,是否可以修改,是否有序等等特点可以把数据容器分成五类,分别为列表list,元组tuple,字符串str,集合set,字典dict。
2024-04-19 19:49:22 993 1
原创 【Python】判断语句,循环语句
运行结果为在屏幕上打印三个haha,while循环的组成为while 循环的条件 :然后内部是每次循环要执行的语句,while循环里的语句一般要带有改变循环条件的语句,比如这里的i+=1。if和要执行的语句在不同的行中,以四个空格缩进,表示要执行的语句隶属于上面的if语句,一个if可以掌管任意多条语句,但是都要以四个空格缩进。判断语句嵌套的关键在于空格的缩进,外边的if和else都没有缩进,表示其他们是同级的,if a9的判断语句。还可以把判断条件和输入都集成到if语句的判断条件中去,比如。
2024-04-17 23:40:38 930 1
原创 【Python】基本语法速通
使用占位符这种方式来进行字符串连接的时候,可以理解为要打印的东西就是引号里面的东西,只不过引号中的占位符要被后面变量的内容替换掉,同C语言中的printf函数不同,因为C语言中占位符和后面的变量连接使用的是逗号,python中使用的是%,比如。拼接字符串借助的操作符是+,注意+只能拼接字符串,如果变量中存的是数字等其他类型就无法使用+进行拼接了。注:在Python中,变量无类型,数据有类型,我们平常所说的字符串变量,意思是变量中存储的数据类型是字符串,平常所说的整数变量,意思是变量中存储的数据类型是整数。
2024-04-17 23:37:57 921
原创 谭浩强第五版C语言课后习题(编程题)+答案
辗转相除法的原理是用a除b,如果有余数,就把b赋给a,再把余数赋给b,当a除b余数为零的时候,此时的b就是二者的最大公约数,对于第一次除的时候谁做被除数是无所谓的,因为如果第一次a小于b,那么a除b的余数就是a,然后执行循环内部的操作把b赋给a,把余数赋给b,就变成了被除数大。升序数组中插入一个数的思想:如果在中间插入,就把最后的元素往后挪一位,然后在原来最后一个数的位置上插入我们想要插入的数。15. 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。
2024-03-22 17:35:20 2555
原创 【数据结构】顺序表+链表
想要删除尾部节点首先应该找到尾部的节点,当tail指向尾部节点的时候free(tail),就可以把尾部节点这个空间释放掉,在使用free函数之后,通常要把tail置为空指针,实际上tail作为一个局部变量,置空与否都可以,因为出了这个函数tail变量就被销毁了,并不会产生访问他的情况,实际上我们应该把原来倒数第二个节点的next置为NULL,要改变节点,也就是结构体的一部分,我们应该使用结构体指针,于是我们使用了一个指针prev来找到倒数第二个节点并将这个节点的next置空。因此完整的尾删功能代码如下。
2024-03-05 21:43:03 1051
原创 【C语言】编程题专项练习+答案
这种方法应该注意的是当我们拿到一个大于等于10的数时候,我们应该转化成A~F,在上面的代码中我们是要把数字字符转化成字符A~F,因此应该判断当前数字字符是否大于字符10,但是判断条件不能写>='10'而应该写成>'9',这是因为在C语言中'10'会被认为是一个多字符常量,他的ASCII码值并不是‘9’的ASCII码值+1,我们可以通过写一个代码打印他们两个的ASCII码来观察。这个函数定义在头文件 中。检查字符串str2是否为str1的子串,如果是,返回子串在str1中的位置,如果不是,返回NULL。
2024-03-05 21:36:42 2559
原创 【C语言】文件操作
在我们打开一个文件的时候会自动填充这些信息。换句话说每打开一个文件,系统就会自动在内存中开辟一个结构体变量,这个结构体类型是FILE类型,这种类型是系统自带的,不是我们人为创建的,存放这种结构体类型的指针是FILE*类型的,通过这种指针可以维护这个结构体。我们所说的读,写,输入,输出,其实都是针对当前程序来说的,如果是从键盘上打字,就是输入,或者叫读,如果是数据在屏幕上显示出来,就是输出,或者叫写,可以把当前程序类比成我们本人,我们读一本书,对于我们来说就是输入,我们写一篇博客,对于我们来说就是输出。
2024-03-01 14:27:25 1642 1
原创 【C语言】通讯录(静态版本+动态版本+文件版本)层层深入讲解,附有完整源代码
把fread的返回值也就是成功读取的数据的个数作为while循环的判断条件,如果当前文件中的数据已经读完了,就不用再继续读了,并且我们把读到的内容放到一个临时变量tmp中去,读到的东西是people类型的数据,因此tmp也应该是people类型的,data是一个数组,里面的元素都是people类型的,每次把tmp赋给p->data[p->sz],出循环的时候就读完了文件中的所有信息并且相应修改了sz。然后是增加联系人的函数,在增加之前我们先要判断一下通讯录是不是已经满了,我们使用下面的函数来实现这个功能。
2024-03-01 13:14:21 1105
原创 【数据结构】时间复杂度与空间复杂度
算法的时间复杂度并不是指一个代码运行时间的快慢,因为在不同机器上运行的时间肯定不同,因此算法的时间复杂度指的是基本操作的执行次数,他是一个数学意义上的函数。这个函数并不是C语言中那种函数,而是一个数学函数,比如显然是执行了N方+2N+10次,这个N方假设我们说他是F(N),也就是一个数学函数,那么这个F(N)就是上面这个算法的时间复杂度。但是实际上我们并不一定要计算精确的执行次数,而只需要大概执行次数,因为当N足够大的时候,F(N)的大小主要是由N方决定了,因此我们就可以用N方来近似这个表达式的值。
2024-02-21 16:29:51 1223
原创 【C语言】通讯录(静态版本+动态版本)思路解析+完整源代码
像这样静态版本的通讯录问题还是比较大的,首先就是我们不管存多少个联系人的信息,上来都创建了一个100个元素的数组,这样对内存的开销就比较大,如果我们存的信息少,就浪费了内存,如果存的太多,又要去修改最大容量,在我们学习了动态内存开辟之后,我们可以对通讯录进行如下修改:通讯录刚上来可以存放三个联系人的信息,当通讯录满了之后,自动扩充两个人的名额。我们希望通讯录具有增加联系人,删除联系人,显示联系人,找查联系人,修改联系人,排序的功能,联系人的信息具有名字,年龄,性别,电话,地址的信息。
2024-02-18 15:00:17 1220
原创 【C语言】动态内存管理四大常用函数--malloc,calloc,realloc,free以及动态内存管理的常见问题
动态内存管理的主要函数有malloc,calloc,realloc,free等,这些函数操作的数据都是在堆区上的,我们的内存分为了栈区,堆区,静态区,栈区主要用来存放局部变量和形式参数,堆区主要是用于动态内存开辟,静态区主要存放的是全局变量和static修饰的变量也即静态变量。
2024-02-18 14:56:41 1124
原创 【C语言】自定义类型详解 ----结构体,位段,枚举,联合
可以先创建类型再初始化,也可以在创建类型的同时初始化如图是在创建类型的同时初始化初始化的时候可以直接像sn1一样按顺序写,这样编译器认为是按照结构体成员出现的顺序初始化的,也可以使用点操作符,这样就可以按照自己的顺序来初始化。位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int或char。2.位段的成员名后边有一个冒号和一个数字。冒号后面的数字代表这个成员变量占的比特位。注意是比特位,不是字节。但是位段与结构体是两个不同的概念,比如。
2024-02-16 12:52:58 1982
原创 【C语言】面试常考----- 内存函数memcpy和memmove的功能区别与模拟实现
当然可以,举个例子,12345678这串数字,现在我要把345处的内容拷贝成123,也就是最终让数字变成12123678,此时des在src的后面,如果我先把1拷贝到3的位置,那么后面在想把3拷贝到6处时就很尴尬,因为此时的3已经变成了1,但是如果我倒着拷贝,先把3拷贝到6的地方,再把2拷贝到5的地方,再把1拷贝到3的地方,不就行了吗?于是出现了上图所示的情况。再举一个例子,如果我要把345拷贝到123的位置,此时des在src的前面,我们直接把3拷贝到1的位置,4拷贝到2的位置,5拷贝到3的位置即可。
2024-02-15 15:33:26 839 2
原创 C语言库函数strstr的功能介绍与模拟实现
找的过程显然是一个循环,只要cp没有指向\0我们就让他继续找,找的过程中是*s1与*s2比较,如果二者相等就一直比较,直到一方出现了\0,如果*s1已经是\0但是*s2不是\0,说明str1中已经不可能找到str2,我们直接返回NULL,如果发现*s2是\0,那不管此时*s1是不是\0,都已经找到了str2,此时返回cp。如果cp都已经指向了\0,说明肯定找不到了,返回NULL(实际上只要cp指向的字符串比str2短就不可能找到了)注:这种写法有点像暴力枚举法,效率还是比较低的。模拟实现strstr()
2024-02-14 13:40:34 431
原创 【C语言】常见字符串函数的功能与模拟实现
找的过程显然是一个循环,只要cp没有指向\0我们就让他继续找,找的过程中是*s1与*s2比较,如果二者相等就一直比较,直到一方出现了\0,如果*s1已经是\0但是*s2不是\0,说明str1中已经不可能找到str2,我们直接返回NULL,如果发现*s2是\0,那不管此时*s1是不是\0,都已经找到了str2,此时返回cp。功能:比较两个字符串的大小,如果前者比后者大,返回一个大于零的值,反之返回一个小于零的值,如果二者相等就返回0。当然这种场景是因为我们知道了字符串是什么,有几个分割符。
2024-02-14 13:39:23 1459
原创 【C语言】一道相当有难度的指针题目(某大厂笔试真题)超详解
第二次打印*--*++cpp+3,通过查阅操作符优先级表格可知++操作符,--操作符和*操作符的优先级要比+高,因此+3是最后再算的,经过第一次打印,cpp现在已经指向了cp[1],再++,cpp现在指向了cp[2],解引用,找到了c[1],再--,就拿到了c[0],c[0]也是一个指针,指向字符串ENTER的首元素,类型是char*,再+3就跳过3个char类型指向了E,因此以%s的形式打印结果是ER。学会这道笔试题,相信你对指针的理解,对数组,字符串的理解都会上一个档次。在内存中的存储关系图如图所示。
2024-02-10 12:38:19 462
原创 【C语言】指针专项练习 都是一些大厂的笔试真题 附有详细解析,带你深入理解指针
第四次打印,sizeof内部放的是a[0]+1,其中a[0]是第一行那个一维数组的数组名,这次没有单独放在sizeof内部,因此他代表第一行那个一位数组首元素的地址,也就是a[0][0]的地址,这个地址是int*类型的,+1跳过一个int类型的,因此sizeof内部放的其实是arr[0][1]的地址,他是int*类型的,打印结果是4或8。a[0]是第一行那个一维数组的数组名,代表这个一维数组首元素的地址也就是a[0][0]的地址,打印p[0]也就是*(p+0)就是打印a[0][0],因此打印结果是1。
2024-02-10 12:35:24 1922
原创 【C语言】模拟实现库函数qsort
他的四个参数分别是要进行排序的数组base的首地址,base数组的元素个数,每个元素的大小,以及一个函数指针,这个函数指针指向了一个函数,这个函数的参数是两个void*类型的指针,返回类型是int,要求这个函数能够比较参数(这个函数的参数是两个指针)指向的两个元素的大小,规定如果elem1指向的元素比elem2指向的元素大,那这个函数就返回一个大于零的数,反之就返回一个小于零的数,如果elem1和elem2指向的元素一样大,就返回0。这样我们就拿到了要比较的两个元素,但是这两个元素如何比较?
2024-02-08 15:16:12 1286
原创 什么是大小端字节序存储?如何用代码判断当前的机器是大端字存储还是小端存储?
1.字节序:以字节为单位,讨论存储顺序2.大端字节序存储:高位在低地址处小端字节序存储:高位在低地址处什么是高位?比如1234中1就是高位,4就是低位。3.只有字节数超过一个字节的类型才讨论存储顺序,char类型的变量一共就一个字节,当然就不存在存储顺序的问题。
2024-02-06 14:47:32 400
原创 【C语言】深度剖析数据在内存中的存储
先来介绍一个错误的想法:首先把9放到了n申请的这块内存空间里面,第一次打印肯定是9,没问题,第二次打印是通过*pFloat,他仍然是访问这块空间,拿到的是9,但是打印的时候以%f形式打印,默认是小数点后六位,因此结果是9.000000,然后代码中把n指向的这块空间的内容改成了9.0,再次以%d形式打印,还是9,然后又以%f形式打印这块空间里的内容,应该是9.000000。虽然这里a要存的是128,但是发生截断之后实际存在a里面的补码和上面的-128是一样的,因此打印结果也是一样的,是一个非常大的数字。
2024-02-06 14:39:56 993
原创 【C语言】结构体基础 纯干货 一篇文章带你了解结构体类型的创建,成员类型,初始化,结构体成员的访问,结构体类型传参
然而接下来我们想要用我们自己定义的print_stu函数打印这个已经被初始化的结构体变量s的时候,发现结果居然是0,这是因为我们在初始化s的时候用的是传值调用,在把s传给set_stu函数的时候,这个函数就会在内存空间上创建s的临时拷贝t,然后为t申请一块空间,在这块空间上面进行一系列初始化,此时s并未被初始化,当然打印结果是0。结构体成员访问是通过点操作符或者箭头操作符来实现的,点操作符针对的是结构体类型变量,箭头操作符针对的是结构体类型变量的地址。结构体成员可以是标量,数组,指针,甚至是其他结构体。
2024-02-04 12:50:26 587
原创 C语言中的隐式转换-------整型提升与算术转换
然后要把这个值存到c3里面,会发生截断,最终c3里面存的是01000100,然而在打印的时候我们的打印格式是以10进制整数打印有符号的整数,首先c3发生整型提升,符号位是1,补1至32位,得到补码,负数,计算出原码之后发现是-124。打印结果是1,4,4,这是因为第一次打印c没有参与运算,也就无需发生整型提升,但是后面两次打印c都参与了运算,又c是char类型,因此c要发生整型提升,在运算的时候变成int类型,因此打印结果是4。转换为其他类型,包括两种,一种是整型提升,一种是算数提升。
2024-02-03 13:56:51 539
原创 【C语言】指针基础 纯干货,一篇文章带你了解指针运算,指针数组,二级指针,野指针
要知道指针的大小,首先应该知道地址编号是如何产生的,对于32位的机器来说,有32根地址线,每根地址线可以是高电平也可以是低电平,对应的就是二进制的1和0,这样就可以产生2的32次方个数,这些数就可以用来作为地址编号,而要表示这32位二进制数,需要4个字节大小的空间,因此在32位机器上,指针的大小就是4个字节,同理在64位机器上就能产生2的64次方个数,也就是从64个0到64个1的数字,因此在64位机器上指针大小就是8个字节。也就说平常口头所说的指针是指针变量,而真正的指针是指针变量里面存放的内容。
2024-02-03 13:14:18 395
原创 【C语言】数组的应用:扫雷游戏(包含扩展和标记功能)附完整源代码
这个函数我们是使用递归的方式来写的,这个win就是我们胜利的标准,每走一个格子且不是雷他就+1,他最高加到row*col-雷的个数,这时候我们就赢了。我们传递的是win的地址,也就是进行了传址调用,这是为了能够在函数内部改变外部的变量(关于传值调用和传址调用的问题可以去看我函数的那篇文章),扩展的条件有三个,第一条是我们选择的格子本身不是雷,这个非常好办,,第二条是选择的格子周围没有雷,这个可以通过前面的统计周围雷的个数的函数来判断,第三就是我们所选的格子不能被重复遍历,不然就会陷入死递归。
2024-01-30 11:45:48 1223
原创 【C语言】数组的应用:三子棋游戏
为了方便,我们就让电脑随机下棋即可,电脑下棋我们通过模上row和模上col就能产生0~row-1,与0~col-1,有了这样的限制,电脑就不会产生非法坐标了,生成随机数的方式就是rand函数,在调用rand函数之前要调用srand函数,这是rand函数的语法,srand函数用于设置时间戳,且只需要在主函数中调用一次即可,这里有一个设置时间戳的固定方法就是srand((unsigned)time(NULL)),希望读着能够记住这个写法。假设玩家赢返回*,电脑赢返回#,没有结束返回C,平局返回Q。
2024-01-27 13:16:22 633
原创 【C语言】一维数组,二维数组的创建,初始化,存储,以及数组传参的常见问题,冒泡排序及其错误写法以及优化
假如这是一个四行五列的二维数组,他在内存中的存储形式如图,要想访问第一行的元素,其实就是通过下标arr[0][1]......arr[0][4],前面都是arr[0],也就是说要访问第一行的元素,通过arr[][i]即可,对比一维数组访问的时候比如一个有五个元素的一维数组arr,要想访问他的每个元素只需要通过arr[i]即可,而这个一维数组的数组名是arr,因此我们可以把二维数组的第一行看做一个数组名为arr[0]的一维数组。数值上其实和数组首元素地址是一样的,但是代表的意义不一样。int arr[n];
2024-01-26 11:37:44 628
原创 【C语言】函数的声明,定义,传参,调用,嵌套,递归(图解):汉诺塔问题,青蛙跳台阶问题。学会函数知识点,这一篇就够了
假如我们输入1234,在第一次调用的时候显然是大于9,因此进入if执行下一次print函数,而并没有去打印x%10,这时候传的参数是123,仍然大于9,继续执行print,也没有打印x%10,这时候传的参数是12,仍然大于9,继续执行print,也没有打印x%10,这时候传的参数是1,小于9不进入if而是执行下面的语句打印了x%10也就是1,而这次的print函数是从上一个print函数那里跳过来的,执行完这次就接着上一次的执行,因此打印2,接着是3,接着是4。可以理解为形参是实参的一份临时拷贝。
2024-01-24 17:47:01 920
原创 利用C语言实现猜数字游戏
可以看到参数类型和返回类型都是time_t类型的,这个其实就是long long 类型的重新起了一个名字而已,参数类型无所谓,直接传空指针,返回值是我们需要的,他的类型也是time_t,返回值是一个变化的值,如果写成srand(time(NULL))又出现了问题就是srand需要的是一个unsigned int类型的变量, 我们直接强制类型转换就行了。插入一个知识点叫时间戳,时间戳就是一个数字,这个数字可以转化成某个时间。猜数字游戏:随机生成1~100之间的数字,猜大了或者猜小了会提示。
2024-01-15 22:28:15 407
原创 【C语言】分支语句与循环语句一些需要注意的点
continue的作用是跳过本次循环后面的代码,直接转向循环的判断部分。比如上面这个代码,n刚上来时是1,不会执行if里面的语句也就是continue,而是会直接执行continue下面的语句,从而打印出了1,2,3,4,但是当n等于5的时候,满足if语句的判断条件,因此执行了continue,从而直接跳过本次循环continue后面的代码直接跳转到while的判断条件去,而由于跳过了后面的n++,此时n的值仍然是5,因此又会执行continue而导致程序陷入死循环。注:int a = b = 5;
2024-01-15 22:26:08 994
原创 【汇编语言】寻址方式和指令系统详解(周荷琴第六版)
如果是段间转移的话,JMP后面的目标地址就是32位的,低位表示IP,高位表示CS,此时如果用标号给出目标地址,应该在标号前面加一个FAR,如果由存储器操作数给出,那么存储器操作数指向单元的低位是IP,高位是CS,由于8086没有32位的寄存器,因此段间转移无法由寄存器间接给出目标地址。如果源操作数是8位的,那么他与AL相乘之后是一个16位的数,高八位送到AH,低八位送到AL,如果源操作数是一个16位数,那么他就自动与AX相乘得到一个32位的数,低16位放在AX里面,高16位放在DX里面。
2023-12-17 23:29:53 1747
原创 汇编程序设计
伪指令是一些看起来像指令,但实际上并不是CPU可以直接执行的指令。它们更像是一种特殊的命令,由汇编器(或编译器)处理。伪指令的功能主要是帮助程序员更方便地编写和组织汇编程序。它们可以用来定义数据、布局程序、定义常量和符号,以及进行条件编译等操作。举个例子,如果我们想在汇编程序中定义一些数据,比如一系列的数字或字符,我们可以使用伪指令来简化操作。通过使用伪指令,我们可以直接写下这些数字或字符,并告诉汇编器将它们保存在内存中的特定位置。伪指令会在编译时被汇编器解析,生成相应的机器码或控制信息。另外,
2023-08-15 16:36:09 2042 1
原创 可编程计时器8253与可编程并行接口8255
可编程定时器8253(Programmable Interval Timer 8253)是一种常用的计时器芯片,主要用于计算机系统中的定时和计数功能。它通常被集成在主板或扩展卡上,与中央处理器通过内部总线相连接。8253芯片具有三个计数器(Timer 0、Timer 1和Timer 2),每个计数器都可以独立地进行定时和计数操作。每个计数器可以设置为不同的工作模式,如内部定时、外部计数和脉冲产生等。除了计数功能外,8253还可以产生中断信号,以便CPU在计数器达到预设值时接收到相应的中断请求。编程8
2023-08-14 18:15:20 2459
原创 C语言测试题(附有详细解析)
1.运行结果是啥?fib函数每递归一次cnt就+1 fib就是把大于等于1的数拆成两个数之和,也就说只要fib的变量不是0或1,他就要拆一次,挨着数出来就行了结果是672.这个代码的运行结果是?x后置++,第一次先打印1 然后x变成了2进入判断语句进行判断,判断的时候用的是2后置--x变成了1,然后又回去,导致打印的结果一直都是1 判断条件一直都是2所以运行结果为陷入死循环3.下面代码的运行结果为?int i=1;int j;j=i++;答:把i的值也
2023-07-01 17:15:37 15952 5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人