作为一个代码小白,如何学习编程,在网上看到的建议都是去建议学习什么什么的书,先看什么书再看什么书,这也是我在学习过程中看到最多的建议。学习了好几年以后才看,这些建议大多是无用的,这些建议就像是听着正确实际缺无用的废话,就像是总有长辈去你家串门的时候,聊到你还在上学,总会热心的说 : 好好上学,考个好大学,娶个好媳妇。尤其是在更深的学习以后,发觉很多国外的教程都会给你详细的说明文档,demo事例,丰富的案例。在听那几句干瘪的话,这是扯淡。
作为为初学者编程入门做的两个系列的文章, 这两个系列文章的目的是让初学者在刚学习的时候就规避到将要遇到繁杂的知识点,而专注于理解程序是什么本身。这两个系列文章的定位就是为小白学习编程提供一个强力的切入点。
程序的数据存储与处理。这个系列是讲解程序怎么理解数据,并且用户应该怎么使用数据,
程序的逻辑与实现方法。这个是系列讲解的主要是如何通过代码架构实现功能逻辑的编写。
程序中的管家---大括号。这个系列是通过大括号的讲解,把变量的生命周期作用范围,函数,形参,实参,不同的脚本变量通信的知识点串联起来。当然这篇文章是为视界之外的成员免费提供的,暂不外公。
希望用户通过以上的教程建立起对程序的理解,里面都有很多概念性的东西,需要记忆的并不多,如果用户有不明白的地方,可以多看几遍。但是我要说的一点就是如果看了几遍还是不甚明白,那就是我写的不清楚了,一定要告诉我。
(一)程序的数据存储和处理。
我们先放这个章节的结论,再聊具体内容。
程序不擅长储存数据,但是擅长处理数据。程序是很不擅长存储大量的数据,数据的存储只能是小量的数据,当面对大量数据的时候,数据必须要用固定的组合方式。这一点会在对应的视频中具体说明的。
程序的数据都是对现实生活的需求在代码里的具体实现。脱离现实的生活而只是讲程序的方式并不好,程序对应的是生活,我们通过生活思考程序。
程序的数据--本质简单,组合多样。所有的数据都是二进制数据,但是为了和现实的需求结合起来,有各种的组合方式。
第一步我们开始讲具体内容。
我先写几个代码:
int a=1;
int b=2;
int c=a+b;
printf(%d,c);
上面这个代码是我们刚开始会见到,但是我很不赞成这个思考与写程序的方式, 比方我说a储存了数据1,b储存了数据2,c存储了a和b的和,。。。然后我就双眼一黑GG了,上面写代码的方式只是在陈述一段知识点,并没为我们提供更多的思考方式,换一个角度,我们在上面的结论里面得出了程序的数据都是对应的现实。我们通过修改这一段程序把现实和程序结合起来。
我们的生活场景是这样的,比如我们去买苹果,苹果的价格是5快一个,我买10个是多少钱? 我把价格5块钱放在一个变量里面price,把数量10个苹果放在变量appleNum里面,把最后的价钱放在rusult里面。
代码的表现方式是:
int price=5;
int appleNum=10;
int rusult =price *appleNum;
这个代码是我凭空敲出来的,但是为什么都要用int类型·呢,我知道你看过的一些代码书里面是有其他的变量类型的,比如 float 比如 char 比如 long 比如 double 比如 bool。
think that-----因为我在场景中做了限制,分别用的单位是个,价钱的5. int 类型的数据是可以存储5.10这种数字的。假如我修改了场景:我们去买苹果,苹果价格是5快5一斤,你想买3斤半,价钱是多少?
现在的数据变成了 5.5 3.5 , 我现在就不能用int 类型定义 price 和 apppleNum了,甚至我都不能用 appleNum保存斤数了,Num是数量的含义,重量就要用Weight.能存储这些数据的类型是float,
所以代码修改成:
float price=5.5;
float appleWeight=3.5;
float rusult=price * appleWeight;
初学者可能认为这些限制好无趣甚至看一看就感觉讲的真LOW,什么苹果白菜的,这些我都知道啊,用得着花这么多的笔墨写嘛? 有这些牢骚其实挺正常的,因为我在学习的时候也有这些抱怨。也是工作了一段时间后才明白,因为我们从大小的环境是没深入了解过编程的事情的,所以你对程序的印象就是一个白纸,当你看到看到这些赋值的时候,脑海里面你看到的赋值,更多的丰富多彩的东西你是没看到的,这个问题并不怪你自己,因为我们的社会很少开放自己的学习经验,不过,我会慢慢的把程序丰富的一面打开,别急,听我慢慢讲。
不过我要先说一点的是,你不要看这个赋值简单,但是程序中编程的目的,都是为了赋值,而且赋值也会比你想的有用的多。赋值是很重要的!
铁打的赋值,流水的应用场景。
下面的这张图好看吗?
在程序的角度上来讲也都是赋值。实际的处理设置的地方是:
看到上面的几个颜色条了吗,就是调节这些来修改调节出这个配色。
如果我全部调红呢,我们看一下效果。
刚才的美感都没有了,红红的一片。
所以赋值是很重要的事情。不要因为变量的定义赋值是学习的第一章就小瞧赋值这个概念。相反的,我认为一些编程书上后面的章节:函数啦 ,链表啦,指针啦,完全没必要怎么说,初学者把掌握了函数,指针的使用当作自己的学习好坏的评价标准完全是本末倒置,捡了芝麻丢了西瓜,以我几年的编程经验来说,如果你有幸在编程行业继续走下去,你会被各种知识点,各种高大上的理论填满,但是赋值是你永远在做的事情。
学习编程是不能脱离固定的场景的,更确切的说是不能脱离自己的代码场景。上面的那几张图就是取之unity,这是一款游戏开发工具,你们玩的很多手机游戏,都是使用它开发的,现在VR游戏很多也是它开发的,当然我把刚才你看到的场景生成了手机APK,放在了百度云盘上了。你要感兴趣的话,可以下载下来体验,地址:http://pan.baidu.com/s/1bpeaylT注·:这是在一个第三方插件上修改的,并非我设计,建造。我是拿来修改,第二次开发。
unity就是我具体的应用场景,在这个场景里面,我只需要修改值刚才的颜色条,就可以得到很多效果。你可能会说,这个只是修改设置,并不算赋值。所以我打算贴一段源码:
先不要去理解每段代码的含义,你就看没一句代码都有什么?是不是都有等号,是不是都在赋值!
v2f vert(appdata v) {
v2f o;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
half3 normal = v.normal;
o.color = v.color;
half dirFront = 1 - acos(clamp(dot(half3(0, 0, 1), half3(0, 0, normal.z)), -1, 1)) / PI_HALF;
half dirBack = 1 - acos(clamp(dot(half3(0, 0, -1), half3(0, 0, normal.z)), -1, 1)) / PI_HALF;
half dirRight = 1 - acos(clamp(dot(half3(1, 0, 0), half3(normal.x, 0, 0)), -1, 1)) / PI_HALF;
half dirLeft = 1 - acos(clamp(dot(half3(-1, 0, 0), half3(normal.x, 0, 0)), -1, 1)) / PI_HALF;
half dirUp = 1 - acos(clamp(dot(half3(0, 1, 0), half3(0, normal.y, 0)), -1, 1)) / PI_HALF;
half dirDown = 1 - acos(clamp(dot(half3(0, -1, 0), half3(0, normal.y, 0)), -1, 1)) / PI_HALF;
half4 posGrad = v.vertex;
half blendFractor = saturate((posGrad.y - _GradientYStartPos) / _GradientHeight);
half3 colorFront = lerp(_FrontBottomColor, _FrontTopColor, blendFractor);
half3 colorBack = lerp(_BackBottomColor, _BackTopColor, blendFractor);
half3 colorRight = lerp(_RightBottomColor, _RightTopColor, blendFractor);
half3 colorLeft = lerp(_LeftBottomColor, _LeftTopColor, blendFractor);
#if FOG_BOTTOM
// Remove directions with blendFractor.
dirFront = lerp(1, dirFront, blendFractor);
dirBack = lerp(1, dirBack, blendFractor);
dirRight = lerp(1, dirRight, blendFractor);
dirLeft = lerp(1, dirLeft, blendFractor);
dirUp = lerp(1, dirUp, blendFractor);
dirDown = lerp(1, dirDown, blendFractor);
#endif
half3 finalFront = normal.z > 0? (colorFront * dirFront) : (colorBack * dirBack);
half3 finalRight = normal.x > 0? (colorRight * dirRight) : (colorLeft * dirLeft);
half3 finalTop = normal.y > 0? (_TopColor * dirUp) : (_BottomColor * dirDown);
#if !INDEPENDENT_SIDES
o.lighting = finalFront + finalRight + finalTop;
#else
if (abs(normal.x) > abs(normal.y) && abs(normal.x) > abs(normal.z))
{
o.lighting = finalRight;
}
else if (abs(normal.y) > abs(normal.z))
{
o.lighting = finalTop;
}
else
{
o.lighting = finalFront;
}
#endif
#if LIGHTMAP_COLR_ON
o.lightmap_uv = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
#else
o.lightmap_uv = half3(0, 0, 0);
#endif
// Transfer realtime shadows
TRANSFER_SHADOW(o);
UNITY_TRANSFER_FOG(o, o.pos);
o.lighting += _AmbientColor * _AmbientPower;
return o;
}
fixed4 frag(v2f v) : COLOR {
fixed4 result = fixed4(0, 0, 0, 0);
half4 lightColor = half4((_LightTint * v.lighting), 1);
fixed shadowPower = saturate(SHADOW_ATTENUATION(v) + 1 - _ShadowPower);
#ifdef LIGHTMAP_ON
#if LIGHTMAP_COLR_ON
fixed4 lmColor = UNITY_SAMPLE_TEX2D(unity_Lightmap, v.lightmap_uv) * shadowPower;
half3 lmPower = lerp(VEC3_ONE, saturate(DecodeLightmap(lmColor)), _LightmapPower);
result.xyz = lerp(_LightmapColor.xyz, VEC3_ONE, lmPower) * lightColor.xyz;
#else
result = lightColor * shadowPower;
#endif
#else
result = lightColor * shadowPower;
#endif
result.xyz *= v.color * tex2D(_MainTex, v.uv);
UNITY_APPLY_FOG(v.fogCoord, result);
UNITY_OPAQUE_ALPHA(result.a);
return result;
}
ENDCG
请深记:程序就是一句句的赋值。你很难找到没有等号的代码。
///////////////////////////////////////////////////////////////////////////////////////////
现在你也许知道了赋值的重要性,但是还是不知道赋值该怎么用,是不是,我们在学习过程中都会有相同的疑惑,我也有这些疑惑,我并不像让吊你的胃口,我继续往下说。
你会有不知道怎么用,对赋值难以落地是因为你没有被带入到一个和代码相关的场景里面。
现在我把你带入到一个场景。理解这个场景:有一个东西,它是立立方方的一个正方体,它长宽高都为1,现在你把他变为长宽高都为2.
我们在unity中实现上面的场景:
左面红框的是正方体,右面的红框是长宽高为1.
现在我们用代码来让他变为2.
核心代码就是:
Cube.localScale = new Vector3 (2,2,2);
这句代码的意思是立方体的三维缩放比列分别设置为2,2,2.
你会有这样的疑问:为什么我这样写就会变成2倍了?
这就是场景中的平台赋予我的力量,程序的最终赋值都是对平台提供的属性赋值。
上张图的右面红色的框框的值,你让它变成2,它就会2.
所以,学习程序的时候,你单独学习程序,而不考虑应用场景和所在的平台是学习会很茫然。当然平台的学习甚至还要比单纯学习还要难,我并不建议,用户去学习unity啊,这个难道太大,unity用只是用来让你更深的明白程序是怎么回事的工具,在这一系列教程里面,我只会把unity这个软件,当作场景重现的平台。
好,下一章节,我们继续讲我们的数据存储与处理。