从零开始学VB献给想学习VB的朋友们首先必须说明的是,如果您希望通过学习本文,
学习vb成为高手,那您大可不必看下去了,因为只是不可能的,vb入门容易,深入很难,
需要计算机原理的知识,需要汇编的功底,需要c的功底,需要对底层的了解„„
本文献给渴望学习编程的朋友们,本文希望能通过对vb的学习,使您对什么是编程有一个初
步的了解,使您迈出程序设计的第一步
学习编程有很多条路,您可以先学习微机原理,汇编,然后学习高级语言,这样可以对学习
高级语言有不小的帮助,也可以先学习vb这样的比较容易上手的语言,但不论哪条路,都是
充满艰辛的,如果您希望短期内成为高手,为了向别人炫耀而学习编程,那您是不会成功的。
好了,下面我们开始学习,第一步,打开vb(),弹出的新建工程,我们选择默认得“标准
exe”,点打开,(对于vb的环境,我会在需要时介绍,但不会完全讲解,您可以没事的时候
四处点一点,看一看,自己探索一下)
您会看到一个窗体,里面有个窗体,那就是我们的程序啦,左边是工具栏,按钮,文本框什
么地就在那,向画图一样画在窗体上好了,我们的第一个程序只要一个按钮,一个文本框
在画好的按钮上双击,我们就打开了代码窗口,vb已经自动生成了处理按钮单击的事件的代
码框架
我们输入一下代码(代码对于初学有难度,很容易晕,做好思想准备)
哦,忘了说了,代码的用途是:枚举10000以内自然数中的质数
PrivateSubCommand1_Click()
DimArr()AsDouble
DimZhishuAsBoolean
DimiAsDouble
DimCurNumAsDouble
DimjAsDouble
DimArrCountAsDouble
DimOutArrAsString
Zhishu=True
ReDimArr(1To1)
Arr(1)=2
ArrCount=1
Fori=3To10000Step2
CurNum=i
Forj=1ToArrCount
IfArr(j)>Sqr(CurNum)ThenExitFor
IfCurNumModArr(j)=0Then
Zhishu=Fal
ExitFor
EndIf
Next
IfZhishuThen
ArrCount=ArrCount+1
ReDimPrerveArr(1ToArrCount)
Arr(ArrCount)=CurNum
OutArr=OutArr+Str(CurNum)+vbCrLf
El
Zhishu=True
EndIf
Next
=OutArr
EndSub
代码什么意思?下面一点点讲解
DimArr()AsDouble
DimZhishuAsBoolean
DimiAsDouble
DimCurNumAsDouble
DimjAsDouble
DimArrCountAsDouble
DimOutArrAsString
(插入一句:您可能已经发现vb的代码窗口里的滚动条是不支持鼠标滚轮的,请下载附件里
的东东放到系统目录(c:windowssystem32),这是一个使代码窗口支持鼠标滚轮的add-in)
哦,那个,上面的几句都是Dim....,dim语句是声明语句用来声明变量,变量在程序运行
时是可以改变得,对变量的复制直接变量名=值或表达式,表达式就像(1+(5*6)*3-8)这样
的东西,当然可能更复杂(几乎肯定比这个复杂)
声明这些变量我们是有用的(废话!),根据不同用途,变量被声明为不同的类型,As...就是
告诉vb声明的变量的类型,Double是双精度值,String是字符串
其他类型:
long,长整形(顾名思义,保存整数啦)
Integer,整型
byte,字节
single,单精度
„„
变量是什么?我解释不清,要解释清也不是三言两语的事,自己体会一下吧,保存数值或字
符串,参与运算,用做标记位等用途吧
Zhishu=True
Arr(1)=2
ArrCount=1
这句就是赋值语句,其中Zhishu变量类型为boolean(前面怎么没写?),这种类型只有两
钟取值True和Fal,其实true就是非零,fal就是零,当然那是后话
Arr()是个变量数组,关于变量数组和下面的具体运算,请听下回分解()
从零开始学VB献给想学习VB的朋友们第二篇变量、声明、数组
本篇会加入一些vb入门之后需要了解的东东,看不懂不要紧,能记住尽量记住,记不住起码
在心里要有个印象,学到后面可以翻回来看看。
vb中的数据类型标示符占用空间(字节)范围
boolean(布尔型)无2true或fal
byte(字节型)无10~255
integer(整型)%2-32768~32767
long(长整型)&4-2147473648~2147483647
single(单精度型)!4-3.402823E+38~1.401298E+45和
+1.401298E-45~+3.402823E+38
double(双精度型)#8-1.797693134862315D+308~-4.94066D+324和
+4.94066D-324~+1.767693134862315D+308
currency(货币型)@8-922337203685477.5808~+922337203685477.5807
date(日期型)无8100年1月1日~9999年12月31日
string(字符串)$10+串长(变长)串长(定长)0~约20亿(变长)1~约65400(定
长)
object(对象型)无4任何对象的引用
variant(变体)无22+串长(字符)16(数值)同变长string或同double
关于string类型:
string类型分为变长和定长两种,变长声明为dimMyStrasstring,定长声明为dimMyStr2
asstring*10,变长字符串长度可变,定长不可变,当MyStr2="abc"时,由于"abc"只有3
位,vb将用空格补足剩下的7位,当MyStr2="abcdefghijklmnopq"时,由于超出了10位,
10位后的将被截去
stirng直接的连接使用+或&,建议使用&连接字符串,这样可以使编码更易读
MyStr="abc"&Str2&"fff"其中Str2="kkk"则连接后MyStr为"abckkkfff"
vbcrlf是一个常用的预定义常量,用于换行
高级:string类型用于以A结尾api作参数传递时,vb会自动将unicode的字符串(vb中
的字符串都是unicode)转换为ansi,stirng类型变量作为参数传递给api时,实际传递的
是string的指针,所以byvalStr1asstring这样的声明也可以Str1有api写回的返回值。
关于变量名:
必须字母开头,必须中间没有空格,不能使用关键字,不分大小写,但建议采用易读的方式:
STARTTIME或starttime就不如StartTime易读
通常在模块级变量前加m,全局变量前加g„„
关于声明
dim变量as类型局部变量
private变量as类型私有变量
public变量as类型全局变量
static变量as类型静态变量
vb中并不要求一定要进行变量声明,当使用未声明的变量时,vb将其声明为变体,由于变体
占用较多的内存,以及处理变体比处理其他类型变费时,所以强烈建议变量使用前声明,同时
这样也可以防止很多错误的发生
工具菜单-选项-要求变量声明选中,将在代码通用部分加入OptionExplicit,这将强制
变量声明,使用未声明变量将报错,建议选中
声明和使用变量时as类型和标识符不能冲突,例如dimVar$aslong是不行的,同样dim
Varaslong使用时在Var后面加了不是&的标示符都是不行的
dima,b,caslong=dimaasvariant,basvariant,caslong,也就是说只有c是long
型,a和b都是变体,这与其他语言有区别
dima=dimaasvariant未指明类型将被声明为变体
声明后string类型初值为空串"",数值类型为0,boolean为fal(也是0嘛)
数组:
dim数组名([lowerto]upper,[[lowerto]upper])[astype]
[]内为可选内容,lower默认为0,astype不指定则为变体
一维数组
dimArr(10)aslong
包括
Arr(0),arr(1),Arr(2),Arr(3),Arr(4),Arr(5),Arr(6),Arr(7),Arr(8),Arr(9),Arr(10)
11个元素
二维数组
dimArr2(10,20)aslong
动态数组
dimArr3()aslong
使用redim重新分配内存
redimArr3(5)aslong
可以在redim后面加上prerve关键字,这样可以保护已有数据,比如
dimMyArr()aslong
redimMyArr(2)aslong
MyArr(1)=1
MyArr(2)=2
redimMyArr(5)aslong
这时MyArr(1),MyArr(2)的值就都没了,redimprerveMyArr(5)aslong,就可以保护这
些数据
但是如果数组空间变小了,被删的数据就丢了,
只有最后一维可以修改上限
由于数组在内存中是连续存放的,所以在给api传数组时可以byrefArr(0)这样把数组第一
个元素的地址传过去。
当数据类型相同,左边数组为动态数组时可以
NewArr=OldArr这样copy数组(方便哈)
好了,我们看看那个枚举素数的程序
DimArr()AsDouble
DimZhishuAsBoolean
DimiAsDouble
DimCurNumAsDouble
DimjAsDouble
DimArrCountAsDouble
DimOutArrAsString
Zhishu=True
ReDimArr(1To1)
Arr(1)=2
ArrCount=1
这几句应该都明白了吧
i和j通常用于循环计数器,当然你也可以用别的
之所以我们要定义一个Arr()来存放找到的质数,而不是把找到的质数仅仅放在OutArr里,
因为对于任意给定的数n,如果它不能被小于n^0.5的任一个质数整除,那么它就是质数,
我们不必把所有小于n的数都试一遍
从零开始学VB献给想学习VB的朋友们第三篇语句
注释语句:'和rem后的语句为注释,vb不会处理这些语句
条件:
if条件then
语句
elif条件then
语句
el
语句
endif
其中elif和el为可选,也就是说if语句还可以有一下格式:
if条件then语句
if条件then
语句
endif
if条件then
语句
el
语句
endif
if语句很好理解,如果条件成立,执行then后面的语句,如果不成立,执行el后面的语
句,elif只是把条件不成立之后又进行了一次判断,道理是一样的
lectca语句
lectca表达式
ca条件1
语句1
ca条件2
语句3
„„
cael
语句
endlect
如过明白了if语句那么可以这样理解lectca语句
if表达式=条件1then
语句1
elif表达式=条件2then
语句2
„„
el
语句
endif
ca后面的表达式可以有很多,用,分开
比如
lectcaNUm
ca2,4,6,8
print"偶数"
ca1,3,5,7,9
print"奇数"
endlect
循环:
for计数器=初值to终值step步长
语句
next
比如计算1加到100
dimiaslong
dimsumaslong
fori=1to100
sum=sum+i
next
i为计数器,sum结果为5050
do...loop
还比如1加到100
dimiaslong
dimsumaslong
i=1
dowhilei<=100
sum=sum+i
i=i+1
loop
意思是while后面的表达式成立则执行循环,循环由do和loop包围起来,由于do...loop
语句没有计数器,所以我们要自己让i每循环一次加1,while可以写在do后面,也可以写在
loop后面
不同就是做判断的时间不同,写在loop后面那么执行一遍循环中的语句再检查是否表达式成
立,do后面就先检查,while的地方可以写until,作用和while相反:while表示表达式成
立则执行循环,until表示表达式不成立则执行循环。
exit语句
可以exitfor,exitdo,表示不管三七二十一退出循环,执行后面的东东
下面看第一篇里的程序:
Fori=3To10000Step2
CurNum=i
Forj=1ToArrCount
IfArr(j)>Sqr(CurNum)ThenExitFor
IfCurNumModArr(j)=0Then
Zhishu=Fal
ExitFor
EndIf
Next
IfZhishuThen
ArrCount=ArrCount+1
ReDimPrerveArr(1ToArrCount)
Arr(ArrCount)=CurNum
OutArr=OutArr+Str(CurNum)+vbCrLf
El
Zhishu=True
EndIf
Next
先看最外层,是一个for循环计数器从3开始,每次加2,直到10000,为什么每次加2?因为
除了2以外所有的质数都是奇数,好了,最外面的循环把3到10000的奇数挨个过一遍,我
们要对这些奇数进行检验,看是不是质数,方法是让这个奇数除以所有小于这个奇数算术平
方根的质数,如果都不能整除,那么这个奇数就是质数了,CurNum=i,CurNum是我们当前
处理的奇数
下面又有一个循环,计数器j从1开始到ArrCount每次加1,ArrCount是数组Arr()的元素
个数,也就是我们已经找到的质数的个数
IfArr(j)>Sqr(CurNum)ThenExitFor
Sqr(CurNum)是求CurNum的算术平方根,Sqr是一个函数,这个以后说
所以这个if语句就是说如果Arr(j)找到的质数的第j个如果大于CurNum的算术平方根了,
那么退出循环,执行后面(也就是next后面的语句)
IfCurNumModArr(j)=0Then
Zhishu=Fal
ExitFor
EndIf
Mod嘛,两数相除取余数,9Mod2=1,10mod3=1
如果一个数mod另一个数等于0那就是整除了,我们这里让CurNum除找到的质数的第j个(j
一次加1,就是一次除已经找到的质数)整除了的话那这个curnum就不是质数,让Zhishu
=fal,然后退出循环
IfZhishuThen
ArrCount=ArrCount+1
ReDimPrerveArr(1ToArrCount)
Arr(ArrCount)=CurNum
OutArr=OutArr+Str(CurNum)+vbCrLf
El
Zhishu=True
EndIf
这里判断Zhishu的值,如果为true,执行then后面的语句,为fal,执行el后面的语
句,
如果为true,我们又发现了一个质数,ArrCount加1,数组重新分配内存,多一个元素的地
方,同时保护已有数据,然后把新找到的质数加到数组里,
OutArr=OutArr+Str(CurNum)+vbCrLf表示在outarr字符串后面连上新的质数,外加
一个换行符
Str()用于把数值转换为字符串,函数后面说
如果为fal,这个数不是质数,把zhishu标记置为true
可能有点乱,zhishu这个标记默认为true,在最外层的循环之前就执行了Zhishu=True,
然后我们一直除阿除阿除阿,整除了,不是质数,zhishu=fal,执行后面的判断,除到所
有比curnum的算术平方根小的质数都除过了,还没整除,是质数,zhishu标记不用动,退
出循环,执行判断
本文发布于:2022-12-03 21:57:21,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/46949.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |