成绩南京工程学院课程设计报告(论文)题目排序演示课程名称程序设计基础---VB院(系、部、中心)先进制造技术工程中心专业机械制造及其自动化班级D机加工091学生姓名钱丽学号231090406设计地点图书馆A307指导教师黄陈蓉设计起止时间: 2011 年 1月4 日至 2011 年 1月 6日目录一、设计任务 (3)二、总体设计思路 (4)三、画出程序总体框图 (4)四、系统的调试 (6)五、收获体会 (8)六、源代码 (9)七、主要参考资料 (23)一、设计任务(1)程序启动后,显示主界面。
首先单击“产生10个随机数”按钮来产生10个随机数,并显示在10个文本框中;然后选择一种“演示模式”和“排序方式”,其中演示模式可以直接给出排序结果,也可以通过动画动态演示整个排序过程,排序方式可以按从小到大顺序,也可以按从大到小顺序排序。
(2)在主窗口的空白区单击鼠标右键,弹出快捷菜单。
从中选择“排序算法”命令,打开对话框,从中选择一种排序方式,单击不同排序方式时,“算法描述”中简要介绍了这种算法。
单击“确定”按钮返回到主窗口,主窗口中最上方框架控件的标题文字显示当前所选的排序算法。
(3)设置完毕,单击“开始排序”按钮(此按钮在生成数据之前是不可用的),启动排序过程。
若选择了动画方式,红色背景的文本框表示当前正在比较的元素,黄色的代表已排序的元素,2个运动的文本框表示交换过程。
在排序过程中可以调节水平滚动条的位置来控制演示过程的速度。
排序结束后程序以消息框的形式报告数据交换的次数。
可以使用快捷菜单中的“将数据写入文件”命令将排序后的数据保存到“data.txt”中覆盖原有内容。
(4)选择窗口主菜单中的“颜色设置”命令,主窗口扩大,底部显示“颜色设置”框架,可以对“文本背景色”、“文本前景色”、“已排序元素色”和“交换结点色”进行设置。
再选择此命令,窗口恢复到原来的大小。
(5)选择主菜单中的“退出”命令可退出本程序,程序显示消息对话框予以确认。
二、系统总体设计方案三、画出程序整体框图1.快捷菜单排序方法多重窗体窗体编辑器设计界面排序演示模块代码信息提示框编写代码2.启动后的主界面3.确认退出对话框4.颜色设置5.显示交换次数6.“排序算法选择”对话框四、系统的调试1、问题:停止按钮不能使其在开始运行时候停止。
解决:利用了Boolean(逻辑变量)定义了一个使程序停止的变量f,然后又定义了一个Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ,声明sleep函数,可以使程序暂停一段时间,最后用时钟(timer)来设定所需暂停的随机时间(s)。
注意timer函数设置时的interval值,以毫秒为单位,1000ms=1s。
2、问题:消息对话框(msgbox)的形式,及msgbox函数的返回值如何的选取,设置。
解决:在对“停止”按钮编码时,一开始未给msgbox赋值,导致程序不起作用,后来赋值后,采用了msgbox函数里的vbyes与vbno,采用了if...then...else...但程序无法退出,最后只对vbno做了代码编制,退出程序则采用了“unload”函数,最后程序终于调试成功。
3、问题:动态演示如何演变,交换次数无法得到。
解决:采用timer函数,以时间来对它进行控制,也可以拖得滚动条来控制它动态演示时的速度。
演示代码:If a(k) > a(j) And Option1.Value ThenText1(k - 1).BackColor = yanse1 '''''''''''''''交换元素颜色Text1(j - 1).BackColor = yanse1DoEventsCall Sleep(1000) 调用了函数sleeplinshi = a(j)a(j) = a(k)a(k) = linshijiaohuan = jiaohuan + 1Text1(k - 1).Text = a(k)Text1(j - 1).Text = a(j)Text1(k - 1).BackColor = yanse '''''''''''''已经排序的颜色Text1(j - 1).BackColor = yanseEnd IfIf a(k) < a(j) And Option2.Value ThenText1(k - 1).BackColor = yanse1Text1(j - 1).BackColor = yanse1linshi = a(j)a(j) = a(k)a(k) = linshijiaohuan = jiaohuan + 1DoEventsSleep (1000)Text1(k - 1).Text = a(k)Text1(j - 1).Text = a(j)Text1(k - 1).BackColor = yanseText1(j - 1).BackColor = yanseEnd IfIf k = 9 Thenj = 0k = 0Timer1.Enabled = FalseMsgBox Frame1.Caption & "排序结束" & "共用" & jiaohuan & "次", vbOKOnly + vbInformation, "系统提示"4、问题:快捷菜单无法弹出。
解决:设计到了窗体编辑器,及弹出菜单所使用的方法PopupMenu。
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)If Button = 2 Then Form1.PopupMenu youjian '''右键弹出菜单End Sub五、收获体会这是我进入大学以来第一次学习vb,第一次知道了什么是vb,第一次了解到了原来平时我们看到计算机上那些普普通通的小程序需要那么多的代码才能够运行起来,终于发现这其中的奥秘。
学习vb首先就是要对所有常用函数了如指掌,这样在编程的时候才能够很快想到并用对地方,做这个程序设计的一开始,简直是一头雾水,无从下手,后来经过翻书,查找资料,网上资料,等等...终于对所要编的程序有了一定的认识,在同学互相讨论的基础上,终于编出排序演示,但是还存在不足,在动态演示的时候,缺了正在交换文本框的动态形式,但是基本能运行起来,大致的符合了设计任务。
程序中所涉及的内容很多,有比较法排序,插入法排序,冒泡发排序,选择法排序,集合了所有的排序,以前对排序的编程就有点不理解,因为它很绕,真正理解它真的有点困难。
还有一些我们vb书上第七章的一些窗体编辑器,快捷菜单的做法,定时器的编码,这些更加巩固了我对这些知识的理解,通过这几天对vb的深入研究,发现其实慢慢的对vb产生了兴趣,从以前的没兴趣到产生兴趣,这是一种好的现象,兴趣是最好的老师,相信我会越学越好的。
六、源代码模块:Option ExplicitPublic Declare Sub Sleep Lib "kernel32" (ByV al dwMilliseconds As Long)颜色设置:Private Sub Combo1_Click()Dim i As IntegerSelect Case Combo1.ListIndexCase 0For i = 0 T o 9T ext1(i).BackColor = vbBlueNext iCase 1For i = 0 T o 9T ext1(i).BackColor = vbGreenNext iCase 2For i = 0 T o 9T ext1(i).BackColor = vbRedNext iCase 3For i = 0 T o 9T ext1(i).BackColor = vbY ellowNext iEnd SelectEnd SubPrivate Sub Combo2_Click()Dim i As IntegerSelect Case Combo2.ListIndex Case 0For i = 0 T o 9T ext1(i).ForeColor = vbBlueNext iCase 1For i = 0 T o 9T ext1(i).ForeColor = vbGreen Next iCase 2For i = 0 T o 9T ext1(i).ForeColor = vbRed Next iCase 3For i = 0 T o 9T ext1(i).ForeColor = vbY ellow Next iEnd SelectEnd SubPrivate Sub Combo3_Click() Select Case Combo3.ListIndexCase 0yanse = vbBlueCase 1yanse = vbGreenCase 2yanse = vbRedCase 3yanse = vbY ellowEnd SelectEnd SubPrivate Sub Combo4_Click() Select Case Combo4.ListIndexCase 0yanse1 = vbBlueCase 1yanse1 = vbGreenCase 2yanse1 = vbRedCase 3yanse1 = vbY ellowEnd SelectEnd Sub退出按钮:Private Sub Command1_Click()If MsgBox("您真的要退出吗?", 4 + 32, "请您确认!") = vbNo Then Exit SubEnd IfUnload Form1Unload Form2End Sub产生随机数:Private Sub Command2_Click()Dim i As IntegerRandomize T imeFor i = 1 T o 10a(i) = Rnd * 200T ext1(i - 1).T ext = a(i)Next iCommand3.Enabled = T rueCommand4.Enabled = T rueEnd Sub开始排序直接给出排序结果:Private Sub Command3_Click()Dim i As Integer, k As SingleIf Form1.Optzhijie.V alue ThenIf Form2.Option1.V alue ThenCall bijiao(a)For i = 1 T o 10T ext1(i - 1).T ext = a(i)NextElseIf Form2.Option2.V alue ThenCall xuanze(a)For i = 1 T o 10T ext1(i - 1).T ext = a(i)NextElseIf Form2.Option3.V alue ThenCall charu(a)For i = 1 T o 10T ext1(i - 1).T ext = a(i)NextElseIf Form2.Option4.V alue ThenCall maopao(a)For i = 1 T o 10T ext1(i - 1).T ext = a(i)NextEnd IfIf a(1) > a(10) ThenT ext2(0).T ext = a(1)T ext2(1).T ext = a(10)ElseT ext2(0).T ext = a(10)T ext2(1).T ext = a(1)End IfFor i = 1 T o 10k = a(i) + kNext iT ext2(2).T ext = k / 10End If----------------------------------------------------------------------------------------- 动态演示结果:If Form1.Optdongtai.V alue ThenIf Form2.Option1.V alue ThenT imer1.Enabled = T rueElseIf Form2.Option2.V alue ThenT imer1.Enabled = T rueElseIf Form2.Option3.V alue ThenT imer1.Enabled = T rueElseIf Form2.Option4.V alue ThenT imer1.Enabled = T rueEnd IfEnd IfEnd Sub暂停运行命令:Private Sub Command4_Click()Dim i%, n%, s%f = FalseT imer1.Enabled = FalseT imer1.Interval = 1000For i = 1 T o ns = n + 1Next iSleep (n)End Sub默认:Private Sub Command5_Click()Dim i%Combo1.T ext = "蓝色"Combo2.T ext = "绿色"Combo3.T ext = "红色"Combo4.T ext = "黄色"T ext1(i).BackColor = vbBlueT ext1(i).ForeColor = vbGreenyanse = vbRedyanse1 = vbY ellowNextEnd Sub窗体启动的时候加载的程序:Private Sub Form_Load()Command3.Enabled = FalseCommand4.Enabled = FalseFrame4.V isible = FalseForm2.Option1.V alue = T rueEnd Sub快捷菜单:Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then Form1.PopupMenu youjianEnd Sub速度Private Sub HScroll1_Change()T imer1.Interval = HScroll1.SmallchangeEnd Sub菜单退出的按钮:Private Sub mnu_end_Click()Unload Form1Unload Form2End Sub显示设置按钮:Private Sub mnu_set_Click()If mnu_set.Checked = T rue ThenForm1.Height = Form1.Height + 1650Frame4.V isible = T ruemnu_set.Checked = FalseElseIf mnu_set.Checked = False ThenForm1.Height = Form1.Height - 1650mnu_set.Checked = T rueEnd IfEnd Sub写入数据:Private Sub shujuxie_Click()Open App.Path + "\data.txt" For Output As #1For i = 1 T o 10Write #1, a(i);Next iClose #1End Sub显示窗体2:Private Sub suanfa_Click()Form2.ShowEnd Sub时间控件用来动态演示:Private Sub T imer1_T imer()Static k As Integer, j As Integer, linshi As Integer, jiaohuan As Integer, i As Integer Dim X As Integer, m As Singlef = T rueIf f = False ThenExit SubEnd IfIf Form2.Option1.V alue Then 比较法排序If k = 0 Thenk = 1j = 2End IfIf j = 11 Thenk = k + 1j = k + 1End IfIf a(k) > a(j) And Option1.V alue Then 交换元素颜色T ext1(k - 1).BackColor = yanse1T ext1(j - 1).BackColor = yanse1DoEventsCall Sleep(1000)linshi = a(j)a(j) = a(k)a(k) = linshijiaohuan = jiaohuan + 1T ext1(k - 1).T ext = a(k)T ext1(j - 1).T ext = a(j)T ext1(k - 1).BackColor = yanse 已经排序的元素颜色T ext1(j - 1).BackColor = yanseEnd IfIf a(k) < a(j) And Option2.V alue ThenT ext1(k - 1).BackColor = yanse1linshi = a(j)a(j) = a(k)a(k) = linshijiaohuan = jiaohuan + 1DoEventsSleep (1000)T ext1(k - 1).T ext = a(k)T ext1(j - 1).T ext = a(j)T ext1(k - 1).BackColor = yanseT ext1(j - 1).BackColor = yanseEnd IfIf k = 9 Thenj = 0k = 0T imer1.Enabled = FalseMsgBox Frame1.Caption & "排序结束" & "交换次数为:" & jiaohuan & "次", vbOKOnly + vbInformation, "系统提示"jiaohuan = 0If a(1) > a(10) ThenT ext2(0).T ext = a(1)T ext2(1).T ext = a(10)ElseT ext2(0).T ext = a(10)T ext2(1).T ext = a(1)End IfFor X = 1 T o 10m = a(X) + mNext XT ext2(2).T ext = m / 10End Ifj = j + 1 选择法排序ElseIf Form2.Option2.V alue Thenk = k + 1linshi = a(k + 1)i = k + 1If Option1.V alue ThenFor j = k + 1 T o UBound(a)If linshi > a(j) Thenlinshi = a(j)i = jEnd IfNext jIf a(k) > a(i) ThenT ext1(i - 1).BackColor = yanse1DoEventsSleep (1000)linshi = a(i)a(i) = a(k)a(k) = linshiT ext1(k - 1).T ext = a(k)T ext1(i - 1).T ext = a(i)jiaohuan = jiaohuan + 1T ext1(k - 1).BackColor = yanseT ext1(i - 1).BackColor = yanseEnd IfEnd IfIf Option2.V alue ThenFor j = k + 1 T o UBound(a)If linshi < a(j) Thenlinshi = a(j)i = jEnd IfNext jIf a(k) < a(i) And Option2.V alue ThenT ext1(k - 1).BackColor = yanse1T ext1(i - 1).BackColor = yanse1DoEventsSleep (1000)linshi = a(i)a(i) = a(k)a(k) = linshiT ext1(k - 1).T ext = a(k)T ext1(i - 1).T ext = a(i)jiaohuan = jiaohuan + 1T ext1(k - 1).BackColor = yanseT ext1(i - 1).BackColor = yanseEnd IfEnd IfIf k = 9 Theni = 0j = 0k = 0T imer1.Enabled = FalseMsgBox Frame1.Caption & "排序结束" & "交换次数为:" & jiaohuan & "次", vbOKOnly + vbInformation, "系统提示"jiaohuan = 0If a(1) > a(10) ThenT ext2(0).T ext = a(1)T ext2(1).T ext = a(10)ElseT ext2(0).T ext = a(10)T ext2(1).T ext = a(1)End IfFor X = 1 T o 10m = a(X) + mNext XT ext2(2).T ext = m / 10End IfElseIf Form2.Option3.V alue Then 插入法排序 i = i + 1For j = 1 T o iIf a(i) < a(j) And Option1.V alue ThenT ext1(i - 1).BackColor = yanse1T ext1(j - 1).BackColor = yanse1DoEventsSleep (1000)linshi = a(i)For k = i T o j + 1 Step -1a(k) = a(k - 1)Next ka(j) = linshijiaohuan = jiaohuan + 1For X = j T o iT ext1(X - 1).T ext = a(X)Next XT ext1(i - 1).BackColor = yanseT ext1(j - 1).BackColor = yanseEnd IfIf a(i) > a(j) And Option2.V alue ThenT ext1(i - 1).BackColor = yanse1T ext1(j - 1).BackColor = yanse1DoEventsSleep (1000)linshi = a(i)For k = i T o j + 1 Step -1a(k) = a(k - 1)Next ka(j) = linshiT ext1(i - 1).BackColor = yanseT ext1(j - 1).BackColor = yansejiaohuan = jiaohuan + 1For X = j T o iT ext1(X - 1).T ext = a(X)Next XEnd IfNext jIf i = 10 Theni = 0j = 0k = 0T imer1.Enabled = FalseMsgBox Frame1.Caption & "排序结束" & "交换次数为:" & jiaohuan & "次", vbOKOnly + vbInformation, "系统提示"jiaohuan = 0If a(1) > a(10) ThenT ext2(0).T ext = a(1)T ext2(1).T ext = a(10)ElseT ext2(0).T ext = a(10)T ext2(1).T ext = a(1)End IfFor X = 1 T o 10m = a(X) + mNext XT ext2(2).T ext = m / 10End IfElseIf Form2.Option4.V alue Then 冒泡法排序j = j + 1If j = 10 - k Thenk = k + 1j = 1End IfIf a(j) > a(j + 1) And Option1.V alue ThenT ext1(j - 1).BackColor = yanse1T ext1(j).BackColor = yanse1DoEventsSleep (1000)linshi = a(j + 1)a(j + 1) = a(j)a(j) = linshijiaohuan = jiaohuan + 1T ext1(j - 1).T ext = a(j)T ext1(j).T ext = a(j + 1)T ext1(j - 1).BackColor = yanseT ext1(j).BackColor = yanseEnd IfIf a(j) < a(j + 1) And Option2.V alue ThenT ext1(j - 1).BackColor = yanse1T ext1(j).BackColor = yanse1DoEventsSleep (1000)linshi = a(j + 1)a(j + 1) = a(j)a(j) = linshijiaohuan = jiaohuan + 1T ext1(j - 1).T ext = a(j)T ext1(j).T ext = a(j + 1)T ext1(j - 1).BackColor = yanseT ext1(j).BackColor = yanseEnd IfIf k = 9 Thenk = 0j = 0T imer1.Enabled = FalseMsgBox Frame1.Caption & "排序结束" & "交换次序为:" & jiaohuan & "次", vbOKOnly + vbInformation, "系统提示"jiaohuan = 0If a(1) > a(10) ThenT ext2(0).T ext = a(1)T ext2(1).T ext = a(10)ElseT ext2(0).T ext = a(10)T ext2(1).T ext = a(1)End IfFor X = 1 T o 10m = a(X) + mNext XT ext2(2).T ext = m / 10End IfEnd IfEnd SubPrivate Sub wenjiandu_Click() 从文件中读取数据Dim i As IntegerOpen App.Path + "\data.txt" For Input As #1For i = 1 T o 10Input #1, a(i)T ext1(i - 1).T ext = a(i)Next iCommand3.Enabled = T rueCommand4.Enabled = T rueEnd Sub比较法排序Private Function bijiao(paixu() As Integer) As Integer Dim k As Integer, j As Integer, linshi As Integer jiaohuan = 0For k = 1 T o UBound(paixu) - 1If Option1.V alue ThenFor j = k T o UBound(paixu)If paixu(k) > paixu(j) Thenlinshi = paixu(j)paixu(j) = paixu(k)paixu(k) = linshiEnd IfNext jElseIf Option2.V alue ThenFor j = k T o UBound(paixu)If paixu(k) < paixu(j) Thenlinshi = paixu(j)paixu(j) = paixu(k)paixu(k) = linshiEnd IfNext jEnd IfNext kEnd Function比较法排序Private Function maopao(paixu() As Integer) As Integer Dim k As Integer, j As Integer, linshi As IntegerFor k = 1 T o UBound(paixu) - 1If Option1.V alue ThenFor j = 1 T o UBound(paixu) - kIf paixu(j) > paixu(j + 1) Thenlinshi = paixu(j + 1)paixu(j + 1) = paixu(j)paixu(j) = linshiEnd IfNext jElseIf Option2.V alue ThenFor j = 1 T o UBound(paixu) - kIf paixu(j) < paixu(j + 1) Thenlinshi = paixu(j + 1)paixu(j + 1) = paixu(j)paixu(j) = linshiEnd IfNext jEnd IfNext kEnd Function选择法排序Private Function xuanze(paixu() As Integer) As Integer Dim k As Integer, j As Integer, linshi As Integer, m As Integer For k = 1 T o UBound(paixu) - 1linshi = paixu(k + 1)m = k + 1For j = k + 1 T o UBound(paixu)If linshi > paixu(j) Thenlinshi = paixu(j)m = jEnd IfNext jIf paixu(k) > paixu(m) And Option1.V alue Thenlinshi = paixu(m)paixu(m) = paixu(k)paixu(k) = linshiEnd IfIf Option2.V alue Thenlinshi = paixu(k + 1)m = k + 1For j = k + 1 T o UBound(paixu)If linshi < paixu(j) Thenlinshi = paixu(j)m = jEnd IfNext jIf paixu(k) < paixu(m) Thenlinshi = paixu(m)paixu(m) = paixu(k)paixu(k) = linshiEnd IfEnd IfNext kEnd Function插入法排序:Private Function charu(paixu() As Integer) As IntegerDim i As Integer, j As Integer, k As Integer, linshi As IntegerFor i = 1 T o UBound(paixu)For j = 1 T o iIf paixu(i) < paixu(j) And Option1.V alue Thenlinshi = paixu(i)For k = i T o j + 1 Step -1paixu(k) = paixu(k - 1)Next kpaixu(j) = linshiElseIf paixu(i) > paixu(j) And Option2.V alue Thenlinshi = paixu(i)For k = i T o j + 1 Step -1paixu(k) = paixu(k - 1)Next kpaixu(j) = linshiEnd IfNext jNext iEnd Function窗体2的源代码::Option ExplicitPrivate Sub Command1_Click()Form2.V isible = FalseEnd SubPrivate Sub Option1_Click()T ext1.T ext = ""T ext1.T ext = "所谓比较法就是:第一轮从a(1)开始,一次讲A(1)与其后的所有元素逐个进行比较,如果其后的某一个元素比A(1)小,则将两者对调,这样第一轮结束后A(1)中保留的是10个元素中最小的值。