自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 今日收获(C语言)

去掉“标准”,输入流和输出流也可以是指向文件的指针,可以从文件中读取数据而非键盘,可以将数据输出(打印)到文件中而非屏幕。这两个结果其实是有些让人疑惑的:文件里存的是“abcdefg”,假如末尾指向的是 f,那往左偏移2个距离得到的应该是 e,但输出的居然是 f!fwrite有四个参数:需要被写入的数据所在的地址,每个数据的字节大小,写入的数据的数量,输出流。(如果是结构体,就以结构体为单位)。fread也有四个参数:用来存放读出的数据的地址,每个数据的字节大小,读出的数据的数量,输入流。

2024-12-30 22:04:56 792

原创 今日收获(C语言)

base是起始地址,先把它强制类型转换成char类型指针,这可以保证在对它加减整数的时候是以1个字节为单位移动,j*width则代表指针移动的长度,j 是下标,width是每个元素的字节数,相乘就是指针移动的长度,此时指向的就是待排序的元素。对于int my_cmp(const void* e1, const void* e2),void类型保证了它能接收任意类型的数据地址,而void类型的指针是无法被解引用的,要先进行强制类型转换,转换成要比较的数据的类型,然后再解引用找到对应的值。

2024-12-26 00:27:18 845

原创 今日收获(C语言)

这里解释一下形参可以用int** arr的原因:int* arr[10]里面存的是{int* int* int* int*......},存的本来就是一级指针,一级指针的地址应该用二级指针变量来接受。我定义了一个ADD函数,指针pf可以接收它的地址:pf前面的 * 代表它是指针,后面的()代表它指向一个函数,()里面写函数的参数类型,最前面的int是函数的返回类型。p前面的 * 代表它是一个指针变量,它后面的[10]代表它指向一个大小为10个元素的数组,前面的int*代表数组元素的类型。

2024-12-25 18:01:14 689

原创 今日收获(C语言)

实际上,任何小数转换为二进制形式,再以科学计数法表示,小数点前面一定是 1,所以这个 1干脆就不给它储存空间了,输出的时候自动补上一个1就行了。因为while的条件是i < m && k < n,所以当 i 或 k 走到边界时,就跳出循环了,此时要把另一个数组还没有输出的元素输出。E的储存空间为8个bit位,按照无符号整数,最大可以存255(2的8次方减1),即[0,255]。.E为全1,此时代表这个数是无穷大(255-127=128,2的128次方很大),正无穷或负无穷。(相等情况放到1或2里都可以)

2024-12-24 11:16:25 890

原创 今日收获(C语言)

14 00 00 00 和44 33 22 11,这实际上表示的是b和a的16进制,虽然内存中是以补码(二进制码)储存的,为了更容易观察就以16进制表示了。16进制的1位相当于二进制的4位,则两个16进制位就是1个字节(8bit),因为我定义的是int 类型,所以b和a各占4个字节。在前面的博客中说过,原码如果想要转换成补码,需要除符号位的其他位按位取反得到反码,再加1得到补码,简称“取反加一”。结果为:ffffffff(8位),这与地址的储存形式是一样的,因为地址也是以十六进制储存。

2024-12-20 22:30:40 698

原创 今日收获(C语言)

void可以指各种类型,我们不需要明确定义这到底是什么类型,实际上,这是由qsort函数传过来的数据的类型决定的。这串代码很有意思,它在试图查找未知字母对应的值,就像我上面说的 ”有一个样例包含了25个小写字母,所以剩下那一个肯定有与之对应的,要我们自己找出来。* 的数量是:11,9,7,5...即:2*(line-1-i)-1,注意:这里的line-1后还要再减一个 i,i 是不断变化的。那为什么不用gets?qsort的使用:把“存数据的数组,数据的个数,每个数据的大小,compare函数”传进去。

2024-12-18 00:34:38 778

原创 今日收获(C语言)

但值得注意的是 “p+i”。p每次只向后移动2个字节,而数组里的数每个都占4个字节,比如说 a[0]=1,占4个字节就是 00 00 00 01(16进制码),而内存中是倒着储存的。01 00 00 00 02 00 00 00 会变成 00 00 00 00 00 00 00 00。求出1到10000内,假设a是一个n位数,如果a的每一位的n次方相加的和等于a,a就是超级水仙花数。我以16进制的形式初始化a,然后取a的地址,强制性转换成short*类型 ,再存到p里面。

2024-12-13 01:04:14 344

原创 今日收获(C语言)

1的补码有32个1,把它转换成无符号类型时,会被当成一个很大的整数(32个1直接被当成一个正数的原码),它肯定比4大。这道题的条件是:小鱼正在朝一个方向游动,而猎人就离小鱼s米远,猎人的捕猎范围是以他为原点半径为x米的圆,如果小鱼在游到这个范围内的下一秒可以游出去(直线游),那它就可以避免危险,否则就变烤鱼。如果担心写反,就可以在函数形参中用const 修饰 sur,这种情况下如果写成赋值给*sur,程序会直接报错,因为经const修饰,*sur 已经无法被赋值了。我这里加的不是a*0.98,而是a。

2024-12-12 00:58:06 342

原创 今日收获(C语言)

同理,当我定义int** p2时,int** 是它的类型,此时第二个 * 代表p2是一个指针变量,而前面的 int* 代表它指向的是一个 int* 类型的指针变量。当我定义int*p时,int* 是它的类型,* 代表p是一个指针变量,int 代表这个指针要指向一个int 类型的变量。当我把形参改成无符号整数时,它就默认传过来的是正数了,-1的补码是32个1,函数会把它当成一个特别大的正数处理。然后我对p2(即p的地址)解引用(*)得到a的地址,然后再一次解引用(*)得到a的值,将它修改为20。

2024-12-06 22:17:53 490

原创 今日收获(C语言)

int *p=&x;现在我把a的地址赋给了指针变量(注意,是存在p里面了,不是存在*p里,这里不要搞混了。输出结果是9,由此可见:以%d形式输出&a[9] - &a[0],代表a[9]和a[0]之间相差几个元素,即从a[0]一直到a[8]。在32位的操作系统下,指针变量占4个字节(32个bit位除以8等于4个字节),这4个字节是用来存地址的,这个地址相当于一个门牌号。32位系统下,指针变量占4个字节,那如果是char类型的指针变量,我把它加1是跳过了一个字节,这与指针变量占4个字节不冲突吗?

2024-12-05 01:14:46 265

原创 今日收获(C语言)

计算 i 时,a先减 1再使用,a变成了0,此时“--a”位假,根据&&操作符的性质,结果恒为假,所以程序也不会再往后进行,即b和c的值均不会发生改变。此时i++但j没有++,也就是说 j 在一直等着下一个不等于4的数,当循环结束后,直接以 j 为边界从头开始打印,得到的就是“删除不想要的数”的数组。计算 i 时,a先使用再加 1,此时"a++"为真,不管 || 后面是什么,结果恒为真,所以程序不会再往后进行,即b和c的值均不会发生改变。从这串代码中可以看出,“.”的用处可以理解为“连接”结构体中的成员。

2024-12-03 23:54:54 342

原创 今日收获(C语言)

现在把它按位与1,1&1=1,1&0=0。-7的原码是10000000000000000000000000000111(32位),由于负数的原码,反码和补码不相同,所以我们需要经过一些转变来得到它的补码。a是7,其原码为00000000000000000000000000000111(32位),又因为7是正数,所以它的补码就是原码。用右移操作符把a一直向右移动,这会使a的每一位逐渐落到最后一位上,每一次都让它按位与1,如果结果是1,就让计数器+1。现在b就是原来的a,那a-b就是原来的b,把它赋给a。

2024-12-03 11:35:02 877

原创 今日收获(C语言)

二,不再局限于在n*n的棋盘上玩n子棋。再写一个宏定义,代表多少个棋子连成一条线会赢,这意味着我可以在9*9的棋盘上玩五子棋,但是判断胜负也会变得复杂,因为行和列数大于玩家获胜时需要连续的棋子数,同时对角线的平行线也需要判断。一.找到n子棋判断胜负的通法,即想要切换四子棋,五子棋....时,只需要修改宏定义,3改成4或5...即可,不需要再对判断胜负的代码进行修改。1.有这样一个题:假设从周 x (周一,周二...)开始算起,过了 n 天以后,一共度过了多少个工作日?2.今天的重点,三子棋进阶。

2024-11-29 00:30:24 208

原创 今日收获(C语言)

这是两层if循环嵌套,每次大循环结束都会打印两行,由于if条件的限制,最后一次只会打印一行。现在已经写完玩家和电脑下棋的函数了,显然要把它俩放到一个while循环里,总不能只下一次吧。那再进一步讲,我只要把宏定义和#include<stdio.h>写到game.h里,是不是在test.c里只要引用game.h头文件就可以了?即:初始化二维数组的函数。2.game.c(把游戏需要的函数在这里面定义,因为全部放到test.c里的话就太拥挤了)一,game.h(这是一个头文件,用于声明游戏中用到的各种函数)

2024-11-26 23:47:47 583

原创 今日收获(C语言)

1.有一个字符数组,存了一个字符串,现在我要用一个函数把这个字符串逆序,然后打印整个数组。注意:一,不是逆序打印每个元素,而是把数组里的元素全部逆序,然后打印数组。后端用不了这种方法,但我们可以每次都用“\0”代替最后一个元素,这样在下一次计算长度的时候就是我们想要的范围了。把第1个和第7个换位置,第2个和第6个换位置...直到只剩下中间的那个元素(如果偶数个元素的话,对称的均会交换)。b.再次让第1个和最后一个换位置(注意“这里的第1个和最后一个”是缩小范围后的),然后再缩小范围。

2024-11-26 17:35:24 334

原创 今日收获(C语言)

这三个参数代表的字母会改变,但从前往后的顺序一定是起始柱,中转柱,终点柱。那么问题来了,第一个和第三个基本步骤本来也是要拆成3步进行的,但在代码中好像并没有体现出来,仅仅else里三行描述基本步骤的代码,就把问题解决了,这是怎么做到的?现在开始尝试写函数:(为了方便,起始柱,中转柱,终点柱用one,two,three代替)哈哈,这就是递归算法的妙用,自己调用自己,把复杂的过程简化,大事化小。只不过第一个步骤里A是起始柱,C是中转柱,B是终点柱。第三个步骤里B是起始柱,A是中转柱,C是终点柱。

2024-11-26 00:09:39 415

原创 今日收获(C语言)

首先来看第一个问题,递归是函数自己调用自己,把大事化小,想要把1234每一位都拆出来,可以这样想:1234变成123 4,再变成12 3 4,再变成1 2 3 4,所以可以写个函数,把前面几位拆开,打印最后一位,让它不断地调用自己使得每一位都被拆开。比如“abc”,我可以先取第一位的地址,每取一位就加1,继续取下一位的地址,直到遇到“\0”,停止递归。a.int l=sizeof(arr)/sizeof(arr[0])-1可以用来计算字符数组元素个数,这里面的arr就是整个数组的地址,而非首元素地址。

2024-11-22 01:25:17 618

原创 今日收获(C语言)

首先最里面肯定输出43,43是两个字符,所以最里面的printf的返回值是2,所以倒数第二层printf输出2,2是一个字符,所以倒数第二层printf的返回值是1,所以最外层printf输出1。int search(int a[], int k, int r)这里面的a[]仅仅是数组首元素的地址,如果在函数里求r将会得到1-1=0.3.闰年的条件:能被4整除但不能被100整除,或者能被400整除,有366天,正常是365天。7.函数应该是单一性的,最好不要让一个函数既干这个又干那个。

2024-11-18 23:22:00 128

原创 今日收获(C语言)

需要注意的是,第二种求法也算上了字符串末尾的“\0”,所以要减个1。用strlen无需考虑这些,它只会读到\0之前。6,今天最大的收获:猜数字游戏。引入头文件include<stdlib.h>,它包含了system函数,可以执行系统命令。4.goto语句多用于一下子跳出很多次循环。比break方便,但不能乱用。如果想取消,只需system("shutdown -a");一,用strlen函数(一般求法)

2024-11-17 23:27:10 137

原创 今日收获(C语言)

一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?值得注意的是,我在所有条件里都加了i<n-1,这是为了防止数组越界。2.在不知道数量的情况下,如何读取一串整数到数组中。1.一道很经典的题---小水洼。

2024-11-15 01:06:38 223

原创 2.今日收获(C语言)(高效筛素数)(倒序排数字)

i++) //因为gets会自动在字符串后面加上'\0',遍历的时候只需要让a[i]不等于\0就行了。2.如果有一个题给你一个字符串,让你把A到Z转换成1到26再相乘,可以先用gets读取,然后遍历的时候:sum*=(a[i]-'A'+1) //sum类型是int,无需担心前后类型不同char类型是以ASCII码储存的。} //如果i是质数,则i的倍数都不是质数,把这些下标对应的数变成0,让它们不参与下次循环。i++)a[i]=1;

2024-11-13 23:57:41 191

原创 1.今日收获(C语言)(基本知识点)

7.假如吧int b[10010]由1和0组成,遍历的时候我想遇到0就变1,遇到1就变0,只需要下面这一个式子就可以解决:b[i] = 1 - b[i];此时用double可以最大程度的减小误差,而用float定义变量时,有些样例可能无法通过。while(i) //i不为0时始终进行循环。3.对于位数不太多的数字,想找它的子数字,可以用%10和/10来实现。//先除去最后一位,再除去第一位。//先看最后一位是不是2。

2024-11-12 22:52:24 165 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除