系统程序员计划
文章平均质量分 81
系统程序员计划学习
惺忪牛犊子
边学习边记录
展开
-
系统程序员成长计划 ——学习篇7:排序算法
目标 前面完成了动态数组的实现,现在学习几种排序算法。 实现: ①冒泡排序②快速排序③归并排序 具体要求: ①同时支持升序排序和降序排序。 ②同时支持多种数据类型。 提示: 看到这两点要求,应该马上想到使用回调函数。 前篇示例已定义过比较回调函数的原型:typedef int (*DataCompareFunc)(void* ctx, void* data); 故整数升序比较函数: int int_cmp(void* a, void*b)原创 2021-05-09 16:11:36 · 153 阅读 · 1 评论 -
系统程序员成长计划 ——学习篇8:有序数组的两个应用
常见应用二分查找 二分查找也称为折半查找,它的前提是数组中的元素是有序的。 算法过程(假定数组为升序): 先拿要查找的元素与数组中间位置的元素相比较,如果要找的元素小则在数组的前半部分查找,大则在数组的后半部分查找,相等则说明找到了。重复这个过程直到找到或者数组被分成单个元素为止。实现如下所示。int qsearch(void** array, size_t nr, void* data, DataCompareFunc cmp){ int low = 0; int mid原创 2021-05-09 16:23:30 · 157 阅读 · 0 评论 -
读书笔记 ——《系统程序员成长计划》篇7:动态数组
概念摘抄自:C语言实现动态数组,克服静态数组大小固定的缺陷C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量。一旦定义了一个数组,系统将为它分配一个固定大小的空间,以后不能改变,称为静态数组。但在编程过程中,有时我们所需的内存空间无法预先确定,对于这个问题,用静态数组的办法很难解决。动态数组是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分原创 2021-05-09 15:16:10 · 285 阅读 · 3 评论 -
读书笔记 ——《系统程序员成长计划》篇6:写的又快又好的秘诀
好与快 “快”是指效率高,“好”是指软件质量高,两者并不是对立关系,作者认为在一定范围条件中,“快”与“好”是属于正反馈的关系,只有写的好,才可能写的快。 这个范围是什么?达到平衡的中间质量点,而这个质量点是多少?作者给出答案是87.5%。时间花在哪里?分析 通常是SPEC工程师(系统分析员)的任务,程序在这个过程主要是理解需求并分析如何实现,即:软件设计。 这可靠深入学习各种常用设计方法,反复练习基本数据结构和算法。测试 调试 代码阅读法 写完程序后,大家都喜欢迫不及原创 2021-04-28 22:38:23 · 310 阅读 · 1 评论 -
读书笔记 ——《系统程序员成长计划》篇5:数据放在哪?
未初始化的全局变量(.bss段) bss段被用来存放那些没有初始化或初始化为0的全局变量。 bss类型的全局变量只占运行的内存,而不占用文件空间。 现在大多数操作系统在加载程序时,会把所有bss全局变量清零。但最好手动初始化为0. 作为全局变量,在整个程序运行周期内,bss数据是一直存在的。初始化的全局变量(.data段) data段用来存放着数据,被用来存放那些初始化非0值的全局变量。 若数据全是0,则为了优化考虑,会当作bss处理。 data类型的全局变量既占文件空间,又占原创 2021-04-18 22:44:49 · 259 阅读 · 1 评论 -
读书笔记 ——《系统程序员成长计划》篇4:拥抱变化
说明: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 QQ 群 号:513683159 【相互学习】内容来源: 《系统程序员成长计划》上一篇:读书笔记 ——《系统程序员成长计划》篇3:双链表下一篇:读书笔记 ——《系统程序员成长计划》篇5:数据放在哪?目录:一、需求描述二、解决方案1、实现多个函数,需要哪个调用哪个2、传入附加参数决定打印的数据类型3、回调函数法①定义函数指针类型②声明dl原创 2022-05-06 15:35:08 · 1384 阅读 · 0 评论 -
读书笔记 ——《系统程序员成长计划》篇3:双链表
专用链表和通用链表专用链表 链表的实现和调用耦合在一起,只能被一个调用者使用,不能单独在其他地方被重用。优点: ①性能更高。(可直接访问数据成员,省去包装函数带来的性能开销,故可提高时间性能,无需事先完整接口,生成代码更小,因此可提高空间性能) ②依赖更少。(自己实现不依赖别人,这样移植会更加简单) ③实现简单。(无需考虑复杂情况,符合当前应用即可,无需提供完整接口)通用链表 具有通用性,可多出被重复使用。优点:(从全局看) ①可靠性更高。(重用性高,随着每次重用而不断改进)原创 2021-04-08 11:07:08 · 334 阅读 · 2 评论 -
读书笔记 ——《系统程序员成长计划》篇2:封装
什么是封装? 封装就是保护好程序的隐私,不该让调用者知道的事,就坚决不要暴露出来。为什么要封装?(好处) 隔离变化。程序的隐私通常是最容易变化的部分。如:内部数据结构、内部使用的函数和全局变量等,我们需要把这些代码封装起来,从而让它们的变化不会影响到系统的其他部分。 降低复杂度。接口最小化是软件设计的基本原则之一,最小化的接口容易被理解和使用。封装内部实现细节,只暴露最小的接口,会让系统变得简单明了,在一定程度上降低系统的复杂度。如何封装?隐藏数据结构 缺点: ①暴露内部数据结原创 2021-03-20 16:04:54 · 193 阅读 · 1 评论 -
读书笔记 ——《系统程序员成长计划》篇1:代码风格
命名要展示对象的功能文件名:单词小写,多个单词下划线分隔 文件名要能传达文件内容。(易寻找) 将一类代码放一块。(易取名) 如:dlist.c(d为double缩写)函数名:单词小写,多个单词下划线分隔 一个函数只完成单一功能。(不可根据代码量衡量) 函数名要直观体现功能。(若取名困难说明设计不合理) 如:find_node变量名:单词小写,多个单词下划线分隔 如:DListNode* node = NULL;结构/枚举/联合名:首字母大写,多个单词连写 如:stru原创 2021-03-20 15:04:37 · 298 阅读 · 0 评论