博文
认识二维数组中的行列指针差异(2009-10-07 22:40:00)
摘要:/*=============================================================
认识二维数组中的行列指针差异,明白a+i=a[i]=*(a+i)=&a[i]=&a[i][0]
a+i代表指向第i行的指针a+i与&a[i]等价,而*(a+i)是指向列与a[i]等价
,a[i][0]是代表第i行第0个元素的地址。 虽然这几个元素代表的地址是相同的,但是
代表意义却不同
==============================================================
作者:最后的村长
时间:2009年10月28日
&nb......
从10个数种找出其中最大值和最小值(2009-10-07 22:39:00)
摘要:/*=============================================================
从10个数种找出其中最大值和最小值
算法分析:
1、用函数实现,但是函数仅仅能返回一个函数值所以定义全局变量
2、10个整数存放到数组中,采用地址传递的方式改变数组中的元素
==============================================================
作者:最后的村长
时间:2009年10月5日
工具:DEV C++ 4.9.9.2
&......
多种方法实现数组元素的输出(2009-10-07 22:38:00)
摘要:/*=============================================================
多种方法实现数组元素的输出
==============================================================
作者:最后的村长
时间:2009年10月28日
工具:DEV C++ 4.9.9.2
version:1.0
==============================================================*/
#include <stdio.h>
#include <stdlib.h>
/*=============================================================*/
int main()
{
int a[10];//定义整形数组
int i;
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
&n......
以指针变量作为函数形参,实现两个值的互换(2009-10-07 22:38:00)
摘要:/*=============================================================
以指针变量作为函数形参,实现两个值的互换
算法:通过函数实现两个指针变量的互换
==============================================================
作者:最后的村长
时间:2009年10月4日
工具:DEV C++
version:1.0
==============================================================*/
#include <stdio.h>
#include <stdlib.h>
void exchange(int *p1,int *p2);
/*=============================================================*/
int main()
{
int a,b;......
用指针实现输入的两个整数按照先大后小的顺序输出(2009-10-07 22:37:00)
摘要:/*=============================================================
用指针实现输入的两个整数按照先大后小的顺序输出
算法分析:1、定义两个整数和两个整形指针变量
2、两个整形指针变量指向两个整数
3、 如果指针指向的两个整数不是先大后小,那么就
将两个指针变量的指针互换
==============================================================
作者:最后的村长
时间:2009年9月28日
工具:DEV C++
version:1.0
==============================================================*/
#include <stdio.h>
#i......
指针访问整形变量(2009-10-07 22:37:00)
摘要:/*=============================================================
熟悉指针变量的定义和使用,区别&和*符号的区别,&代表取地址运算符
*代表指针运算符(或称间接访问运算)
==============================================================
作者:最后的村长
时间:2009年10月2日
工具:DEV C++ 4.9.9.2
version:1.0
==============================================================*/
#include <stdio.h>
#include <stdlib.h>
/*=============================================================*/
int main()
{
int a,b;
int *pointer_1,*pointer_2;//定义指针变量
a=8;b=9;
pointer_1=&a;//将a的首地址赋给指针变量pointer_1
......
条件编译控制电文输出(2009-10-07 22:36:00)
摘要:/*=============================================================
用条件编译的方法实现:输入一行电文,可以任选两种输出,一为原文输出,一为字母
变成其下一字母。用#define命令来控制是否要译成密码例如#define CHANGE 1则输出密码
如果#define CHANGE 0就不输出
算法分析:1 初始化字符串
2 获取字符串总的字符个数n
3 设定两个游标i、j,i选定字符,j负责从i后的字符与i字符进行比较
==============================================================
作者:最后的村长
时间:2009年10月2日
工具:DEV C++ 4.9.9.2
version:1.0
=========================================================......
用宏实现 海伦定理(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: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;要下移一行,就要↓或鼠标。(注......