Python实验报告 实验15 - 体育竞技分析

一、实验目的

(1)掌握结构化程序设计方法
(2)掌握Python的模块组织方法


二、实验环境

Windows 7以上版本的操作系统,Python 3.5以上编程环境。


三、实验内容和步骤


1.阅读下列代码,运行竞技比赛模拟程序,查看执行结果。


#MatchAnalysis.py
from random import random
def printIntro():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手B的能力值(0-1): "))
    n = eval(input("模拟比赛的场次: "))
    return a, b, n
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB
def gameOver(a,b):
    return a==15 or b==15
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB
def printSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
def main():
    printIntro()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)
main()


2.阅读官方文档关于package的描述:

https://docs.python.org/zh-cn/3/tutorial/modules.html#packages
module和package特性是Python开发大型项目的基石,请仔细阅读上述官方文档。回答:init.py文件的作用是什么?


3.罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

字符数值
I1
V5
X10
L50
C100
D500
M100

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

编写Python程序:给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

样例输入样例输出
3III
4IV
9IX
58LVIII
(解释: L = 50, V = 5, III = 3)
1994MCMXCIV
(解释: M = 1000, CM = 900, XC = 90, IV = 4)

四、实验结果


1. 运行截图

第一题运行截图


2. 回答

由于Python只把含 init.py 文件的目录当成包。因此__init__.py文件可以使Python能够将__init__.py所在的目录识别为一个包,除此之外,init.py还可以用来执行包的初始化代码,或设置__all__变量。


3.1 程序代码


thousands = ["", "M", "MM", "MMM"]
hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]
tens = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]
singles = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"]
def getRomenNum(num, digit):
    if digit == 4:
        return thousands[num]
    elif digit == 3:
        return hundreds[num]
    elif digit == 2:
        return tens[num]
    elif digit == 1:
        return singles[num]
def main():
    num = eval(input("请输入一个数字: "))
    thousand = getRomenNum(num//1000, 4)
    hundred = getRomenNum((num%1000)//100, 3)
    ten = getRomenNum(((num%1000)%100)//10, 2)
    single = getRomenNum(((num%1000)%100)%10, 1)
    print(thousand + hundred + ten + single)
main()


3.2 运行截图

第三题运行截图


版权声明:本文为qq_43640281原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。