appium如何连接多台设备

我们在做app自动化的时候,若要考虑兼容性问题,需要跑几台设备,要是一台一台的跑比较耗

时,因此需要考虑使用多线程来同时操作多台设备。

1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况,获取到设备名称。

 2.获取需要操作app的包名和页面名称(前提该设备已经打开了app)

 3.设置初始配置信息

from appium import webdriver
import threading


# 设备一
def run_01():
    desired = {
        "platformName": "Android",  # 手机系统
        "platformVersion": "7.1.2",  # 手机系统版本
        "deviceName": '127.0.0.1:62001',  # 连接的设备(adb devices)
        "automationName": "UiAutomator2",
        "appPackage": "",  # app包名
        "appActivity": "",  # app的启动页面
        "autoGrantPermissions": "true",  # 默认允许app获取相关权限
        "noReset": True  # 保留登录模式
    }
    driver_01 = webdriver.Remote(command_executor="http://127.0.0.1:4723/wd/hub", desired_capabilities=desired)
    # driver(driver_01)


# 设备二
def run_02():
    desired = {
        "platformName": "Android",  # 手机系统
        "platformVersion": "11",  # 手机系统版本
        "deviceName": '90bf8faf',  # 连接的设备(adb devices)
        "automationName": "UiAutomator2",  # 自动化测试框架 (1.4以上的appium不用写)
        "appPackage": "",  # app包名
        "appActivity": "",  # app的启动页面
        "autoGrantPermissions": "true",  # 默认允许app获取相关权限
        "noReset": True  # 保留登录模式
    }
    driver_02 = webdriver.Remote(command_executor="http://127.0.0.1:4720/wd/hub", desired_capabilities=desired)
    # driver(driver_02)

不同的设备启动配置端口号是不一样的,我这里一个是4723,一个是4720.

4.打开页面后操作元素,这里只简单的关闭页面(具体方法可参考:http://www.cnblogs.com/lihongtaoya/p/16988855.html)

def driver(drivers):  # 元素操作方法
    time.sleep(5)
    drivers.quit()

5.使用多线程运行多台设备

if __name__ == '__main__':
    threading.Thread(target=run_01).start()
    threading.Thread(target=run_02).start()

6.启动appium服务

启动指令:appium --allow-cors -p 端口号 -U 设备名称

 我这边是两台设备,因此需要启动两个服务,启动完之后就可以运行main函数了。

7.以上实例是将配置信息写在了代码中,若是有十几二十几台设备的话,这种写法有点麻烦,我们可以

   将配置信息的产生封装在json文件中使用时用load()方法去取参数即可。

1)创建一个json文件存放配置信息

[{
        "url": "http://127.0.0.1:4723/wd/hub",
        "desired": {
                "platformName": "Android",
                "platformVersion": "7.1.2",
                "deviceName": "127.0.0.1:62001",
                "automationName": "UiAutomator2",
                "appPackage": "",
                "appActivity": "",
                "autoGrantPermissions": "true",
                "noReset": true}

    }, {
        "url": "http://127.0.0.1:4720/wd/hub",
        "desired":{
                "platformName": "Android",
                "platformVersion": "11",
                "deviceName": "90bf8faf",
                "automationName": "UiAutomator2",
                "appPackage": "",
                "appActivity": "",
                "autoGrantPermissions": "true",
                "noReset": true}

    }]

2)读取配置信息,这里直接贴完整代码了。

def test_run(url, desired):
    driver_02 = webdriver.Remote(command_executor=url, desired_capabilities=desired)
    driver(driver_02)


def driver(drivers):  # 元素操作方法
    time.sleep(5)
    drivers.quit()


if __name__ == '__main__':
    with open("./appium.json", mode="r", encoding="utf-8") as f:
        data = list(json.load(f))
    for i in range(0, len(data)):
        a = threading.Thread(target=test_run, args=(data[i]["url"], data[i]["desired"]))
        a.start()

 

 

 

 

 

 

 

 

 

文章来源:http://www.cnblogs.com/lihongtaoya/ ,请勿转载
本文转载于网络 如有侵权请联系删除

相关文章

  • 织梦DedeCMS文章标题自动增加长尾关键词的方法

    本文实例讲述了织梦DedeCMS文章标题自动增加长尾关键词的方法,在织梦DedeCMS后台输入标题发布后生成的网页自动带上长尾标题和长尾词。分享给大家供大家参考。具体实现方法如下:例如:1、后台文章标题“米米素材网”发布后生成的网页标题是米米素材网基诺互联米米素材网基诺seo米米素材网百度等2、后台文章标题“脚本下载”发布后生成的网页标题是脚本下载基诺互联脚本下载基诺seo 脚本下载百度等例1例2主词不一样后面的长尾都一样,就要达到这种功能,本人提供两种解决方案如下:在文章内容模板处以下面的方式调用 复制代码 代码如下:{dede:field.titlefunction="autotitle(@me)"/} {dede:field.titlefunction="wordtitle(@me)"/}然后找到includehelpersextend.helper.php在最后添加以下代码 复制代码 代码如下:if(!function_exists('autotitle')) { functionautotitle($title){

  • 8个基础且实用的C语言经典实例【附源码】

    1、输出9*9口诀。共9行9列,i控制行,j控制列。// //Createdby冲哥on2020/12/29. // #include"stdio.h" intmain(){ inti,j,result; for(i=1;i<10;i++){ for(j=1;j<=i;j++){ result=i*j; printf("%d*%d=%-4d",i,j,result); } printf("\n"); } return0; } 复制2、古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?// //Createdby冲哥on2020/12/29. // #include"stdio.h" intmain(){ longf1,f2; inti; f1=f2=1; for(i=1;i<=20;i++){ printf("%12ld%12ld",f1,f2); if(i%2==0

  • 两个基于spring的单元测试简单样例

    单元测试,从一定程度上可以看出一个同学达到的层次。但又不完全是,有时可能只是一个思考方式的转变。单元测试有非常多的工具供选择,在java中,junit无疑是比较常用的。本文列出,junit在spring中的使用样例,供参考。1:单元测试主要方式这里仅说我们常用的单元测试的场景,或者是我自己常用的场景,主要分为4大类:1.对外提供的接口级别的测试,如rest-api,主要用于保证对外提供的接口符合预期,而非等到别人调用时才发现异常;2.serivce级别的单元测试,主要用于保证service功能正常;3.静态方法的测试,主要用于测试一些工具类符合预期,这类测试一般比较简单;4.mock接口实现测试,这类测试往往最复杂,一般是为测试复杂场景,但又要保证影响因素单一,保证测试的有效性,要求既要mock得少也要求mock得合适,最难;一般还有对环境初始化时的运行,和结束测试时的清理工作,即setup()和teardow().在junit中就体现为两个注解:@Before和@After。实际上,除了最后一种测试是比较体系化和完备的之外,前几种也许都不是那么细致,至少一般测试不到某个很小的点上,或

  • Matt Dowle 演讲节选(一)

    MattDowle与data.table“Matt:“老子在给世界上最大的金融机构打工,你竟然说BUG修复要等6个月?!” S-PLUS客服:“为什么你不试试R呢?” ”说着一口伦敦音的MattDowle个子不高,方方正正的脸,第一眼看上去有点略显紧张的神经质,是那种在英剧中典型的面孔。虽然不像HadleyWickham(请大家猛戳大猫上期的《HadleyWickham采访节选》)那样多产(Hadley目前已经在CRAN上发布了40多个包了),但是Matt凭着自己的data.table包成为了R圈最有影响力的开源包作者之一。(Matt演讲照片,是不是有种英剧里出来的赶脚?)data.table是大猫认为最优秀的数据处理包,不管从语法还是性能上大猫认为都要比dplyr优秀。截至2016年12月30日,data.table是StackOverflow上有关R的第三大tag,下面一共4912个帖子,而dplyr为4063。data.table也是github中第八大受关注的R开源项目。此外,data.table是目前RStudioCRAN镜像中下载最多包。要知道Hadley可是RStudio

  • 移植uc/OS-III最新版到小熊派开发板(STM32L431)

    一、uc/OS全家桶1.MicriumSoftwareMicriumSoftware提供了RTOS解决方案系列,俗称ucos全家桶,其中最为出名的就是ucOS-II和ucOS-III,于2016年成为SiliconLabs的一部分。2.μc/OSRTOS&stacksucos整条产品线非常丰富,常用的组件都有,官方叫做μc/OSRTOS&stacks,民间叫做ucos全家桶。作为一个上过火星的老牌RTOS,找机会体验一下还是很爽的,ucos全家桶中提供了非常丰富的内容。目前ucos全家桶中的产品大多数已经在github开源,遵循Apache-2.0开源许可,开源地址在:“https://github.com/SiliconLabs ”3.ucos内核选择玩全家桶之前,肯定要先把RTOS内核玩起来,关于选择ucos-II还是ucos-III是个老生长谈的问题,上图解决:4.uc/OS-III源码下载uc/OS-III系统分为了三个开源仓库,要分别拉取。①uC-OS3:gitclonehttps://github.com/SiliconLabs/uC-OS3.git 复制②

  • 为什么大家都说“SELECT *”效率低?

    无论在工作还是面试中,关于SQL中不要用“SELECT*”,都是大家听烂了的问题,虽说听烂了,但普遍理解还是在很浅的层面,并没有多少人去追根究底,探究其原理。面试官:“小陈,说一下你常用的SQL优化方式吧。” 陈小哈:“那很多啊,比如不要用SELECT*,查询效率低。巴拉巴拉...”面试官:“为什么不要用SELECT*?它在哪些情况下效率低呢?” 陈小哈:“SELECT*它好像比写指定列名多一次全表查询吧,还多查了一些无用的字段。”面试官:“嗯...” 陈小哈:“emmm~没了”陈小哈:“....??(几个意思)”面试官:“嗯...好,那你还有什么要问我的么?” 陈小哈:“我问你个锤子,把老子简历还我!”废话不多说,本文带你深入了解一下"SELECT*"效率低的原因及场景。效率低的原因先看一下一本Java开发手册中MySQL部分描述:4-1.【强制】在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。说明:增加查询分析器解析成本。增减字段容易与resultMap配置不一致。无用字段增加网络消耗,尤其是text类型的字段。开发手册中比较概括的提到了

  • Linux 命令(81)—— chmod 命令

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/K346K346/article/details/1028272641.命令简介chmod命令用来变更文件或目录的访问权限。仅限文件属主和超级用户root使用。Linux文件与目录的权限有三种范围,属主(u,user)、属组(g,group)与其它(o,other),全部用户使用a(all)表示。每个范围的权限由三个比特位表示,从左至右分别表示r(read,读)、w(write,写)与x(execute,可执行)。权限可以使用字符或八进制数字表示,r对应数字4,w对应数字2,x对应数字1。如果相应的权限位没有权限,使用ls-l命令查看时,显示为横杠-。如下图所示: 注意: (1)当使用chmod改变符号链接的权限时,实际上改变的是目标文件的权限;chmod无法更改其符号链接的权限,这不是一个bug,因为符号链接的权限从未被使用过。 (2)chmod在递归时,遇到符号链接则会忽略之。2.命令格式chmod[OPTION]...MODE[,

  • SSH端口转发

    端口转发ssh会自动加密和解密所有的ssh客户端与服务端之间的网络数据。但是ssh还提供了一个端口转发的功能。转发是一种与其他网络应用程序交互的方式,它能将其他TCP端口的网络数据通过SSH链接来转发,并且自动提供了相应的加密以及解密服务。这一过程有时也被叫做隧道应用场景A:本地服务器(IP:10.0.0.1)B:中间服务器(IP:10.10.10.1)C:目标服务器(C可以看到都是中间服务器B在访问自己)本地转发第一种场景A:10.0.0.1B:10.0.0.2(安装Mysqlservice,监听端口3306)B上数据库限制了只有本机上的应用才可以直接连接Mysql服务,如果我们由于调试需要用A上直接连接这个LDAP服务器,就需要使用本地转发实现ssh-L<本地端口>:<远程主机>:<远程端口><sshhostaname>复制本例中应该如下:ssh-L30000:10.0.0.2:80root@10.0.0.2复制*-L表示使用本地转发建立ssh隧道*选用-f后台建立隧道*-N建议隧道后不执行命令*-fNR*本地转发:本地转发是表示本地

  • 平台设计中的脚本管理

    前期揉入了一些功能,因为主要是面向基础功能,所以进度略慢,如果要想一下子有种井喷的效果,那就是脚本化和流程化大显身手的时候了。如果尽可能减少开发和业务同学之间的技术代沟,使用脚本化和流程化我认为就是一个纽带。这里所说的脚本化,其实严格来说是校本化,工具化的延伸。是相比于基础功能命令,SQL,接口的进一步抽象。我来分别对脚本管理,流程管理做一个基本的解释,欢迎各位拍砖,拍得越狠越好,因为我希望听到有价值的建议。脚本管理是在元数据构建的基础上的,比如对MySQL/RedisDBA来说,操作的基本粒度是数据库实例,那么我们就可以完全按照IP+端口来构建匹配到一个对应的实例,至于硬件,是否虚拟化,配置的明细,这些我们可以通过信息下钻得到更细维度的信息,但是对于我们的操作粒度来说,实例已经足够。所以有了基础的元数据,要细化并且和管理工作结合起来,才有了充分条件。我在构建基础平台的时候,随着基础功能的增加,越来约感觉到了复杂度和维度需要简化,细化。元数据的信息可以分为多个菜单,不同的功能之间有关联关系来指定,所以在MTV的Django框架中,我配置了不少的url来支持前期的工作,但是如果是MySQ

  • 个性化推荐沙龙 | 推荐系统中基于深度学习的混合协同过滤模型

    董鑫,携程基础业务部BI团队高级算法工程师,博士毕业于上海交通大学计算机科学与技术系。近些年,深度学习在语音识别、图像处理、自然语言处理等领域都取得了很大的突破与成就。相对来说,深度学习在推荐系统领域的研究与应用还处于早期阶段。 携程在深度学习与推荐系统结合的领域也进行了相关的研究与应用,并在国际人工智能顶级会议AAAI2017上发表了相应的研究成果《AHybridCollaborativeFilteringModelwithDeepStructureforRecommenderSystems》,本文将分享深度学习在推荐系统上的应用,同时介绍携程基础BI团队在这一领域上的实践。一、推荐系统介绍推荐系统的功能是帮助用户主动找到满足其偏好的个性化物品并推荐给用户。推荐系统的输入数据可以多种多样,归纳起来分为用户(User)、物品(Item)和评分(Ratings)三个层面,它们分别对应于一个矩阵中的行、列、值。对于一个特定用户,推荐系统的输出为一个推荐列表,该列表按照偏好得分顺序给出了该用户可能感兴趣的物品。 图1.推荐系统问题描述如图1右边所示,推荐问题一个典型的形式化描述如下:我们拥有

  • 如何快速提升团队软件开发成熟度,提升研发效能?

    今天一个小伙伴问我,如何「快速提升」一个团队的软件开发成熟度?我犯难了。我个人理解一个团队的软件开发成熟度涉及的东西很多,但最简单最直接的方法就是发钱涨工资,可是估计很多公司不愿意,那就只有扣了。快速提升的目标短期制度解决如果想短期快速提升,那就直接梳理好最关键点,制定规章制度,然后通过奖惩制度让大家遵守。这种做法成本不高,也许还能创收给团建攒点经费。这种做法优点就是见效快、直达痛点,但是副作用也很大,不厚道不人道,无法持久,毕竟工作合同里可没写扣钱的事儿。一天两天一周两周还行,时间一长人都跑了。1-2个月内可以考虑这种做法。举个例子,服务稳定性问题。一段时间公司的某些服务经常出现问题,根因也有很多,比如上错代码、上线后配置没改、容器状态不对,告警误报等等。然后成立了一个服务稳定性小组,对每次事故进行复盘定责。人为原因直接罚钱,轻罚一线重罚领导。某种程度上解决了一些问题。但是时间一长这种方法就不灵光了,因为涉及到个人的收入,所以在最后查原因、影响范围的时候下面有的人就开始糊弄了,把影响功能、时间、人数、对外影响往轻了说。同事之间总不能天天拆台互相揭发吧?那这活还怎么干。尤其是大领导自己

  • 腾讯云私有网络删除本端IP转换ACL策略私有网络API2017

    1.接口描述本接口(DeleteLocalIPTranslationAclRule)用于删除本端IP转换ACL策略。接口请求域名:vpc.api.qcloud.com 2.输入参数以下请求参数列表仅列出了接口请求参数,正式调用时需要加上公共请求参数,详情请参见公共请求参数页面。其中,此接口的Action字段为DeleteLocalIPTranslationAclRule。 参数名称 必选 类型 描述 vpcId 是 String 系统分配的私有网络ID,例如vpc-dfg5445。 directConnectGatewayId 是 String 系统分配的专线网关ID,例如dcg-4d545d。 originalIP 是 String 原始IP。 translationIP 是 String 转换后IP。 aclRules.n 是 Array ACL策略ID数组,例如aclRules.0=25。 3.输出参数 参数名称 类型 描述 code Int 公共错误码。0表示成功,其他值表示失败。详见错误码页面的公共错误码。 message Str

  • 在Ubuntu-14.04.3配置并成功编译Android6_r1源码

    折腾了一周,终于把Android6_r1的源码编译成功。先上图,这是在ubuntu中运行的Android模拟器: 由于我是在win8中安装虚拟机VMware,然后在虚拟机中安装Ubuntu进行编译,所以遇到诸多麻烦。如果直接在linux中编译,可能会更顺利。 -------------------------------------------------------------------------------------------------------------------------- 准备工作: VMware虚拟机,安装请参考:VMware8安装配置Win7、CentOS-7向导 官网下载ubuntu镜像:ubuntu-14.04.3-desktop-amd64.iso 安装ubuntu,一并参考“VMware8安装配置Win7、CentOS-7向导” ----------------------------------------------------------------------------- 建议:ubuntu内存分配4G,预留90G虚拟硬盘(之前选择了

  • emitter-Client

    生成子key:通配符号# 订阅:通配符+ packagemain import( "encoding/json" "fmt" "os" "time" emitter"github.com/emitter-io/go" ) typeMyBodystruct{ Iduint64 Bodystring } varlocalIDuint64 funcmain(){ localID=0 varmykeystring rMsg:=&MyBody{} o:=emitter.NewClientOptions() o.SetOnMessageHandler(func(_emitter.Emitter,msgemitter.Message){ fmt.Printf("Receivedmessage:%s\n",msg.Payload()) err:=json.Unmarshal(msg.Payload(),rMsg) iferr!=nil{ fmt.Println("parsejsondataerr!") } fmt.Printf("Re

  • linux找不到动态链接库.so文件的解决方法

      如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时可能会出现找不到动态链接库的情形。   可以通过ldd命名来查看可执行文件依赖的动态链接库。   解决这个问题:  (1)在系统中查找这个文件(当然要保证系统中已经有这个.so文件,只是查找路径没有设置正确而已):   sudofind/-namelibjson_linux-gcc-4.6_libmt.so   结果:/home/liu/Desktop/jsoncpp-src-0.5.0/libs/linux-gcc-4.6/libjson_linux-gcc-4.6_libmt.so (2)将.so文件路径的目录添加到/etc/ld.so.conf    sudo vim/etc/ld.so.conf   文件末尾新添加一行,/home/liu/Desktop/jsoncpp-src-0.5.0/libs/linux-gcc-4.6 (3)使得修改生效   sudo/sbin/ldconfig   linux下so动态库一些不为人知

  • OAuth 2.0系列(四)--- 受保护资源服务器

    前两篇详细介绍了OAuth2.0中的两个核心服务器,现在只剩下最后一个受保护资源服务器了,它可以说是OAuth2.0的终极目的,前面做了那么多,最终就是为了去受保护资源服务器上获取用户想要的数据,与前两者一样,受保护资源服务器也有它要完成的使命:  如上图所示,它需要完成: 解析令牌 校验令牌 不同场景下提供不同的服务 一句话概括,资源服务器需要做的就是从传入的HTTP请求中解析出OAuth令牌,验证该令牌,并确定它能用于哪些请求! 一、解析令牌 前一篇文章【https://www.cnblogs.com/hellowhy/p/15521724.html】中提到发送令牌参数的方式有三种: 使用HTTP Authorization头部; 使用表单格式的请求体参数 使用URL编码的查询参数 但是一般情况下都是优先选择header方式,为了更好的兼容不同的客户端,资源服务器上最好提供三种不同传递方式的解析 OAuthbearer令牌使用规范规定,在使用HTTPAuthorization头部传送令牌时,HTTP头部的值以关键字Bearer开头,后跟一个空格,再跟

  • php连接mysql数据库的基本操作

    一、在PHP7.0以前链接mysql数据库的方法 //造一个连接,需要@错误控制运算符屏蔽错误,这个连接方式将来会被取消$connect=@mysql_connect("localhost","root","123"); //选择要操作的数据库mysql_select_db("test",$connect);   //或者 mysql_select_db("test");   //写SQL语句$sql="select*fromNation"; //执行SQL语句,返回结果集$result=mysql_query($sql); //从结果集中读取数据while($row=mysql_fetch_assoc($result)){var_dump($row);}   二、在PHP7.0以后,由于废弃了mysql_connetc(),所以使用mysqli的方式进行连接。 $mysql_server_name='localhost';//改成自己的mysql数据库服务器 $mysql_username='root';//改成自己的mysql数据库用户名 $my

  • git操作

    Git是目前世界上最好的分布式版本控制系统,它有两个最主要的功能:版本控制,多人协同。使用Git分为本地和远 程仓库。对于远程仓库,每个人都可以创建一个自己的工作分支,然后将内容clone到本地工作空间。本地又可以分为工 作区和暂存区,工作区工作完了以后,可以将所有的修改add到暂存区,也可以将add到暂存区的修改撤销,通过commit 可以将暂存区的修改提交到本地分支,然后通过push可以将本地分支的修改提交到远程创库的分支上。对于多人协同, 有两种合并方法,merge和rebase,相对来说rebase要优于merge。   gitisadistributeversoncontrolsystem.Andsupportmutil-personcollaboration.Therearetwowaysofit.rebaseandmerge commandsetisasfollows //初始化仓库,会生成一个.git目录(默认隐藏的)  gitinit //将文件添加到仓库       

  • ORACLE 回车换行符

    定义 制表符chr(9) 换行符chr(10) 回车符chr(13)复制 查询 SELECT'AA'||chr(9)||'BB'||chr(10)||'CC'||chr(13)||'DD'asAFROMDUAL;复制 替换 SELECT'AABB CC DD',TRANSLATE('AABB CC DD',CHR(9)||CHR(10)||CHR(13),',-')FROMdual;复制  

  • 中国科学院大学数字集成电路作业开源——组合逻辑章节

    中国科学院大学数字集成电路作业开源——第1-3章 0、说明 开源内容为中国科学院大学《高等数字集成电路分析与设计》课程的个人作业答案,此开源仅供学习交流,禁止未经作者同意的转载或抄袭。此外作业中可能有一些不严谨甚至出错的地方,欢迎各位读者在评论区中指出,一些有疑问的地方也欢迎讨论。 所有代码均已上传gitee https://gitee.com/sasasatori/ucas_digital_intergrated_circuit.git 1、基础概念问题 1.1请简要描述集成电路设计过程中,抽象分层的常规做法?抽象分层对集成电路设计所带来的意义何在? 答:抽象分层的常规做法一般会通过抽象和分层思想,将整个集成电路设计分作系统层级、模块层级、门电路层级、电路层级、器件层级共五个层级。 抽象分层对集成电路设计带来的意义包括: 提高集成电路的设计效率,使得单个设计人员可以更快速的完成更大规模的电路设计,设计者可以更多聚焦到特定边界下的极致任务高效优化 实现了整个产业链从系统到器件的层次化、精细化的任务分工,不同的设计层级有不同的公司钻研,促进了产业的飞速发展 整个产业可以充分借

  • AtCoder Beginners Contest 274 Editoral

    AtCoderBeginnersContest274Editoral 目录AtCoderBeginnersContest274EditoralTaskA-BattingAverageProblemStatementSampleData题面翻译SourceCode解析TaskB-LineSensorProblemStatement题面翻译SourceCode解析TaskC-Ameba(变形虫)ProblemStatement题面翻译SourceCode解析 TaskA-BattingAverage ProblemStatement Thereareintegers\(A\)and\(B\),whichsatisfy\(1≤A≤10\)and\(0≤B≤A\). LetSbethestringobtainedasfollows. Roundoff\(\dfracAB\)tothreedecimaldigits,thenwritetheintegerpart(1digit),.(thedecimalpoint),andthedecimalpart(3digits)inthisorder,wi

相关推荐

推荐阅读