自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 资源 (9)
  • 收藏
  • 关注

原创 C++的模板(十四):更多的自动内存管理

在具体实现上,由于编译器typeid返回的type_info类型做成了固定的const 类型,并且屏蔽了构造函数,复制,赋值这些操作,不能直接用它来构造map容器。考虑到每个list容器,如list<int>,list<double>,原则上虽然都是list,具体到语法上却都是不同的类型。在管理器析构的时候,自动释放容器中的指针。分别是list<double*>,list<int*>,list<double>和list<int>。根据前文的例子,问题的后一半已经有了答案,现在只要把list容器组装起来。

2025-03-29 18:22:06 440

原创 C++的模板(十三):镜像逻辑

平衡算法的"LL-旋转",“LR-旋转”,分别与"RR-旋转",“RL-旋转”,镜像对称。对称逻辑短一点的代码还不成问题,长的大家都会感到头痛。我本人就从未经历过长的镜像逻辑代码,改完之后,可以一次运行通过的情况。这里的意图是,把对struct node写的代码模板化,然后直接套用到镜像上。这样就少写了一半代码。正面理解,模板处理的是"RR-旋转"和“RL-旋转”。但是代入mirror类型,立即就有了"LL-旋转",“LR-旋转”。字段上的left指针和right指针的逻辑互换,似乎还没达到类型的级别。

2025-03-18 15:46:29 192

原创 AVL树的平衡算法的简化问题

现在大家都想到了:在AVL树需要发生平衡调整的时候,把已经调好的3个储备结点拿出来,整体替换掉树中需要调整的3个结点,再把替换下来的原来的3个结点做成初始化中的左、中、右三角结构,存回到help中储备,留给下次用。如果增加的高度是在较高的一侧,那么结点的平衡因子超限,这种情况在上面第一种情况的最后一个变化发生,需要进行平衡调整。当AVL树中心插入一个新结点时,它的父结点如果是真平衡,那么状态转化为准平衡,树的高度增加了1,因为高度增加,这个父结点需要接着向更高一层的父结点报告这个变化。

2025-03-14 21:09:53 376

原创 C++的继承(十二):抽象类

至今,C++程序员已经见过了很多抽象类的例子。一个不含数据,只有纯虚函数的类。关于“接口”,第一个推论就是,对“接口”的非公有继承没有意义。从前,C语言程序员已经发明了回调函数机制。现在,C++已经准备好对它推广,升级为回调对象。不同的类,只要继承了同样的抽象类基类,就可以被程序中其他地方的复杂逻辑调用,而不需要区别具体是那一个类型。升级为使用回调对象。方法就是让回调对象继承共同的抽象类。当你正打算继承一个抽象类做基类时,或者甚至只是选用普通类做基类时,你都可以轻声念这样一句咒语:“吃饺子要沾点醋”。

2025-03-10 14:44:40 133

原创 高斯消元法

前文“鸡兔同笼问题”,提出了用i-函数映射的方法,改造1维数组,获得2维数组相似的功能。考虑到这个例子过于简单。还需要在更复杂的例子上验证这种方法的可行性。考虑到通用性,这里3是行的长度,应当用变量。这里选择了高斯消元法的例子来验证。高斯消元法的计算过程,简单的说,就是,2,当前行以下的每一行,依次以首项的比例减去当前行,从而消去自己首项。选取首项不为0的行为主元,交换到当前行。回代过程这里就省略了。现在可以立即看一看运行结果。详细的步骤参见算法书,这里就不重复了。3,回代求出方程解。

2025-02-21 14:51:53 133

原创 C++的封装(十五):第四种访问控制

代表全局允许,子类允许,私有3种访问权限。Java有4种,如果什么都没写,就是默认,代表在同一个包中可以随便访问。初学者对C++的访问控制还没深入理解,使用时常常设置的自相矛盾,弄得自己头大。看到Java有第4种访问权限,觉得Java好,都转到Java去了。“一个包”,也是一个类,比如就叫class Abc好了。包里有3个类, class A, class B, class C,记作:Abc::A,Abc::B, Abc::C。要允许外面访问,在公有部分在弄个类继承一下这个struct就完了…

2025-02-18 14:27:02 219

原创 鸡兔同笼问题

在这里讨论这个问题的解法当然太小儿科了。但是y_tab这个C语言解释器只提供了1维数组。如果需要用到2维数组时,该怎么做?现有鸡、兔合装在一个笼子里。数头一共100个头,数脚一共300只脚。问有多少只鸡多少只兔?函数i()对2维数组作下标转换。现在演示用行列式和克莱姆法则求解这个问题。

2025-02-17 15:00:46 747

原创 适配模式,桥接模式,组合模式,装饰模式和代理模式

作为一种极端情况,如果适配模式中,被适配的对象已经有了相应的接口。一些对象通过工厂模式构造出来,它们的构造函数,复制构造函数都被做了屏蔽,这时使用编译时继承变得不可行,但是仍然可用装饰模式在运行时附加新的功能。把适配器和被适配的类同过多重继承做在一起,公开适配器的接口,屏蔽被适配的类的接口,使得被适配的类能够被调用者使用。适配器和被适配的对象互相独立,通过向适配器传递适配对象的指针来构造适配器,从而使适配对象能够被调用。如果适配者完全克隆了被适配对象的接口,适配器可以参加到任何一个被适配对象的调用中去。

2024-12-27 13:29:48 590

原创 工厂模式,建造模式,抽象工厂,原型和单件模式

更重要的原因是,背后实际运行的是单件,在多任务环境中,单件可以避免不必要的同步,而使得逻辑变得更加简单。工厂模式中产品类的对象创建发生在“主类”中,而建造模式中产品类的对象创建发生在“旁支类”的基础类中。然而工厂模式的创建可以是随时按需创建,Builder模式看起来是一步到位一次性创建了用户所需的全部对象,因而两者在生命周期有显著的区别,Builder类用完就可以迅速淡出甚至完全丢弃。如果不建立主类的旁支系统,就又简化了。它仅在基础类定义交接格式即抽象方法,在直系的各子类中具体定义在对应的方法。

2024-12-23 18:55:41 235

原创 C++的封装(十四):《设计模式》这本书

读者如果不加思考的接受,很容易出问题,再也无法学精通了。这些在类边界的勾连代码,往往比较狡狯,把垃圾代码收集到一个肮脏的角落,然后集中力量对付。初学者尝试练习编程,写的内容往往很单薄,而过度套用设计模式封装了又封装,导致代码充满了肮脏的垃圾代码,而真正的程序逻辑反而被淹没。这本书虽然用《设计模式》来命名,它的重点是讲述在类型分界线外,类之间的勾连技巧,这些技巧虽然最后也归入设计的范畴,毕竟已经属于枝节了。设计的重点难道不是功能、性能、高效的数据结构么,这些应该早已在类的内部实现了,而不是出现在类边界了。

2024-12-22 19:20:58 306

原创 希尔排序的增量和缩小增量问题

想象一下,对每一个列向量都开一个直接插入排序“线程”,每个线程插入完一个数据,就轮换给下一个线程。刚才说到printag(),把一个单行的数组输出为 gap列的矩阵。也是说排序好的半gap相邻的列向量要镶嵌合并,变成长度增加一倍,数目减少一半的又一个矩阵。好了,矩阵有行向量,列向量两种分解的方法。而在这个镶嵌变化了的列向量上做排序是有特殊规律的。镶嵌的列向量有间隔的排序关系,插入的新数据就会被这种“沉积岩的地质层”结构拦下,不能穿透。这样原来的数组,输出为n/gap行, gap列的矩阵。

2024-10-26 00:05:45 776

原创 数组的初始化,参数传递,和求和

在自己做的这个C语言解释器中,数组的使用非常简便。下面小程序是一个例子。演示了数组的初始化,参数传递, 和求和。

2024-10-20 22:10:09 216

原创 插入排序,希尔排序,和归并排序

每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。数组,是每个编程语言中最基本最简单的数据结构。而这些次结构的拼装组合,又转化成最简单的数组结构。归并排序的gap是另一种用法,它通过gap分段,所以它的子数组的元素是挨着的。不像shell排序,子数组是跳开的。这些,正是算法书所告诉你的:你是程序员,每一个量,你都可以动。希尔排序是在插入排序的基础上,先用一些gap对数组预处理。通过这些处理,使插入排序中挪动数组的距离缩短,从而降低开销。读者可以对照算法书,一步一步观看它的对应的实际代码。

2024-10-08 19:35:24 402

原创 C语言的switch语句

假如数组a[]是一张100个元素的素数表。如果打印不是从第一个元素开始,则要求显示起始符“…C语言的switch语句比大家通常所习惯的用法更复杂。switch语句内部可以含有不在case 和 default标号覆盖范围的内容。用y_tab实现的C语言解释程序完全支持这种用法。因此可以先在解释程序试验,然后平移到C语言编译器。这个switch语句用法跟大家平常所熟悉的有所不同。但的确是正确的C语言语句。可以正常编译和运行。

2024-10-07 11:27:42 475

原创 python和c

区别在于c语言在编译函数头的时候,就已经指出了参数重复的问题。明显python的创造者设计python的时候没有意识到会有这种问题。限于修复水平,补丁没有打到最开始出现问题的地方,而是放到了最后。python这个语言现在用的非常流行了。拥护它的人高度赞美它,认为它高效率,功能强,现代化,限于自己的水平完全不知道它有什么问题。这样的语言,就给这样的人用。直到我需要检查一个编译器的问题。当然,python程序员限于自己的水平,看不出这里有什么问题。如果在函数定义过程中,函数的参数出现同名,这当然是错误。

2024-10-05 13:03:36 438

原创 向自定义函数传数组

大于0代表参数(形参)为数组,保存此数组在函数本地数组表中的索引。编译调用这个函数的代码时,换成实参,生成调用函数的NT_INITV“数组头”节点,并在里面存放调用函数的数组表中对应数组的索引。如果函数的数组大于这个值,运行时需要分配局部数组,并且运行完成时,跳过output数组和参数数组,释放它们。用y_tab实现的C语言解释程序中,用一个规定了名字的“output”数组,在所有自定义函数中共享同一个数组的数据。调用时也是用一个“数组头”代表实参,并配置运行时获得实际数组地址的代码。

2024-09-28 13:07:30 502

原创 pthread的同步:条件变量之条件

producer做了wakeup()之后,会阻塞在idle锁上, 这是cond.sync_wait();如果这个enable被使能,表明wait线程进入了“条件”区,可以和signal线程同步。当然,signal线程也要检查wait线程有没有做这个使能,如果还没有,又必须发signal,那么需要同步等待wait线程使能。当然,还要标出危险区。在我眼里,这个变量既无条件,亦非变量,简直就是无条件常量。我想,条件变量的条件,应该是让用户自己填充的,既然用户自己没有填充,系统干跑,自然就没有条件,也无所谓变量。

2024-08-01 19:26:02 411

原创 pthread的同步:死锁问题

无论 pthread_cond_signal()放在 pthread_mutex_unlock()的前面还是后面,下一句回到循环头上的 pthread_mutex_lock(),都会和consumer的退出wait产生锁竞争,所以这里要确保consumer的wait先退出,然后producer再回去循环头上锁。consumer恢复执行,解锁这个空锁,这时consumer已经有了mutex锁,解锁空锁后,producer继续运行,就阻塞循环头上的那个mutex锁上了。到此,原来的例子改完了。

2024-07-31 14:29:18 570

原创 Pthread条件变量同步

究其原因,调度线程无法测试读写线程是否执行了mutex_lock(),把自己挂在互斥量,因而暂停了运行,还是仅仅因为操作系统扣住了它。既然调度线程用条件变量唤醒读写线程,读写线程用解锁互斥量唤醒调度线程,这样问题就得到了解决。稍微需要注意下,这里读写线程在yield()里面用了额外的一对mutex_unlock()和mutex_lock()来避免和resume()中的 pthread_cond_wait(),“退出休眠并上锁互斥量”发生竞争。读写线程用条件变量睡眠,调度线程用对应的signal语句唤醒它。

2024-07-30 10:03:01 471

原创 pthread和多线程

注意系统的调度仍然在跑,这里意思是自己写的同步的调度,以下简称调度,意思都是自己做的调度。如果线程自己的mutex被别的线程上锁,那么线程运行到这个位置的时候,再次上锁就会休眠,而别的线程解锁,也就唤醒了这个休眠的线程。之前调度程序已经给它们mutex上了锁,跑起来之后,首先是去对自己的mutex上锁,这样可以进入休眠,让调度程序有序唤醒它们进行操作。普通用法,在同一线程中对资源上锁,解锁,操作时串行的,不会发生自己两次锁同一个资源问题,这时两者的作用是相同的,除非发生了操作中用了递归函数。

2024-07-28 13:22:30 814

原创 longjmp和多线程(三):运行栈冲突

要想防止数据被覆盖的办法,就是把栈上的变量都保存的外部的全局变量中去。len变量尽管也是个局部变量,因为它在longjmp()返回之后,使用之前重新求值了,所以也不用保存。除此之外,函数调用自动保存的前一桢的栈桢指针和返回地址也会被破坏,所以也需要保存。在write_stack上还需要恢复coroutine_write的局部变量fp,所以现在bx_read()和bx_write()的返回值调整为返回一个状态值,告诉上级函数本次返回有没有跨yield调用。运行调度程序的main()函数的栈也会被覆盖。

2024-07-23 00:22:44 356

原创 longjmp和多线程:读写线程实例

写线程由主程序启动。读线程由写线程启动。程序的功能是从当前目录读取一个文本文件并显示出来。读线程比写线程先运行。因为一开始缓冲区为空,读线程第一次读就需要让出处理机,让写线程开始写 buffer。这个例子中,读写线程通过一个bx缓冲区合作。如果缓冲区为空,读线程调用yield原语让出处理机让写线程来写。如果缓冲区写满了,写线程也是调用yield原语让读线程来读。因为多线程的问题比较复杂。这里再给个实际内容的例子。

2024-07-21 21:21:53 259

原创 longjmp和多线程

原例子这里就不展示了。这里做了大幅修改,把原来的“主控(即主线程)和子线程”改为“主控(即调度程序)和两个子线程”。最好每个线程有独立的运行栈,那样就又回到OS自己的多线程上来了。子线程用start_coroutine()启动。下一个子线程必须用上一个子线程启动。子线程结束后不能return返回,而是把状态置为1,表示结束,然后用yield()回到调度程序。更多的子线程需要自行改进调度程序。看到有人用setjmp()/longjmp() 做的多线程例子。如果用多线程,linux当然用pthread线程库。

2024-07-20 11:13:13 291

原创 C++的模板(十二):forward模板

如果调用的是C++自动生成那个版本,会自动调用基类的对应的复制构造函数。这个例子中,复制构造函数写成了模板。在复制构造函数模板中,向重载的print()成员函数转发了参数a。模板并不清楚传给它的类型是哪种重载类型,因此转发给print(),让它打印出来。这里,forward模板携带的参数类型T,照抄模板的传入类型。f()和g()函数的"赋值"语句(赋值格式的初始化语句)各导致了2次复制构造函数调用。运行结果提示,b2确实调用了C++自动生成的那个复制构造函数。这样就可以对不同的类型,做不同的处理。

2024-07-16 12:36:49 248

原创 C++的模板(十一):算法的轨迹

set的find()方法只比较了一个子集。这里用了两组强制类型转换,把int的容器,直接当作类型integer的容器来看了:因为integer是int的原样包装,它们在2进制上没有任何不同,也就是说,在运行期没有任何不同,这样转换当然是可以的。对于容器的一个参数数据类型T,这里是int,可以对它重载一个2进制内容完全一样的 wrap_T,拦截它的构造函数,析构函数,赋值,比较等接口函数,就可以抓到它的运行轨迹。如果不想装入大量的数据,执行数十万,数百万的检索进行比较,那么怎么知道用set检索的效率更高呢。

2024-07-15 18:56:02 377

原创 用解释程序交错执行2个线程

其中,用ecount表示thread的任务是执行10次,count从 0计数,到ecount执行结束。ins照旧,存放swap(a,b):或swap(a,c):的指令。现在注意力集中到考虑,以swap(a,b):, swap(a,c):, 为蓝本的2个线程,每个线程各执行相应的swap代码10次。前面的例子,swap 语句串扰执行问题,实现了一个assign指令的解释器。现在就借用它的代码,用解释程序演示一下多线程是怎么执行的。当sched()选择的"下一个"线程已经finish,sched()就返回0。

2024-07-07 19:54:24 314

原创 Swap语句的串扰执行问题

这可以看作在6个位置的指令片中,任选3个位置,依次填入swap(a, b)的这3个语句,剩下的空位,依次填入swap(a, c)的这3个语句。指令串的每一个指令都是对初始化好的swap(a, b):和swap(a, c):的6个指令的引用。操作数给出初始值{a(‘A’), b(‘B’), c(‘C’), t1(‘x’), t2(‘z’)}。要验是否证线程安全,简单的办法是,做2个线程,各自运行swap语句数十万次,在并发环境下观察运行结果,如果出现非预期的结果,即判定线程不安全。然后转化成20个指令串。

2024-07-05 10:58:00 223

原创 C++的模板(十):shared_ptr的上锁问题

这个_M_ptr也是那个被引用计数管理的对象指针,在_Sp_counted_base及其派生类的管理范围内,如果引用计数归0,最后要销毁这个被管理的对象。执行完立即产生一个调度断点,那么别的线程可以在这个点上调度运行,如果凑巧也执行了一个 __shared_ptr ::swap(),并且是前面做到一半的那个__shared_ptr,那么它的执行导致_M_refcount被换走。加锁的办法,如果管理的是少量的大粒度的对象,可以使用单一的全局锁,如果管理的是大量的细粒度的对象,就要使用局部锁,对象粒度的锁。

2024-07-04 10:59:33 937

原创 C++的模板(九):模板的实例化问题

什么原因呢,STL中的容器,对用作key的类型是有些讲究的,key必须能够比较,而这里的Event类没写“operator

2024-06-27 21:58:05 869

原创 C++的模板(八):子系统

因为构造函数被分离,这些指针在模板外可以被派生类构造,因此可以是多态的。上面示例的子系统,绑定了事件和响应的关系,并处理收到的消息。因此,就允许了Event和Response的多态存在。这里有2个((DMM&)dr)、((DMM&)dr)的强制类型转换。dr中的list存的又是他们的基类指针,这样转化当然没问题。平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。

2024-06-24 13:06:38 239

原创 右值引用和移动语义

比如参数是某种表结构的node,在node内嵌了一个实际数据的对象,或者参数是pair模板这类情况,把几个实际数据对象粘贴在一起,这时需要把右值对象的一个或多个部分转发给对数据有管辖权的函数处理。如果在调用operator=过程中参数匹配的是函数返回值,藏在返回值中的那个list,反正下一步就会丢掉的,何不把它的内容链也直接拿过来呢,把它弄成空list,对析构也没有影响。const对参数施加了常量约束,因此在函数中不能修改参数引用的对象,这不仅包括不能改动对象的数据,也包括不能调用对象的非常量成员函数。

2024-06-18 13:00:03 804

原创 C++的封装(十三):迭代器问题

这里想说明,在别人的代码里,看到代码不是自己想象的样子,也不用奇怪,因为有各种不同的实现方法。汇编代码看起来虽然比较吃力,但还是可以看到,disp()函数调用了__ZN4list5beginEv函数,对应源代码的list::begin(),然后调用了 __ZN4list3endEv函数,对应源代码的list::end(),然后又调用了 _顺便说一下,察看生成的汇编代码时,因为编译器对原函数作了名称转化,运算符重载函数名不易辨认,可在源代码挨着运算符重载换个名字再写一下这个代码,这样在汇编代码中就容易找了。

2024-06-13 19:57:54 1291

原创 C++的封装(十二):外部构造函数

Create_AB(), Create_BC()是类AB, BC逻辑上的构造函数。变化之后,去掉了构造函数参数中的多余的选项。何况,关于这些参数实现细节用户根本没有什么概念,让他创建对象时去选择这些选项,他也不知道选得对不对?当然Create_AB(), Create_BC()作为config类的成员函数,仅仅是普通的成员函数。如果实现过程需要施加更多的控制,比如增加私有数据allow_debug_a,allow_debug_b作为控制选项,这时最好重开一个新的类,一个config类,让它去专注干这事。

2024-06-08 22:17:37 419

原创 大数除法运算,利用乘法优化

先用比除数多一个数位的基本单位去除以除数,得到基本单位的商d和余数r,那么如果这个数位上是n,用n去乘商和余数,可以得到近似的商nd和余数nr。假如除数是一个数位的x,那么先用两位数{1,0},实际是10000,去除x得商d和余数r,那么数{n, 0}除x,会得到商nd和余数nr。output[]={9,9,-1},现在的意思是90009。最后需要处理d[]的进位,处理后d[]传到output[]数组。在大数除法过程中,如果能有意识的利用乘法运算,应当能够提升计算速度的,因为乘法速度比较快。

2024-06-04 23:48:43 476

原创 C++的继承(十一):私有继承和受保护的继承

这就出现了一个奇观,在公共区域都能访问到的数据,到了派生类中反而访问不到了。但凡用过C++的人都知道:私有继承的成员在派生类里均为私有,受保护的继承公有和受保护的在派生类里为受保护。为了防止过度玩弄这样的花招,C++允许私有继承和受保护的继承在派生类里开放基类的权限。在这里,C的析构函数不能访问X的数据a和成员函数sqare()。进而想到,在C里面也这样做,不是就可以访问私有继承的X中的成员了吗,回避这个问题,最好的办法是让B受保护继承X,这样就可以了。通过X的别名来引用X,骗过编译器,这样就可以了。

2024-05-29 10:26:42 389

原创 C++的封装(十一):linux风格的链表和稀疏矩阵

还有一些必要的插入,删除,引用操作,它们是稀疏矩阵的基本功能。它没有包含数据字段。当然,要客户化,添加需要的用户数据,并且把list::node的指针转化到客户客户node上来。上面list的代码,list::node的结构用了标准库的pair模板,这个没有关系啊,完全可以用简单的指针,这里使用只为评估一下这玩艺好不好用。外部的visit(), found(),dispose()几个作为回调函数运行时传到链表中,这样可以随机应变,保证了操作的灵活性。插入,删除,遍历,释放都试了一遍,已经能够正常工作了。

2024-05-24 10:59:09 231

原创 C++的模板(七):左值强制类型转换

如果没有用这个语法显式实例化这个类,直接用Savein仍会碰到访问权限的问题。这样做是妥当的,因为数据成员默认都是private的,如果模板不接受指向private的数据成员的指针,这个语言也就没有这种功能了。指向数据成员的指针,除了转换指向其它数据成员的指针,不能转换成别的类型。这一步过关之后,可以通过Whatever类的对象或指针和拣出来这个x来访问类的私有数据了,这时已经是运行期问题了。这个数据成员的指针是可以提取出来的。

2024-05-22 02:19:33 345

原创 大数的指数运算

因为123456789的123456789次方是个很大的数,大约有50亿个数位,限于计算机的存储能力,也限于计算机的运算速度,实际演示不了。一个“节”可以存放4位数字,或8位数字,因此可以按“节”看作是10000进制或100000000进制。因为指数是常数的原因,对pexp中的循环和条件做了优化。大数的指数运算也是按“节”拆分,然后再链接起来。这里假设一个“节”存放4位数字,所以是万进制。当然,这里做了乘法优化,而不是原始的最多进行9999次连乘的算法。当跨计算“节”时, 要对“节”进行调整。

2024-04-25 08:17:06 415

原创 C++的封装(十):数据和代码分离

这样变化后,class正常使用不受影响,如果要访问私有数据也轻而易举。因为class在代码完全不生成(隐藏的)数据成员,访问内部数据只需一个class到对应的struct的强制类型转换。但是在开发阶段,成员方法还不完全具备,过于讲究封装必定会碍手碍脚,反而使debug不能充分施展。封装的好处当然是非常多的。就是说,class只写方法,数据都放到对应的struct里面。class都从对应的struct私有继承自己的数据成员。所以你学了之后,要悄悄的用,千万别说这是我教的。可以试试这个方法,数据和代码分离。

2024-04-17 11:34:54 333

原创 一个月有多少天

时钟交汇问题是这样一个问题,分针每小时走1圈,时针每小时走1/12圈,这次交汇后下次什么时间再次交汇?因为分针走的时候时针也在走,肯定要多于1小时,然后分针追上时针。求得月亮绕地球公转周期是27.4天。同理,月亮公转一周时,地球也(绕日)走了27.4天。转化成时分秒是,29天12小时44分10秒。跟精确值29天12小时44分3秒相比,误差是7秒。月亮绕地球作圆周运动,向心力是地球对月亮的万有引力。月亮的质量大约是地球的1/81。这个数据无所谓,计算的时候会约掉。所以可以知道农历的一个月大约是29.5天。

2024-04-08 11:03:00 1179

自己做的小巧C语言解释程序

自己设计的C语言解释程序。可以解释执行大部分C语言语句。包含C语言的全部流控语句,数据有整数和浮点数据类型。实现了自定义函数功能。print语句可以使用字符串。新增了对函数传数组功能。goto语句可以跳转到函数内部。一定程度上能代替C语言进行数值计算。适合用于C语言学习,数值计算,算法试验等场合。在本人的blog有讲解。包内txt文件含有例子程序。

2024-09-29

自动配平化学反应方程式程序

中学化学反应方程式自动配平的程序。中学生化学课学习资源。16位程序,可在Dos, Dosbox,WinXP 系统使用。

2018-11-29

802.11权威指南

802.11权威指南, 802.11® Wireless Networks: The Definitive Guide

2014-05-24

C 语言脚本解释程序y

自己设计的C语言解释程序。可以解释执行基本的C语言语句。包含C语言的基本流控语句,数据有整数和浮点数据类型。print语句可以使用字符串。新增了自定义函数功能。一定程度上能代替C语言进行数值计算。适合用于C语言学习,数值计算,算法测试等场合。包内txt文件含有例子程序。

2021-03-11

bigtab.zip

C语言解释程序。可以交互式运行或执行脚本。数据类型只有整数一种。但大小没有限制。可以用作大数计算和高精度计算。语法同C语言。其中包括求小数点后100位对数,平方根,三角函数的示例脚本。

2021-02-02

选修课学习计划配置器|score.zip

根据选修的课程,累计同学的学分,看是否达到要求。以此确定本学期学习计划。课程名字和学分可按照example.txt 的格式配置。

2020-11-06

自动配平化学反应方程式程序

中学生化学课学习资源。运行环境说明 1, 安卓手机使用需安装Dosbox环境,然后把Dos版本程序存入Dosbox的目录,Dosbox启动后,在C:\>后输入程序名运行 2, Win系统可以使用Windows下的版本 3, 提供源代码

2019-06-05

tetris.zip

俄罗斯方块编程练习。C语言编写。适用于Windows环境。含有源代码。可用mingw-gcc和 VC++编译。

2020-04-12

自动配平化学反应方程式程序-大系数

化学反应方程式自动配平的程序。Windows系统下运行。在原来的基础上增加了对大系数的处理。能够配平系数在10000以内的化学方程式。 input chemical expr: NaClO3 +FeCl2 + HCl = NaCl + FeCl3 +H2O 1 6 6 1 6 3 input chemical expr: KMnO4+FeSO4+H2SO4=Fe2(SO4)3+MnSO4+K2SO4+H2O 2 10 8 5 2 1 8 input chemical expr: Fe+HNO3+H2O=Fe(OH)3+NH4NO3 8 6 15 8 3 input chemical expr: MnO2+HCl=MnCl2+Cl2+H2O 1 4 1 1 2 input chemical expr: Cl2+NaOH=NaCl+NaClO+H2O 1 2 1 1 1 input chemical expr: PhCH3 + KMnO4 + H2SO4 = PhCOOH + K2SO4 + MnSO4 + H2O 5 6 9 5 3 6 14 input chemical expr: P4 +P2I4 +H2O = PH4I + H3PO4 13 10 128 40 32 input chemical expr: K4Fe(CN)6+KMnO4+H2SO4=KHSO4+Fe2(SO4)3+MnSO4+HNO3+CO2+H2 4 30 82 46 2 30 24 24 47 input chemical expr: Fe36Si5+H3PO4+K2Cr2O7=FePO4+SiO2+K3PO4+CrPO4+H2O 9 836 192 324 45 128 384 1254

2019-10-05

C++ GUI Qt4 编程(第二版) 英文版

C++ GUI Qt4 编程(第二版) 英文版, CHM格式

2016-12-21

空空如也

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

TA关注的人

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