KeyFansClub

首页 » - 特色讨论区 - » 键社茶餐厅 » 请问一道简单的VB题……
helenzhu - 2007/9/25 18:43:00
求三个数的平均数

我的代码如下:
Private Sub Command1_Click()
d = (a + b + c) / 3
  End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Form_Load()
Dim a As Single, b As Single, c As Single, d As Single
Text1.Text = a
Text2.Text = b
Text3.Text = c
Text4.Text = d

End Sub

运行结果都是0…………



不知道该怎么弄啊[:Cry:]

Help!
王二 - 2007/9/25 18:48:00
首先你的A,B,C,D都没有付初始值,所以VB自动付了0。
其次你的A,B,C,D都是Form_Load的局部变量,Command1_Click()里面是访问不到的
其实如果你开了Option Explicit的话,你就会发现你的程序还有编译错误...
因为VB默认是不用申明变量就能使用的
helenzhu - 2007/9/25 18:53:00
那么……怎么做……一头雾水……
王二 - 2007/9/25 19:02:00
Dim a As Single, b As Single, c As Single, d As Single

Private Sub Command1_Click()
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = (a + b + c) / 3
Text4.Text = d
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Form_Load()
Text1.Text = a
Text2.Text = b
Text3.Text = c
Text4.Text = d
End Sub

最简单的话,这么改应该就行了,其实做得好一点的话,还可以把公式抽到外面去...=v=
helenzhu - 2007/9/25 19:05:00
啊^_^ 好了^_^ 谢谢咪^_^

公式抽到外面是……?



form load和 click为什么都需要
a = Text1.Text
b = Text2.Text
c = Text3.Text
这几个式子?
王二 - 2007/9/25 19:25:00
看你这个程序大致可以猜出你想做点什么..
就是在画面上输入三个数字,然后按一个按钮,把这三个数字的平均值写到另一个框中。

如果我说的没错的话……
那么你把画面上的三个框填写完毕之后,只是改变了Text1.Text ~ Text3.Text的值而已,
a,b,c的值完全没有变,所以d = (a + b + c) / 3的结果也不会变,永远是0

那么要让他变的话,只有把Text的值赋到相应的变量里去,计算完毕后再把结果写回Text4.Text中,才能在画面中看到结果...

另外,公式抽到外面这句话就当我自言自语吧....对新人讲这个会越讲越糊...orz
helenzhu - 2007/9/25 19:35:00
那么要让他变的话,只有把Text的值赋到相应的变量里去,计算完毕后再把结果写回Text4.Text中,才能在画面中看到结果...

嗯……这句话 是哪些式子起作用的?
思兼SRW - 2007/9/25 19:52:00
国家二级刚刚过去.....[:Admire:]
王二 - 2007/9/25 20:20:00
起计算作用的是d = (a + b + c) / 3
画面上表示作用的Text1.Text ~ Text4.Text
要做的就是在这两个之前做映射
cheong00 - 2007/9/25 22:37:00
我會這樣寫:

======

Private Sub Command1_Click()
Text4.Text = CStr((CSng(Text1.Text) + CSng(Text2.Text) + CSng(Text3.Text)) / 3)
End Sub

======

我不明白為什麼不教用 a = CSng(Text1.Text) 即把型別轉換都寫進去.
沒那概念而習慣用Varient的話, 以後學其他Language時會很麻煩的...

EDIT: 即使繼續寫VB也很麻煩的... 好像我這樣用一行式寫而不做型別轉換的話, 如果Text1到Text3的內容分別是2, 3, 4的話, Text4的內容就會是(234 / 3) = 78而不是3了
cheong00 - 2007/9/25 22:47:00
原帖由 王二 于 2007-9-25 19:02:00 发表
Dim a As Single, b As Single, c As Single, d As Single

Private Sub Command1_Click()
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = (a + b + c) / 3
Text4.Text = d
End Sub

Private Sub C......

Form_Load那些都沒有效果的, 可以略過...
又不是被其他Form call出來的dialog, 反正a,b,c,d的初始值也是 0 嘛...

==

Dim a As Single, b As Single, c As Single, d As Single

Private Sub Command1_Click()
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = (a + b + c) / 3
Text4.Text = d
End Sub

==

然後在把Text1到Text4拉到Form上時, 把Text屬性設成"0"就好.
helenzhu - 2007/9/25 22:54:00
Dim a As Single, b As Single, c As Single, d As Single

Private Sub Command1_Click()
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = (a + b + c) / 3
Text4.Text = d
End Sub



那个……运行的时候会提示  实时错误“424” 要求对象




还有如果某个text里不输入任何数字的话会提示  实时错误“13” 类型不匹配 怎么解决呢?
cheong00 - 2007/9/25 23:09:00
原帖由 helenzhu 于 2007-9-25 22:54:00 发表
那个……运行的时候会提示  实时错误“424” 要求对象

你.. 不會是不記得把Text1至Text4和Command1拉到Form上吧...

原帖由 helenzhu 于 2007-9-25 22:54:00 发表
还有如果某个text里不输入任何数字的话会提示  实时错误“13” 类型不匹配 怎么解决呢?

把 a = Text1.Text 改成

If (Len(Text1.Text) > 0) Then
    a = Text1.Text
End If

其他兩個TextBox比照辦理...

EDIT: 想一想還是多做一些比較好, 不然第二次計算結果就可能不對了:

If (Len(Text1.Text) > 0) Then
    a = Text1.Text
Else
    a = 0
    Text1.Text = 0
End If
helenzhu - 2007/9/25 23:22:00
把Text1至Text4和Command1拉到Form上


就是建立控件?有的啊……
cheong00 - 2007/9/25 23:34:00
你在 "a = Text1.Text" 那行設一個breakpoint(中斷點), 在按command1時就會停在那行上了.

之後慢慢按F8 step(逐行執行), 看在那一行出錯吧...
helenzhu - 2007/9/25 23:58:00
原帖由 cheong00 于 2007-9-25 23:34:00 发表
你在 "a = Text1.Text" 那行設一個breakpoint(中斷點), 在按command1時就會停在那行上了.

之後慢慢按F8 step(逐行執行), 看在那一行出錯吧...



a = Text1.Text  就有错误……
cheong00 - 2007/9/26 0:10:00
原帖由 helenzhu 于 2007-9-25 23:58:00 发表
a = Text1.Text  就有错误……


我剛剛做的... 你就自己看著照做一次吧...

======
上傳不了JPG...  才113KB也說太大了... :(

以下是Form1.frm的內容 (可以用Notepad開啟)...

======

VERSION 5.00
Begin VB.Form Form1
  Caption        =  "Form1"
  ClientHeight    =  3090
  ClientLeft      =  60
  ClientTop      =  450
  ClientWidth    =  4680
  LinkTopic      =  "Form1"
  ScaleHeight    =  3090
  ScaleWidth      =  4680
  StartUpPosition =  3  'Windows Default
  Begin VB.CommandButton Command1
      Caption        =  "Command1"
      Height          =  375
      Left            =  2400
      TabIndex        =  4
      Top            =  600
      Width          =  1335
  End
  Begin VB.TextBox Text4
      Height          =  375
      Left            =  50
      TabIndex        =  3
      Text            =  "0"
      Top            =  2040
      Width          =  2000
  End
  Begin VB.TextBox Text3
      Height          =  375
      Left            =  50
      TabIndex        =  2
      Text            =  "0"
      Top            =  1440
      Width          =  2000
  End
  Begin VB.TextBox Text2
      Height          =  375
      Left            =  50
      TabIndex        =  1
      Text            =  "0"
      Top            =  840
      Width          =  2000
  End
  Begin VB.TextBox Text1
      Height          =  375
      Left            =  50
      TabIndex        =  0
      Text            =  "0"
      Top            =  360
      Width          =  2000
  End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim a As Single, b As Single, c As Single, d As Single
Private Sub Command1_Click()
    If (Len(Text1.Text) > 0) Then
        a = CSng(Text1.Text)
    Else
        Text1.Text = "0"
        a = 0
    End If
    If (Len(Text2.Text) > 0) Then
        b = CSng(Text2.Text)
    Else
        Textb.Text = "0"
        b = 0
    End If
    If (Len(Text3.Text) > 0) Then
        c = CSng(Text3.Text)
    Else
        Text3.Text = "0"
        c = 0
    End If
    d = (a + b + c) / 3
    Text4.Text = d
End Sub
helenzhu - 2007/9/26 0:23:00
If (Len(Text2.Text) > 0) Then
        b = CSng(Text2.Text)
    Else
        Textb.Text = "0"
        b = 0
    End If


这里红色部分

我改过来运行终于成功啦^_^


谢谢
斑鳩君和理昌君^_^
烟雨江南 - 2007/9/26 0:26:00
这样就可以了。前提是在你的Form上有Text1~Text4、Command1、Command2这六个控件。

Private Sub Command1_Click()
Dim a As Single, b As Single, c As Single, d As Single

a = val(Text1.Text )
b = val(Text2.Text )
c = val(Text3.Text )

d = (a + b + c) / 3

Text4.Text = d
End Sub

Private Sub Command2_Click()
End
End Sub
cheong00 - 2007/9/26 1:08:00
原帖由 helenzhu 于 2007-9-26 0:23:00 发表
If (Len(Text2.Text) > 0) Then
        b = CSng(Text2.Text)
    Else
        Textb.Text = "0"
        b = 0
    End If


这里红色部分

我改过来......

Emmm... 這樣說其他部份也要做相應的改變才對...

If (Len(Textb.Text) > 0) Then
        b = CSng(Textb.Text)
    Else
        Textb.Text = "0"
        b = 0
    End If
王二 - 2007/9/26 2:45:00
原帖由 cheong00 于 2007-9-25 22:37:00 发表
我會這樣寫:

======

Private Sub Command1_Click()
Text4.Text = CStr((CSng(Text1.Text) + CSng(Text2.Text) + CSng(Text3.Text)) / 3)
End Sub

======

我不明白為什麼不教用 a = CSng(Text1.Text) 即把型別轉換都寫進去.
沒那概念而習慣用Varient的話, 以後學其他Language時會很麻煩的...

EDIT: 即使繼續寫VB也很麻煩的... 好像我這樣用一行式寫而不做型別轉換的話, 如果Text1到Text3的內容分別是2, 3, 4的話, Text4的內容就會是(234 / 3) = 78而不是3了


=v=
果然还是没教好啊...
其实我是怕教的东西多会让人混淆,所以就沿着她的程序这么改下来了...
单从VB的特点来讲,字符串和数字类型确实能直接转换,而且在“+”和“&”下面会发生不同种类的类型变换

数字 + 数字 -> 数字(相加)
文字列 + 数字 -> 数字(只要文字列能变换成数字,相加)
文字列 + 文字列 -> 文字列(文字列串联)

数字 & 数字 -> 两个数字的文字列?(这个倒不是很清楚)
数字 & 文字列 -> 数字转换成文字列串联成一个新的文字列
文字列 & 文字列 -> 串联起来的文字列

大致感觉就是这样,所以cheong00兄如果不用转换的话,会把三个数字连起来。

接下来说说个人观点:(就当我今天半夜没事做,一个人自言自语好了orz)
其实我是写C/C++出身的,当然对C/C++以及后来接触的内嵌ASM,还有风格与C/C++相同的C#特别热爱
不单单是因为他们是强类型语言,还有就是对底层有着非常好的控制能力

目前因为做的项目范围比较广,什么语言都有所接触
首先说说VB吧...做过一个项目VB6.0 VB.NET ASP混合的系统...系统逻辑不难,难得就是各种语言之间的接口调用
VB是一种比较简单的语言,主要编写界面,事件驱动,只要写程序片断而不用考虑各种事件之间的影响。
对于新手容易入门,但VB写的时候最好还是把强制类型声明选项打开,有时候编译器帮你掩盖错误不是一件好事情。
相反,根据编译器的提示,自己修改的错误或问题点越多,你能学到的也就也多
VB.NET是微软基于.NET体系,发展出来的一种符合VB语法的语言。其实应该说它和.NET程序的写法类似,
和VB类似仅仅是因为它继承了VB的各种旧的特性,不过在实际运用中,除非是移植的代码,否则不应该用这些旧特性,
因为微软为了在新的.NET体系上实现这些旧的功能,导致内部的代码的效率有所降低。(最明显的就是On Error GoTo 这个语法)

对于VB而言,个人不是很喜欢,毕竟写起来和C/C++完全不一样,没手感了orz
不过VB有一个优点就是COM的调用是非常便利的。


这半年又做了Java的项目...Struts框架=v=
怎么说呢,对于Java这语言来说,确实和C/C++非常像,但还是有几个弱点:
个人认为的第一个弱点本来应该是属于Java的优点——没指针
可能因为我对细节控制特别在意吧,没指针让我在许多处理上都要花费更大的代价去完成一项很简单的工作
这里引出来的问题就是类型转换,Java是没有无符号数的,曾经碰到一个要测试字符编码的问题,
非得把文字的符号数转成非符号数才能进行判断。(如果在C/C++中只要一个类型转换就行了,其实实际代码什么事情都没有做,
因为指针还是一个,只是编译器换了一种类型去解释它)
另一个还是老问题...速度太慢...昨天开了两个Eclipse同时跑高负荷的程序的时候,想停下来怎么也停不下来,死在那里最后竟然自动重启了orz

对于Java,Eclipse提供的IDE环境还是非常不错的,即时的编译错误提示,编译错误仍能调试,CheckStyle和FindBugs的语法和格式的检查
不过对于Java的速度来说,实在有点不爽orz


个人最喜欢的还是C/C++和Win32 API的组合,挖掘操作系统的秘密还是作为一个热爱写程序的程序员的终极目标啊~~~~(远目
cheong00 - 2007/9/26 14:21:00
嗯, 有寫C++/C#的話應該知道當 a + b而a和b是不同型別的數字的話, 結果的型別會是a和b之間最大容量的型別. 這也叫implicit casting.

不過呢, 我還是比較習慣寫成 (typemax)a + (typemax)b, 把需要的轉換explicit地寫出來. 這樣在找bug的時候會快/容易一些找到型別轉換時的錯誤.

目前的目標是養成/改進寫程式碼的習慣, 以減少不小心而型成的bug和加快除錯速度為優先. 包括固定的block indention習慣, 寫比較式c==(a+b)寫成(a+b)==c, 還有即使編譯器會按operator priority計算但寫的時候決不省略括號等...

原帖由 王二 于 2007-9-26 2:45:00 发表
个人最喜欢的还是C/C++和Win32 API的组合,挖掘操作系统的秘密还是作为一个热爱写程序的程序员的终极目标啊~~~~(远目

這我很贊同. 我也是對這方面比較有興趣的. :D
飘 - 2007/9/27 1:48:00
原帖由 cheong00 于 2007-9-26 14:21:00 发表
嗯, 有寫C++/C#的話應該知道當 a + b而a和b是不同型別的數字的話, 結果的型別會是a和b之間最大容量的型別. 這也叫implicit casting.

不過呢, 我還是比較習慣寫成 (typemax)a + (typemax)b, 把需要的轉換explicit地......


个人觉得这样显式转换画蛇添足,
double dSum = (double)nNum1 + dNum2 显然没有必要且看起来怪异……

OS么……
目前期待C++0x boost TR1中
LOVEHINA-AVC - 2007/10/5 12:14:00

个人最喜欢的还是C/C++和Win32 API的组合,挖掘操作系统的秘密还是作为一个热爱写程序的程序员的终极目标啊~~~~(远目


先把WRK(Windows Research Kernel)看一遍再来说这个吧…………
粘土火星 - 2007/10/5 14:15:00
居然连回了2个………………orz。。。。
粘土火星 - 2007/10/5 14:15:00
The Windows Research Kernel (WRK) packages core Microsoft Windows XP x64/Server 2003 SP1 kernel source code with an environment for building and testing experimental versions of the Windows kernel for use in teaching and research. The WRK includes source for processes, threads, LPC, virtual memory, scheduler, object manager, I/O manager, synchronization, worker threads, kernel heap manager, and other core NTOS functionality.

The WRK is useful in design projects that allow your students to explore operating system (OS) principles using the Windows kernel sources. It enables advanced teaching and research by facilitating building experiments and projects based on modifying the Windows kernel, as well as by promoting better understanding of the Windows architecture and implementation.
1
查看完整版本: 请问一道简单的VB题……