我会定期把我的测试心得和体会发表在这里,希望来阅览的每位朋友都有所获。即使没有,有一点启发,我也心满意足。我也欢迎您的留言,哪怕是对我的批评,或者是指出我的错误。

编程练习题

上一篇 / 下一篇  2009-08-18 23:00:21

查看( 666 ) / 评论( 42 )
在论坛上时常看到有人问某段代码怎么写或怎么实现,这说明还是编程能力欠缺。这也是为什么某些(甚至是许多)开发人员看不起测试人员的一个主要原因。在写脚本的过程中,我积累了不少极佳的编程练习题,共享出来,有兴趣或想试验一下或欲提高自己的编程能力的朋友可以试试你完成下面几个问题的时间、完成的代码的质量和效率如何。

[本帖最后由 walker1020 于 2009-8-18 22:57 编辑]

TAG:

walker1020的个人空间 walker1020 发布于2009-08-18 21:59:24
1,题目:如何把含有特殊字符的属性值(字符串)转换为可以被QTP识别出此对象的字符串?

背景说明:在使用描述性编程去识别一个对象的时候,需要对函数特殊字符的属性值进行转义,就是在特殊字符的前面加一个反斜杠 \, 这样QTP就把反斜杠后面的字符识别为一个文本字符,不再认为它是正则表达式里的特殊字符。例如,对于一个innertext 是 MIDA$的WebElement,我必须要写  WebElement("innertext:=MIDA\$"),QTP才能识别出此对象。

问题说明:如何在字符串中找出所有的正则表达式里使用的特殊字符,然后在其前面增加一个反斜杠\

特别说明:如果正确解决了此问题,那么你就可以轻松地使用描述性编程,让QTP 乖乖地识别出其属性值含有特殊字符的对象了。

要求:
1, 必须找到所有的正则表达式里使用的特殊字符特殊字符
2,为了实现代码的重用,请写成函数 (Function)的形式;
3,不得改变函数(Function)内任何一个参数的值
4,要有对函数(Function)的参数、返回值和代码的必要解释或说明。

[ 本帖最后由 walker1020 于 2009-8-18 23:36 编辑 ]
walker1020的个人空间 walker1020 发布于2009-08-18 22:45:58
2,题目:数据转换

背景说明:根据应用程序的逻辑,应用程序会对输入的数据进行处理,其处理的逻辑是以小数点为分界点,分别对整数部分和小数部分进行处理,具体如下:
1,对于整数部分,从最后一位开始,每隔3位,增加一个分隔符 ,
注意:它是英文状态下的逗号。如果整数部分小于或等于3位,则整数部分不需要添加此分隔符。
2, 对于小数部分,如果小数位数小于2,则自动添加0, 直到凑够两位小数。如果小数位数大于2,则只保留最前面两位小数(其余的会被舍去)
3,如果输入的字符串没有小数点,那么最多可以输入12位;如果输入的位数大于9位,应用程序只会把最前面的10 位作为整数部分,其余的自动认为是小数部分(并在相应的位置自动增加小数点)。
4,如果输入的字符串里面有小数点,那么输入的字符串里面的整数部分最多是9位。
5,应用程序自动在处理后的数据前面增加一个$ ,但输入的数据不能包含此字符。
例如:输入的是 12345, 其输出是$12, 345.00; 输入的是123,输出是$123.00; 输入的是123456789012,输出是$1,234,567,890.12; 输入的是12345678901,输出是$1,234,567,890.10;输入的是1234.5,输出是$1,234.50;输入的是12.34567,输出是$12.34

特别说明: 有具体项目测试经验的朋友能看出,这是某个项目的业务处理逻辑。不同的是,我把具体的业务逻辑过滤掉了,只留下数据处理部分。因此此题有具体的现实背景和应用意义。

问题: 如何快速准确地对输入的数据进行转换?

要求:
1,要有对数据的检验过程。如果字符串含有非数字的字符,那么出现提示错误信息:“此字符串含有非数字的字符,请重新输入”;如果整数部分多于9位(字符串里面有小数点),那么出现错误提示:“整数部分不能多于9位,请重新输入”;如果输入的数据多于12位(字符串里面没有小数点),那么出现错误提示:“输入的数据不能多于12位,请重新输入” 。
2、 3、4 的要求同第一题的 2、3、4

[ 本帖最后由 walker1020 于 2009-8-18 23:38 编辑 ]
walker1020的个人空间 walker1020 发布于2009-08-18 22:54:14
3,题目:无位数限制的数据转换

问题说明: 如果没有对输入的数据的位数限制,也就是整数部分和小数部分的位数没有限制,那么还是以小数点为分界点,对小数点左边的整数部分,从最后一位是每隔3位增加一个分隔符 ,   ;对小数点右边的小数部分,从小数点后第一位开始每隔3位增加一个分隔符 ,  
如果小数位数小于2,则自动添加0, 直到凑够两位小数。 此问题又该如何解决?
如:输入的数据是 1234567890123456789,输出的是 1,234,567,890,123,456,789.00;输入的数据是 1234567890.123456789,输出的是 1,234,567,890.123,456,789

特别说明:此题目纯粹是为了考验你的编程能力。

要求:
1,要有对数据的检验过程。如果字符串含有非数字的字符,那么出现提示错误信息:“此字符串含有非数字的字符,请重新输入”
2,同上一题的2、3、4 点

[ 本帖最后由 walker1020 于 2009-8-18 23:39 编辑 ]
walker1020的个人空间 walker1020 发布于2009-08-18 23:00:15
最后一点说明:如果对题目有异议,可以发短信给我,也可以直接在后面回复。希望看到高质量、高水平的代码出现。灌水的回复就先免了吧。  谢谢配合!
walker1020的个人空间 walker1020 发布于2009-08-18 23:26:15
我会选择合适的时机,择优公布高质量、高水平的代码,同时对其作者进行某种形式的奖励。
walker1020的个人空间 walker1020 发布于2009-08-19 10:10:41
It is recommended to resolve the above questions with VBScript. However, you have the choice to select another Script or programming language to resolve them.
chenchengo2008发布于2009-08-19 10:35:41
'==========================================================================
'
' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.0
'
' NAME: 题目2(数据转化)
'
' AUTHOR: chenc
' DATE  : 2009-8-19
'
' COMMENT: 请大家多多指教
'
'==========================================================================
'
Function datachange(num)
If  IsValidChar(num)=False Then
  datachange="此字符串含有非数字的字符,请重新输入"
  Elseif len(CStr(int(num)))>9 Then
   datachange="整数部分不能多于9位,请重新输入"
  Elseif Len(Cstr(num))>13 Then
   datachange="输入的数据不能多于12位,请重新输入"

  Else datachange= FormatCurrency(num,2,-1)
End If
End Function
Public Function IsValidChar(str)'非法字符的判断
   IsValidChar = False
   On Error Resume Next
  
   If IsNull(str) Then Exit Function
   If Trim(str) = Empty Then Exit Function
   Dim ValidStr
   Dim i, l, s, c
  
   ValidStr = ".0123456789"
   l = Len(str)
   s = UCase(str)
   For i = 1 To l
    c = Mid(s, i, 1)
    If InStr(ValidStr, c) = 0 Then
     IsValidChar = False
     Exit Function
    End If
   Next
   IsValidChar = True
End Function
num=InputBox("请输入数字")
MsgBox datachange(num)

初学,请版主和其他朋友多多指教

[ 本帖最后由 chenchengo2008 于 2009-8-19 10:36 编辑 ]
Kevin藏宝库 hsjzfling 发布于2009-08-19 10:40:15
借walker1020的地盘给大家推荐下练习编程的宝地
http://projecteuler.net/index.php?section=problems

前10多题基本都是给大家找自信的,20多题以后就开始逐渐有难度了。
算法在心中,设计脚本逻辑就比较得心应手了
Kevin藏宝库 hsjzfling 发布于2009-08-19 15:44:40
这么久也没人再回帖了,那我来献丑吧~

CODE:

'==========================================================================
' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.1
'
' NAME  : 题目3:无位数限制的数据转换
'
' AUTHOR: hsjzfling
' DATE  : 2009-8-19
'
'==========================================================================

Function MyFormatCurrency(dblNumber)
        If (Not IsNumeric(dblNumber)) Or InStr(CStr(dblNumber),",") Then
                MsgBox "Wrong number format,please check!"
                Exit Function
        End If
        arrNumber = Split(CStr(dblNumber),".")
        If UBound(arrNumber) = 0 Then
                MyFormatCurrency = AddCommerForIntegerPart(arrNumber(0))&".00"
        Else
                MyFormatCurrency = AddCommerForIntegerPart(arrNumber(0)) & "." & AddCommerForFractionPart(arrNumber(1))
        End If
End Function

Function AddCommerForIntegerPart(ByVal strNumber)
        Dim strIntCurrency:strIntCurrency = ""
        While Len(strNumber)>3
                strIntCurrency = "," & Right(strNumber,3) & strIntCurrency
                strNumber = Left(strNumber,Len(strNumber) - 3)
        Wend
        strIntCurrency = strNumber & strIntCurrency
        AddCommerForIntegerPart = strIntCurrency
End Function

Function AddCommerForFractionPart(ByVal strNumber)
        Dim strFraCurrency:strFraCurrency = ""
        If Len(strNumber) = 0 Then
                AddCommerForFractionPart = "00"
        ElseIf Len(strNumber) = 1 Then
                AddCommerForFractionPart = strNumber&"0"
        Else
                While Len(strNumber)>3
                        strFraCurrency = strFraCurrency & Left(strNumber,3) & ","  
                        strNumber = Right(strNumber,Len(strNumber) - 3)
                Wend
                strFraCurrency = strFraCurrency & strNumber
                AddCommerForFractionPart = strFraCurrency
        End If
End Function
Msgbox MyFormatCurrency("1234567890123456789.1234567890123456789")
walker1020的个人空间 walker1020 发布于2009-08-19 15:46:30
回复8#
首先感谢你的快速回复。个人对你写的代码点评如下:
优点:使用了VBScript 自带的 FormatCurrency 函数,不需要为了增加分隔符而额外写代码,非常巧妙!

缺点:
1,如果num = 123456789012,根据你写的代码,会出现错误提示“整数部分不能多于9位,请重新输入”;而根据应用程序的逻辑,应该输出 $1,234,567,890.12
2,缺少对函数的说明和变量的定义说明

[ 本帖最后由 walker1020 于 2009-8-19 15:48 编辑 ]
Kevin藏宝库 hsjzfling 发布于2009-08-19 15:51:19
注释一下,MyFormatCurrency函数的输入参数应该是字符串型,直接输入一个较大的数字可能会因为自动转换为科学计数法而转换出错。

输入的数据LZ没有指出".0123"之类的是否也是合法的输入数据哦,程序中就没额外加入判断了,默认为合法输入。
walker1020的个人空间 walker1020 发布于2009-08-19 15:59:24
To hsjzfling
你的代码简洁、漂亮,并且使用了 ByVal, 很有借鉴意义。
Kevin藏宝库 hsjzfling 发布于2009-08-19 16:01:24
回复 8# 的帖子
输入数据为"."或者"1.1.1"可是会报错哦~
另外如果测试机器的默认Currency格式不是$123,45,输出的结果可能会大不相同哦~
walker1020的个人空间 walker1020 发布于2009-08-19 16:13:02

QUOTE:

原帖由 hsjzfling 于 2009-8-19 16:01 发表
输入数据为"."或者"1.1.1"可是会报错哦~
另外如果测试机器的默认Currency格式不是$123,45,输出的结果可能会大不相同哦~
这倒是些问题。我怎么没有想到呢?
testlab的个人空间 testlab 发布于2009-08-19 17:13:32
写的不怎么样,请大家指点
'============================================
'题目3
'AUTHOR: testlab
'DATE  : 2009-8-19


'============================================

GetStr()


Public Function GetStr()                        '输入与输出
        str = InputBox("请输入数字")
        If (Not IsNumeric(str)) Or InStr(CStr(str),",") Then
            MsgBox "此字符串含有非数字的字符,请重新输入"
            GetStr()
    End If
    If str = "" Then
            MsgBox ("无输入")
            Exit Function
    End If
    GetStr = dealdata(str)
    MsgBox GetStr
End function


Public Function DealData(str)        '对数字的处理
        If InStr(str,".") = 0 Then
                rightdata = ".00"
                leftdata = str
        Else
                num = Split(str,".")
                intg = num(0)
                decimal = num(1)
        End If
        If intg <> "" Then
                length = Len(intg)
                If length > 3 Then
                        a = length Mod 3
                        If a <> 0 Then
                                leftdata = Mid(intg,1,a)&","
                        End If
                        i = 1 + b
                        While i < length - 3
                                leftdata = leftdata & Mid(intg,i,3) & ","
                                i = i + 3
                        Wend
                        leftdata = leftdata & Mid(intg,length-2,3)
                Else
                        leftdata = intg
                End If
        Else
                leftdata = intg
        End If
       
        length = Len(decimal)
        If length = 1 Then
                rightdata = decimal & "0"
        Else
                i = 1
                While i <= length - 3
                        rightdata = rightdata & Mid(decimal,i,3) & ","
                        i = i + 3
                Wend
                rightdata = rightdata & Mid(decimal,i,3)
        End If
        DealData = leftdata & "." & rightdata
End Function
Kevin藏宝库 hsjzfling 发布于2009-08-19 17:23:44
回复 16# 的帖子
输入值没有小数部分的时候程序输出就不对咯~~
比如输入 "1" ~~
testlab的个人空间 testlab 发布于2009-08-19 17:29:53
变量写错了,改了
'============================================
'题目3
'AUTHOR: testlab
'DATE  : 2009-8-19


'============================================

GetStr()


Public Function GetStr()                        '输入与输出
        str = InputBox("请输入数字")
        If (Not IsNumeric(str)) Or InStr(CStr(str),",") Then
            MsgBox "此字符串含有非数字的字符,请重新输入"
            GetStr()
    End If
    If str = "" Then
            MsgBox ("无输入")
            Exit Function
    End If
    GetStr = dealdata(str)
    MsgBox GetStr
End function


Public Function DealData(str)        '对数字的处理
        If InStr(str,".") = 0 Then
                rightdata = "00"
                intg = str
        Else
                num = Split(str,".")
                intg = num(0)
                decimal = num(1)
        End If
        If intg <> "" Then
                length = Len(intg)
                If length > 3 Then
                        a = length Mod 3
                        If a <> 0 Then
                                leftdata = Mid(intg,1,a)&","
                        End If
                        i = 1 + b
                        While i < length - 3
                                leftdata = leftdata & Mid(intg,i,3) & ","
                                i = i + 3
                        Wend
                        leftdata = leftdata & Mid(intg,length-2,3)
                Else
                        leftdata = intg
                End If
        Else
                leftdata = intg
        End If
       
        length = Len(decimal)
        If length = 1 Then
                rightdata = decimal & "0"
        Else
                i = 1
                While i <= length - 3
                        rightdata = rightdata & Mid(decimal,i,3) & ","
                        i = i + 3
                Wend
                rightdata = rightdata & Mid(decimal,i,3)
        End If
        DealData = leftdata & "." & rightdata
End Function
Kevin藏宝库 hsjzfling 发布于2009-08-19 17:41:33
回复 18# 的帖子
输入合法数据"1.",输出结果还是不符合需求~~
LS可以参考下我的代码,我的代码中每一个判断都是有意义的,省掉了肯定就有缺陷了~~

[ 本帖最后由 hsjzfling 于 2009-8-19 17:44 编辑 ]
testlab的个人空间 testlab 发布于2009-08-19 17:50:36
少了一个length = 0的判断
walker1020的个人空间 walker1020 发布于2009-08-19 18:10:52
敢于亮出自己的代码也是一种智慧。只要能力有提高,总有一天你会让程序员对你是刮目相看。
我来说两句

(可选)

Open Toolbar