c语言用封装来优化程序
一、基础研究
先对函数fa进行研究,代码如下:

fa函数的参数为一个字符指针,他存储要输出的字符串。因为要显示在屏幕的中央位置,所以我们要把字符串放在段地址b800处。用strlen获取字符串的长度,因为屏幕为25行80列,所以如果字符串长度超过80,即一行放不下,那么就执行if后面的语句,这时要确保字符串整体位于屏幕中央,需要计算行数,而首地址的列数固定为3就可以了;如果字符串长度不超过80,即一行能够放得下,那么将字符串放在中间行第12行,而首地址的列数需要计算以确保字符串在屏幕中央,我们通过行数和列数计算字符串首地址时用(总行/列数-字符串占的行/列数(行加1列不加1))/2即可得出字符串首地址的行/列数。因为我们要在屏幕中央显示字符串,这样会覆盖掉屏幕上原来的信息,所以我们要提前将要显示的区域的信息保存起来,在我们的字符串现实之后,再将这些信息恢复。那么这些信息保存在哪里呢?保存在另一段内存中,因为传入的字符串长度是不确定的,所以要保存的屏幕信息的大小也是不确定的,我们无法先开辟一个固定的空间来保存它,只能动态地开辟空间来保存。所以我们需要使用malloc函数来动态地开辟空间,并将屏幕上的信息保存到这段内存中。这里传入的字符串长度为n,但是屏幕上一个字符是用2个字节来显示的,一个存储字符内容,一个存储颜色属性,所以我们在转移时转移的字节数应该是字符串长度的两倍。
之后显示提示字符串并等待用户输入,直到用户输入了字符’y’,’Y’,’n’,’N’。之后将之前存储的屏幕信息还原并将按键信息返回。我们来看返回语句:return(ch==‘y’||ch==’Y’);如果用户输入了’y’或’Y’,则这里会返回一个非0值,如果用户输入了’n’或’N’,则这里会返回0.
再来看main函数是怎么使用fa函数的,代码如下:

程序在调用fa函数时直接在里面传入了要显示的字符串,我们知道字符串是一个字符数组,而数组在作为参数时会退化成一个字符指针,所以可以与fa的参数类型对接。
我们需要实现一个ask函数,ask函数实现的功能与fa函数相似,只是fa函数是实现所有功能,而ask函数是通过调用子函数实现具体功能。它们显示字符串、等待用户输入的功能是一样的。所以我们只需要修改fa最后的返回语句,改成用函数指针调用函数即可。程序如下:


如果用户输入的是’y’,’Y’,则调用子函数,之后返回,如果用户输入的是’n’,’N’,则直接返回。
我觉得ask所实现的特性是fa所实现的特性所衍生的。fa函数是用一个函数实现所有的功能,但是这样一个函数里面的代码太多了,会导致程序的维护性和可读性降低,所以ask在fa的基础上用子函数实现特定功能,这样修改和读起来都更加方便快捷。所以ask函数要比fa函数更好,因为它可以增加子函数对程序的功能进行扩展,而且函数的可读性和维护性更好。ask函数的设计思想是将函数的功能尽可能地细化,尽量做到每一个函数只实现一个功能,每一个函数的语句尽可能地少,最好在3句以内。这样可以将程序的可读性和维护行做到最好。
我们将函数ask的代码加入到cs .lib中,这样我们要实现完整程序,只需要在c文件里写好子函数,再在main函数里调用就行了。
我们之前的封装是对共性的封装,这种封装到一定的程度就成了对对象的封装,这个时候我们对问题的抽象化已经到达了一定的程度,但是我们对对象的实例化与方法的调用等操作都是在main函数里的,也就是说我们对个性的实现主要是在main函数里,也就是我们对需求的实现主要是在main函数里。而且这些实现需求的语句是十分零碎杂乱的。要让程序更加有序,我们可以将需求的实现也封装起来,这样我们只需要在main函数里进行实例化和函数调用就可以了。而需求是需要函数来完成的,所以我们要把实现一个需求的语句封装在一个函数里,这样调用这个函数就可以实现需求。而fa函数是将实现需求的语句全部封装在函数内,而ask函数是将每一个小的需求都再封装在一个小的函数里,这样会使程序封装度更高,更加的有序。所以我们要使整个程序有序,不仅需要封装对象,也需要封装需求,不仅需要封装数据,也需要封装函数,即要做到数据、方法的有序,要做到所有函数内都是有序的,所有需求的实现都是有序的。
二、扩展研究
1、形如ch==’y’返回的bool型如果是非0值,是1还是有规律的数,如果不是1,是什么?
答:由编译器的不同而不同,有的编译器的值是-1,有的是1.
三、研究总结
为了将程序的功能细化,我们可以每一个功能用一个函数实现,这样方便程序的测试、修改、扩展,做到了完全的有序化。事实上我们实现的这个ask函数还属于功能比较复杂的库函数,我们看printf函数、sizeof函数、kbhit函数、getch函数等,功能都非常单一,但是很实用,这样我们写程序时才能想的起来怎么用它们,如果你写了一个功能强大的库函数,要传入很多参数,实现很复杂的功能,但是实现大多数程序时都不适用,甚至你都想不起来该怎么用,这个函数就没有那些简单的、基本的库函数有价值。如果你实现的库函数可以表达我们某一种基本的需求,比如输出、输入、返回、调用等等,那么它才是有价值的。
在比较简单的事物的基础上实现比较复杂的事物,这是比较简单的,在比较复杂的事物的基础上实现比较复杂的事物,这是比较难的。所以一个函数的功能要单一,我们才好用它。因为实现程序、表达思想的是程序员,不是我们调用的库函数,这些封装好的东西只是简化我们工作的,不是代替我们写程序的,它们只能算是一个个单词,是我们程序员把它们串联起来形成一条条语句,形成有特色功能的程序。
而且我们写程序,不要把自己想的太聪明,而是要把自己往蠢里想,正是因为我们时时都有可能犯错,所以我们才要通过规范的程序设计思想来约束自己,正是因为每个人都时时可能犯错,所以才要通过法律、道德、各种价值观、人生观、世界观来约束自己,指导自己怎么去走正确的路,做对的事。
程序设计思想就是指导我们在解决问题时采用合适的思路来分析和解决,而面向对象的程序设计思想能够让我们更好地认识问题,面向过程的程序设计思想能够让我们更好地解决问题。我们当然可以将这两种思想结合起来。而程序设计的关键点就是有序,为了实现这个目标,我们对程序进行各种层次和角度的封装,尽力使其在实现功能的基础上,变得更加有序、合理,便于扩展和组织,以方便我们借助程序对问题进行更深层次的思考。它的意义不仅在于让程序员更容易理解并进行扩展和修改,也在于借助于这个程序思考和解决问题。
c语言用封装来优化程序的更多相关文章
- c语言实现封装、继承和多态
1. 概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...
- 如何提高sql查询性能到达优化程序的目的
1.关于SQL查询效率,100w数据 SQL查询效率 step by step -- setp 1.-- 建表create table t_userinfo(userid int identity(1 ...
- asp.net mvc 自定义pager封装与优化
asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...
- 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)
阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...
- C语言编写的bmp读写程序
C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 <span style="font-size:16px;">#include "Windows ...
- 使用Advanced Installer将.exe程序重新封装为.msi程序
原文:使用Advanced Installer将.exe程序重新封装为.msi程序 使用Advanced Installer将.exe程序重新封装为.msi程序 首先安装Advanced instal ...
- C语言之一天一个小程序
程序示例: #include <stdio.h> #include <stdlib.h> int main() { printf("Hello,world!\n&qu ...
- 详解封装微信小程序组件及小程序坑(附带解决方案)
一.序 上一篇介绍了如何从零开发微信小程序,博客园审核变智障了,每次代码都不算篇幅,好好滴一篇原创,不到3分钟从首页移出来了.这篇介绍一下组件封装和我的踩坑历程. 二.封装微信小程序可复用组件 首先模 ...
- jQuery封装和优化
封装和优化插件 --封装插件 (function($){ //自定义插件代码 })(jQuery) --------------- (function($){ $.fn.extend({ //函数列表 ...
随机推荐
- Mongodb query查询
Query.All("name", "a", "b");//通过多个元素来匹配数组Query.And(Query.EQ("name ...
- Linux用户root忘记密码的解决(unbuntu16.04)
参考: http://www.linuxidc.com/Linux/2012-04/59069.htm http://www.68idc.cn/help/server/linux/2015060735 ...
- mysql 查询随机一条记录
项目中 需要查询热门帖子,查询结果是多条中一条:SQL 如下,记录下
- InnoDB 数据表压缩原理与限制
http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载 ...
- Ext入门的第一个程序(1)
1.Ext是什么? extjs是集UI和ajax框架与一身的,界面又好看,又有很强的ajax交互功能,适合不会做漂亮页面的程序员用的,缺点就是太大了,要导入近800KB左右的js和css文件,这对于w ...
- [转] 消息系统该Push/Pull模式分析
信息推拉技术简介 “智能信息推拉(IIPP)技术”是在网上信息获取技术中加入了智能成份,从而有助于用户在海量信息中高效.及时地获取最新信息,提高了信 息系统主动信息服务的能力.如果引入基于IIPP的主 ...
- [转] ubuntu 12.04 安装 nginx+php+mysql web服务器
Nginx 是一个轻量级,以占用系统资源少,运行效率而成为web服务器的后起之秀,国内现在很多大型网站都以使用nginx,包括腾讯.新浪等大型信息网站,还有淘宝网站使用的是nginx二次开发的web服 ...
- iOS UI布局调试工具
查看ios软件的ui布局有三种: 1.DCIntrospect 这种方式是开源的,我从github上clone下来后运行demo,运行遇到了问题:Xcode cannot run using t ...
- C#编写QQ找茬外挂
QQ找茬外挂,用C#代码编写. 使用方法 这个工具的主要运行流程很简单:游戏截图->比较图片->标记图片不同点.实现代码 截图的处理类ScreenCapture: /// /// 提供全屏 ...
- PHP 关于文件操作的简单介绍
文件操作一直是Web程序员头疼的地方,而文件操作在CMS这样的系统中又是必须的.如今,PHP文件操作的函数内容已经非常强大,文件这部分也是学习PHP非常重要的一部分,希望大家不要忽略.这篇文章会简单介 ...