编程办公桌
‘壹’ 如何理解面向对象编程
[引] 1.基本概念:
1.1 类与对象的初探
要我说,无论是面向过程的语言也好,面向对象的语言也罢,我首先要给他讲的都是类和对象!--------“这个世界是由什么组成的?”这个问题如果 让不同的人来回答会得到不同的答案。如果是一个化学家,他也许会告诉你“还用问嘛?这个世界是由分子、原子、离子等等的化学物质组成的”。如果是一个画家 呢?他也许会告诉你,“这个世界是由不同的颜色所组成的”。……呵呵,众说纷纭吧!但如果让一个分类学家来考虑问题就有趣的多了,他会告诉你“这个世界是 由不同类型的物与事所构成的”好!作为面向对象的程序员来说,我们要站在分类学家的角度去考虑问题!是的,这个世界是由动物、植物等组成的。动物又分为单 细胞动物、多细胞动物、哺乳动物等等,哺乳动物又分为人、大象、老虎……就这样的分下去了!
现在,站在抽象的角度,我们给“类”下个定义吧!我的意思是,站在抽象的角度,你回答我“什么是人类?”首先让我们来看看人类所具有的一些特征,这个 特征包括属性(一些参数,数值)以及方法(一些行为,他能干什么!)。每个人都有身高、体重、年龄、血型等等一些属性。人会劳动、人都会直立行走、人都会 用自己的头脑去创造工具等等这些方法!人之所以能区别于其它类型的动物,是因为每个人都具有人这个群体的属性与方法。“人类”只是一个抽象的概念,它仅仅 是一个概念,它是不存在的实体!但是所有具备“人类”这个群体的属性与方法的对象都叫人!这个对象“人”是实际存在的实体!每个人都是人这个群体的一个对 象。老虎为什么不是人?因为它不具备人这个群体的属性与方法,老虎不会直立行走,不会使用工具等等!所以说老虎不是人!
由此可见-------类描述了一组有相同特性(属性)和相同行为(方法)的对象。在程序中,类实际上就是数据类型!例如:整数,小数等等。整数也有 一组特性和行为。面向过程的语言与面相对象的语言的区别就在于,面向过程的语言不允许程序员自己定义数据类型,而只能使用程序中内置的数据类型!而为了模 拟真实世界,为了更好的解决问题,往往我们需要创建解决问题所必需的数据类型!面向对象编程为我们提供了解决方案。
1.2 内置数据类型与函数:
计算机程序在存储数据时必须跟踪3个基本属性为:
1. 信息存储在何处;
2. 存储的值是多少;
3. 存储的信息是什么类型的;
让我们来看看编程语言的内置数据类型都有哪些!(呵呵,这个不大好说,因为每门语言都有自己独特的数据类型,但这毕竟是少数,比如在java中有 byte类型的数据,而在C++中就没有,希望你能举一反三!)比如整数”int ”,浮点类型的数据”float”!字符串”String”,以及数组还有结构体等等。然而在写程序的时候,根据需要我们会创建一个类型的变量或常量,例 如:由于我们需要创建一个整形的变量i为5,我们就可以这样做,int i = 5;而根据需要我很有可能改变i的值,也就是从新给它赋值,比如让它等与6,就可以在所需的地方改成i = 6;由此我们知道,在“值”上可以发生变化的量就叫变量。不会发生变化的量就叫做常量了,在C++中用count关键字来声明,而在JAVA中则使用 final关键字来声明。由于不同语言的声明格式不一样,这里就不做一一介绍了,详细的内容清查阅相关书籍!
在这里我们主要讨论一下函数,我们可以把函数想象成一个“实现某种特定功能的黑匣子”-------这个功能是由你来设定的,举个例子来说:现在我问 你“2+3等于多少”?我相信你能很快的回答我等于5。让我们来分析分析这句话包含什么信息!首先我要把你的大脑想象成是一个黑匣子,我并不知道也没有必 要知道你的大脑是如何工作的(也就是怎么运算的),我关心的只是我传给你的是什么信息?你对信息做了哪些处理? 以及你返回给我的是什么信息?需要提醒你一下的是每个方法都会返回一个信息给调用者的,除了构造函数外(稍候我会作详细的介绍)。我现在需要把自己当作是 一名程序员,而你呢?当然就是计算机了!计算即可没有人那么聪明,它只会按事先约好的特定的格式运行,我想让它具有如上所述的功能,我就要先定义这个黑匣 子!首先我要告诉这个黑匣子会有两个整数值给你(这就是所谓的参数,是程序员需要给黑匣子的信息),然后就要定义这个黑匣子内部实现这两个整数相加的运算 (这就是黑匣子对数据所做的加工,根据需要,你可以做任何的加工。)。最后再标注它返回给我一个同样是整型的数值(这是黑匣子返回给程序员的信息)。一个 函数就这样定义完了,让我们来看看书写格式:
int addnum(int x,int y){
return x+y;
}
具体的含义是这样的:
int /*返回值类型*/ addnum /*方法(黑匣子)名称*/ (int x,int y/*传入的参数*/){
return x+y; /*内部是想方法(实现相加运算,)并用return返回给调用者结果*/
}
首先请注意上明的“return”语句!return 关键字的含义是向调用者返回紧跟在它后面的信息!就像上面一样,因为我问你,你才会回答我,如果我不问你,你就不用回答我的!在计算机中也一样,定义好这 个函数在哪里调用呢?我只能告诉你,哪里需要就在哪里调用!当然,你可以根据需要去更改参数、返回值以及内部实现,具体到如何定义如何调用你只好去参考相 关的资料了!在这里我只是给你一个思想!
有时你会遇到这样的问题,我让你记住,我的年龄是20岁!从字面上理解,你并没有给我返回信息!然而事实上,你确实给我返回了信息,信息的内容是“无信息,也就是无返回值类型void”。具体的程序如下:
int myAge = 0;
int a=20;
void remAge(int a){
myAge=a;
}
具体的函数说明如下:
int myAge =0; //定义并初始化我的年龄为0;
int a=20; /*定义变量a等于20*/
void /*返回值类型为无返回值类型*/ remAge /*函数名称*/(int a /*传入的参数*/){
myAge=a; //内部实现方法,注意,没有return返回!!!
}
关于函数的话题还有很多很多,这里就不一一介绍了,我的目的是让你知道函数是怎么一会事儿!为下面的讨论作铺垫!
1.3 指针以及引用:
指针及引用是在C++中有的,JAVA中没有。JAVA中取消了对内存的操作,随之而来的事也取消了操作符重载的操作。不过在稍候我还是会介绍一些操 作符重载的功能等。引用主要还是用在函数参数的传递上。所以我在这里就不做过多的介绍了。他们很实用,有兴趣的同学可以参阅C++相关书籍。
1.4 运算符及控制语句:
还是自己看看相关书籍吧,这里就不再熬述了!
2.深入探讨面向对象:
2.1“类型”的内部细节:
有了上面的知识,我们现在就可以深入的挖掘类的内部实现了。所有的知识点我都会围绕着类与对象展开,在此之前,我希望你能够确信对以上所介绍的基本内容已完全掌握了!
是的,面向对象的编程语言最大的特色就是可以编写自己所需的数据类型,以更好的解决问题。我想我必须要帮你搞清楚“类,对象,属性,方法它们之间的关 系”!就像我前面所说的,人这个“类”是什么也做不了的,因为“人类”只是一个抽象的概念,它不是实实在在的“东西”,而这个“东西”就是所谓的对象。只 有人这个“对象”才能去工作。而类呢?类是对象的描述!对象从类中产生出来!此时,对象具有类所描述的所有的属性以及方法。-------一定要理解这句 话!!!
也许你已经有些不知所措了,没关系!好好的回味一下,我再举个例子!例如电视机,电视机都有工作原理图,那么什么叫电视机呢?只要它能够实现工作原理图的 所有功能的物体,我们都叫它电视机。你想想是不是这么一回事儿?可是,电视机原理图是不能工作的,也就是这个原理图不能收看节目,只有电视机这个“实体 ——即所谓的对象”才能收看节目,也就是说,从类生成出对象之后才算得上是真正的有意义!才能开始工作。此时,电视机拥有电视原理图所描述的所有的属性及 方法!明白了吧,呵呵!
我先前介绍过,类是属性与方法的集合。而这些属性与方法可以被声明为私有的(private),公共的(public)或是受保护(protected)的,他们描述了对类成员的访问控制。下面我分别做一下介绍:
1. 公共的(public):把变量声明为公共类型的之后,那么就可以通过对象来直接访问,一切都是暴露无遗的!也就是说,你的信用卡密码别人也能够直接得到。
2. 私有的(private):如果把变量声明为私有的情况就好多了,想要得到我的信用卡密码,对象必须要调用专用的方法才能够得到。
3. 受保护的(protected):介绍继承时再讨论。
4. 默认控制访问符(friendly)://JAVA中有而C++中没有。
为了实现数据的封装,提高数据的安全性,我们一般会把类的属性声明为私有的,而把类的方法声明为公共的。这样,对象能够直接调用类中定义的所有方法,当对 象想要修改或得到自己的属性的时候就必须要调用以定义好的专用的方法才能够实现。你想想,你会把你的信用卡密码公布出来嘛?呵呵!所以,我们提倡的是: “对象调方法,方法改属性”;
2.2通过实例看内存分配:
说了这么多,让我们来看一个实例吧!比如:现在我们要编写某家公司员工管理系统,你认为最合适的数据类型是什么?我认为是员工个人!但是在面向过程的 语言中,这样做是不允许的,因为它只能使用语言中的内部数据类型!而员工不在这个内部数据类型之内!也许有人会说可以用C语言中的struct,好注意! 毕竟它是类的基础!如果你以前是一名面C或B的程序员,请你忘掉这些,让我们一起看看如何用类来实现这一切吧!
某家公司的员工是人类的一个特殊群体,它除了具备人类的所有特性与方法外,它还有额外的特性与方法,比如她有她的工资、信用卡密码、作息时间等等,这 些特性以及工作内容,工作量等等这些方法。而在计算机中我们该如何定义这个类呢?下面我将写出它的格式,让你看看在计算机中它是张什么样子的!
/*在此我需要再次声明的是,我用的是JAVA格式,在语法格式上它与C++大不相同!许多细节以及内部操作都有诸多区别,而在思想上确实大同小异的*/
//employee.java
public class employee{
private String name; //员工姓名
private int age; //员工年龄
private char sex; //员工性别
private float emolument; //员工薪水
private boolean lunch; //员工午餐
//……等等
public void heater(){ //这个方法是用来加工员工的午餐
lunch = true;
}
public void setName(String a){ //这个方法是修改员工的姓名
name= a;
}
public String getName(){ //这个方法是得到员工的姓名
return name;
}
//……等等
}
这样我们就定义完了我们所需要的数据类型。现在,让我们来看看它能够干什么以及怎么工作!
我想要做的是,工作室里有一个光杆司令叫“jingwei”,我修改它的名字后对对它进行输出,看看我是怎么做的吧!
注意:请仔细观察对象是如何调用方法的,它使用了“.”操作符!事实上是这样的,对象调用公共的属性或方法时就会使用“.”操作符。
然而在C++中,如果定义一个同类型的指针,该指针调用此对象的方法时,就会使用“->”操作符。更详细的内容清参阅相关书籍了!
//workstation.java
import java.awt.Graphics;
import java.applet.Applet;
public class workstation extends Applet{
private employee jingwei ; //对象的声明,此时并不分配内存!
public void init(){
jingwei = new employee(); /*此时创建对象会调用构造函数,稍候介绍*/
jingwei.setName(“jw”); //设置我的名字
}
public void paint(Graphics g){
g.drawString("my age is "+jingwei.getName(),10,10);//显示我的年龄
}
}
输出结果是:
my name is jw
这串字符串是在输出窗口的x坐标轴为10 px , y坐标轴为10 px的位置。
我现在要做的是,把上面的程序做个大解剖,让你能够看清楚它到底是怎么一回事儿!(我可不时带你去看里面的汇编,呵呵,那个我也不会:)
首先还是来看看我们自定义的数据类型employee,在应用的时候它和int类型的数据没什么两样,一样的需要创建变量(对象),只不过前者是咱自 己定义的,而后这是它内置的。Employee这个类中有许多属性,也有许多方法。而此时,我们不能直接用我们所创建出来的对象调用它的属性进行修改。因 为它是private受保护类型的!我要想修改我的姓名我就要用对象调用setName()这个方法,而我想得到我的姓名就要调用getName()这个 方法。我们完全是按照航线来行走的,这个航线就是“对象调方法,方法改属性”
好的,我真的相信你已经明白了这是怎么一回事儿了!呵呵!仰起航帆,继续前行!
现在让我们一起来看看workstation这个类。这是个主类,和C++中的main()函数的味道差不多。其中,在JAVA中,一个文件只允许有而且必须有一个主类,这个主类用public来声明!他就跟C++中必须要有一个main()函数是一样的。
让我们来看看这个类中的第一条语句!private employee jingwei ;这条语句的作用是声明一个employee的对象jingwei(在C++中就不用声明了)。我想要和你说的是“声明”与“定义”之间的区别。声明只是 告诉计算机将要有这样的一个变量(对象),在内存中它并不为这个变量(对象)分配内存!而只有在定义的时候才会给这个变量(对象)分配内存。(需要说明一 下的是init()方法是完成初始化操作的,在此处定义对象,为对象分配内存。start()方法用来启动浏览器的主线程,paint()方法来显示 Apple的界面。这些是Applet程序所需的,至于Application程序就不需要了,当然了,C++中也不需要他们。关于他们的详细内容清参阅 相关书籍)
紧接着就开始定一个对象了,对jingwei这个对象进行操作才会有实际的意义。千万不要有这种想法:“试图对类进行操作!”就像前面我说的,电视机 原理不能看电视一样!这是毫无意义的!看这条语句jingwei = new employee();它的意思就是定义一个employee类型的对象jingwei。此时,我想告诉你的是:“jingwei这个对想拥有了些什 么”。它拥有了类所描述的所有的属性及方法。下面我一一给你列出来:
/*所有的employee对象都拥有这些属性。每创建一个对象就会从新分配一块内存来存放相应对象的这些属性。我的意思是每个对象都有自己“独特”的一份*/
private String name; //员工姓名
private int age; //员工年龄
private char sex; //员工性别
private float emolument; //员工薪水
private boolean lunch; //员工午餐
/*所有的employee对象都拥有这些方法。但在内存中只有一份*/
public void heater(){ //这个方法是用来加工员工的午餐
lunch = true;
}
public void setName(String a){ //这个方法是修改员工的姓名
name= a;
}
public String getName(){ //这个方法是得到员工的姓名
return name;
}
/*但是,实际上在创建jingwei这个对象时计算机只给这个对象的所有的属性分配了内存,而并没有给方法分配内存。方法只有一个,是属于所有的对象的,所以无论创建了多少个对象,计算机只会为一个方法分配一块内存。*/
我想我还是举个例子吧,不然你非晕倒不可。呵呵!
看我这条语句“private boolean lunch;”公司不管午餐,每个员工都需要带饭。我们现在这样想,公司的空间是所有的内存容量,你的办公桌就是计算机中的内存中的一部分(每个员工都有 一份,是在创建对象时分配的)。你把午饭带到了公司,放在了你的办公桌上。“午饭”占据了你的办公桌的一角(占了你自己“对象”的一块内存容量)。这份午 饭只属于你自己,同样别人的也只属于她自己!所以每个员工(对象)都需要一快空间(内存)来存放自己的午餐(属性)。在计算机中也是这样的,每创建一个对 象,就会在内存中从新分配一块内存来放“午餐——lunch”这个属性(对象所拥有的所有的属性)。
计算机只会为对象的属性分配内存。因为每个对象的都不一样!就像你往公司带的午饭和我往公司带的午饭不一样是一个道理!但方法就不同了。早晨带的饭中 午就凉了,你需要用微波炉来加热。微波炉可不用你带,公司就有(只占公司的一块空间),它放在了午餐桌上。你想想,微波炉属于谁的?它属于所有员工的!因 为每个员工都可以用它。而不必每个员工都带一份。由此可见,每个员工(对象)都有一份午饭(属性),但所有的员工(对象)只一个微波炉(方法)。所有的员 工(对象)都可以通过这个微波炉(方法)来改变自己午餐(属性)的冷热状态。殊途同归!在计算机中也就是这样,方法只有一份,供所有的对象使用!而属性是 每个对象一份,因为每个对象的都不一样。别和我说你还不明白,不然我会撞墙的,呵呵:)
2.3深入探讨函数:
2.3.1构造函数、默认构造函数、 缺省构造函数
对于上面的实例,它已经能完成绝大部分工作了,但它还是不完善的,还有许许多多的细节等到我们去完善!也许有的同学已经注意到了,当我创建完 “jingwei”这个对象时,这个对象的所有的属性都是空的,也就是说:这个对象的姓名是未定的、年龄是未定的、性别是未定的、薪水是未定的、午餐也是 未定的。而我们想把这些属性都添加上去,就还要用对象调用相应的方法,去一个个修改!天啊,这简直是太麻烦了!有没有什么好方法能够在我们创建对象的同时 就完成了对属性赋值的操作呢?哦不,应该说是对属性的初始化呢?当然没问题了,这就需要所谓的构造函数!
构造函数是类中最特殊的函数,它与析构函数的功能正好相反!
从特征上来说:1.它是编程语言中唯一没有返回值类型的函数。
2.它的名称与类的名称必须要完全相同。
3.它必须被声明为公共(public)的类型
4,可以对构造函数进行重载。
5.它在创建对象是自动被调用。
从功能上来说:1.它是对类中的属性进行初始化。
其实,对于上面的程序来说我们没有自己定义构造函数。但是,在这种情况下,系统会自动为我们定义一个“默认构造函数”。他会把数值变量自动赋值为0, 把布尔行变量赋值为false等等(但在C++中,默认构造函数不初始化其成员)。如果程序员定义了构造函数,那么系统就不会再为你的程序添加一个缺默认 造函数了。(在这里,我们提倡的是自己定义构造函数,而不是用系统的默认构造函数)
还是看个实例吧!这样比较清楚一些!
//employee.java
public class employee{
private String name; //员工姓名
private int age; //员工年龄
private char sex; //员工性别
private float emolument; //员工薪水
private boolean lunch; //员工午餐
//……等等
public employee(){ //这个就是“默认”构造函数
name = “jw”; //设置员工姓名
age = 20; //设置员工年龄
sex = “M”; //设置员工性别
emolument = 100; //设置员工薪水
lunch = false; //设置员工午餐
}
public void heater(){ //这个方法是用来加工员工的午餐
lunch = true;
}
//……等等
};
这样,在我们创建“jingwei”这个对象的同时,它的所有的属性也被初始化了!显然,这大大的提高了工作效率,但是,它还是不符合要求。想想看, 如果我们现在创建这个类型的第二个对象的时候会发生什么事情?告诉你,除了对象的“名”(这个名称不在是对象属性中的名称,而是对象本身的名称)不一样 外,其所有的“属性值”都一样!比如:现在我们创建第二个对象flashmagic,然而我会发现这个对象的所有的属性和jingwei这个对象的所有的 属性完全相同。而我们只能在用对象的方法去改变着写属性了!很显然,这种方法不大好!我们需要一种方法在创建对象的时候为对象的属性赋予“我们想要的 值”。
相信你也看到了,默认构造函数就显得无能为力了。我们需要的是带参数的构造函数,在创建对象时,我们把参数传给构造函数,这样就能完成了上述的功能!口说无凭,还是来看个实例吧:
//employee.java
public class employee{
private String name; //员工姓名
private int age; //员工年龄
private char sex; //员工性别
private float emolument; //员工薪水
private boolean lunch; //员工午餐
//……等等
public employee(String n,int a,char s,float e,boolean l){ //看这个构造函数
name = n; //设置员工姓名
age = a; //设置员工年龄
sex = s; //设置员工性别
emolument = e; //设置员工薪水
lunch =l; //设置员工午餐
}
public void heater(){ //这个方法是用来加工员工的午餐
lunch = true;
}
//……等等
};
这样一来,在创建对象的同时我们就可以给他赋予我们想要的值,很显然,这可就方便多了。哦,对了!还没有告诉你怎么创建呢!哈哈,往前翻几页你会看到这句话:
jingwei = new employee();这是创建一个对象,而我们把它改成
jingwei = new employee("jingwei",20,'M',100,false);这样一来,所有的工作都完成了,呵呵!(在创建对象的同时赋予了我们想要的“初值”)
2.3.2重载构造函数:
我还是先把概念给你吧,让你有个认识,随后我们在进行论述。
在JAVA中:
1. 函数重载是一个类中声明了多个同名的方法,但有不同的参数个数和参数类型。
2. 函数重构是指在子类中声明与父类同名的方法,从而覆盖了父类的方法。重构解决了子类与父类的差异问题。(在讨论到继承时我会详细说明)
在C++中:
1. 数重载的概念一样。
2. 重构的概念可就不一样了,C++中功能更为庞大的虚函数。更详细内容这里就不错过多介绍了!
其实关于重载的概念你并不陌生,在编程中相信你也接触过。呵呵!让我们来举个操作符重载的例子你就会明白了,(JAVA中不支持这个功能)我们定义三个整数变量:
int i1=2, i2=3,i3=0;
i3 = i1 + i2;
此时i3=5;加号实现了两个数相加的运算功能。然而我们现在要定义三个字符串变量:
String str1=”jing”, str2=”wei”,str3=””;
str3 = str1 + str2;
此时str3 = “jingwei”;加号实现了两个字符串相加的运算功能。同样是加号,既可以把两个整型的变量加在一起,也可以把两个字符串类型的变量加在一起。同一个 操作符实现了不同的功能------这就是所谓的操作符重载(嘿嘿,我说你一定见过吧:)!不就好像是汉语中的一词多意一样!我需要说明一下的是,C++ 中的操作符重载可没有这么简单。比如,我们可以对两个自定义类型的对象进行相加的运算,进行赋值的运算。这样书写简洁明了,而且非常实用。当然,关于操作 符重载的话题太多了,有兴趣再看看书吧!
我们把操作符的话题在转到函数上来,我们一直强调的是“对象调方法”------对象其实调的是方法的“名称”。而我们现在要对方法进想重载,也就是 定义多个相同名称的函数,这样计算机在调用的时候不会混淆嘛?我想应该不会的,呵呵,因为仅仅是函数名称相同,而我们在调用函数时会把参数传递给他的。既 是没有参数也是一种参数传递参数的信息(信息为无参数)!然而由于参数类型、参数数量、返回值类型不同我们就可以对相同名称的函数进行区分�
‘贰’ 日常生活中需要编程的地方有哪些
成功人生所需要知道的一切重要事情,你都能从计算机编程中学到。不相信我?那就继续往下看。
当我很小开始编程之时,还只是照搬电脑杂志上前瞻性的文字和符号,以便我和哥哥能够让带有一个双软盘驱动器的旧 Franklin 64 播放一段小巧的数字曲调。当时我们还没有太多生活经验去辨别那些神秘文本。
很多年后,在高中的Pascal课程中,事情看起来开始变得不同。了解if条件语句和for循环,开始引发出沃尔特·惠特曼和罗伯特·弗罗斯特等人都引以为傲的哲学突触联系。好吧,我说的有点夸张,但是这些见解仍然很酷。
是的,我知道,它说起来是一件很令人厌烦的事情——但事实是,在代码中,在while语句、数组、方法、对象等所有这些中,蕴含着很多智慧。事实上,我学到的很多驾驭生活的能力,通常都直接来源于我对多种编程语言的研究。
一、用流程图简化每件事情
许多程序员在开始编写单行代码之前很久就已经开始使用流程图。这样做的原因是,有时试图一下子编写出整个程序的感觉真的是压倒性的,尤其是当程序要完成一些非常复杂的任务时。
程序员将接受大的甚至巨大的软件项目,然后将它们分解为更好管理的更小的部分——有点像造一辆汽车,需要通过事先做每个所需组件,然后再将它们组合 在一起。每个部分都是一个(或几个)具有特定输入值或行为的集合、然后完成一些输出任务的代码块。在该模块内部,程序员将使用流程图描绘出从输入到输出的 逻辑。
流程图能够帮助你以一种可视化形式跟随这个逻辑,这远比你试图用文字把它写出来或者想当然地狂写代码来解决这一问题更加容易理解。程序员没有找出这 样的“动态”逻辑的原因是,后面的逻辑通常在很大程度上取决于你对如何处理程序中早前的逻辑做出的决定。早期决定错了,你将会把自己编入死胡同。
生活中也是如此。当你正在做一个关于如何去还清债务、买房子,或者如何处理任何其他复杂的生活状况,甚至如何管理工作中 的一个项目的决策。在你坐下落笔绘制出在这个过程或决策中每一步的创意流程图时,所有那些看似不可逾越的任务都能够得到更好的处理。这将帮助你在每一个 阶段为你所有可能的选择作出决定,或者预测所有可能性然后追踪各种情景。就像编程,了解早期的选择会如何影响后面的结果将帮助你及早地做出更好的决策。
二、每件事物都有它的位置
当你组织你的生活时也是如此,无论是你的房子还是办公室,你根据要存储事物所需空间的多少来选择空间的大小。小而透明的塑料盒用于盛放干货,一个贴 好标签的香料架盛放香料以节省空间。在办公室,你会将日常工作文档放在办公桌抽屉里,而将敏感的商业文档存放进一个锁柜中。每件物品都有合适的容器,并且 都有它适当的位置——这是组织良好生活的座右铭。
三、重用程序模块以节省时间
任何一个优秀的程序员最终都知道特定的代码块(或称为“函数”)可以在多个程序中重用。例如,一个将华氏温度转换成摄氏温度的函数,它可以用于你创 建的任何需要完成这一任务的程序中。这个函数是一个简单的模块,它以华氏温度为输入,然后输出对应的摄氏温度。这个函数可以包括一定行的代码,然而当你本 可以将它们保存为一个程序模块,然后再直接将其嵌入到未来任何需要它的程序中去时,你为什么非要为所编写的每一个程序都重建这些代码呢?
每当你开始编写一个脚本或程序时,第一步总是创建你的变量。在编程中,包含有很多不同类型的变量。有支持文本表示的字符串类型,支持非十进制数表示 的整数型,用于处理更大数字的双精度型或其变体,还有数组类型、结构体类型等等。我们的想法是,定义一个适用于手头任务的变量。例如,如果一个函数的输出 是一个人的名字,那么你需要的是一个字符串变量。
四、记录每一件事
有时,对于一个程序员来说,只是飞速编写代码而不记录单独的事情是非常诱人的。之所以诱人是因为,任何时候你都准确地知道你想要程序做什么以及你想 要怎样去实现它。记录一个程序需要时间。你必须描述每一步怎样做以及为什么这样做。这看似毫无意义,但几个月后当你决定重用这段代码或为另一用途修改它 时,这就体现了奋力挣扎想起你的每一行代码到底是在做什么,与迅速回退去了解你逻辑背后的整个意图之间的区别。
五、始终给自己留一条退路
一个业余程序员最常犯的错误之一是无限循环。这是一种打破循环所需的条件从未发生的情况,程序会留在循环里并且永远不会结束——这占用100%的电脑CPU资源,几乎相当于锁定了电脑,直至你终止这一过程。
业余程序员需要从中学习的教训是,每当你创建一个需要消耗大量CPU资源的循环来执行某种任务时,引入各种各样的跳出机制是非常重要的。换句话说, 相比基于一个判断你的计算结果是否超过一定值的While循环(在某些情况下它可能永远不会达到),引入一个非常基本的循环计数然后添加一个次要终止条件 的方法是更可取的。如果循环次数超过某个极大的数值,循环必须结束,而如果在一切正常的情况下,这个条件应该是永远不可能达到的。
‘叁’ 编程界面颜色推荐科学设置,如何设置能最大程度减轻眼睛压力
建议你电脑屏幕不要用白色,因为白色对眼睛的刺激是最大的。像我们这样整天对着电脑干活的,也应该注意一下。
其实,只要稍微设置一下,就能让你电脑上的窗口从白花花的颜色变成淡淡的绿色。
设置方法如下:
>>>>在桌面点右键,依次选属性(properties)—外观(appearance)
>>>>点右下角的高级(advanced),然后在项目(items)的下拉菜单里选窗口(windows)>>>>点右侧的下拉菜单颜色(color),点下方的其它(others)
>>>>把色调(Hue)设为85,饱和度(Sat)设为90,亮度(Lum)设为205.(出厂时一般设为160-0-240)
>>>>单击添加到自定义颜色(Add to custom colors),按确定(OK)…… 一直确定(OK)下去。
把窗口设成绿色之后,再来把IE的网页背景也变成养眼的绿色吧:
打开IE,点击工具(TOOLS)—Internet选项(INTERNET
OPTIONS)—辅助功能(Assessibility),勾选第一个“不使用网页中指定的颜色”(ignore colors specified on web
pages),然后点“确定” (OK)--确定……退出。
OK啦,现在你就会发现你的屏幕已经变成淡淡的绿色了。
这个颜色会比白色柔和许多,刚开始可能你还有些不适应,但确实对我们的眼睛有好处,大家不妨试一下。
还有~~~
端正姿势保护眼睛,它对于缓解眼睛疲劳起着十分重要的作用。
具体来讲:
不要长时间持续使用电脑。通常每1小时就需要休息10分钟,在休息时可进行望远或做眼的保健操;观赏绿色植物有利于放松眼部肌肉;点眼药水也能在一定程度上防止眼部干涩,保持眼睛湿润。
眼睛与屏幕之间应保持50厘米以上的距离,最好采用下视20度的视角。对文稿录入人员来说,应减小文稿和电脑显示器屏幕间的距离,降低眼睛因不停转换目标而引起的疲劳。
在使用电脑时应多眨眼,以增加眼内润滑剂和酶的分泌,保持眼睛湿润。
常洗脸可以减小电脑辐射的伤害。
每天饮用绿茶。茶可改善机体造血功能,能增强人体的免疫能力,减少辐射影响。
多吃一些新鲜的蔬菜和水果,可以预防角膜干燥、眼干涩、视力下降甚至夜盲症等眼病。
如果出现眼睛不适,经过长时间休息都不能解除症状者,则需及时到医院检查。
二、环境篇
良好的电脑使用环境,对保护眼睛也很重要。
具体来讲:
电脑房间要经常通风。安装了空调的房间要注意经常换气,因为大量二氧化碳会使人头昏、头痛。
电脑不应对着窗户或背着窗户放,周围环境的光线要柔和;电脑显示器的亮度要调节合适;使用电脑的房间最好装上百叶窗和窗帘。
电脑室最佳温度21℃、湿度60%。提倡在室内放置一些绿色植物,这样不仅可以保持室温,还可以补充室内氧气。
三、显示器篇
电脑显示器是电脑使用者要经常面对的,所以显示器光源的合适与否时至关重要的。因此,可依个人习惯选择一个适合的显示器。为了减少辐射也可以考虑使用LCD(液晶显示器)。一般来讲显示器的辐射主要来源于显示器背面电子元件辐射,因此不建议办公桌以面对面或者前后顺序摆放,以免显示器背面对人,造成对他人的辐射伤害。
四、刷新率篇
显示器刷新率的高低和保护眼睛也有很大的联系。低刷新率会使眼睛很快疲劳,无法长时间工作,一般来说,85Hz以上对人眼的伤害较小。一些名牌显示器,在安装好驱动程序后就可以在“显示属性”的“设置’页中点击“高级”按钮,然后在“适配器”中设置刷新率,如果显示器能够承受,设置得越高越好。但是一些显示器的驱动程序或显示器本身无法支持较高的刷新率,所以一般用户的刷新率设置在75Hz即可。以免调高后屏幕被刷成黑屏,影响使用。
五、软件篇
紧张的工作往往会使人过分投入而忘记了休息,这会使眼睛深度疲劳,还有一些电脑游戏爱好者,痴迷于游戏中而忘记了保护眼睛,视力的下降当然是必然的。所以建议大家不要过长时间沉迷于电脑游戏或观看影视节目等,注意适当休息,选择其他的娱乐方式放松心情。
丰富多彩的互联网世界,给我们带来了我们需要的信息及工作与生活的快乐。如果我们的眼睛没有保护好,就不能尽情享受现代高科技的便利与发展,面对一个近在咫尺的丰富网络世界,而不能接近它,对于一个现代人来说,实在是一种难以忍受的痛苦折磨。
眼睛保护是一项重要的生命工程,它贯穿于我们的工作与生活,让我们从现在做起,保护好我们的心灵之窗,让它们永远清透明亮!
‘肆’ 3D模型与3D编程
这种方面的书十分难找。至少我在网上找到的教程不大于5个
第一3D编程一般都是开发游戏用到,不赚钱的东西没人学这个
第二涉及到载入缓冲,硬件参数,类和库文件的载入。OpenGL和D3D技术。最起码你要有C++基础,不错的天赋,能在极少的教程中找到用法。许多教程是不教你怎么载入库文件,载入头文件。缓冲区,窗口,MFC怎么写。都要你自己去悟
第三,IDE的兼容问题。VC编译软件有多种。VC++6.0,VS2008,VS2005。等等。每个版本兼容和代码支持规范也不一样。到时候你要面临这版本不一样的教程和N多错误想着解决办法。头都炸了
最近也在学3D编程,一头雾水,基本问题现在也解决了。我只是觉得自己刚刚入门