您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Visual-Basic-清华大学vb编程语言基础-第7讲
第七讲常用算法内容提要自定义数据类型常用算法•查找•排序•数组元素的插入和删除自定义数据类型Type自定义数据类型名元素名1[(下标)]as类型名元素名2[(下标)]as类型名……EndTypeTypestudentNameasstring*20'姓名Noasinteger'学号Ageasinteger'年龄Sexasstring*1'性别Score(4)assingle'5门课成绩Endtype自定义数据类型一般在标准模块(.bas)中定义,默认是Public,在窗体模块中定义,默认是Private。自定义数据类型可以是字符串,但只能是定长字符串。自定义的数据类型名使用上和Integer、Double等基本类型名相同。自定义数据类型的使用定义了数据类型之后,就可以声明该数据类型的变量,声明的形式为:Dim变量名As自定义数据类型名Dimstuasstudent使用stu变量中的元素,形式为:变量名.元素名stu.namestu.noWithstu.name=“张三”.no=04134.age=18.sex=“男”Fori=0to4.score(i)=int(rnd*101)NextiEndwith自定义数据类型-例定义一个含学号、姓名、成绩3个成员的学生信息数据类型,然后定义一个该类型的数组用来存放学生信息。单击“添加”按钮时将当前文本框text1、text2、text3的数据加入学生信息数组,并在标签中显示当前已有的总记录数。单击“查找”按钮,可以按文本框中指定的学号找到学生信息,并显示在对应的文本框text1、text2、text3中。自定义数据类型-例TypestudentNoAsString*6'学号nameAsString*8‘姓名ScoreAsSingle'成绩EndType标准模块Dimmystu()AsstudentDimnAsInteger窗体通用声明PrivateSubCommand1_Click()n=n+1ReDimPreservemystu(1Ton)AsstudentWithmystu(n).No=Text1.name=Text2.Score=Text3EndWithLabel5.Caption=当前总记录数为:+Str(n)EndSubPrivateSubCommand2_Click()Dimi%Fori=1TonIfmystu(i).No=Text4ThenText1=mystu(i).NoText2=mystu(i).nameText3=mystu(i).ScoreEndIfNextiEndSubPrivateSubForm_Load()n=0EndSub分类统计常用算法将一批数据按分类的条件统计包含的个数例:输入一串字符,统计各字母出现的次数,不区分大小写统计26个字母出现的个数,先声明一个具有26个元素的数组,每个元素的下标表示对应的字母,元素的值表示对应字母出现的次数。从输入的字符串中逐一取出字符,转换成大写字符(不区分大小写),进行判断。分类统计PrivateSubCommand1_Click()Dima(1To26)AsIntegerDimstrAsString*1Dimle%,i%,j%le=Len(Text1.Text)Fori=1Tolestr=UCase(Mid(Text1,i,1))Ifstr=AAndstr=ZThenj=Asc(str)-65+1a(j)=a(j)+1EndIfNextiForj=1To26Ifa(j)0ThenPicture1.Print;Chr$(j+64);=;a(j);NextjEndSub数组排序-选择法排序常用算法使用选择排序法对随机产生的10个数按从小到大的次序排序并输出。分析:选择排序法算法的步骤是:首先从待排序的n个数中选出最小的数,与第一个数交换位置,然后从其余n-1个数中找出次小的数,与第二个数交换位置,……,重复此过程,最后构成递增序列。a(1)a(2)a(3)a(4)a(5)a(6)a(2)a(3)a(4)a(5)a(6)a(3)a(4)a(5)a(6)a(4)a(5)a(6)a(5)a(6)原始数据869327第一趟排序269387第二趟排序239687第三趟排序236987第四趟排序236789第五趟排序236789数组排序-选择法排序选择法排序需要两重循环实现,内循环找出最小的数的位置,外循环把找到的最小数交换到相应的位置。PrivateSubCommand1_Click()Dima(1To10)AsIntegerDimi%,j%,p%,temp%RandomizePrint排序前:Fori=1To10a(i)=Int(Rnd*100)Printa(i);Nexti常用算法Fori=1To9'外循环,进行9轮比较p=i'第i轮比较时,假设第i个元素最小Forj=i+1To10'内循环,在数组的第i个到第10个元素中找最小元素的下标Ifa(j)a(p)Thenp=jEndIfNextjIfpiThentemp=a(i)'找出的最小元素与第i个元素交换a(i)=a(p)a(p)=tempEndIfNextiPrintPrint排序后:Fori=1To10Printa(i);NextiPrintEndSub数组排序-冒泡法排序使用冒泡排序法对随机产生的10个数按从小到大的次序排序并输出。分析:冒泡排序法算法的思路是:相邻的两个数两两比较,若小数在后面,两数交换。这样经过一趟比较后,最大的数沉底,放到最后一个位置,小数上升,第二趟对余下的数两两比较,得次大的数沉到倒数第2的位置上,……,以此类推,最后得到一个递增序列。常用算法数组排序-冒泡法排序原始数据第一趟排序第二趟排序第三趟排序第四趟排序第五趟排序a(1)1085531a(2)857313a(3)573155a(4)731777a(5)318888a(6)11010101010常用算法数组排序-冒泡法排序常用算法Dima(1To10)AsInteger窗体通用声明PrivateSubForm_Load()Dimi%RandomizePrint排序前:Fori=1To10a(i)=Int(Rnd*100)Printa(i);NextiEndSub数组排序-冒泡法排序常用算法PrivateSubCommand1_Click()Dimi%,j%,t%Fori=1To9‘外循环,进行9轮比较Forj=1To10-i'内循环,两两比较Ifa(j)a(j+1)Then'若次序不对,马上交换位置t=a(j)a(j)=a(j+1)a(j+1)=tEndIfNextj'出了内循环,最大数已沉底,小数浮起NextiPrintPrint排序后:Fori=1To10Printa(i);NextiPrintEndSub数组排序-冒泡法排序-2原始数据第一趟排序第二趟排序第三趟排序第四趟排序第五趟排序a(1)1011111a(2)8103333a(3)5810555a(4)7581077a(5)3758108a(6)1377810常用算法数组排序-冒泡法排序-2Dima(1To10)AsInteger窗体通用声明PrivateSubForm_Load()DimiAsIntegerRandomizePrint排序前:Fori=1To10a(i)=Int(Rnd*100)Printa(i);NextiEndSubPrivateSubCommand1_Click()Dimi%,j%,t%Fori=1To9Forj=9ToiStep-1Ifa(j)a(j+1)Thent=a(j)a(j)=a(j+1)a(j+1)=tEndIfNextjNextiPrintPrint排序后:Fori=1To10Printa(i);NextiEndSub产生不重复的随机数Dima(1To7)AsIntegerDimflagAsBoolean,i%,p%RandomizeFori=1To7Doa(i)=Int(Rnd*36)+1flag=FalseForp=1Toi-1Ifa(i)=a(p)Thenflag=TrueExitForEndIfNextpLoopWhileflag=TrueNextiFori=1To7Printa(i);Nexti产生7个随机数,每个数在1—36之间的,并且不能重复.查找查找,也叫检索,是根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素。利用数组可以方便的实现数据的查找•顺序查找•折半查找顺序查找顺序查找是一种最基本和最简单的查找方法。从表中第1个数据开始,逐个数据与给定值进行比较,若某个数据与给定值相等,则查找成功,否则,查找不成功。适用于无序表常用算法顺序查找-例利用顺序查找法查找考场教室号。准考证号码2101~21471741~18021201~12873333~33871803~18292511~2576教室号码102103114209305306为了便于查找,通过二维数组rm建立两种号码对照表,Rm由Form_Load事件过程建立。顺序查找-例Dimrm(6,3)AsIntegerPrivateSubForm_Load()rm(1,1)=2101:rm(1,2)=2147:rm(1,3)=102rm(2,1)=1741:rm(2,2)=1802:rm(2,3)=103rm(3,1)=1201:rm(3,2)=1287:rm(3,3)=114rm(4,1)=3333:rm(4,2)=3387:rm(4,3)=209rm(5,1)=1803:rm(5,2)=1829:rm(5,3)=305rm(6,1)=2511:rm(6,2)=2576:rm(6,3)=306EndSub顺序查找-例PrivateSubCommand1_Click()Dimno%,flag%,i%flag=0no=Val(Text1.Text)Fori=1To6Ifno=rm(i,1)Andno=rm(i,2)ThenText2.Text=rm(i,3)flag=1ExitForEndIfNextiIfflag=0ThenText2.Text=无此准考证号码EndIfText1.SetFocusEndSub折半查找法学号50001500025000450006500085000950010500135001650020数学98907868698283696485外语88928575778695957998查找之前首先要将数组按要查找的关键字排好序。先从数组的中间开始比较,判断该元素是否是要找的数据如果是,则查找成功,否的话,若被查找的元素在该数组的上半部,则从上半部的中间开始继续查找,否则从下半部开始查找。重复执行上面过程,不断缩小查找范围。到最后,因找不到或找到而停止查找。常用算法折半查找法50001500025000450006500085000950010500135001650020TopBottMid=int((top+bott)/2)h(mid)50010,令top=mid+15000150002500045000650008[5000950010500135001650020]BottTopmidh(mid)50010,令bott=mid-15000150002500045000650008[5000950010]500135001650020TopBottmidh(mid)50010,令top=mid+1500015000250004500065000850009[50010]500135001650020TopmidBott常用算法折半查找法-例学号50001500025000450006500085000950010500135001650020数学98907868698283696485外语88928575778695957998十个学生的成绩表如下,使用折半查找法通过学号查找学生成绩。常用算法折半查找法-例Opti
本文标题:Visual-Basic-清华大学vb编程语言基础-第7讲
链接地址:https://www.777doc.com/doc-3661899 .html