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({ //函数列表 ...
随机推荐
- 博客SEO-搜索引擎工作原理简介
资源推荐 Zac出版的<SEO实战密码>是SEO入门的好书,可惜我在当当网买的电子书受DRM版权保护,无法与大家分享. 我在网上找到了此书的 了解搜索引擎 章节,非常详细,且容易理解. ...
- HDU 4622 多校第三场1002 后缀自动机
比赛的时候我是用后缀数组的,但是T了. 赛后看了解题报告说,后缀数组貌似是卡你常数的时间,我算了下复杂度O(T * Q * n).这是10 ^ 8,但是考虑到每次询问的时候都要重新构造字符,所以那个n ...
- 开始我的 JNI 入门吧
JNI (java native interface) java本地开发接口(一句话 : 就是1个 adapter). JNI 是一个协议 - 是用来让 java代码和C,C++ 代码 ...
- hdu 3642 Get The Treasury(扫描线)
pid=3642" style="">题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次 ...
- 网络环境场景以及模拟工具netem
网络环境场景包括: 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况. 掉包(Drop),随机丢弃一些数据. 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的 ...
- c++回调编程本质
1. boost:bind获得一个函数对象,就像函数指针一样,这个行为可以作为回调 2. bosot:bind的函数对象可以保存别的对象的引用,回调对象的成员函数 3. boost:function是 ...
- java中-静态代码块、构造代码块、构造方法的联系
例如该题: 1 class Fu{ static { System.out.println("这是父类静态代码块"); } { System.out.println("这 ...
- Android系统移植与驱动开发——第七章——LED驱动
LED驱动的实现原理 编写LED驱动: 测试LED驱动之前需要用USB数据线连接开发板,然后打开电源,成功启动之后,执行build.sh脚本文件编译和安装LED驱动,顺利则会自动连接 如果有多个设备文 ...
- HDU 4442 Physical Examination(关于贪心排序)
这个题目用贪心来做,关键是怎么贪心最小,那就是排序的问题了. 加入给定两个数a1, b1, a2, b2.那么如果先选1再选2的话,总的耗费就是a1 + a1 * b2 + a2; 如果先选2再选1, ...
- codevs3304水果姐逛水果街
/* 线段树开到*4 *4 *4 *4 ! 维护 4个值 区间最大值 区间最小值 从左往右跑最大收益 从右往左跑最大收益 */ #include<iostream> #include< ...