Monday, April 30, 2007

Final Presentation

昨天晚上, 或者说是今天凌晨, 接到"小道消息"说, 我们的Final Presentation被安排在今天下午四点.
和志峰凌晨两点跑到周逸卿楼去看公告. Superise! 果然是........
我靠, PPT都还没做, 还presentation呢. 回来后本来想通宵的, 结果是在不撑就睡了. 今天早上12点中起来, 起了个澡, 吃了个饭, 就开工了, 做到3点50分, 急急忙忙赶过去, 也不知道自己说的什么就结束了.
唉...终于结束了.
PS. 结束后我们和Kao哥在Student Union 喝茶聊天. 很多问题, 一到嘴边, 不知道怎么用英语表达, 又硬生生的咽了回去............

Sunday, April 29, 2007

Word 插入页码

首先, 火箭又输了, 而且输的很惨, 哀悼一下先. 凌晨七点多睡, 十一点左右爬起来支持火箭, 真令我失望.

终于把浙大要的毕业设计的第一册弄好了. 其实内容老早就写好了, 只是要把三个文件合在一起装订打印. 可是内容格式, 像什么边框距了, 字体了, 目录格式了, 规定一坨一坨的. 烦都烦死了, 可是又不能不弄. 之前弄过一次了, 碰到很多word的问题, 烦了就仍在那了. 五一之前必须要交了, 所以今天只能硬着头皮上了. word的功能是在太强大, 平时也就打个字之类的, 都没好好去研究, 今天真要用到了, 才觉得难受.
主要想记一下word中插入页码的问题, 大家都在做毕业设计, 可能会对其他人有帮助.

**********************************************************************************

如果你想从第二页开始插入页码的话,最简单的方法是:页面设置->版式->首页不同; 或者在添加页码中选择从"第0页"开始, 并且"选择首页不显示".
如果你想从第X页开始插入页码的话方法是:X代表你想插入的页码
1、将鼠标定位在第X-1页的最后一个字符后
2、选择 插入->分隔符. 在 "分节符类型"选项中,选中 "下一页".
3、将鼠标定位到第X页
4、选择 插入->页码
这样 "将第X页设为第1页的问题"就解决了;但还要执行下面这一步
5、双击第X页的页脚,出现 "页眉和页脚" 工具图标,同时页脚区域会显示 "与上一节相同" 的提示(如果没有此提示,下面的步骤就不用执行了)
6、点击 "页眉和页脚" 工具图标中 "链接到前一个" 按键后,页脚区域显示的 "与上一节相同" 的提示消失;
7、点击 "页眉和页脚" 工具图标中"关闭" 按键;至此就ok了

Submitted Final Report Draft!!!

终于啊, 终于! 刚才向导师提交了final report的初稿, 这样final year project的主要工作就基本完成了. 剩下的就是改改final report, 做一下final presentation.
哈哈, 值得纪念的时刻啊. 2007年4月29日2点50分!
嗯, 还不能睡觉, 等会要去吃早茶!
发几张小时候红白机的经常玩的游戏的截图, 使用psp模拟的, 呵呵, 好有感觉啊.


Friday, April 27, 2007

北京奥运会火炬传递路线图[中国境内]

2007年4月26日, 在距离北京奥运会开幕还有470天的时候, 北京奥组委公布了08年北京奥运会火炬传递路线图. 此刻, 我还在为我的final year project report而奋斗. *_*.
不出所料, 还是要经过台湾, 不知道大陆和台湾是怎么商量的? 也不知道当08年奥运火炬传到台湾的时候, 台湾人到底是什么感受? 会不会有奥运会在自己国家里举行的自豪感, 还是*&(%$##.
感到庆幸的是, 会经过香港, 08年的时候可能还是在香港了. 不过全国像样的城市都经过了, 不经过香港也不太可能.
感到失望的是, 路线图上没有自己的家乡-淄博. 虽然即使有经过, 对自己也不会有什么影响. 不过全国像样的城市都经过了, 却还是没有淄博.

Sunday, April 22, 2007

what the hell is Japan!?

日本, 菊花和刀的国家.
对于一个中国人来说, 日本真是让人又憎又爱.
日本给了中国一段不堪回首的屈辱历史, 却至今不肯正视, 不愿道歉;
日本首相至今仍在参拜靖国神社;
日本官员仍口出狂言"历史上不存在慰安妇";
日本今天仍然霸占着钓鱼岛;
日本现在还觊觎着我们的东海.
一个可恨的, 可恶的邻居.
日本的文化原于中国, 让中国人感到有亲切感;
日本的经济发达, 是多少中国人的梦想;
日本的卡通动漫, 陪伴我们走过童年, 甚至大学无聊的生活;
日本的电子产品风靡世界, 是时尚, 质量的代名词.
一个可爱的, 可敬的邻居.
中国人对于日本的感情实在是非常复杂.

PS 1
常用游戏的日语翻译 [zz from 幸福种子]
コマンド(command) :指令

ロ-ド(load):正在读取

スタ-ド(start):开始 

コソティニユ-(continue):继续  

ォプツョン(option):设定 

ツスチム(system):系统

サゥント(sound):声音 

もどる:返回

セレクト(select):选择 

ォ-ト(auto):自动模式

ニュ-ゲ-ム:New game

ステ-ジ(stage):关卡;版面

スコァ(score):分数

セ-ブ(save):储存

PS 2: 这个日本女是谁? 唱歌很好听啊.


Thursday, April 19, 2007

不厚道

今天把HKUST给拒了, 总觉得自己不太厚道. 毕竟是答应了人家的. 刚开始的时候也考虑到诚信问题, 但是那段时间一个offer都没有的时候, 非常害怕, 所以也就"不择手段"得乱许诺, 对哪个学校也是说给了offer就会去. 现在真的要面对选择的时候就有问题了. 其实之所以把UST拒了完全是因为HKU早给了offer. 对我来说, 两个学校都挺好. 唉, 算了, 以后要少做些没诚信的事情了.

Tuesday, April 17, 2007

New Album! the return of Avril Lavigne

Yup, Avril is back, with her new album, the best damn thing. I heared that she will come to HongKong to publicise this new album next month. haha, maybe i am luckily enough to see her. whatever, enjoy the new songs first.

Monday, April 16, 2007

无聊的人

志锋(329427002) 13:14:03
这个有意思
化石研究显示鸡可能是暴龙后裔(图)
http://tech.sina.com.cn/d/2007-04-16/08231466397.shtml

这个问题困扰我很久,与其让我相信某种动物经过突变成了会下蛋的鸡,我宁愿相信会下蛋的某种动物某天下了一个发生突变的蛋。
zyw(273076727) 13:15:17
下面那句话是谁说的........
志锋(329427002) 13:16:01
当然是我了
zyw(273076727) 13:16:25
"某种动物经过突变成了会下蛋的鸡"????
志锋(329427002) 13:17:25
要么 鸡--》蛋, 我不信的
要么 蛋--》鸡, 我信的
wrong??
zyw(273076727) 13:18:42
没看懂你说的什么意思, 不知道wrongbuwrong. 但是没人说是某种动物突变成了鸡
志锋(329427002) 13:19:58
。。。。。。。
真的没人?? 那么所有人都应该认为是某个蛋突变孵化出了鸡?? 好像不见的
zyw(273076727) 13:20:17
..........
zyw(273076727) 13:20:25
你真没学过生物?
zyw(273076727) 13:21:03
鸟类是由爬行动物进化过来的,
zyw(273076727) 13:21:20
什么鸡蛋, 蛋鸡的?
志锋(329427002) 13:22:58
我问你先有鸡还是鸡蛋??
排除某个鸟蛋不小心突变孵化出了鸡(这个和暴龙蛋一个意思)
zyw(273076727) 13:24:12
, 这个问题.........那就不知道了. 要考鸡蛋的定义, 你先给个定义: 是鸡下的蛋叫鸡蛋? 还是能孵出鸡的蛋叫鸡蛋?
志锋(329427002) 13:24:51
能孵出鸡的蛋
zyw(273076727) 13:24:55
那还用说吗.
志锋(329427002) 13:25:08
排除突变的那颗鸟蛋
zyw(273076727) 13:25:14
如果你能给出鸡蛋的定义, 那这个问题就不叫问题
志锋(329427002) 13:26:49
换句话说无论怎么样蛋是无辜的
要突变全部都是鸟(或鸡)的问题。
蛋只是继承特性
志锋(329427002) 13:26:52
??
yeats(164331714) 13:27:49
YM下两位philosopher~
zyw(273076727) 13:28:06
鸡蛋, 蛋鸡根本就是没有意义的问题. 你说"相信某种动物经过突变成了会下蛋的鸡", 难道是它某天早上起来突然成了鸡?
yeats(164331714) 13:28:45
一大早就在研究蛋和鸡的问题来了...
志锋(329427002) 13:29:34
。。。。。显然有的嘛

zyw(273076727) 13:29:33
可以激发一下思维, 增加脑部血液流量, 不知道过早痴呆. 还是有好处的, 你也来完文
zyw(273076727) 13:29:44
显然有什么?>
zyw(273076727) 13:31:16
??????
志锋(329427002) 13:31:20
因为那只鸡发生突变所以下了个突变的蛋(参考格斯拉 和 蜥蜴变异)
大哥就不信完全是因为哪个健康的蛋突然变异了
所以不是所有人都有明确的鸡到蛋 或是 蛋到鸡的概念
zyw(273076727) 13:31:34
格斯拉 ......
zyw(273076727) 13:32:20
我都说过了, 这是鸡和蛋的定义的问题:
志锋(329427002) 13:32:49
你这就像取极限的问题
可是总是有个点啊
zyw(273076727) 13:32:54
1. 如果鸡蛋是指鸡下的蛋的话: 那肯定是先有鸡,
志锋(329427002) 13:33:30
如果只是定义上的问题那么可能鸟就可是说是鸡了
或者是“远古时代定义的鸡”
zyw(273076727) 13:33:31
2. 如果鸡蛋是指能孵出鸡的蛋的话: 那就是先有蛋了.
zyw(273076727) 13:34:08
鸟和鸡是一个性质, 我觉得不会影响这个问题.
zyw(273076727) 13:34:25
先有鸟? 还是先有鸟蛋?
zyw(273076727) 13:34:32
不是一样吗
志锋(329427002) 13:35:21
这个问题好 鸟的祖先总不会下蛋的
所以这个问题比较干脆,免的你抠定义
zyw(273076727) 13:35:31
...........
zyw(273076727) 13:35:38
鸟的祖先不会下蛋????
zyw(273076727) 13:35:45
唉........
志锋(329427002) 13:36:04
鸟的祖先 : 第一只会下蛋的鸟
志锋(329427002) 13:36:32
你不会认为有一个突然间孵化的蛋吧??
zyw(273076727) 13:36:31
鸟是有爬行动物进化过来的, 爬行动物也是会下蛋的,大哥
zyw(273076727) 13:36:36
唉...
志锋(329427002) 13:37:15
这个大哥失误
志锋(329427002) 13:38:30
简单说 第一头 会下蛋的动物是不是突变来的??
zyw(273076727) 13:39:02
我理解一下啊
zyw(273076727) 13:39:58
这个怎么理解? 我觉得还是回到鸡和蛋吧,
志锋(329427002) 13:41:16
就得这么理解
如果 第一头会下蛋的动物是突变来的
那么 第一只“会下鸡蛋”的鸡是也可以说是突变来的
right??
zyw(273076727) 13:42:52
第一会下蛋的鸡是突变而来的, 但不是和你之前的观点相反了.........
志锋(329427002) 13:43:05
这个个算是 “第一个” “鸡蛋”的出处
第一个鸡蛋 孵出 的鸡 是你说的定义上“由蛋孵出的”鸡
zyw(273076727) 13:44:00
看不懂. 你先明确下鸡蛋的定义
志锋(329427002) 13:44:19
我说两个问题困扰我很久
你说大家只有一个想法。
zyw(273076727) 13:44:19
能孵出鸡的蛋叫鸡蛋?
zyw(273076727) 13:44:31
我有说大家都是一个想法吗..............
志锋(329427002) 13:45:03
“但是没人说是某种动物突变成了鸡”--by 1D
zyw(273076727) 13:45:45
只是你其中一个说法是明确错误的."与其让我相信某种动物经过突变成了会下蛋的鸡", 某天早上起来那个动物醒来发现, 自己成鸡了??????/
志锋(329427002) 13:45:59
就2个可能啊 要么动物突变 要么 蛋突变
如果说蛋也是一种动物的话 我没法说
zyw(273076727) 13:46:08
你先回答我上面的问题
zyw(273076727) 13:46:52
会不会有某种动物第二天突变成另外一种动物?
志锋(329427002) 13:47:11
是可能受到什么射线影响,一个不小心就下个蛋了
这也是第一头能下蛋的动物的由来啊
志锋(329427002) 13:48:24
界限是模糊的 但是观点就是这样的
zyw(273076727) 13:48:37
好, 那你给出"鸡"的定义. 能下鸡蛋的动物叫鸡? 还是从鸡蛋中孵出的动物叫鸡.
志锋(329427002) 13:50:35
现在我们的讨论已经上升到 “会下蛋的那个东西”了
不是这个定义
正如你说的 鸡要定义 鸡蛋要定义
鸡的定义又包括鸡蛋的定义,反之亦然
zyw(273076727) 13:51:03
是啊, 所以只是定义的问题
志锋(329427002) 13:52:01
哥哥去上课了
zyw(273076727) 13:52:21
嗯, 那算我赢了, 谢谢大家
zyw(273076727) 13:52:33
今天的辩论结束了
志锋(329427002) 13:52:38
我的观点“大家被两种想法困惑着”
你的观点大家只有一个想法。
-------------现在连问题都无法描述清,所以我怀疑你的观点。。。
zyw(273076727) 13:54:29
你的观点大家只有一个想法。????????????
志锋(329427002) 13:54:34
走了
zyw(273076727) 13:54:33
我有说这个吗?
志锋(329427002) 13:54:55
我就当是这个了
zyw(273076727) 13:55:00
我的观点是你说的问题不是问题, 有了定义就没问题了.
zyw(273076727) 13:55:05
_-_!

Sunday, April 15, 2007

[ZZ]C语言-time.h从头学

C语言-time.h从头学
本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。

关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)

1.概念
在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.

通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:

Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。

Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。

epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。

2. 计时

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void elapsed_time()
{
printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);
}

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

#include “stdio.h”
#include “stdlib.h”
#include “time.h”

int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- ) ;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}

在笔者的机器上,运行结果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。

3.与日期和时间相关的数据结构

在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:

#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
#define _TM_DEFINED
#endif

ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。

而日历时间(Calendar Time)是通过time_t数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:

#ifndef _TIME_T_DEFINED
typedef long time_t; /* 时间值 */
#define _TIME_T_DEFINED /* 避免重复定义 time_t */
#endif

大家可能会产生疑问:既然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?对time_t数据类型的值来说,它所表示的时间不能晚于2038年1月18日19时14分07秒。为了能够表示更久远的时间,一些编译器厂商引入了64位甚至更长的整形数来保存日历时间。比如微软在Visual C++中采用了__time64_t数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32位字的time()函数),这样就可以通过该数据类型保存3001年1月1日0时0分0秒(不包括该时间点)之前的时间。

在time.h头文件中,我们还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数:

double difftime(time_t time1, time_t time0);
time_t mktime(struct tm * timeptr);
time_t time(time_t * timer);
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

此外,time.h还提供了两种不同的函数将日历时间(一个用time_t表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式tm:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

通过查阅MSDN,我们可以知道Microsoft C/C++ 7.0中时间点的值(time_t对象的值)是从1899年12月31日0时0分0秒到该时间点所经过的秒数,而其它各种版本的Microsoft C/C++和所有不同版本的Visual C++都是计算的从1970年1月1日0时0分0秒到该时间点所经过的秒数。

4.与日期和时间相关的函数及应用
在本节,我将向大家展示怎样利用time.h中声明的函数对时间进行操作。这些操作包括取当前时间、计算时间间隔、以不同的形式显示时间等内容。

4.1 获得日历时间

我们可以通过time()函数来获得日历时间(Calendar Time),其原型为:
time_t time(time_t * timer);

如果你已经声明了参数timer,你可以从参数timer返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数。如果参数为空(NUL),函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间:

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
printf("The Calendar Time now is %d\n",lt);
return 0;
}

运行的结果与当时的时间有关,我当时运行的结果是:

The Calendar Time now is 1122707619

其中1122707619就是我运行程序时的日历时间。即从1970年1月1日0时0分0秒到此时的秒数。

4.2 获得日期和时间

这里说的日期和时间就是我们平时所说的年、月、日、时、分、秒等信息。从第2节我们已经知道这些信息都保存在一个名为tm的结构体中,那么如何将一个日历时间保存为一个tm结构的对象呢?

其中可以使用的函数是gmtime()和localtime(),这两个函数的原型为:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间。比如现在用gmtime()函数获得的世界标准时间是2005年7月30日7点18分20秒,那么我用localtime()函数在中国地区获得的本地时间会比世界标准时间晚8个小时,即2005年7月30日15点18分20秒。下面是个例子:

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *local;
time_t t;
t=time(NUL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}

运行结果是:

Local hour is: 15
UTC hour is: 7

4.3 固定的时间格式

我们可以通过asctime()函数和ctime()函数将时间以固定的格式显示出来,两者的返回值都是char*型的字符串。返回的时间格式为:

星期几 月份 日期 时:分:秒 年\n\0
例如:Wed Jan 02 02:03:55 1980\n\0

其中\n是一个换行符,\0是一个空字符,表示字符串结束。下面是两个函数的原型:

char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

其中asctime()函数是通过tm结构来生成具有固定格式的保存时间信息的字符串,而ctime()是通过日历时间来生成时间字符串。这样的话,asctime()函数只是把tm结构对象中的各个域填到时间字符串的相应位置就行了,而ctime()函数需要先参照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串。在下面,如果t是一个非空的time_t变量的话,那么:

printf(ctime(&t));

等价于:

struct tm *ptr;
ptr=localtime(&t);
printf(asctime(ptr));

那么,下面这个程序的两条printf语句输出的结果就是不同的了(除非你将本地时区设为世界标准时间所在的时区):

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
ptr=gmtime(<);
printf(asctime(ptr));
printf(ctime(<));
return 0;
}

运行结果:

Sat Jul 30 08:43:03 2005
Sat Jul 30 16:43:03 2005

4.4 自定义时间格式

我们可以使用strftime()函数将时间格式化为我们想要的格式。它的原型如下:

size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);



我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。

函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。

%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十进制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

如果想显示现在是几点了,并以12小时制显示,就象下面这段程序:

#include “time.h”
#include “stdio.h”
int main(void)
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NUL);
ptr=localtime(<);
strftime(str,100,"It is now %I %p",ptr);
printf(str);
return 0;
}

其运行结果为:
It is now 4PM

而下面的程序则显示当前的完整日期:

#include
#include

void main( void )
{
struct tm *newtime;
char tmpbuf[128];
time_t lt1;
time( <1 );
newtime=localtime(<1);
strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
printf(tmpbuf);
}

运行结果:

Today is Saturday, day 30 of July in the year 2005.

4.5 计算持续时间的长度

有时候在实际应用中要计算一个事件持续的时间长度,比如计算打字速度。在第1节计时部分中,我已经用clock函数举了一个例子。Clock()函数可以精确到毫秒级。同时,我们也可以使用difftime()函数,但它只能精确到秒。该函数的定义如下:

double difftime(time_t time1, time_t time0);

虽然该函数返回的以秒计算的时间间隔是double类型的,但这并不说明该时间具有同double一样的精确度,这是由它的参数觉得的(time_t是以秒为单位计算的)。比如下面一段程序:

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
time_t start,end;
start = time(NUL);
system("pause");
end = time(NUL);
printf("The pause used %f seconds.\n",difftime(end,start));//<-
system("pause");
return 0;
}

运行结果为:
请按任意键继续. . .
The pause used 2.000000 seconds.
请按任意键继续. . .

可以想像,暂停的时间并不那么巧是整整2秒钟。其实,你将上面程序的带有“//<-”注释的一行用下面的一行代码替换:

printf("The pause used %f seconds.\n",end-start);

其运行结果是一样的。

4.6 分解时间转化为日历时间

这里说的分解时间就是以年、月、日、时、分、秒等分量保存的时间结构,在C/C++中是tm结构。我们可以使用mktime()函数将用tm结构表示的时间转化为日历时间。其函数原型如下:

time_t mktime(struct tm * timeptr);

其返回值就是转化后的日历时间。这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,下面的例子可以计算出1997年7月1日是星期几:

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
printf(ctime(&t_of_day));
return 0;
}
运行结果:
Tue Jul 01 00:00:01 1997
现在注意了,有了mktime()函数,是不是我们可以操作现在之前的任何时间呢?你可以通过这种办法算出1945年8月15号是星期几吗?答案是否定的。因为这个时间在1970年1月1日之前,所以在大多数编译器中,这样的程序虽然可以编译通过,但运行时会异常终止。

Saturday, April 14, 2007

买了PSP!

前段时间一直想买个psp了, 主要是打发时间. 打打游戏啊, 看看mp4. psp的屏幕超赞, 看电影那是相当爽, 其实想买的冲动也是源于此. 上网了解了n多知识, psp有个刷机的问题. 高版本的由于不能刷机, 所以不能玩iso的游戏, 只能买正版的umd光盘(像winning eleven这样的游戏, 要320hk$). 但是, 穷学生一个, 哪有这么多钱啊. 所以只能买低版本的. sony精的很, 为了能买正版游戏, 不停的升级版本. 所以低版本的psp现在很少能买到, 到正规商店去买, 更是想都不用想. 奔了湾仔, 黄金, 旺角几家电脑城都没有发现合适的, 主要怕奸商把我这个小白骗了.......就这样也渐渐不再关注了.
昨天楼友说他的朋友有一台全新的PSP, 公司annual dinner的时候中奖了(这RP...). 于是, 昨天晚上去看了一下, 觉得挺好, 而且也是ver2.81的, 可以刷机, 就买下了. Value Pack 加 Winning Eleven 10, 一共1500hk$. 买行货大概要1900多.
不过还是不能玩游戏, Winning Eleven 10 最低要ver2.82. 看来要买个数据线先升到ver3.03了.

Tuesday, April 10, 2007

i scored the golden goal!

however, i made it on the basketball court. weird? haha
tonight, we, 13/F, played interfloor basketball against 17/F. i still remember We lost 3 to 12 in last interfloor football march with the same guys. they have two U football team players. they showed great power in the basketball court as well, though we have 3 hall basketball team players. it is doomed to be a keen match!!!
Sure enough, we played two overtimes and two of our key players were fouled out. the referees decided to determine the final result by freethrowing just as that in football match. each team presented five player. i was the first one!
in the first round, i failed to score and each team got just 1 point.
in the second round, our opponent lost and i goaled! the whole match is over FINALLY!!!!!!!!!
nice night!

Monday, April 09, 2007

About Google

两条关于google的消息
1, Google的blogspot好像再次被和谐了(新学会的用法 -_-!). 哎, 还是希望中国政府对自己有自信一点, 别的国家政府也没有GFW, 难道就都倒台了? 希望我们的政府成熟一点, 不要给人留下太多诟病的把柄.
2, Google中国对关于Google 拼音字库的问题, 正式承认了抄袭一说.

Sunday, April 08, 2007

[ZZ]C和C++里面的lvalue 和 rvalue的释义

一个百科网站About Site上找到lvalue 和 rvalue 这两个词的准确释义,摘贴如下:
Definition: C and C++ have the notion of lvalues and rvalues associated with variables and constants. The rvalue is the data value of the variable, that is, what information it contains. The "r" in rvalue can be thought of as "read" value. A variable also has an associated lvalue. The "l" in lvalue can be though of as location, meaning that a variable has a location that data or information can be put into. This is contrasted with a constant. A constant has some data value, that is an rvalue. But, it cannot be written to. It does not have an lvalue.

Another view of these terms is that objects with an rvalue, namely a variable or a constant can appear on the right hand side of a statement. They have some data value that can be manipulated. Only objects with an lvalue, such as variable, can appear on the left hand side of a statement. An object must be addressable to store a value.

Here are two examples.

int x;

x = 5; // This is fine, 5 is an rvalue, x can be an lvalue.
5 = x; // This is illegal. A literal constant such as 5 is not
// addressable. It cannot be a lvalue.

这段就说的很明白 lvalue中的l其实指的表示该值的存储地址属性,而另外一个相对的词rvalue值中的r指得是read的属性,和左右根本没有任何关系。

Thursday, April 05, 2007

[ZZ]在浙大(YQ)最不爽的八件事情

今天在88上看到一个帖子, 觉得深有感触, 呵呵.
1. GG太多,MM太少,找不到GF,咳....
这个....这个我也不用说什么了
2. 食堂太少,菜少,关门时间早(指四食堂,其他更贵了)
比起香港来好多了, 现在非常想念小乐惠的川味. 不过确实关门太早,过了6点基本上就没戏了.
3. 宿舍和教室路程太长(我住北门啊,经常去九教,经常"长征",当然别说我没买自行车)
我也住北门, 不过我经常去的是曹楼, 比他还远...

4. 车子多如毛,马路变成停车道(浙大老师真有米...,人多,钱也多)
玉泉的车确实挺多的.
5. YQ图书馆那叫一个破...,怎么和qinghua peking比啊......(ZJG还好拉!)
我就去过一次就再也不想进去了. 书应该都长毛了吧. 味道非常难闻.
6. 自行车消失得那叫一个快....(解释下第三条原因!)
来到玉泉后买了两辆自行车(东站买的黑车), 一个被贼偷去了, 一个被"警察叔叔"拿去了.
7. 导师放的羊好多啊!!!....(赚钱要紧呢!)
学生就是导师的廉价劳动力.
8. 周围的饭馆(北门附近),屈指可数啊....腐败都要先"长征"下(虽然我腐败地少拉)
我要求不高了, 我觉得还是挺多的, 南门外的川菜馆, 黄龙底下的"一席地" 之类的都挺好.

Wednesday, April 04, 2007

今天拿到了HKUST的offer

今天下午下楼去的时候, 看到自己的mail hole里面躺着一封信, 过去一看尽然是HKUST的offer. 自己本来都不报什么打算了. 因为虽然说是自己联系的那个导师说会推荐我, 但是他始终强调: the final decision is made by the admission committee. 可是很多人之前都已经拿到offer了, 所以心里始终觉得这是他在找理由推脱. 现在看来正是这样的了. HKUST的这个导师人非常不错, 那次去面试的时候他给我介绍了他的实验室还带我去看HKUST的风景. HKUST是个非常不错的学校, 自己现在有些犹豫了, 到底是HKUST还是HKU.唉....