随笔分类 - C基础
C基础知识
C开发中的单元测试(Cunit)
摘要:最近在写C代码的过程中,感觉自己在重复一项必不可少的环节,就是自测代码,这使我想起以前在写JAVA时的Junit带来的快捷和方便,于是马上行动,经百度、谷歌几轮后,发现Cunit工具,看名字,就可猜到它与Junit同属一宗。网上的相关内容也都非常雷同,这里不再详述,有兴趣的话,可以直奔官方文档.下面我们结合一个小实例,来体验一下Cunit的便利吧(学编程,最有效的方式还是自己动手)
阅读全文
C编程思想之抽象数据类型(ADT)(五)实例演练
摘要:根据前面几篇关于C语言的抽象类型及模块化开发的知识,一方面总结知识,另一方面通过实例来增加理解,使其真正转化为自己的能力和思想,使强大而又古老的C语言不再枯燥,挖掘它的高级语言特性。我们简单回顾一下相关知识:
重点有:
1)接口定义,只重行为,不重底层实现,给予实现层充分的自由。
2)模块化划分再加上接口层,实现层和客户层,多种形式,使程序易于开发和维护
这里我们主要应用前面几篇博文中提到的关于模块块开发及抽象数据类型的相关知识,结合一个常见的数据结构题目---停车场管理,练习体会一下。
阅读全文
C编程思想之抽象数据类型(ADT)(四)
摘要:学习ADT有一周了,从了解到使用,慢慢找到了一点感觉,通过一系列的基础数据类型如堆栈,队伍,扫描器等常见结构模型练习体会它的威力。这些大多都参考自《程序设计抽象思想-C语言描述》,但不是照搬过来了,为了真正提高自己的基本技能,尽力自己独立完成,遇到再去参考大师的思路,这样一方面提高自己的动手能力,另一方面明确了自己的问题,有针对性地学习别人的长处。
ADT在模块化开发中发挥了极其重要的作用,它可使一个复杂程序变得有层次,更模块化,易于开发和重用。首先它将一般程序划分为接口,实现和客户端三层,每层都有自己的职责,应用到实现中可能是三组不同的人员,在一定程序上,使这三层关系分明,如接口是通过一个头文件,定义一个抽象数据类型,及其行为,实现层依照接口定义,实现底层表示和行为的实现代码,而且底层表示和实现是有一定自由的,可根据实际,选择高效的实现方式;而客户端作为接口的使用者,对接口的实现层并不了解,也不需要了解。只需根据接口定义及其说明,来调用相应的行为函数,来完成复杂的任务。
阅读全文
C编程思想之抽象数据类型(ADT)(三)
摘要:自从有了抽象数据类型的思想指导,突然有种豁然开朗的感觉,感觉这枯燥繁琐的C语言有了生气,大脑思考问题时,增添了不少灵感和思路。面对一个复杂问题,不再迷茫而不知所措。
根据模块化开发的思想,对于一个复杂问题,一般是根据”逐步求精“的指导精神,将问题分析,按功能将程序分解为多个模块,其中包含main函数的称作主模块,其它模块都可看作是主模块的库,甚至有些模块是相对独立的,可以作为多个应用程序的库,以实现最大限度的代码重用。
阅读全文
C编程思想之抽象数据类型(ADT)(二)
摘要:此篇继续前一个博客,以一个火车厢重排问题为例(这里用堆栈形式的缓冲轨),有关此题目,想必大家有所耳闻,我也在网上搜索过,发有大多都是C++版本,而C语言版本只有一版,而且我感觉有点乱,注释少,以至我没有耐心读下去。正好拿这个题目练练手,就当做个大脑体操了,呵呵,步入正题,继续体会抽象数据类型带来的好处。
阅读全文
C编程思想之抽象数据类型(ADT)(一)
摘要:在读了《程序设计抽象思想-C语言描述》第八章后,对此ADT抽象思想感触颇深,而且从中还看到了面向对象编程的影子,不禁感叹这些老外的近二十年前的书的经典,感觉为自己灵活,高效驾驭这古老而又现代的C语言指明了方向,废话少说,步入正题。
ADT相关知识这里简略列了一个图表,以供浏览:
阅读全文
C基础抽象思想之递归演练(1)
摘要:递归思想运用很灵活,有时可以显而易见,有时却需要深入琢磨,这里我们练习一个题目,题目内容是输出n个字符的所有排列。
利用前面博客中回顾的递归知识,深入分析此题目,
我们先依次取n个字符中的一个作为第一位上的值,问题则转化为求得剩下n-1个字符的所有排列,依此类推,问题越来越简化,简化,最简单情况就是各位置上字符都被确定,排列结束。
阅读全文
C基础抽象思想之递归
摘要:递归思想是“分之治之”的一种重要思维方式,此文章通过总结递归相关概念和思想,通过几个经典例子来体会,因为有太多东西是无法用语言表达出来的。接受它并灵活运用此思想,是一个长期的任务
阅读全文
C基础之内存分配(二)
摘要:上篇博文已经回顾了内存分配方式的相关知识,特别是动态分配,此处我们以一个查找质数的实例来练习体会一下动态分配的魅力
阅读全文
C基础之记录(结构)的初始化
摘要:记录是计算机科学中的专业术语,其实在C语言中是struct(结构),它是用来自定义各种复杂数据类型的, 它的成员可以是各种基本数据类型,也可以是其它复杂类型,如数组,记录,甚至是自身的引用。
阅读全文
C基础算法之快速排序法
摘要:快速排序法是一种在现实中经常被采用的一种排序方式,这里面又涉及递归的思想,这里我们先回顾一下相关概念:
1)递归:
递归是一种编程策略(分而治之),也是它把一个大的问题分解成具有相同形式的简单问题。它是一种强有力的思想,一旧题解了它,那就可以解决许多看似复杂的问题。
2)快速排序法:
逻辑思路就是先取一个分界点,在分界点左边都比它小,在分界点右边都比它大,下一步再将左右两边子数组再用同样方式进一步分割排序。这正符合递归的特点,将大的数组分成小数组后,进一步分割,以此类推,形成递归过程。递归过程注意为自己找好出口,不然就陷入死循环的深渊。
阅读全文
C基础算法之二分法查找
摘要:算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
阅读全文
C基础之再谈指针与数组
摘要:指针与数组的话题可谓是老生常谈了,大多数的书箱也都是把这两个东东放在一块来讲述的,此篇文章不是我个人总结, 算是篇读《C语言深度解剖》的读书笔记吧,因为看这它里面的第四章指针与数组后,感觉有很多以前搞不清楚的地方有了种顿悟的感觉,所以有把这种感觉写下来的冲动。若是感觉此文给你带来不便,请拜读原文。
阅读全文
C基础练习二:利用联合体检测系统的大小端存储模式一例
摘要:联合体union的概念,特征,系统的大小端存储机制
阅读全文
Linux内核之系统调用小结
摘要:在现代OS中,内核提供了用户进程与内核进行交互的一组接口。这些接口让应用程序受限地访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其它资源的能力。这些接口在应用程序和内核之间扮演了使者的角色,应用程序发出各种请求,而内核负责满足这些要求,也遵循了Unix世界的一句格言“提供机制而不是策略”。其实通过提供这些接口主要为了保证系统的稳定可靠,避免应用程序恣意忘行。
阅读全文
通过Emacs阅读Linux内核源代码
摘要:Emacs的魅力不必多说,这里简单介绍一下通过Emacs来阅读Linux内核源代码的操作。
阅读全文
浙公网安备 33010602011771号