博文

scanf()与gets()的区别(2012-02-01 23:52:00)

摘要:scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi hello",则应该使用__gets__函数。 gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。 char string[15]; gets(string); /*遇到回车认为输入结束*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,应该使用gets输入。 scanf和gets获取字符串时的区别 在C语言中,能构获取字符串的函数至少有两个: 1.scanf() 所在头文件:stdio.h 语法:scanf("格式控制字符串",变量地址列表); 接受字符串时:scanf("%s",字符数组名或指针); 2.gets() 所在头文件:stdio.h 语法:gets(字符数组名或指针); 两者在接受字符串时: 1.不同点: scanf不能接受空格、制表符Tab、回车等; 而gets能够接受空格、制表符Tab和回车等; 2.相同点: 字符串接受结束后自动加'\0'。 例1: #include <stdio.h> main() { char ch1[10],ch2[10]; scanf("%s",ch1); gets(ch2); } 依次键入asd空格fg回车,asd空格fg回车,则ch1="asd\0",ch2="asd fg\0"。 例2: #include <stdio.h> main() { char ch1[10],ch2[10],c1,c2; scanf("%s",ch1); c1=getchar(); gets(ch2); c2=getchar(); } 依次键入asdfg回车,asdfg回车,则ch1="asdfg\0",c1='\n',ch2="asdfg\0",c2需输入。 scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。 gets:可接受回车键之前输入的所有字符,并用'\n'替代 '\0'......

阅读全文(1357) | 评论:0

提高代码水平书目(2012-02-01 23:51:00)

摘要:作者:gfree.wind@gmail.com 博客:blog.focus-linux.net
下面的书籍,我认为绝对有助于提高代码的质量和水平。这里没有列出算法方面的书籍——那些书籍会在另一篇文章中列出: 《高质量程序设计指南——C++/C语言》 《程序员修炼之道》 《编程高手箴言》 《软件随想录》 《编程珠玑》 《高效程序员的45个习惯》 《代码之美》 《架构之美》 《代码大全》 《代码质量》 《重构——改善既存代码的设计》 《posix多线程程序设计》 《深入理解计算机系统》 《设计模式》 《Head First设计模式》 《代码整洁之道》
这里列出的书目涉及内容比较杂,但是个人认为,想成为一个专业的程序员,这些书还是要多读读的,更重要的是要看懂。 最后还是欢迎大家补充其它书目。 ......

阅读全文(1123) | 评论:0

数据结构之顺序表和链表的比较(2012-02-01 23:49:00)

摘要: 作为线性表的两种基本的存储结构:顺序表和链表。它们在存储和操作上各有优缺点,列表比较如下:       顺序表 链表 优点 1、方法简单,各种高级语言中都有数组,容易实现; 2、不用为表示结点间的逻辑关系而增加额外的存储开销,存储密度大;3、具有按元素序号随机访问的特点,查找速度快。 1、插入、删除时,只要找到对应前驱结点,修改指针即可,无需移动元素; 2、采用动态存储分配,不会造成内存浪费和溢出。 缺点 1、插入删除操作时,需要移动元素,平均移动大约表中一半的元素,对元素较多的顺序表效率低。 2、采用静态空间分配,需要预先分配足够大的存储空间,会造成内存的浪费和溢出。 1、在有些语言中,不支持指针,不容易实现; 2、需要用额外空间存储线性表的关系,存储密度小3、不能随机访问,查找时要从头指针开始遍历。 链表的优缺点基本上与顺序表是相反。在实际应用中选取哪种存储结构应根据实际情况在存储和操作上进行权衡考虑:   1.基于存储的考虑   顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对“MAXSIZE”要有合适的设定,过大造成浪费,过小造成溢出。如果对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密度较低(存储密度是指一个结点中数据元素所占的存储单元和整个结点所占的存储单元之比)。   2.基于操作的考虑   在顺序表中按序号访问元素的时间性能为O(1),而链表中按序号访问的时间性能是O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;而在顺序表中做插入、删除时需移动元素,当数据元素的信息量较多且表较长时,这一点是不应忽视的;在链表中作插入、删除,虽然也要找插入位置,但主要是比较操作,从这个角度考虑显然链表较优。   3.基于开发语言的考虑   顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,有些语言不支持指针类型,并且相对指针来讲顺序表较简单。   总之,两种存储结构各有长短,选择那一种存储方式应由实际问题决定。通常“较稳定”的线性表选择顺......

阅读全文(2557) | 评论:0

c++中new和delete的使用方法(2012-02-01 23:47:00)

摘要:c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1. 开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.  2)int *a = new int(5) 作用同上,但是同时将整数赋值为5 2.  开辟数组空间 一维: int *a = new int[100];开辟一个大小为100的整型数组空间 二维: int **a = new int[5][6] 三维及其以上:依此类推. 一般用法: new 类型 [初值] delete用法:           1. int *a = new int;                delete a;   //释放单个int的空间           2.int *a = new int[5];                delete [] a; //释放int数组空间             要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.           用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫......

阅读全文(1064) | 评论:0

数组和指针的互换(2012-02-01 23:46:00)

摘要:由来:     我们在学习C语言的时候, 经常会写这样的程序: void Func1(int *p)
{
}
void Func2(int a[])
{
} int main()
{
  int a[10];
  Func1(a);   int *p;
  Func2(p);
}     即一维数组与指针作为函数参数的互换使用, 我们可以一眼看出这个程序是可以通过编译的.     a是数组a[10]第一个元素的地址, 作为参数传递到函数中去, 接收方是*p, 在函数中可以使用*p, 或者p[0]来访问元素. 看起来数组和指针可以这样互换着使用, 编译器会把它们编译成一样的东西.       问题的提出:     再来看下面的代码, 为什么这些代码会报错? void Func1(int (*p)[10])
{
}
void Func2(int (*p)[])
{
}
void Func3(int **p)
{
} int main()
{
  int a[10][10];
  int **p;   Func1(a); //Pass
  Func2(a); //Error1
  Func3(a); //Error2   Func1(p); //Error3
  Func2(p); //Error4
  Func3(p); //Pass
}       分析:     当把a作为参数传给函数时候, a代表的是"......

阅读全文(1749) | 评论:0

pointer底层相关(2012-02-01 23:45:00)

摘要:谭浩强1.  在程序中一般是通过变量名来对内存单元进行存取操作的。      其实程序经过编译之后已经将变量名转换为变量的地址,对变量的存取都是通过地址进行的。
2.  C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也要遵循这一规则,      不可能通过调用函数来改变实参指针变量的值,但可以改变实参变量指针所指变量的值。
3.  引用数组元素可以用下标法,也可以用指针法。      使用指针法能使目标程序质量高(占内存少,运行速度快)
4.  事实上, 在编译的时候, 对数组元素a[i]就是按*(a+i)处理的, 即按数组首元素的地址加上相对位移量得到要找的元素的地址, 然后找出该单元的内容.      可看出, [ ]实际上是一种变址运算符, 将a[i]按照a+i算地址      故指向数组的指针变量也可以带下标, a[i]和*(a+i)等价
由3,4看出,引用一个数组元素, 可以:      下标法: a[i]      指针法: *(a+i) 或 *(p+i)s
只需记住一点:指针指向的数据类型与定义时指针的类型一定要是对应的。除了用强制类型转换。 ......

阅读全文(1189) | 评论:0

关于取整的几个函数(2012-02-01 23:43:00)

摘要:1.floor()      double floor ( double x );        float floor ( float x ); long double floor ( long double x );2.ceil()      double ceil ( double x );   float ceil ( float x ); long double ceil ( long double x ); 3.modf()      double modf ( double x, double * intpart );      long double modf ( long double x, long double * intpart );        float modf ( float x, float * intpart ); ......

阅读全文(1023) | 评论:0

计算机操作系统、程序设计语言和软件开发工具历史网(2012-02-01 23:36:00)

摘要:http://www.softwarehistory.net/
计算机操作系统、程序设计语言和软件开发工具历史网
还没有怎么看,不过觉得以后应该会从中收益的......

阅读全文(1012) | 评论:0

F#,印度数学教育与优秀编程(2012-02-01 23:32:00)

摘要:这个周末,我终于可以坐下来做我在一年来一直承诺要做的事情:我开始应用F#。这次体验相当有趣。十多年来,我第一次不能只是通过坐着瞧一些样本代码来理解一门语言。 这次体验强化了当前通用编程语言的可悲状况。确实,过去我曾多次抱怨过VB.NET、C#、Java等语言的平庸之处。但明白我的所作所为对我的思考方式有着重大影响,这引起我的强烈兴趣。 我在11年级使用EdScheme时初次遇到一种函数编程语言。虽然F#的语法与EdScheme大有不同(EdScheme是Scheme的一个版本,是Lisp的一个术语;F#以OCaml为基础),它们的许多原理是一样的,特别是在“标签”与“值”相对的概念方面。 在函数编程语言中,有一种避免(或完全禁止)“值”概念的倾向。相反,每个标识符实际上作为一个标签,引用一个特殊的函数。 例如,“let x=5+y”并不是设定x的值等于y加5得到的值。相反,x是一个函数,调用后,它计算5+y并返回结果。如你所见,这种思维方式与我们大多数人学会的过程代码截然不同。 说明一下,我在“过程代码领域”中包含了面向对象(OO)代码,因为在最原始、低级的层次,每个OO程序都以一个非常传统、过程化的思考过程结束。换句话说,OO只是访问和编写过程代码的一个非常优秀和有组织的方法。 姑且不谈那一点。我发现我的思维很难接受某些概念。让人感到沮丧的是,我过去了解这种情况。并不仅仅是因为我有些迟钝或缺乏练习,我发现自己难以接受F#的思考方式。 想象一下,如果你去骑自行车,但由于你开了15年的汽车,你的脚总是不由自主的伸向油门处;你说的情况和这类似。 这让我记起我在几个月前的一次谈话。与我交谈的是一位由印度访美的程序员,他和我彼此相当熟悉,他做程序员已有相当长一段时间了,可能和我的时间一样长。他和我谈到教育。 众所周知,印度、中国和许多其它国家在数学教育上远远超过美国。因此我问他在印度如何教授数学。我的问题让他感到十分困惑,好像学习数学还有别的方法,而这是他第一次听说似的。 “从书本,通过黑板上的例子(学习数学);还有别的方法吗?”我向他询问计算器和电脑的使用情况,这两种工具在美国的数学教育中应用广泛。 他对我解释说,印度高中禁止使用计算器;大学也只允许使用计算器进行基本的计算(如加、减、乘、除、指数、平方根、对数和自然对数);他们反对使用计算器甚至达到......

阅读全文(1436) | 评论:0

IT ROUTER 之总结(2012-02-01 23:27:00)

摘要:Freshman Year#1. C/C++ #2. English #3. Maths #4. 古籍 #5 Algorithm #6 Some important executive applications No any more!!!
From Pro. Wen-jun Li: To be a "有文化的人" : 1. Know the history      计算机硬件的发展历史      程序设计语言的发展历史      软件工程的发纳入历史      ... 2. 读经典      著名的教材      ACM图灵奖演讲报告      Great Papers in Computer Science      ... ......

阅读全文(995) | 评论:0