自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 编程(48)----------网页打开的过程

连接建立以后, 作为客户端这一方就会发起请求. 这里以百度为例. 客户端会发起一个打开百度搜索的请求. 这个请求常见的以GET和POST居多. 但就自身而言, 更倾向于使用POST. POST与GET相比更为安全, 因为不会将传递参数显示在URL上. 但二者本质区别是GET是从服务器上获取数据, 而POST是向服务器内传递数据.这里大致的过程是客户端发起一个FIN断开连接的请求, 然后服务器回应, 确认断开. 稍后再以同样的方式, 以服务器再发一次, 这样双方就断开了连接.已回:我听得见, 你听的见吗?

2023-09-18 09:30:00 134

原创 编程(47)----------Spring AOP

假设, 有一个过滤器. 需要在一堆大小不一的豆子当中过滤出小的豆子用于碾磨成粉. 这个过程其实就可以抽象成AOP. 切面就是这个过滤装置, 连接点就是要进行过滤的豆子, 它们有大有小, 而切点就是那个漏斗, 只有小的能够过去, 碾磨成粉就是通知, 即具体的要对过滤出来的方法具体实现的措施.AOP是Spring中, 个人认为较为抽象的一个思想. 一般来说, 学习一个新东西, 第一件事是先看看这个知识点的定义是什么. 同时要注意, 同一事物的定义可以有很多, 毕竟定义没有绝对的对与错, 只有准确与否.

2023-09-17 15:27:09 121

原创 编程(46)----------个人项目

一个大型的项目要实现数以万计的人进行访问, 那么这个项目必然不可能只存在于某一个服务器当中, 而必须实现多个服务器分布. 但是这时存在一个问题. 假设某个项目客户第一次登录访问时是在服务器A中, 登录后服务器A创建了session以便于进行项目其他操作. 但是由于该项目是分布于多个服务器当中的, 那完全有可能客户在进行二次访问时恰好访问的是服务器B. 那么由于session只存在于服务器A中, 故需要再次执行登录操作.在该项目中就实现了一个简单的拦截器, 并排除部分非拦截内容, 如前端的渲染.

2023-09-05 16:53:45 43

原创 编程(45)----------事务

还存在一种更特殊的情况. 在事务1提交数据后, 事务2进行读取时, 多次读取发现数据的值虽然是一样的, 但是结果集不一样. 比如本身读取数字5, 反复读取确实也是数字5, 没变的值. 但是在某一次读取时, 却多出一个除5以外的值. 这种情况被称为幻读. 在这样的情况下, 读加锁与写加锁其实已经无效化了, 只能实行事务串行化. 即单线程进行事务的处理.在事务中进行查询某个数据时, 无论查询多少次, 查询的数据都应该是合理的. 比如微信钱包余额. 不可能在不使用的情况下, 每次看数字都不一样.

2023-07-11 11:30:00 73

原创 编程(44)----------MySQL索引存储

因此, 若要查询某个值. 其实就是一个很看脸的过程. 如果查询的值为33, 可直接找到. 若为9或其他就得进行多次的IO访问. 与二叉树相比B树减少了树的高度也就是降低了IO访问次数, 但实际执行效果并不稳定, 以此所构建出的产品不同的用户体验差距是很大的, 故由此基础上才进行了改进有了B+树。-----------------------------------------最后编辑于2023.7.10晚上八点左右。2. 无论如何查询最终都会落到子节点上. 这样访问IO的次数都是固定稳定的.

2023-07-10 20:09:32 110

原创 编程(43)----------ConcurrentHashMap

因此, ConcurrentHashMap优化的第一个地方就是将这个大锁进行细化. 在JDK1.8以前, 是将哈希表数组中的每几个进行上锁. 但是这样效果并不好, 之后就直接进行单独加锁. 即将每个链表的头结点作为加锁对象. 这样既可以保证访问同一个链表时加锁, 不同链表之间也能有效同时进行访问.但如果两个线程访问的是c和d呢?很显然这个时候其实无需加锁. 因为二者根本是在不同的链表上的. 在这种情况下加锁毫无意义. 二者访问根本不会收到影响. 只会白白因为加锁而浪费资源和时间.

2023-07-03 20:45:20 121

原创 编程(42)----------锁策略

第二个用法就是实现自旋锁. 以一段伪代码来大致描述其过程, 因为是伪代码, 拿到Idea上肯定是会报错的. 在CAS实现自旋锁的时候, 会进行判定, 判定当前的owner是否为空, 而owner是用来判定是否加锁的, 若为空即为未加锁. 因此, 为空时与判定值相同, 就进行交换把当前线程的引用赋值给owner, 即加锁成功, 返回true, 从而结束循环. 若owner不为null, 即锁已被别的线程占用, 返回false, 循环判定而实现自旋.既是轻量级锁也是重量级锁;

2023-06-16 20:10:00 142

原创 编程(41) ----------线程池

假设打包这个操作是"内核态", 也就是必须要由内核操作来完成. 因此, ABC都必须将袋子交给服务员进行打包. D是属于线程池中的线程, 是属于"用户态", 所执行的是程序员自己所写的代码, 想怎么做全由自己决定. D可以选择将袋子给服务员, 但是服务员不一定会马上帮他打包, 因为已经有客户在进行等待. 同样的道理, 一个系统内核也不是只处理一个线程. 不可能来一个处理一个.-----------------------------------最后编辑于2023.6.14晚上八点左右。

2023-06-14 20:03:42 465

原创 编程(40)----------单例模式

想象一个这样的场景, 打游戏的时候, 尝试很多次, 都未通关. 这种情况下是否会考虑查一下攻略?首先就从判定改写入手. 在多线程中, 由于读入, 判定, 改写的操作不具有原子性, 是分开的操作. 很有可能一个线程刚判定完, 为null, 另一个线程也开始判定, 结果也为null. 在这种情况下二者都会依照代码在此基础上new一个对象. 但是这实际上是违背了单例模式的规则. 因此要对整个过程进行加锁操作.------------------------------最后编辑于2023.6.1晚上八点左右。

2023-06-01 20:09:00 535

原创 编程(39)----------多线程中的锁

假设吃面的人必须得先拿起他左边的筷子, 再拿起他右边的一根筷子. 那在这种情况下考虑极端情况, 当五个人同时都想吃面时, 会同时都拿起左边的筷子, 且右边没有筷子可拿. 这个时候就僵住了, 谁也吃不了面, 谁也不会放下筷子. 同理, 在多线程种, 每个线程就好比每个人, 每跟筷子就好比每个锁, 考虑极端情况, 会出现这种全部僵在一起的状态.这时是否可以考虑开绿灯呢?4.循环等待. 也就是刚才所演示的. 线程一获得锁A的同时, 线程二获得锁B. 然后线程一要获得锁B, 线程二要获得锁A, 僵持不下.

2023-06-01 14:42:45 407

原创 编程(38)----------计算机的部分原理

常见的输入设备,如鼠标,键盘. 输出设备如显示屏,音响耳机. 当然也存在如触摸屏这样的输入输出一体的设备. 而在现如今的计算机中,除这些必备的硬件以外还有如显卡,散热器这些用于更方便使用计算机的硬件. 但无论如何, 冯诺依曼体系中提到的硬件, 是必须存在的.也就是说,假设某个应用程序要调用相应的硬件,就得逐层调用. 先通过系统调用提供的api, 把命令告知于内核,内核在调用相应的驱动程序识别出相应的硬件,实现调用. 反之也是如此, 例如简单的在电脑桌面上双击打开一个应用程序,也是如此逐层调用.

2023-05-28 16:48:32 525

原创 我的编程经历(37)----------搜索树和哈希表

假设某个数组为{0, 1, 2, 3, 4, 5},要将其存放在某个哈希表中,假设哈希表的对应关系,也就是哈希函数为key = val % 哈希表的长度(假设哈希表长度为10),val即为数组中某个元素的值。因此哈希表实际上每个节点都是一个类似于链表的结构,若有元素存放于此,就以头插或尾插的形式将其接续在后面。例如2 % 10 = 2 就在对应的哈希表中2的位置存放一个值为2的元素。但其问题在于,若要存放12,依照此哈希函数得到的仍是2,因此会出现冲突。其二,其右子树的值必定大于其根节点的值;

2023-05-18 17:15:30 40

原创 我的编程经历(36)----------排序

给定一个集合如{5 8 9 6 3 9 85}, 将其以一定形式进行排序后可见,由于该数组集合种存在两个相同大小的元素,因此排序后的这两个元素肯定是紧挨着的。如果排序前后二者的相位置未发生改变,则为稳定的排序,反之则为不稳定排序。将一个集合中的元素间隔等分成若干个组,再对每个组中的元素进行插入排序,直到组数为一,由于依次排序,整个数组会越来越有序。其思想是将一个待排序的集合进行划分,划分至不可分割为止,再将每个分组中的元素进行排序,使其在该序列中有序,再将两个有序的序列合并,以此类推。

2023-05-16 11:02:56 33

原创 我的编程经历(35)----------优先级队列(堆)

如上图所示,即为一个最小堆:父亲节点的值始终小于其孩子节点的值,最大堆则反之。则在对该完全二叉树进行层序遍历时,必定于数组的遍历结果是相同的,此时就满足堆的性质。已知父亲节点层序遍历下标为n,若其有左右孩子节点,则左孩子节点下标为:2n + 1;4.该接口与其他接口一样,在使用时要调用其构造方法。但是该接口的不带参数的构造方法默认创建的优先级队列容量为11。------------------------最后编辑于2023.5.12下午六点左右。1.该接口所放置的元素必须是要能够比较的;

2023-05-12 17:51:11 34

原创 我的编程经历(34)----------二叉树基本操作

1.二叉树的遍历,分为三种。三者不同之处在于根的位置,前序是先遍历根节点再左子节点右子节点。二叉树相较于其他数据结构来说,较难。其原因之一是代码多使用递归的形式进行。再构思上可能一时之间想不出来,因此需要多画图思考。----------------------------最后编辑于2023.5.10晚上十点左右。本篇总结二叉树的一些基本操作。

2023-05-10 21:40:13 34

原创 我的编程经历(33)----------二叉树理论部分

也就是说二叉树的节点的度不可能大于2。假设有两个子节点的节点为n2,有一个子节点的节点为n1,没有子节点的节点为n0。在这个图中A即为根节点,同时其也是B E D的父节点,反之这三者是A的子节点,下一层的节点也是如此。--------------------------------------最后编辑于2023.5.4下午五点左右。父节点或双亲节点:若某个节点含有子节点,则该节点为其子节点的父节点,如图中C的父节点为B;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点,如图中G为E的子节点;

2023-05-04 16:55:52 48

原创 我的编程经历(32)----------栈与队列

但要注意,进栈与出栈的顺序并非是无限制的。假如有一个集合有四个元素分别是1234,要依次将其放入栈中并且中途可以出栈,那其出栈顺序并非是无限制的,如3142的出栈顺序就不可能实现。因为当3入栈再出栈以后,下一个是2而非1。队列,即只允许在一端进行插入数据操作,而在另一端进行删除操作的特殊线性表。一般来说插入的是队尾,删除的是队头。所谓栈,即一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。就像一个瓶子,先进去的在底部,后进去的在顶部。相较于前面几篇,本篇总结的栈与队列可能会相对简单一点。

2023-05-03 17:04:12 37

原创 我的编程经历(31)----------简单的洗牌

当牌被洗好之后,这里假设摸牌规则是三个人每个人每一轮摸一张牌,一共摸五轮,也就是一共十五张牌。首先思考一个问题,既然要做的是洗牌,那肯定得先有牌。-----------------------------------------------------最后编辑于2023.4.29晚上七点半左右。利用这个方法,适当调用add方法便能获得一套五十二张的纸牌。有了这个类以后便可以获得牌。但获得的牌得存放起来,这里就可以使用ArrayList。前提是除开大小王,并且J Q K这些都以数字代替。

2023-04-29 19:18:58 37

原创 我的编程经历(30)----------String类的初识

但是,若将str2中的字符串改为其他字符串是不会影响str所指向的字符串的。由于字符串本身不可变的特性,为方便对字符串的修改便提供了StringBuffer和StringBuilder类,二者大部分功能都是相同的,不同点之一是前者是多线程后者是单线程。那假如再此基础上,新建一个str2 = str 就会在栈中再开辟一块空间,其中存放的也是与str一样的地址0x111,二者都指向堆中的hello。也就是说假设要拼接几个字符串,并非是简单的修改了字符串将其连在一起,而是每拼接一次就会new一个新的字符串对象。

2023-04-25 14:47:40 39

原创 我的编程经历(29)----------包装类和泛型(简单认识)

而且包装类是属于引用类型,一旦新建则会在内存上开辟新的空间,因此二者不可能相等,因为所存的是不同的地址,如果调用equals,比较二者的内容,那么都为10,则是true。为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应上了一个包装类型,除int与char的包装类分别时Integer和Character以外,其余的基本数据类型的包装类都是其首字母大写。---------------------------------------------------最后编辑于2023.4.24晚上八点左右。

2023-04-24 19:52:07 31

原创 我的编程经历(28)----------异常

在捕获异常中并非必须使用。这里就要简单说明一下,无论是空指针异常NullPointerException 还是 数组越界异常ArrayIndexOutOfBoundsException都是隶属于Exception这一大类的子类,也就是说,Exception类是所有异常类的父类,虽可用之表示所有异常,但范围过大,不建议使用。除此以外,若本方法中没有适合的处理异常的方式,那么就会沿着调用栈向上传递,若一直都没有则会传递到JVM处理,,这样程序会直接异常终止,code 1,与不使用try catch语句一致。

2023-04-22 16:14:47 36

原创 我的编程经历(27)----------面对对象编程(2)

但是若要比较的是name这样的String类型,就得再调用一次compareTo方法,不能直接比较。平常比较数组的大小都是调用Array.sort来进行的。其比较的属性是固定死了的,若要改变只能改变其compareTo中的代码,若随意改动,会造成一系列的连锁反应。10.注意权限问题,当一个类重写某个接口的抽象方法时必须加上public,否则默认的是包访问权限,而抽象方法默认的是public,比包访问权限更广。在具体实践中使用哪一个跟具体的业务存在关系,但比较器是较为推荐的一个,其功能相比之下更为安全。

2023-04-14 15:56:05 31

原创 我的编程经历(26)----------面向对象编程

本片总重点总结Java部分语法知识。1.包和类在IDEA上写代码的时候,执行 部分命令时会需要一些IDEA本身自带的关键字。而为了能使这些关键字生效,就需要进行引用,而引用置于顶部,用import进行表示。如:import java.util.Arrays 这代码的意思是引用java文件中util包中的Arrays这个类。而所谓的包就是对一个类的总体的囊括。在平常写代码的时候一般都是建立一个包,在包中进行代码的书写。当然,在一个类中写代码时所要应用的本身就已经封装好的关键字肯定不止一个,这个时候可以

2023-04-11 15:55:14 27

原创 我的编程经历(25)----------无头单向非循环链表的实现

一个节点分为两个域或者说两个部分,一个是数值域,存储的这个节点的具体的数值,一个是引用域,存储的是下一个节点的地址用于连接不同的节点以实现逻辑连续。在一个链表中一个节点的引用域存放的是下一个节点的地址,正如图中所示第一个头节点head存放的0x888是第二个节点的地址,依次类推直到最后一个节点,由于后面不再有节点,置为null。其他位置的插入,就是将要插入的节点的引用域改为前置的引用域,前置的引用域改为插入的节点的地址。这个属性是属于链表的,因此不能定义在节点的类中而是定义在链表的类中。

2023-04-02 19:16:44 36

原创 我的编程经历(24)----------顺序表

因此才需要顺序表,即定义一个类,在类中对数组的值进行增减删改。光是考虑这些也并不全,如果在赋值之前,这个顺序表已经满元素了没有空位了,又谈何赋值,那就必须对顺序表进行扩容。这里也是如此,既然要删除某个元素,那肯定这个顺序表是不能为空的,再调用先前的方法获取对应元素的下标,删除即将其覆盖。例如在进行编写顺序表的赋值方法时,首先得考虑若要在某个位置进行赋值,那这个位置肯定不能为负数。因为顺序表的底层运行逻辑是数组啊,数组的下标是不可能有负数的。但是,若元素为引用,需将每一个置为null,直接置零是不行的。

2023-04-01 19:17:51 32

原创 我的编程经历(23)----------复杂度

当求第N个斐契那波数时,需要将N - 1 与N - 2 的值相加,同样的道理求N - 1时需要将N - 2 与N - 3相加,以此类推直到减到N - ( N - 1)也就是1的时候,不再继续递归,因此每次递归执行的次数和递归次数都是N,所以O(N^2)。当n的值特别大的时候,加法的后面两项其实就可以忽略不计,因此这个代码基本操作次数,使用大O渐进表示法就是O(N^2)。在这段代码中,可以大概估算一下执行次数。代码运行到第八行的次数是n * n,运行到第十二行的次数是2 * n,运行到第十六行的次数是10。

2023-03-29 15:38:34 32

原创 我的编程经历(22)----------类和对象

注意,在获取成员值的时候,在类的变量中添加了this.,若不添加,由于形参的名字和类中的成员属性的名字一样,就会造成自赋值的情况,而this表示的是对当前实例的引用,避免造成这种情况。那么类的使用者在使用后,如果类的实现者对代码进行了修改,那类的使用者也必须对代码一步一步的修改,维护成本极高。并且,执行顺序也是有规定的。注意,由于静态属性的实现不依赖于具体的实例,所以在成员方法中都是不可以定义类的静态变量的。在修饰属性的时候,它与其他属性不同的地方在于成为静态属性后,仅仅和类相关,和具体的实例无关。

2023-03-27 12:00:30 26

原创 我的编程经历(21)----------Java数组

假设这块空间的地址为0x123,那么形参array所对应的值即为这个地址的值0x123,并指向了堆区中的元素,这一点与指针类似。假设一个二维数组为int[ 2 ][ 2 ] arr = {{1,2}, {3, 4}},实际上是由行数为1数组元素为1,2的一维数组以及行数为2数组元素为3,4的一维数组组成的。注意在这个拷贝中,对拷贝后的数组进行元素数值的改变并不会影响原数组的元素的值。但要注意,拷贝深浅的判定实际上是人为而定的。其中需要注意的是,第二行的数组是属于未初始化的数组,未定义意味着它的内容全为零。

2023-03-24 18:12:02 30

原创 我的编程经历(20)----------Java方法

而下方的numBer(a, b)即是将实参a,b的值传入方法的形参中。这意思是有时候若定义的方法仅仅只是传入的参数不同,就无需再次将整个函数的定义重写一遍,只需将方法中的形参近些年更改即可。是否需要返回值,以具体代码为准,并非重载的硬性要求。即使在形参中打印,也并未改变实参的值。最好像C语言函数一样,使方法的功能尽量单一。与C语言相同,递归是方法在执行过程中自己调用自己。Java中的方法其实跟C语言的函数是非常类似的。方法的返回值不做要求。本篇简单总结Java中的方法。2.Java方法的语法。

2023-03-21 19:17:59 33

原创 我的编程经历(19)----------Java中的逻辑控制

switch语句的注意事项是,每一个语句后都建议跟上一个break,若不加,则会一直执行下去。注意,switch中的值只能是整数,枚举,字符和字符串。当然,switch跟其他条件语句一样也是支持嵌套的,但不建议这么做。在编写整个程序的时候要注意,输入与随机数的应用与C语言还是存在很大差异的,要慢慢习惯Java的编译方式。本篇着重总结Java中的逻辑语序,但实际上和C语言中大致一样,简单进行总结即可。break的作用是让循环提前结束,换句话说break只能在循环中进行使用。7.Java中的输入与输出。

2023-03-21 13:59:14 35

原创 我的编程经历(18)----------Java中的数据类型和运算符

比如,命名时数字不能开头,大小写要区分开,载命名时要具有指向性,见名知其意,推荐使用小驼峰命名法,即除第一个单词以外其他单词首字母都大写。强调一点,若 a || b 中a为真,则不会再判定b是否为真,整个表达式则为真。与C语言相同的是,如果定义俩个整型,并相除,如果结果有小数点,又由于除数与被除数都是整形,因此要定义double类型进行计算。基本数据类型8种包括:整型(byte,short,int,long),浮点数类型(float,double),字符类型(char),布尔类型(boolean)。

2023-03-20 09:59:14 61

原创 我的编程经历(17)----------Java初识

如Java的整型永远是32位,不存在64位的情况,这让Jave的代码可以在多数编译器中使用,不考虑运行环境的问题。虽然可以加装中文插件,但是强烈建议用英文,因为在职场写代码时,多数都是英文版。------------------------------------------------最后编辑于2023.3.15下午四点半左右。如运行时堆栈溢出,内存破坏等。高性能:如字节码可以在运行时刻动态的翻译成对应运行这个应用的特定cpu的机器码。从这一篇章开始,已结束c语言的部分内容,开始Java的研究。

2023-03-15 16:23:58 32

原创 我的编程经历(16)----------数据存储

首先,它是正整数,所以s = 0, 0.5整数位是零,不足1,所以后移位一个小数点位,再将5转为二进制,得到M 为1.0,然后因为这里向右移了一位,所以指数位以科学记数法的形式移回去,所以E为-1。那在这种情况下,如果字符在内存中的存储是高字符位由低字符位依次存储,就是大端,反之则为小端。-------------------------------------最后编辑于2023.3.10下午四点左右。在内存中存储时,若为32位 浮点数,最高位的1位是符号位s,接着的8位是指数位E,剩下的是有效数字M。

2023-03-10 16:06:48 35

原创 我的编程经历(15)----------调试实例

在这个代码中由于数组的元素只存在10个,继续往后走的时候,恰好就走到了存放i这个变量的地址,因此才会出现这种情况。while括号内部实际上是先执行后判断,那么就可以如这个代码这样书写,直接在括号内部进行赋值,也就是说当if或者while语句中的条件为赋值语句时,实际上是将赋值后的结果与0进行比较。其实在这个代码的函数中,完全可以不返回任何值而只把字符进行调换,但是这里把返回类型修改为char* 类型是为了使代码达成链式访问,大概意思就是更流畅。但无论差异如何,这个代码都是有问题的,因为它发生了越界的行为。

2023-03-08 15:32:31 48

原创 我的编程经历(14)----------结构体初阶、调试

这一篇章简单介绍一下结构体,以及VS2013的调试总结。结构体的形式如图所示: 这样看可能不太直观,以具体的例子来说明: 这里简单以一个学生的相关个人信息来定义一个结构体,或者说进行声明。其中中间三行是结构成员,它可以是标量,数组,指针,或者套娃结构成其他结构体。以上是结构体的声明和定义。再来看结构体的初始化:在这个代码中,主函数下一行即为结构体S的的初始化,命名为H,而括号里面就是初始化的内容,与声明相对应。然后就是结构体成员的访问。结构体的访问首选是以指针的形式进行,如果直接以‘.’的形式访问以及后面的

2023-03-06 17:19:45 46

原创 我的编程经历(13)----------指针初阶

随后在取a的地址,并把a的地址放入一块名为b的内存区域,然后再运用解引用符号*取出地址,这样*b所指向的就是a这块区域了。因为标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。要理解指针,首先得理解内存的存储是把一整块内存分为若干个小的单元,每个单元的大小都是一个字节,而每个字节都有其对应的地址编号。在上面的代码中可以看到,指针是有类型的。即指针所指向的位置是不可知的,随机的,不正确的,没有限制的。

2023-03-04 17:00:08 45

原创 我的编程经历(12)----------操作符

其次,整数的二进制位其实是有三种形式的,分别是:源码,反码和补码。这里的第二个等式中,可以理解为b = a ^ b ^ b, 在这里要注意任何数与其本身按位异或,都等于0 ,而0与任何整数按位异或都为其本身,所以可以得到b = a,同样的道理第三个表达式也可以得到 a = b,因此就能实现数的交换。除号需要注意的地方在于,若想要计算的某个值有小数的话,直接使用float库函数是不行的,必须得保证除号操作符两边至少有一个小数。注意连续的&& 和 ||,连续的并操作符,若最左边的为假,后面的就不会进行执行了。

2023-03-02 20:48:10 43

原创 我的编程经历(11)----------三子棋

然后再思考,既然要选择,玩家也会存在选错的可能性,选错后得重新选。电脑的输入相对来说,就比较简单了。这肯定是一个反复的过程,所以肯定是循环进行,那么肯定得把玩家输入的函数与电脑输入的函数,放入循环之中。对于三子棋而言,判定结果无非就四种情况,玩家赢,电脑赢,平局,以及未分出胜负。主要目的,一方面是为了巩固一下代码思维,另一方面这也是我第一个花费较长时间,写代码半个小时,查bug两个小时的代码。做好这些前期工作后,就需要思考,三子棋的运行逻辑是什么,在玩的这个过程中,又会产生多少种情况,都需要考虑清楚。

2023-03-01 00:23:44 43

原创 我的编程经历(10)----------数组

这是数组的初始化,但数组的大小可以存放十个元素,这里只初始化了四个,因此这其实是不完全初始化。对于数组在函数中的实参和形参的取值,其实还不是很明白,为什么函数中接收参数要加arr方括号,而不加方括号又为什么跑不起来,感觉应该是地址问题,是需要加指针变量?在这个代码中,一共打印了六行,先看一三五行,能发现是代表的一样的地址且都是代表数组首元素的地址。但是注意,二维数组的列数是不能省略的。在这里就可以看出,在数组的定义中每个元素地址都是相邻的,也就是说元素之间是相邻的,而且地址加一恰好就跳了一个整形。

2023-02-25 16:07:07 37

原创 我的编程经历(9)--------函数

实际在进行代码编写的时候也是将其分为几个模块编写,最后通过头文件整合到一起以实现程序的运行,这样能大大提高写代码的效率。既然是分出来的,那她的大小必然是有限的。在进行如上诉那样的代码的时候,一直循环往复,必然会出现栈区被使用完的情景,但代码还是在运行,就会出现栈溢出的情况。将这个函数带入主程序就会发现,如果n的值在50及以上,程序就会跑的很慢。因为函数的嵌套是嵌套多个不同的函数,函数中放函数。比如求第n个斐波那契数,在不考虑溢出的情况下 ,可以发现无非就两种情况,n不大于2,以及n 大于2。

2023-02-23 20:20:55 39

空空如也

空空如也

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

TA关注的人

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