不同程序语言,难易度差别大吗?
在对程序一窍不通的人眼中,程序仿佛是一种意念一样的存在:你给我写个程序很简单,输入这个输出那个,你们用程序一下就搞定了!
没错大哥,你看到的是输入个这、输出个那,那中间你看不到的逻辑都是我想想就好的吗?真的不用敲代码不用反复验证吗?
还有大哥说:你要是用VBA写麻烦,我听说那个Python贼好用,你会吗?不然你用那个试试? ……… 所以我今天想片面的说的是,不同程序语言之间可能语法不一样,内部封装的函数和方法也不一样,但只是为了适应该程序语言在某种特定编写环境中图方便而为之。若想用不同语言实现同一个功能,其实现逻辑可以说99%都没有区别!
所以掌握算法(逻辑)才是最牛逼的!
复习一下
先来看看上次的作业吧!请依据文化水平对号入座。
小学及以下
代码语言:javascript复制Sub 三角形的面积()
Dim 面积 As Single
Dim 高 As Single
Dim 底边 As Single
高 = Cells(1, 2)
底 = Cells(2, 2)
面积 = 1 / 2 * 底 * 高
Cells(3, 2) = 面积
End Sub
变量用汉字看着是不是很low,但是不是很好看很容易辨认!那就这么用!
读入高,读入底,然后利用小学公式求面积,再输出!
题目没什么难点,估计能会有同学定义了integer整数型导致了小数点后面丢失。下次注意!
初中及以上
代码语言:javascript复制Sub 球的体积()
Dim R As Integer
R = Cells(Cells(1, 3), 1)
Dim V As Single
V = 4 / 3 * 3.14 * R ^ 3
Cells(2, 3) = V
End Sub
这题难点难道在求球体体积的公式?! 真正难的或许在cells的嵌套吧!
没错,Cells(1,3)是我们输入的行值,所以它本身也是一个“数”,既然是数就可以表示行数,所以这么嵌套是OK啦! 另外啰嗦几句上期有关内容
变量
常用几个类型一定记清楚!integer整数!string字符串!single小数!
一定注意变量的类型,常见的有把小数赋值给整型会丢失精度,把整数赋值给字符串类型,在比较大小时会出错等等。
有些系统的“违禁词”不可以被当做变量名,比如Name、As、Stop等等,就像我们给游戏ID起名时,要避开敏感词汇表里面的内容一样。同样,这些词也不用特意记,你一声明系统就崩溃起火冒烟记得打119……
单元格
表述得越详细越好,比如Worksheets(“Sheet1”).Cells(1,1)就比Cells(1,1)要好。有时候指向不明在工作表或者工作簿之间来回跳转时会出错。就像你同时跟张三李四对话,瞅着他俩中间说:“你是智障吗?”俩人都假装没听到一样。
今天的小目标
1、整几个特别low的变量;
2、用for循环偷懒;
3、用if告诉程序怎么做是对的;
4、从单元格读取内容,经过一番折腾再放回去。
(能改绝对不写新的)
正经的教程开始
If条件判断
曾经的一个笑话给程序猿黑惨了啊哈哈哈哈哈哈哈哈。
小sei的老公是一个程序猿,小sei给他打电话:“下班回来买10个土豆,如果看到了卖西红柿的,买2个。”结果小sei的老公下班回家拎着2个土豆,小sei问他为啥就买这点?“因为我看见卖西红柿的了(手动微笑)”
我们用伪代码(假程序)来回放一下小sei老公短路的脑子:
代码语言:javascript复制Sub 下班买菜()
Dim 预购清单 As 各种菜
预购清单 = 土豆 * 10
If 看到卖西红柿的 Then
预购清单 = 土豆 * 2
End If
End Sub
这还好是预购,要是已购还得去退8个土豆…… 这回有没有理解赋值的覆盖性! 逻辑其实非常简单,我直接讲解一下结构。
语法
If 逻辑 then …… Elseif 逻辑 then …… Elseif 逻辑 then …… Else …… End If
IF,如果;Then,那么。像不像小时候的造句!如果今天下雨,我就不去上学了!像不像你!
ElseIf,其他情况的话,如果;Then那么。其他情况的话,如果(今天确定不下雨,找其他借口)我吃撑了,就不去上学了!
Else,其他。啥借口都没有了,我只能去上学了。
End If,结束标志。代表整个If判断的结构体结束。
只有开头结尾是必须的,其他都是非必须的。
极简版
If 逻辑 then …… End If
逻辑
一堆比较关系,等于=,大于>,大于等于>=,小于<,小于等于<,不等于<>。所有的逻辑关系就都在这儿了,已经全了!
有小伙伴可能另(tai)辟蹊(gang)径:“哎,劳斯,补对啊,包含啥的咋没说?”
就不说气死你!以后再讲!而且可以提前告诉你包含已经被包含了!
这里不提真假值,我们就说条件满足不满足,通俗易懂!
特殊逻辑(别记)
系统认为,只要是0,就是不满足条件(假);只要是非0值,就是满足条件(真)!
代码语言:javascript复制Sub 奇怪逻辑()
If -1 Then
MsgBox ("满足条件")
Else
MsgBox ("不满足条件")
End If
End Sub
以上输出结果一定是满足条件,因为-1不等于0。 这种奇怪的逻辑建议不要直接使用,所以不建议记!但是大约要知道这么个事儿! 所以建议你只需要用逻辑关系符号判断条件是否满足!
Select语句(别记)
所有的If语句,都可以用Select Case改写。 但别学那么多会放弃的!你只需要会一种方法就可以! 所以我Select我讲都不会讲的(手动微笑)
举个例子
做个最简单的题! 输入一个人的年龄,告诉我他属于什么年龄段。
假定2岁及以下属于婴幼儿,10岁及以下属于儿童,20岁及以下属于青年,50岁及以下属于中年,50岁以上属于老年。
来中年人,咱们试着写一下,写之前,这个函数我们会用到:
Inputbox(),输入盒子。这个函数可以弹出一个弹框,输入一个赋值给一个变量。
代码:
代码语言:javascript复制Sub 输入年龄返回所属年龄段()
Dim Age As Integer
Dim AgeType As String
Age = InputBox("请输入整数年龄")
If Age <= 2 Then
AgeType = "婴幼儿"
ElseIf Age <= 10 Then
AgeType = "儿童"
ElseIf Age <= 20 Then
AgeType = "青年"
ElseIf Age <= 50 Then
AgeType = "中年"
Else
AgeType = "老年"
End If
MsgBox (Age & "岁属于" & AgeType)
End Sub
讲解 我们定义两个变量,一个是整数型年龄(Age),一个是字符串型的年龄所属区间(AgeType),我们用Inputbox函数给Age赋值,然后通过判断Age的所属区间确定AgeType的值。最后以“X岁属于X”用Msgbox函数输出。逻辑非常简单。
注意一点,最后的else是可以用elseif改写的,应该怎么写呢?
(留作思考题) (永久尘封的那种)
OK!If条件判断已经学完了,看下一个内容!
For循环
这个真的是程序的精髓,程序擅长解决的就是逻辑重复不需要创造性思维的问题。
比如,每个孩子从小被考:从1加到100,得多少?
所有的父母都希望自己是高斯的父母,但基本希望都落空了…… (欲知什么梗,请移步百度:高斯1加到100故事)
213青年
1 2=3 3 3=6 6 4=4 …… 5085 99 = 5120 5120 100=5220
(算完当场就哭出了声)
普通青年
利用高中学习的等比数列前N项和,(首项 末项)*项数/2 = (1 100)*100/2=5050。 至少算对了。
高端青年
当然是用VBA!
代码语言:javascript复制Sub 求和()
Dim sum As Integer
For i = 1 To 100
sum = sum i
Next
MsgBox ("1加到100等于" & sum)
End Sub
有些具有批(gang)判(jing)精神的同学会说:“切,这高端什么,还比不上普通青年呢!”
是么?那我改成68加到792,麻烦你算下(手动狗头)
此时213青年已倒地吐白沫,普通青年也慌了,因为如此高位的乘法已经不能口算了,然而高端青年只需小小的改动一下代码:
代码语言:javascript复制Sub 求和2()
Dim sum As long
For i = 68 To 792
sum = sum i
Next
MsgBox ("68加到792等于" & sum)
End Sub
注意,此时sum需要更改类型,因为最后结果在3万以上,整型会溢出,所以改成long型。
至此,高端青年完胜。
在这里也想强调一点,程序更多的是解决一类问题,所以能灵活配置是你在写代码时需要考虑的问题。
For语法
For 变量 = 开始值 to 结束值 …… Next
For,循环开始的标志,第一次循环,变量最初会被赋值为“开始值”;从第二次开始,变量每次会被 1,然后与结束值比较,若变量值<=结束值,则继续循环;如果变量值>结束值(这有个伏笔),则跳出循环。
Next,循环结束的标志。运行到这步时变量 1。
举例
我们还是来看“1加到100”这个例子 …… 算了,不看了,简单到不知道怎么讲,自己领悟!不会的话留言!我把你T了!
特殊的语法——倒序
还记得刚才的伏笔吗? “如果变量值>结束值,则跳出循环” 这个表述上是非常不准确的。
语法
For 变量 = 起始值 to 结束值 step 步长 Next
步长是什么意思呢?
以“求1到100所有奇数的和”为例:
代码语言:javascript复制Sub 求奇数和()
Dim sum As Long
For i = 1 To 100 Step 2
sum = sum i
Next
MsgBox ("1加到100的奇数和" & sum)
End Sub
Step 2,理解为步长为2,即变量每次 2,所以i的值就变为了1,3,5,7,9,11……97,99
当i到达99时,下一次循环,i变为了101,超过了100,所以跳出了循环。
所以当step 的步长填写为-1时,会发生什么效果! 没错!变量i的值,每下一次循环,就比当前值减少1。
以“反向求1到100所有偶数的和”为例:
代码语言:javascript复制Sub 反向求偶数和()
Dim sum As Long
For i = 100 To 1 Step -2
sum = sum i
Next
MsgBox ("1加到100的偶数和" & sum)
End Sub
Step -2,步长为-2,即变量每次-2,所以i的值就变为了100,98,96……4,2。
当i为2时,下一次循环,i变为了0,小于结束值1,所以跳出了循环。
总结
1、在step省略不写时,默认缺省为step 1; 2、在step后值为正时,结束标志为大于结束值; 3、在step后值为负时,结束标志为小于结束值。
当然不用记!你写的代码一定是在这个区间,理解就好了!
For循环的嵌套
各种结构都是可以嵌套的,那么下面这个问题,你能理解吗?
代码语言:javascript复制Sub 循环嵌套()
Dim sum As Long
For i = 1 To 100
For j = 1 To 100
sum = sum j
Next
Next
MsgBox (sum)
End Sub
讲解 先看最内层的循环,是不就是一个1加到100的和! 那外面i循环,循环了100次,是不就是将1加到100的和乘以了100!
注意
1、每一个For,对应一个Next。 2、嵌套关系的For之间,不能用相同的变量,会报错! 3、但是并列关系的For,可以用相同变量,一般常用的是i,j,k,也可以自己随意定义。
今日作业
1、新建一个工作表,在A列的第1至第100行,分别输出1至100。 2、但如果这个数是7的整数倍,则不输出。 3、禁止用mod函数!(不用知道这个是啥,我还没讲到)。
下期不定期更新预告
1、再讲一个While循环,这个真是没办法确实不能完全被For循环替代。 2、写了一堆Bug,咋整?我自己看着都懵!(没错,讲解一下调试方法。)
今日毒奶
说VBA弱鸡的多半都是不会VBA的!