模块化编程c语言代码编程问题,做一个控制台时钟。代码是怎么写的?

春花秋月何时了?活动不能少。无奈上海路又遥,21ic探报……
MWC(世界移动通信大会)22号正式开幕了,手机不再唱主角,……
无论是 《机械公敌》 里的终极大BOSS还是POI的the machi……
ApplePay自从今年3月正式入华,不少人在尝鲜之后都大呼……
演讲人:黄孝旋时间: 10:00:00
演讲人:陶瑜浦时间: 10:00:00
演讲人:张亚晖时间: 10:00:00
预算:¥5,000-¥10000预算:¥5,000-¥10000
C语言高效编程的几招,你会了几招了?
[导读]编写高效简洁的C 语言代码,是许多软件工程师追求的目标。第1 招:以空间换时间。第2 招:数学方法解决问题。第3 招:使用位操作。第4 招:汇编嵌入。
编写高效简洁的C 语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。
第1 招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1 招--以空间换时间。
例如:字符串的赋值。
方法A,通常的办法:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,&This is an example!!&
const char string2[LEN]=&This is an example!&
cp=string2;
(使用的时候可以直接用指针来操作。)
从上面的例子可以看出,A 和B 的效率是不能比的。在同样的存储空间下,B 直接使用指针就可以操作了,而A 需要调用两个字符函数才能完成。B 的缺点在于灵活性没有A 好。在需要频繁更改一个字符串内容的时候,A 具有更好的灵活性;
如果采用方法B,则需要预存许多字符串,虽然占用了 大量的内存,但是获得了程序执行的高效率。如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。
该招数的边招--使用宏函数而不是函数。举例如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK (int_bf)
return ((IU&&(bw##_bf))-1)&&(bs##_bf);
void SET_BITS(int_dst,int_bf,int_val)
_dst=((_dst) & ~ (BIT_MASK(_bf)))I\
(((_val)&&&(bs##_bf))&(BIT_MASK(_bf)))
SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumb
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK
(MCDR2_ADDRESS)
#define BIT_MASK(_bf)(((1U&&(bw##_bf))-1)&&
#define SET_BITS(_dst,_bf,_val)\
((_dst)=((_dst)&~(BIT_MASK(_bf)))I
(((_val)&&(bs##_bf))&(BIT_MASK(_bf))))
SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumb
函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU 也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU 时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。D 方法是我看到的最好的置位操作函数,是ARM 公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C 方法是其变体,其中滋味还需大家仔细体会。
第2 招:数学方法解决问题
现在我们演绎高效C 语言编写的第二招--采用数学方法来解决问题。
数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
举例如下,求1~100 的和。
for (I=1; I&=100; I++){
I=(100*(1+100))/2
这个例子是我印象最深的一个数学用例,是我的饿计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式Nx(N+1)/2 来解决这个问题。方法E 循环了100 次才解决问题,也就是说最少用了100 个赋值、100 个判断、200个加法(I 和j);而方法F 仅仅用了1 个加法、1 个乘法、1 次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。
第3 招:使用位操作
实现高效的C 语言编写的第三招--使用位操作,减少除法和取模的运算。
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用&位运算&来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例台如下:
J=456-(456&&4&&4);
在字面上好象H 比G 麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法 G 调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H 则仅仅是几句相关的汇编,代码更简洁、效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。
运用这招需要注意的是,因为CPU 的不同而产生的问题。比如说,在PC 上用这招编写的程序,并在PC 上调试通过,在移植到一个16 位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。
第4 招:汇编嵌入
高效C 语言编程的必杀技,第四招--嵌入汇编。
&在熟悉汇编语言的人眼里,C 语言编写的程序都是垃圾&。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编、混合编程。
举例如下,将数组一赋值给数组二,要求每一个字节都相符。char string1[1024], string2[1024];
for (I=0; I&1024; I++)
*(string2+I)=*(string1+I)
for(I=0; I&1024; I++)
*(string2+I)=*(string1+I);
#ifdef_ARM_
MOV R0,string1
MOV R1,string2
LDMIA R0!,[R3-R11]
STMIA R1!,[R3-R11]
ADD R2,R2,#8
CMP R2, #400
方法I 是最常见的方法,使用了1024 次循环;方法J 则根据平台不同做了区分,在ARM 平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0 的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD 数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙、险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。
切记:使用C 语言进行高效率编程,我的体会仅此而已。在此已本文抛砖引玉,还请各位高手共同切磋。希望各位能给出更好的方法,大家一起提高我们的编程技巧。
最近小米发布了一款路由器产品,将智能路由的话题又推向了一个高峰。小米、果壳加上之前的极路由、百度、360、迅雷等,几大巨头将在短时间内加入路由大战,不禁大家都在发问:这难道是下一个颠覆商业模式的革命性产......关键字:
有一个原理:假设有这么一个场景,两个有性欲的男女,如果给他们提供一个私人的隐秘空间,他们肯定会做爱。
......关键字:
7月17日消息,高通已与微软达成合作,并计划于今年第四季度推出80美元甚至是更低价格的智能手机。据悉,高通此举是为了消化库存,与微软合作的这些Windows Phone手机,将采用高通MSM8909入门级解决方案,由于Window......关键字:
现在,人们基本上都会选择平板电脑或者笔记本作为其便携式设备的首选,不过,遗憾的是,它们都只能靠Wi-Fi来连接网络。近日,美国电信运营商AT&T高管Glenn Lurie认为,像平板这样的便携产品仅仅只靠Wi-Fi连接网络是不......关键字:
26日晚,央视猴年春晚进行了现场彩排,按理说应该是完全保密的,但仍旧泄露了出来。彩排结束后不久,便有网友公布了多张彩排现场照片,甚至有人放出了视频,泄露范围之广面积之大前所未有。在泄露的画面中,赫然可以......关键字:
我 要 评 论
热门关键词怎么不让C语言写的控制台程序一闪而过_问答百科_我爱台球网
我爱台球网-www.52tq.net
怎么不让C语言写的控制台程序一闪而过
怎么不让C语言写的控制台程序一闪而过 编程开发 &|&提问者:网友&|&提问时间: 昨天我用C语言写了一个小程序,生成了exe文件,然后我双击那个exe文件的后,弹出黑框,输入数据计算后,结果总是一闪而过,来不及看结果,试了网上的说法,结尾加getchar(),但是我不知道是没有加对位置还是怎么,还是没有解决问题,我想问问在代码里面加什么可以不让他一闪而过。 最完美的答案:程序最后加个getch();就可以 其他参考答案:你的代码中输入数据的部分可能有疏漏,比如在输入数值的后面紧跟输入字符或者字符串,导致第一个回车没从键盘缓冲区被取走,直接就留给字符或字符串输入,于是,你后续的最后一个回车就变成结束“按任意键继续”的效果,关闭了控制台。不妨看看代码哪里需要添加清空缓冲区的代码,或者在输入数值之前加一个空格来清除缓冲区回车,类似如下:scanf(" %d", &a); //注意在%d之前有个空格,这个空格就用来清除之前输入残留的回车getchar ?和system("pause");getchar()不是定解决问题,最常见的方法是在程序未部加system("pause");当然,你还要在头上加#include?&stdlib.h&最合理的解决方案是换个编译器,如dev-cpp它运行exe文件后,会显示结果的实际编程中,这些都不用了,因为现在都是基于windows编程了? 用VC++2008速成版 写控制台程序一闪而过。怎么办?C语言编好的程序一闪而过,怎么不一闪而过?3C#控制台应用程序执行结果一闪而过是怎么回事?vc++.net 控制台应用程序一闪而过C#的一个问题,控制台程序界面一闪而过1 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
北京理工大学09级C语言编程练习答案
下载积分:600
内容提示:北京理工大学09级C语言编程练习答案
文档格式:DOC|
浏览次数:271|
上传日期: 16:20:27|
文档星级:
该用户还上传了这些文档
北京理工大学09级C语言编程练习答案
官方公共微信怎么用c语言 编一个时间表 源代码是什么?_?_百度知道
怎么用c语言 编一个时间表 源代码是什么?_?
结构tm的定义为struct tm{int tm_include/DST_RUM /tm_sec);time (&timep);
&#47,localtime表头文件#i nclude定义函数char * asctime(const struct tm * timeptr);%d,tm_min。范例#i ncludemain(){time_t timep,当地时区的信息则放到tz所指的结构中;tm_mon),&quot:49,然后将结果以字符串形态返回;;#i ncludemain(){time_,错误代码存于errno,gettimeofday表头文件#i nclude定义函数time_t time(time_t *t);%d\* Hours */}执行Sat Oct 28 02;double difftime(time_t time1;;tm_hour:char * asctime(struct tm * ptr)
将tm结构的时间转化为日历时间: 12 ;gettimeofday (&int tm_struct tm *p;},无法正确设置时间,asctime,p-&gt。此函数与ctime不同处在于传入的参数是不同的结构,错误原因存于errno中,失败返回-1;size_t strftime(char *s;10&#47,ctime, gmtime表头文件#i nclude定义函数struct tm *localtime(const time_t * timep)。若再调用相关的时间日期函数:49 。结构tm的定义请参考gmtime();%d%d%d&quot。char *ctime(long time)
将机器时间转化为日历时间.void unixtodos(:
可由函数localtime( ),当地时区信息则设成tz所指的结构,范围为0-6int tm_yday 从今年1月1日算起至今的天数。 time(取得目前的时间)相关函数ctime.h库), time_t time1) 得到两次机器时间差,失败则返回((time_t)-1)值;, &tz),得到机器时间;,而是UTC时间;printf(&tz_minuteswest, p-&gt, struct time *t) 将UNIX格式的时间和日期转换成DOS格式(由time 和date两部分组成,timep = mktime(p),ftime;非空时;*中欧*/struct tm *gmtime(const time_t *timer).tz_minuteswest);DST_GB &#47,权限不够:08 1993&#92。此函数已经由时区转换成当地时间。返回值成功则返回秒数;Mon& /int tm_wday,此函数也会将返回值存到t指针所指的内存.tv_sec) ;
int tm_Thu&quot, wday[p-&函数说明mktime()用来将参数timeptr所指的tm结构数据转换成从公元日0时0分0 秒算起至今的UTC时间所经过的秒数;sys/printf(&quot:-540tz_dsttime,ctime(&timep)),&quot:136996tz_
/*美国*/ %d\*日光节约时间的状态*&#47,struct tm和clock_t: settimeofday(设置目前时间)相关函数;time(&timep):15。如果t 并非空指针的话;};n&10&#47, ctime, struct time *t) 将DOS的日期和时间格式转换成UNIX标准(机器时间(用到dos,函数说明此函数会返回从公元日的UTC时间从0时0分0秒算起到现在所经过的秒数;int tm_mday。详细的说明请参考gettimeofday(), struct timezone * tz )函数说明gettimeofday()会把目前的时间有tv所指的结构返回;printf(&
};,范围从0-11int tm_year 从1900 年算起至今的年数int tm_wday 一星期的日数;;long tv_*澳洲*&#47。以tm结构表达的时间;printf(&quot,ctime,并且用到time() ,& %d&#92.tv_usec);time_*加拿大*/}执行tv_struct tm *localtime(const time_t *timer);;int tm_sec 代表目前秒数,*秒*&#47,asctime(gmtime(&timep))); /%s%d。tz_dsttime 所代表的状态如下DST_NONE &#47,从一月算起:struct timezone{int tz_tm_wday];
unsigned char ti_*微秒*/Wed&quot, gmtime( )得到
int tm_Tue&}执行2000&#47,p=localtime(&timep), p-&gt, p-&printf(&quot,printf(&usr/* 用time()取得时间(秒数);*
Day of the month *&#47,只能由机器时间得到;Wed Jun 30 21;tv_sec。EINVAL 时区或某个数据是不正确的,gettimeofday表头文件#i nclude#i nclude定义函数int settimeofday ( const struct timeval *int tm_strcut tm *p,设置机器时间;;/
int tm_Thu&n&quot,它们都在头文件中说明; %d\
}.h库)void getdate(struct date *d) 得到系统日期;tm_sec);*不使用*&#47,timep), p-&gt。返回值返回经过的秒数,(1900+p-&gt,localtime表头文件#i nclude定义函数char *ctime(const time_t *timep);printf(&quot,&
int tm_wday:分, p-&;* Minutes *&#47,Tue&}执行Sat Oct 28 10 ;%s&n&quot:time_t:0 gmtime(取得目前时间和日期)相关函数clock_t clock(void);返回值成功则返回0;函数说明gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法。范例#i ncludemain(){char *wday[]={& /};localtime()-&gt。附加说明EFAULT指针tv和tz所指的内存空间超出存取权限,范围为0-23int tm_mday 目前月份的日数,但允许至61秒int tm_min 代表目前分数,&*土耳其*&#47,只有root权限才能使用此函数修改时间;p=gmtime(&timep):%d&#92:12;*
Year - 1980 */tm_year);n&DST_USA &#47。错误代码EPERM 并非由root权限调用settimeofday(),范围0-59int tm_hour 从午夜算起的时数;Sun&DST_CAN /printf(&quot,size_localtime()-&gt,time_t time2): 05 2000 gettimeofday(取得目前的时间)相关函数time,asctime,字符串格式为:22 mktime(将时间结构数据转换成经过的秒数)相关函数time,;time (&timep)。返回值成功则返回0;int tz_
/int tm_*罗马尼亚*/n&quot: tv_usec: %d \}执行time();%s&tv_返回值若再调用相关的时间日期函数。在头文件中定义了三种类型。注意,然后将结果以字符串形态返回;struct tm *p。附加说明返回一字符串表示目前当地的时间日期:struct timeval{long tv_*取得当地时间*/DST_TUR /函数说明settimeofday()会把目前时间设成由tv所指的结构信息,const char *format,const struct timezone *tz);
/}:38 localtime(取得当地目前时间和日期)相关函数
int tm_下面是我从网上收集到的时间函数集asctime(将时间和日期以字符串格式表示)相关函数time。下面列出了这些函数。范例&#47。timeval结构定义为;n&DST_MET /
unsigned char ti_hour, p-&gt,字符串格式为&quot,p=localtime(&timep);*和Greenwich 时间差了多少分钟*/n&quot,localtime表头文件#i nclude定义函数struct tm*gmtime(const time_t*timep);Wed&quot,&Wed Jun 30 21 :06 2000 ctime(将时间和日期以字符串格式表示)相关函数mktime(); /timezone 结构定义为;/;time_t timep。此函数返回的时间日期已经转换成当地时区;tm_mday);time_t mktime(struct tm *timeptr),d 存放得到的日期信息void setdate(struct date *d)void gettime(struct date *t) 得到系统时间 d 存放得到的时间信息void settime(struct date *t)C语言的标准库函数包括一系列日期和时间处理函数;:%d\Sat&;time(&timep), asctime:08 1993&#92,localtime表头文件#i nclude定义函数time_t mktime(strcut tm * timeptr),利用localtime()转换成struct tm 再利用mktine()将struct tm转换成原来的秒数*&#47,然后将结果由结构tm返回:time()-&
/%d%d%d &quot用到的数据结构;
int tm_用到的函数;char *ctime(const time_t *timer);time()-&gt。struct tm *gmtime(time_t
*time) 将机器时间转化为tm时间当ptr为空时;。范例#i ncludemain(){time_Fri&quot:&DST_AUSTALT /上述两个结构都定义在&#47:星期 月 日 小时.h,int tm_yday。返回值返回结构tm代表目前UTC 时间范例#i ncludemain(){char *wday[]={&Sat&*澳洲(1986年以后)*/tm_wday],可由time( )函数获得;int tm_tm_mday);},范围为0-365int tm_isdst 日光节约时间的旗标此函数返回的时间日期未经时区转换;系统时间struct
unsigned char ti_min,从星期一算起;n&函数说明asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法;
da_mon。返回值返回一字符串表示目前当地的时间日期,( l+p-&%s%d;;tz_dsttime:秒 年\tm_year),此字符串可能会被破坏,tz,;char *asctime(const struct tm *timeptr);mktime();
da_day。time_t
time(time_t *ptr)
得到或设置机器时间double difftime(time_t time2,timep),此字符串可能会被破坏;DST_WET &#47, %d\* Seconds *&#47, struct date *d;;Fri&tm_min,settimeofday表头文件#i nclude#i nclude定义函数int gettimeofday ( struct timeval ** Month (1 = Jan) */Mon&;0可由函数ctime( ) asctime( ) 得到;tm_hour,范围01-31int tm_mon 代表目前月份;*西欧*/*东欧*/;
&#47,错误代码存于 &#47,正常范围为0-59,然后将结果由结构tm返回,&quot,&* Hundredths of seconds */。范例#i nclude#i ncludemain(){&#47,&quot:10;*大不列颠*/
/}执行2000/Sun&quot,结构tm定义如下;
int tm_yday.tz_dsttime),const struct tm *timeptr);n&quot, (1900+p-& &#47,单位为秒long dostounix(struct data *d, wday[p-&, (1+p-&gt,失败返回-1;printf (&quot。格式为;printf(&
int tm_mon,&n&quot。日历时间用一个(char *) 类型的字符串表示;;28 Sat 11;DST_AUST /
unsigned char
ti_函数说明ctime ()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法;int tm_28 Sat 8;DST_EET &#47,&quot,p-&
int tm_min,函数说明localtime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法。在中说明的C语言时间函数time_t time(time_t *timer);time(&timep),&;n&#92。此函数已经由时区转换成当地时间;printf(&quot。返回值返回结构tm代表目前的当地时间:%d;printf(&系统日期
da_year:time_t是一个long类型 代表机器时间;tm_mon)
其他类似问题
为您推荐:
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁第15章 DSP的C语言编程_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第15章 DSP的C语言编程
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩46页未读,继续阅读
你可能喜欢

我要回帖

更多关于 c语言编程代码 的文章

 

随机推荐