"敏捷式软件学习" 一条快捷的程序员的成长之路

看了不少同学的问题,很多是关于编程的学习教材,学习路线,学习方法等,也有不少老师给做了解答,但真正能起到帮助的不是很多,我开发程序有十多年了,也从事过一段培训工作,虽然创新能力有限,但也不停的总结和回顾,发现现在软件教育效率很低,有很多可以改进的地方,因此不断尝试,自己摸索了一套软件学习的方法和内容,其中我借鉴了一些敏捷开发的东西,而且采取的是快速掌握主干知识的思路,我就起了敏捷式软件学习这个名字,通过一些学生的学习,效果不错,在此介绍给同学们.其实真正的学习没有什么捷径,但是少走弯路,就是找到了一条捷径.
这套学习方法主要是对软件开发的学习内容和方式做了重大调整,并用了自己方式进行了阐述,以前是通过上课讲给学生们听,现在整理出了一些文字材料.今天在文章结束后贴出一章..
整个学习分三个部分:
  1.编程能力培养.
   在这部分,要学习计算机原理,c语言,mvc思想,数据结构,类库,代码重构,单元测试,测试驱动,面向对象等内容,以C语言为主线,通过一个游戏的开发过程,把相关课程的关键内容讲述出来,最后引入面向对象,用JAVA,C#重新实现.
   这个游戏中文叫五子连珠,英文名叫winlinez,见插图,
  
游戏的规则是点击一个球可以移动到不同的格子里,移动的时候必须延着没有球的格子滚过去,每移动一次随机出现3个球,把5个以上颜色相同的球联成一条线,就可以销掉得分.
   学习的过程也是做游戏的过程,首先用mvc的思想来分析,m是model,数据部分,如何来存储游戏的数据,有了存储之后,就必然有一些算法,来修改分析这些数据,这里涉及到3个算法,随机放球,检测消球,最短路径(小球要沿着最短路径滚过去,要用到广度优先算法),v是view,显示部分,主要功能是根据数据画出界面,接受鼠标信息,发给c,control,控制部分,c调用m,决定下一步做什么,完成m的过程,就是学习C语言和数据结构的过程,在编写的过程中严格按照软件工程的要求来做,代码格式,命名规范,常量定义,单元测试一个都不能少,引入测试驱动的开发模式,最后以头文件和lib库的形式提供给后续开发,v,c的开发放到最后,学会使用别人的和自己的类库.
   整个开发完之后,学习面向对象,换一种语言,java,或c#,你会发现除了面向对象的思想,其他变化真不是很大.
   还可以进一步扩展到弱类型语言,用javascript,python,ruby也来实现一下MODEL,你会觉也不是太难.
 2.数据库原理与建模
   如果要想独立做一个系统,建模是核心部分,如果你在一个大企业里,按照设计要求完成代码,建模是由高级人员完成的,你只要掌握好SQL就行了,但是懂得建模可以帮助你理解设计,而且建模和需求分析,概要设计密切相关,学习建模也是学习需求分析和概要设计,这里面理论的成分有一些,不很多,书上的很多内容用不上,真正有用就是ER方法,多分析几个实例,基本上就可以了,然后就是sql语句,把多表连接,聚合,结果嵌套弄明白就行了,最后常用数据库的使用和连接方法,odbc原理和使用也是必须要掌握的.
 3.web系统和应用开发.
   学习web 系统,基础一样很重要,HTML语言,HTTP协议,JAVASCRIPT,一个都不能少,然后才是不同的服务架构,asp.net,j2ee,php,一种也行,多种也能学的了,接下来就要开发一个实际的系统了,选一个中等规模的线上系统像论坛,博客,完全模仿一下,从分析到数据库设计,到编码实现,做一遍,当然会遇上很多问题,这时候你也可以到CSDN去提一个看似很"高深"的问题了.
      总结一下,整套课程紧密联系实际,但又不缺乏基础理论,只学习最主干的知识,但涉及到了开发过程的全部环节.   


下面是我的教材第二章,大家看一下,是不是有些不一样,这一章涵盖了类型,变量(空间),指针,数组,结构体,凡是和空间,类型相关的内容一起讲出.第一章是cpu,内存,指令,数据,数据的存储等计算机原理方面的知识.从WORD里面粘过来的,格式有点乱,还少了几个图.大家觉的有没讲明白的地方可以说出来,我再改进改进.
    

第二章  程序中的存储       

   刚才说的是如何将我们常见的资料进行数字化,下面我们就要开始真正进入编程的领域,如何使用内存中的空间,如何在内存中有条理的进行大批量数据的存储与读取。
1. 数据空间
我们用来存数据的空间称为数据空间,和数据空间相对应的是地址空间(指针),我们在运算过程中需要存储大量的数据,(在小球游戏中棋盘上哪些有球,什么颜色,哪些没球,我们都要存储起来,根据这些数据我们才能进行削球,移动球,)最常用的是数字的存储和字符的存储。为了存储数据我们通常需要开辟空间或者说申请空间,首先我们学习开空间的方法即变量声明语句:        
1).开空间
int    a;   开辟一个int类型的空间,a就是这个空间的名字.
char   c;   开辟一个char类型的空间 c
这个语句非常简单,分两部分,前一部分指出要开空间的类型,在32位计算机里 int类型4个字节,char类型1个字节,后一部分是为这个空间起的名字,这个名字是要你来起的哦,又称为标识符,起名字好理解一些,在写程序的时候要起很多名字,起名字也有点学问,尽量用英文单词,一看能知道含义,尽量不使用拼音,和字母加序号,不能以数字开头,只能以字母和下划线(_)开头,中间部位可以出现数字,字母和下划线(_)。在现在的教材里这个语句叫变量声明.
除了int,char还有一些其他类型,常用的有如下:
类型    长度       存储内容
char     1          0-255
int      4          有符号整数
long     4          有符号整数
unsigned  4         无符号整数
short     2         有符号整数
float     4   有符号小数 
double   8     有符号整数
注意:c语言要求每一句话结束要加上“;”。
2).空间赋值
请看代码
int a;
char b;
a=258;
b=’b’;
等号表示把等号右边的数值存储到等号左边的空间里,如果等号左边不是已经开好的空间那肯定是错的。
注意:
1.258需要占用两个字节存储102,上一章的内容,低位在前,所以02在前,1在后。前边不用的位要补0.
2.单引号表示该字母或数字对应的ASC码数值,每对单引号里只能有一个字符;

我们通常还会把一个空间里的内容存储到另一个空间里。
如: b=a ;    把a的内容存到b的里面。
但是当两个空间类型不一样时,就出现了一些问题:
如:char   m=30;
int    b=258;
b=m;
b的空间比m的大,把m的内容放进b绰绰有余,不会有任何问题,多余的空间一定要清零或1,(为什么1),必须保证放进去的值和取出的相等
但是   m=b;会怎样呢?b的空间大于m的空间,无法放下,对于这种情况计算机默认的处理是把b的最低位字节放入,但是编译器会要求我们写出显示转换如下:
m=(char)b;这样编译器就知道这是我们故意要做的,而不是不小心写错了。
根据上述原因,凡是大空间的值放入小空间都需要显示转换,反之就不需要了。
2. 数组
当我们需要开多个相同类型的空间时,可以有一个简便的的方法就是数组。
如 int  a[10];        表示开了10个int类型的空间
这10个空间分别是a[0],a[1]….a[9],使用起来和单独开的空间完全一样。把这10个空间的值都存成0;代码如下:
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
a[4]=0;
a[5]=0;
a[6]=0;
a[7]=0;
a[8]=0;
a[9]=0;
还有一个简便写法:
int a[]={0,0,0,0,0,0,0,0,0,0};这一句连int a[10]都包括了,但是先写int a[10],再写a[]={0,0,0,0,0,0,0,0,0,0}就是错误的.
通常开数组空间一定要指明个数,但是在开空间的时候,直接有赋值语句,赋值语句可以表明个数,这时候就不用指明个数了.

需要说明的是数组开的空间肯定是连续的,除此之外都不能保证连续.
说到数组,就要提到字符串,看代码:
char str[]=”this”;
用双引号括起来的内容我们称为字符串,这个字符串存储在数组str中,共占有5个字节,除了’t’,’h’,’i’,’s’外,还多加了一个字符’/0’,作为结束字符,注意不是’0’,
char str1[]={‘t’,’h’,’i’,’s’};
而str1也是个数组,它只占用4个字节,结尾没有结束字符,就不能当做字符串数组来访问。
我们通常访问字符串数组的时候,只需要首地址就行了,不需要长度,也不需要结束地址,当访问到字符’/0’的时候,就认为字符串结束了。
2 地址空间(又称指针空间)
2.1 地址空间(指针)的含义和使用
与上面讲述的空间不一样,有一种空间不是用来存储数据而是用来存储地址,我们称为指针空间.使用方法如下:
int a;    开一个int类型的普通空间a
int *m;  开一个存储a的地址的空间m
m=&a;  把空间a的地址存入到地址空间m中;  &符号表示取空间的地址,可以用在任何空间的前面.如&m,表示m空间的地址
m中存储了a的地址就可以使用m来访问空间a
*m=26;  *表示指针指向的空间, 必须用在指针空间的前面,在这里相当于通过m给空间a里存储了一个数字26. *不能用在普通空间的前面.如果一个指针空间没有赋值(也称为初始化),是不可以用*操作符的.
2.2地址空间(指针)的类型
我们注意到,在开辟地址空间的时候,也先说明了类型,但与普通空间的类型的意义是完全不同,普通空间的类型主要规定了空间的大小,而对于地址空间来讲大小都是一样,对于任何类型的空间来说,他们的地址的长度都是一样的, 指针类型的空间主要有两个用途:
一 是在使用*符号的时候:
int a;       
int *m
m=&a;
*m=26;
修改的是4个字节的空间
二 是指针进行运算的时候:
指针可以进行运算,但只能进行加法和减法,表示相对向后偏移或向前偏移,两个指针空间的内容不可以相加,相加没有实际意义,但可以相减,相减的含义是两个指针空间相差多少.
int a[10];
int *m;
m=&a[0];
m=m+1; 也可写成 m++;
这里m+1并不是表示m里的值加1,而是加上1*(int的空间大小),这里的int就是指针m的类型,这样m=m+1后,m里面存的就是a[1]的地址,而不会是a[0]里的第二个字节.我们在对数组进行访问时通常可以用指针的运算来来访问不同的元素.
以上两点说明了指针类型的用途,也解释了指针运算的含义,如果有一种指针没有指明类型,那么就不可以运算,也不可以用*操作符,有吗?有,void *,表示没有类型的指针.
2.3指针类型的转换.
所谓指针类型的转换就是把a类型的指针放入b类型的指针空间里,按道理,所有的指针空间的大小都一样,不存在大小不匹配的问题,但由于指针类型的特殊用途,编译器为防止我们出现错误,要求我们在不同类型指针空间赋值时要强制转换.
如:
char *m;
int *n;
m=(char *)n;
n=(char *)m;
 3.结构体空间
结构体空间其实没有什么特殊的,只是开结构体的空间的类型比较特殊。先来看一段代码。
struct unit
{
 int x;
    int y;
    char haveBall;
    char ballColor;
} ;
这段代码定义了一个结构体,其中struct是关键字,先解释一下关键字,关键字是C语言中有固定含义的英文单词,我们写程序的时候不能使用关键字来起名字,我们上面提到的数据类型也是关键字。
struct 的含义就是要定义一个新的结构体。后面unit是我们自己起的名字,然后是一对大括号,括号里面是开空间的代码,说明新的类型是由什么样的空间组成,并没有真的开空间,最后用“;”结束。一个新的结构体,就是一种新的类型,上面的代码只是定义了新的类型,我们用新的类型去开的空间,就是结构体空间。代码如下;
unit  a;
新开出来的空间分别由int,int,char,char来组成如下图。
 

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值