博文

成为编程高手的八大奥秘 (2006-12-27 15:53:00)

摘要:成为编程高手的八大奥秘         转摘于:《中国电脑教育报》   作者:未知         不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差得太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。     1、扎实的基础   数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。   2、丰富的想像力   不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。   3、最简单的是最好的   这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。   4、不钻牛角尖   当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。   5、对答案的渴求   人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案......

阅读全文(1514) | 评论:2

TC的一个BUG(2006-12-26 17:10:00)

摘要:#include<stdio.h>     main()     {         static   float   f[3][4];         int   i,j;         for(i=0;i<3;i++)             for(j=0;j<4;j++)                 scanf("%f",&f[i][j]);             for(i=0;i<3;i++)         {             for(j=0;j<4;j++)                 printf("%f   ",f[i][j]);             printf("\n");         }     }     scanf:floating   point   formats   not     linked     Abnormal   program   termination   如果你用的编译器是TC的活,我们经常会碰到上面的问题!!   实则是:   Turbo-C的问题Turbo   C(TC)系统的浮点连接错误       用TC-2.0系统编写小的C程序,如果程序里用到......

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

[转载]网易学院程序系教授管宁(2006-12-25 12:07:00)

摘要: 对于c/c++中的数组排序及计算平均值和得到最大最小值的思考 作者:网易学院程序系教授管宁 最近在帮助其它人的学习中发现了许多问题就数组和局部变量和全居变量的两道例题进行刨析和思考! 排序操作 #include voidsort(array,n) intarray[]; intn; { inti,j,k,t; for(i=0;i)/* 循环9次,这里循环9次因为排列到第9次的时候最大的已经自动被排列到最后了 */{ k=i;[/LIGHT] /* 把i记录下来,以便进行调换操作 */for(j=i+1;)j/* 在外部i循环内进行第二次循环,检查所有的剩余元素 */{ if(array[j])/* 利用k对比j循环的元素大小是否比外部i循环当前元素的值 */{ k=j; /* 将k的值定义为j循环的最小元素的(下标),以便进行调换操作 */} t=array[k]; /* 将t的值定义为j循环的最小值元素的值 */array[k]=array[i]; /* 把j循环内的(也就是array[j])的值,调换为此次外部i循环元素的值 */array[i]=t; /* 将外部i循环的当前元素的值替换为前面以t为临时存储的(也就是array[j])的值 */} } } main() { inta[10],i; /* 定义a[10]为一个数组,用于输入10个不同的数字;定义用于循环的便量i; */printf("enter the array\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); /* 利用这10次循环给每个数组元素尽心赋值操作从a[0]到a[9] */} sort(a,10);/* 把数组a的各数组元素地址和数组数量传递给自定义排序涵数的形式参数 */printf("the sorted array:\n"); for(i=0;i<10;i++) { printf("%d",a[i]); /*利用10次循环把排序后的数组元素打印在屏幕上*/} printf("\n"); }/* 此篇代码练习序号注意的是用数组名作涵数实际参数的时候,不是把数组的值传递给形式参数, 而是把实际参数数组的起始地址传递给形式参数数组,这样两个数组就共同占用一段内存......

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

More Effective C++之考虑变更程序库(2006-12-06 23:14:00)

摘要:程序库的设计就是一个折衷的过程。理想的程序库应该是短小的、快速的、强大的、灵活的、可扩展的、直观的、普遍适用的、具有良好的支持、没有使用约束、没有错误的。这也是不存在的。为尺寸和速度而进行优化的程序库一般不能被移植。具有大量功能的的程序库不会具有直观性。没有错误的程序库在使用范围上会有限制。真实的世界里,你不能拥有每一件东西,总得有付出。   不同的设计者给这些条件赋予了不同的优先级。他们从而在设计中牺牲了不同的东西。因此一般两个提供相同功能的程序库却有着完全不同的性能特征。  例如,考虑iostream和stdio程序库,对于C++程序员来说两者都是可以使用的。iostream程序库与C中的stdio相比有几个优点(参见Effective C++)。例如它是类型安全的(type-safe),它是可扩展的。然而在效率方面,iostream程序库总是不如stdio,因为stdio产生的执行文件与iostream产生的执行文件相比尺寸小而且执行速度快。  首先考虑执行速度的问题。要想掌握iostream和stdio之间的性能差别,一种方法就是用这两个程序库来运行benchmark程序。不过你必须记住benchmark也会撒谎。不仅很难拿出一组能够代表程序或程序库典型用法的数据,而且就算拿出来也是没用,除非有可靠的方法判断出你或你的客户的具有什么样的特征。不过在解决一个问题的不用方法的比较上,benchmark还是能够提供一些信息,所以尽管完全依靠benchmark是愚蠢的,但是忽略它们也是愚蠢的。  让我们测试一个简单的benchmark程序,只测试最基本的I/O功能。这个程序从标准输入读取30000个浮点数,然后把它们以固定的格式写到标准输出里。编译时预处理符号STDIO决定是使用stdio还是iostream。如果定义了这个符号,就是用stdio,否则就使用iostream程序库。 #ifdef STDIO#include <stdio.h>#else#include <iostream>#include <iomanip>using namespace std;#endifconst int VALUES = 30000; // # of values to read/writeint main(){ double......

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

编写高效简洁的C语言代码(2006-12-06 23:13:00)

摘要:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。   第1招:以空间换时间  计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间。  例如:字符串的赋值。  方法A,通常的办法: #define LEN 32char string1 [LEN];memset (string1,0,LEN);strcpy (string1,“This is a example!!”);  方法B: const char string2[LEN] =“This is a example!”;char * cp;cp = string2 ;(使用的时候可以直接用指针来操作。)  从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。  如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。  该招数的变招——使用宏函数而不是函数。举例如下:  方法C: #define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17int BIT_MASK(int __bf){ return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);}void SET_BITS(int __dst, int __bf, int __val){ __dst = ((__dst) & ~(BIT_MASK(__bf))) | \(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))}SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);  方法D: #define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17#def......

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

用指印实现字符串倒置(2006-11-27 22:49:00)

摘要:include <stdio.h>#include <stdlib.h>void fun(char *ss)  {      char *s2=ss;      char t;      while(*s2!='\0')        {s2++;}//此时*S2 已经为空字符串 ,关键啊!!!! 所以S2要先减一       while(ss<=s2--)       {t=*ss;        *ss++=*s2;        *s2=t;                }   } int main(int argc, char *argv[]){    char *a;    gets(a);    fun(a);    printf("%s",a);    system("PAUSE");   return 0;}......

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

二八十进制的转换(2006-11-27 22:47:00)

摘要:#include <stdio.h>#include <stdlib.h>void trans(char *,long,int);int main(int argc, char *argv[]){ int  i;  long  m; char a[20]; int n;  //----------------------------------------------  printf("please input your numer\n");  scanf("%ld",&m);  printf("select one  from three integers(2,8,16)\n ");  scanf("%d",&n);  //---------------------------------------------   trans(a,m,n);  for(i=strlen(a)-1;i>=0;i--)    putchar(a[i]);    system("PAUSE");   return 0;}void  trans(char *p, long m,int n) {  int  r;   while(m!=0)      /*用除n取余,逆向取数的方法转换*/   { r=m%n;     if(r<10) *p=r+48;     else   *p=r+55;           /*将数值转换为相应字符,送入数组相应元素*/     m=m/n;     p++; ......

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