博文
用宏实现 海伦定理(2009-09-30 17:06:00)
摘要:/*=============================================================
用宏实现 海伦定理
==============================================================
作者:最后的村长
时间:2009年9月30日
工具:DEV C++
version:1.0
==============================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define square(s,a,b,c,area) s=(0.5*(a+b+c));area=sqrt(s*(s-a)*(s-b)*(s-c))
/*=======......
谨慎使用单精度/双精度数值类型(2009-09-30 17:05:00)
摘要:
前言
在近日几个帖子里面,和QQ群的讨论里面,我发现很多网友都遇到的问题都是因为不恰当地使用了单精度/双精度数值。因此想专门就这个话题谈一下。
单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(Float),顾名思义是通过浮动小数点来实现数据的存储。这两个数据类型最早是为了科学计算而产生的,他能够给科学计算提供足够高的精度来存储对于精度要求比较高的数值。但是与此同时,他也完全符合科学计算中对于数值的观念:
当我们比较两个棍子的长度的时候,一种方法是并排放着比较一下,一种方法是分别量出长度。但是事实上世界上并不存在两根完全一样长的棍子,我们测量的长度精度受到人类目测能力和测量工具精度的限制。从这个意义上来说,判断两根棍子是否一样长丝毫没有意义,因为结果一定是False,但是我们可以比较他们两个哪个更长或者更短。这个例子很好地概括了单精度/双精度数值类型的设计初衷和存在意义。
基于上述认识,单精度/双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证,比方说,一个数值5.1,很可能存储在单精度/双精度数值中的实际值是5.100000000001或者5.09999999999999。导致这个现象的原因我们可以通过两种方式来解释:
简单的解释方法:
你可以尝试在任何一个控件的属性面板中,设定他的宽度为:3.2CM,当你输入完毕后,你会发现值自动变成了3.199cm,无论你怎么改,你都无法输入3.200CM,因为实际上在电脑中存储的并不是CM为单位的数值,而是“缇”为单位的数值,而“缇”和CM之间的比值,是个很难被除尽的数,因此你输入完毕后,电脑自动转换成了最接近的“缇”值,然后再转换成厘米显示到属性面板上,这一乘一除,两次四舍五入,误差就出来了。单精度/双精度也是类似的原理,其实在二进制存储的时候,单精度/双精度都采用了类似相近分数的方法,而这样的存储是不可能做到准确的。
深入的解释方法:
让我们来看看我们存储到数字介质中的单精度/双精度值到底是怎么样的,我们使用如下代码对单精度类型进行一个解剖:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMo......
[转载】程序员的编辑器——VIM(2009-09-30 11:40:00)
摘要:一、VIM的历史 1. ed ed是UNIX上最古老最基本的编辑器,它最初是UNIX之父Ken Thompson编写的,他第一次在ed中应用了正则表达式(regular expression),这个创举将RE理论带入了实践,对UNIX界造成了深远的影响。 实际上ed是受来自加州伯克利大学的QED编辑器的影响,Ken便是从这所院校这里毕业的。 ed是一种行模式编辑器,下面是一个ed会话的例子:$ ed greeting0 # 因为新创建文件,所以读入了0个字节a # 进入编辑模式(append)hello world, eveyone. # 输入一行文本. # 回到命令模式1p # 显示(print)第一行hello world, eveyone.1c # 最后一个词写错了,修改(change)第一行hello world, everyone.. # 回到命令模式1p # 重新显示第一行,这回发现无误hello world, everyone.q # 退出(quit)? # ?表示没有保存或者命令不认识w # 保存(write)23 # 提示写了23个字节q # 退出 也许大家觉得这个编辑器很难用,可是在70年代,许多使用UNIX的人都是用廉价的终端机通过电话线连到UNIX服务器上的,因为传输速率慢,所以这种简洁的行模式编辑就很有意义,现在虽然硬件有了长足的发展,ed编辑器很少有人用了,但是它的很多理念比如命令字符、正则表达式却在它的很多后辈身上体现出来。下面这个网址有一些ed的笑话,从中大家或多或少能体会到那个时代人们的某种精神。http://www.gnu.org/fun/jokes/ed.msg.htmlGNU ed: http://www.gnu.org/software/ed/ed.htmlReferenc......
【转载】世界第二的VIM:普通人的编辑利器(全集)(2009-09-30 11:36:00)
摘要:2005年5月,笔者开始用VIM。此后渐入佳境,原来因版权自律而放弃盗版UltraEdit的遗憾一扫而空。从VIM中笔者才体会到,什么才是真正的编辑利器。 在善用佳软或其他论坛发文,笔者都是先在VIM中输入,并方便高效地编辑好格式,再贴到网上。而笔者的通讯录、记事、读书笔记、工作记录也是在VIM中完成的。包括一些文档、数据的处理,让VIM过一下,也会提高不少效率。 一句话,自用VIM以来,对它迷恋日深,几乎要超过Total Commander。但是,正如善用佳软及论坛发文所提,笔者大力推荐“用IrfanView/XnView代替ACDSee、用7-zip代替 WinRar/WinZip、用GIMP代替PhotoShop”,但并未推荐VIM代替UltraEdit。这并不意味着VIM不能胜任,恰恰相反,如 果说IrfanView等替代品比原共享软件还有些差距的话,VIM则远胜UltraEdit。不推荐的唯一原因是,VIM对初学者有点难。 今天仍写了此文推荐给大家。原因有二: 其一,编辑选定了题目,要向大众宣讲VIM和Emacs,这种勇气鼓舞了笔者。 其二,已发两位高手的文章(王垠之《Emacs是一种信仰!世界最强编辑器介绍》,Dieken之《程序员的编辑器——VIM》)可能会吓住一些对它们产生了兴趣的人,对此笔者要做些修正。
因此本文内容有二: 一是帮新手体验VIM。这部分有些象实验教程,多用实例,且行文风格尽量傻瓜化,以便于新手(包括以前从未听说过VIM)可以照笔者的操作,一步步体验VIM。 二是介绍笔者的应用,即VIM如何便利笔者的日常工作和生活,而非编程。一、对VIM的基本介绍 一句话介绍就是:VIM是一个超级超级强大的文本编辑器。它和Emacs是一个数量级;而笔者认为,比UltraEdit、Editpad、 EmEditor要高一个(至少半个数量级)。如果你有兴趣,不妨一读《程序员的编辑器——VIM》,以便于对VIM有更详尽全面的理论认识。 要点1:VIM及前身VI,历史悠久(可能比多数读者的年龄更大),经历了几十年的考验和发展,值得信赖。 要点2:VIM有模式。通俗地做一下对比。notepad无模式(或称为只有一种编辑模式)。 你按下j,就是在正文中输入j;要保存,就要ctrl+s;要下移一行,就要↓或鼠标。(注......
【转载】Emacs是一种信仰!世界最强编辑器介绍(2009-09-30 11:26:00)
摘要:
编者按:这个世界最强是个怎么样的强法呢?一说:Emacs是一种“信仰”。另说:世界上的程序员分三种,一种使用Emacs,一种使用vim,剩余的是其它。(完全无视其他编辑器的存在……) 来看看这个被人奉为信仰、可以煮咖啡的编辑器是个什么样子。一、Emacs的历史 Emacs程序的最初版本是由RichardStallman在1975年写成(年龄比很多读者都大吧 :) )。之后其衍生版本众多。目前使用得最多的两个版本是RichardStallman在1984年开发的一个版本——GNUEmacs和1991年由JamieZawinski写成的XEmacs。 看看他的简称你会头晕。 E. M. A. C. S.Emacs Makes A Computer SlowEscape Meta Alt Control ShiftEmacs Makers Are Crazy SickosEmacs Makes All Computing SimpleEmacs Makefiles Annihilate C-ShellsEmacs Manuals Always Cause SenilityEmacs May Allow Customized ScrewupsEmacs Manuals Are Cryptic and SurrealEventually Munches All Computer StorageEight Megabytes And Constantly SwappingElsewhere Maybe All Commands are SimpleExcellent Manuals Are Clearly SuppressedEmacs May Alienate Clients and SupportersExcept by Middle Aged Computer ScientistsExtended Macros Are Considered SuperfluousEvery Mode Accelerates Creation of SoftwareEach Manual's Audience is Completely StupefiedExceptionally Mediocre Algorithm for Computer ScientistsEasi......
【转载】用Gvim建立IDE编程环境 (Windows篇)(2009-09-30 11:05:00)
摘要:
转载自:LeeMonCC说明:本文是作者在完全按照著名的《手把手教你把Vim改装成一个IDE编程环境》一文,在Windows XP上用gvim建立IDE环境时所作的备忘。
原作地址:http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx。
0.准备软件及插件。
(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。
(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download
(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip
(d)taglist_45.zip 地址http://www.vim.org/scripts/download_script.php?src_id=7701
(e)winmanager.zip 地址http://www.vim.org/scripts/download_script.php?src_id=754
(f)minibufexpl.vim 地址http://www.vim.org/scripts/download_script.php?src_id=3640
(g)a.vim 地址http://www.vim.org/scr......
用宏实现两个数互换(2009-09-29 17:00:00)
摘要:/*============================================================= 用宏实现两个数互换 ============================================================== 作者:最后的村长 时间:2009年9月29日 工具:DEV C++ version:1.0==============================================================*/#include <stdio.h>#include <stdlib.h>#define exchange(x,y) t=x;x=y;y=t;/*=============================================================*/int main(){ int x,y,t; printf("请输入x和y的值\n"); printf("x="); scanf("%d",&x); printf("\ny="); scanf("%d",&y); printf("x和y原来的值是:%d,%d",x,y); exchange(x,y); &nb......
给出年月日,计算该日是该年的第n天(2009-09-29 16:24:00)
摘要:/*============================================================= 给出年月日,计算该日是该年的第n天 算法分析:1 定义year、month、day,天数n,闰年标志id_yaer 2 如果year是闰年则id_year=1 否则=0 3 用swtich来累加天数n ============================================================== 作者:最后的村长 时间:2009年9月29日 工具:DEV C++ version:1.0==============================================================*/#include <stdio.h>#include <stdlib.h>/*=============================================================*/int main(){ int year,month,day,n=0,id_year=0;//定义和初始化年月日 printf("请输入年月日\n"); printf("年="); scanf("%d",&year);&n......
勒让德多项式(2009-09-29 15:31:00)
摘要:/*============================================================= 用递归的方法求n阶勒让德多项式的值 如果n=0 f(x,n)=1;如果n=1,f(x,n)=x;如果n>=1 ,f(x,n)=((2n-1)*x-f(x,n-1)-(n-1)*f(x,n-2))/n 算法分析:1 定义x和n 2 输入x和n 3 用递归进行调用 ============================================================== 作者:最后的村长 时间:2009年9月29日 工具:DEV C++ version:1.0==============================================================*/#include <stdio.h>#include <stdlib.h>double f(int n,double x);/*=============================================================*/int main(){ int n;//定义n和x double x; printf("n=");//......
字符串反序存放(2009-09-28 21:44:00)
摘要:/*=============================================================
输入的字符串反序存放
算法分析:1 初始化字符串
2 获取字符串总的字符个数n
3 如果字符个数为偶数那么 第一个和第n个互换.....第n/2-1与n/2+2互换
如果n为奇数,那么第一个和第n个互换 ,n+1/2个字符不动
==============================================================
作者:最后的村长
时间:2009年9月28日
工具:DEV C++
version:1.0
==============================================================*/
#inclu......