51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 11264|回复: 42
打印 上一主题 下一主题

[原创] 编程练习题

[复制链接]
  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2009-8-18 21:53:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在论坛上时常看到有人问某段代码怎么写或怎么实现,这说明还是编程能力欠缺。这也是为什么某些(甚至是许多)开发人员看不起测试人员的一个主要原因。在写脚本的过程中,我积累了不少极佳的编程练习题,共享出来,有兴趣或想试验一下或欲提高自己的编程能力的朋友可以试试你完成下面几个问题的时间、完成的代码的质量和效率如何。
    我也希望论坛上的朋友以此为“磨刀石”,不断提高我们的编程能力,让对我们不服气的开发人员刮目相看。

    [ 本帖最后由 walker1020 于 2009-8-18 23:11 编辑 ]
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
     楼主| 发表于 2009-8-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 编辑 ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
     楼主| 发表于 2009-8-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 编辑 ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    4#
     楼主| 发表于 2009-8-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 编辑 ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    5#
     楼主| 发表于 2009-8-18 23:00:15 | 只看该作者
    最后一点说明:如果对题目有异议,可以发短信给我,也可以直接在后面回复。希望看到高质量、高水平的代码出现。灌水的回复就先免了吧。  谢谢配合!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    6#
     楼主| 发表于 2009-8-18 23:26:15 | 只看该作者
    我会选择合适的时机,择优公布高质量、高水平的代码,同时对其作者进行某种形式的奖励。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    7#
     楼主| 发表于 2009-8-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.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2009-8-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 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2009-8-19 10:40:15 | 只看该作者
    借walker1020的地盘给大家推荐下练习编程的宝地
    http://projecteuler.net/index.php?section=problems

    前10多题基本都是给大家找自信的,20多题以后就开始逐渐有难度了。
    算法在心中,设计脚本逻辑就比较得心应手了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2009-8-19 15:44:40 | 只看该作者
    这么久也没人再回帖了,那我来献丑吧~
    1. '==========================================================================
    2. ' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.1
    3. '
    4. ' NAME  : 题目3:无位数限制的数据转换
    5. '
    6. ' AUTHOR: hsjzfling
    7. ' DATE  : 2009-8-19
    8. '
    9. '==========================================================================

    10. Function MyFormatCurrency(dblNumber)
    11.         If (Not IsNumeric(dblNumber)) Or InStr(CStr(dblNumber),",") Then
    12.                 MsgBox "Wrong number format,please check!"
    13.                 Exit Function
    14.         End If
    15.         arrNumber = Split(CStr(dblNumber),".")
    16.         If UBound(arrNumber) = 0 Then
    17.                 MyFormatCurrency = AddCommerForIntegerPart(arrNumber(0))&".00"
    18.         Else
    19.                 MyFormatCurrency = AddCommerForIntegerPart(arrNumber(0)) & "." & AddCommerForFractionPart(arrNumber(1))
    20.         End If
    21. End Function

    22. Function AddCommerForIntegerPart(ByVal strNumber)
    23.         Dim strIntCurrency:strIntCurrency = ""
    24.         While Len(strNumber)>3
    25.                 strIntCurrency = "," & Right(strNumber,3) & strIntCurrency
    26.                 strNumber = Left(strNumber,Len(strNumber) - 3)
    27.         Wend
    28.         strIntCurrency = strNumber & strIntCurrency
    29.         AddCommerForIntegerPart = strIntCurrency
    30. End Function

    31. Function AddCommerForFractionPart(ByVal strNumber)
    32.         Dim strFraCurrency:strFraCurrency = ""
    33.         If Len(strNumber) = 0 Then
    34.                 AddCommerForFractionPart = "00"
    35.         ElseIf Len(strNumber) = 1 Then
    36.                 AddCommerForFractionPart = strNumber&"0"
    37.         Else
    38.                 While Len(strNumber)>3
    39.                         strFraCurrency = strFraCurrency & Left(strNumber,3) & ","  
    40.                         strNumber = Right(strNumber,Len(strNumber) - 3)
    41.                 Wend
    42.                 strFraCurrency = strFraCurrency & strNumber
    43.                 AddCommerForFractionPart = strFraCurrency
    44.         End If
    45. End Function
    复制代码
    Msgbox MyFormatCurrency("1234567890123456789.1234567890123456789")
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    11#
     楼主| 发表于 2009-8-19 15:46:30 | 只看该作者

    回复8#

    首先感谢你的快速回复。个人对你写的代码点评如下:
    优点:使用了VBScript 自带的 FormatCurrency 函数,不需要为了增加分隔符而额外写代码,非常巧妙!

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

    [ 本帖最后由 walker1020 于 2009-8-19 15:48 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 2009-8-19 15:51:19 | 只看该作者
    注释一下,MyFormatCurrency函数的输入参数应该是字符串型,直接输入一个较大的数字可能会因为自动转换为科学计数法而转换出错。

    输入的数据LZ没有指出".0123"之类的是否也是合法的输入数据哦,程序中就没额外加入判断了,默认为合法输入。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    13#
     楼主| 发表于 2009-8-19 15:59:24 | 只看该作者

    To hsjzfling

    你的代码简洁、漂亮,并且使用了 ByVal, 很有借鉴意义。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2009-8-19 16:01:24 | 只看该作者

    回复 8# 的帖子

    输入数据为"."或者"1.1.1"可是会报错哦~
    另外如果测试机器的默认Currency格式不是$123,45,输出的结果可能会大不相同哦~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    15#
     楼主| 发表于 2009-8-19 16:13:02 | 只看该作者
    原帖由 hsjzfling 于 2009-8-19 16:01 发表
    输入数据为"."或者"1.1.1"可是会报错哦~
    另外如果测试机器的默认Currency格式不是$123,45,输出的结果可能会大不相同哦~


    这倒是些问题。我怎么没有想到呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2009-8-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
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
    发表于 2009-8-19 17:23:44 | 只看该作者

    回复 16# 的帖子

    输入值没有小数部分的时候程序输出就不对咯~~
    比如输入 "1" ~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
    发表于 2009-8-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
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2009-8-19 17:41:33 | 只看该作者

    回复 18# 的帖子

    输入合法数据"1.",输出结果还是不符合需求~~
    LS可以参考下我的代码,我的代码中每一个判断都是有意义的,省掉了肯定就有缺陷了~~

    [ 本帖最后由 hsjzfling 于 2009-8-19 17:44 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2009-8-19 17:50:36 | 只看该作者
    少了一个length = 0的判断
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-19 13:41 , Processed in 0.078812 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表