“大数据基础课”作业1

Q1

问题:某种文明使用了五进制来表示数据,所使用的数字符号分别为@、#、¥、%、&,请编写程序实现该文明的加法和除法。要求:对输入的两个数字进行计算,数字的长度可能不等。

思路:首先要构建五进制与十进制之间的对应关系,然后对转化后的十进制进行加法和除法操作,注意,进行除法操作时可能除数为0这个时间要进行异常处理或者直接处理这个异常。最后再将结果转化为五进制输出

def num52num10(str):
	#五进制转化为十进制函数
    num = 0
    for i in range(len(str)):
        num = num*5 + lst.index(str[i])
    return num

def jieguo(num):
    lstadd = []
    while(num):
        lstadd.insert(0,num%5)
        num = int(num / 5)
    print("两个数之和为:",end='')
    for i in range(len(lstadd)):
        print(lst[lstadd[i]],end="")
    print()

lst = list('@#¥%&')
str1 = input("请输入字符串")
str2 = input("请输入字符串")
print(str1,str2,lst)
#实现加法
num1 = num52num10(str1)
num2 = num52num10(str2)
numadd = num1 + num2
jieguo(numadd)

#求两数相除
try:
	#异常处理
    numdiv = int(num1 / num2)
    jieguo(numdiv)
except:
    print("除数不能为0")

运行结果:
#@ @ [’@’, ‘#’, ‘¥’, ‘%’, ‘&’]
两个数之和为:#@
除数不能为0

Q2

问题:为了提高小学生计算能力,现在需要为小学生编制计算题,要求如下:
(1) 计算式中仅含一个计算符号和两个计算数
(2) 计算结果中不能出现负数
(3) 一次需要出10个这样的题目

思路:首先明确要求,一次出十个计算题,每个计算式要包含两个计算数和一个计算符号,且结果不能为负数。我们可以将四个计算符号放入一个列表,然后循环十次,每次随机产生两个随机数,和一个随机下标,再判断第一个数字<第二个数 and 计算符号为 -

import random
i = 0
operlst = list('+-*/')
while(i<10):
    num1 = random.randint(0,99)
    num2 = random.randint(0,99)
    oper = random.randint(0,3)
    if((num1 < num2)and(oper == 1)):
        continue
    print(str(num1)+operlst[oper]+str(num2))
    i += 1

运行结果:
73/1
35+80
18+49
6/26
56-35
1086
10
67
4733
97+23
66
95

Q3

问题: 计算机中使用通配符表示0个或若干个字符,现有主字符串mstr,和一个包含一个的子字符串sstr,请编写程序查找sstr在mstr中是否存在。备注:本题中通配符 ‘*’不会出现在sstr的首尾位置。

思路:这一题主要考察的是判断子串在母串中的位置,因为子串中含有通配符,我们可以根据此通配符将子串sstr分为两个子串,检测这两个子串在mstr中的位置,如果后面一个子串的位置大于等于前面一个子串的位置+他的长度,说明原子串sstr在mstr中

mstr = "asdfghjkl"
sstr = input("请输入一个字符串") #输入asd*ghj
if((sstr[0] == '*') or (sstr[-1] == '*')):
    print("通配符'*'不能出现在字符串的首尾位置")
sstr1 = list(sstr.split('*'))
if((sstr1[0] in mstr) and sstr1[1] in mstr):
    if (mstr.index(sstr1[1]) > (mstr.index(sstr1[0])+len(sstr1[0]))):
        print("sstr在mstr中存在")
    else:
        print("sstr在mstr中不存在")

结果:sstr在mstr中存在

Q4

问题:编制一个可以在命令行模式下运行的扫雷游戏。
(1)利用随机数进行布雷
(2)计算无雷格子的邻居中包含地雷的数目
(3)能够输入行号和列号表示要打开的格子
(4)能够进行成片的展开。

思路,首先定义一个n n的方格布,然后用户输入雷数,随机产生行列坐标,循环计算每个位置周围的雷数,并记录下来。再定义每个位置的开闭状态,初始输出全闭的方格布,开始游戏。用户输入一个位置,先判断该位置是否有雷(-1),如果有雷结束游戏,打印方格,有雷的位置显示*,如果用书输入位置无雷,且周围有雷,将该位置打开。如果用户打开位置无雷,且周围无雷,打开周围所有位置,打开时如果周围位置也存在0状态,递归打开其周围位置,即一大片打开。

#游戏雷盘为9*9的,定义每个位置的邻居为3*3
import random
def CountNumArray(numArray):
    for i in range(len(numArray)):
        for j in range(len(numArray[0])):
            #找到雷所在的位置,将其周围3*3的元素加1
            if numArray[i][j] == -1:
                #先判断是否在特殊位置
                if i==0:
                    if j==0:
                        #雷的位置在左上角
                        for r in range(0,i+2):
                            for c in range(0,j+2):
                                if(numArray[r][c] != -1):
                                    numArray[r][c] += 1 
                    elif j==len(numArray[0])-1:
                        #雷的位置在右上角
                        for r in range(0,i+2):
                            for c in range(j-1,j+1):
                                if(numArray[r][c] != -1):
                                    numArray[r][c] += 1 
                    else:
                        #雷的位置在第一排
                        for r in range(0,i+2):
                            for c in range(j-1,j+2):
                                if(numArray[r][c] != -1):
                                    numArray[r][c] += 1 
                elif i==len(numArray)-1:
                    if j==0:
                        #雷的位置在左下角
                        for r in range(i-1,i+1):
                            for c in range(0,j+2):
                                if(numArray[r][c] != -1):
                                    numArray[r][c] += 1 
                    elif j==len(numArray[0])-1:
                        #雷的位置在右下角
                        for r in range(i-1,i+1):
                            for c in range(j-1,j+1):
                                if(numArray[r][c] != -1):
                                    numArray[r][c] += 1 
                    else:
                        #雷的位置在最后一排
                        for r in range(i-1,i+1):
                            for c in range(j-1,j+2):
                                if(numArray[r][c] != -1):
                                    numArray[r][c] += 1 
                elif j==0:
                    #在第一列
                    for r in range(i-1,i+2):
                        for c in range(j,j+2):
                            if(numArray[r][c] != -1):
                                numArray[r][c] += 1 
                elif j==len(numArray[0])-1:
                    #在最后一列
                    for r in range(i-1,i+2):
                        for c in range(j-1,j+1):
                            if(numArray[r][c] != -1):
                                numArray[r][c] += 1 
                else:
                    for r in range(i-1,i+2):
                        for c in range(j-1,j+2):
                            if(numArray[r][c] != -1):
                                numArray[r][c] += 1 
def PrintArray(numArray,boolArray,strArray):
    #打印雷盘
    for i in range(len(numArray)):
        for j in range(len(numArray[0])):
            if boolArray[i][j]:
                print(numArray[i][j],end=" ")
            else:
                print(strArray[i][j],end=" ")
        print()
def OpenMuch(numArray,boolArray,rol,col):
    if rol==0:
        if col==0:
            #0的位置在左上角
            for r in range(0,rol+2):
                for c in range(0,col+2):
                    if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                        boolArray[r][c] = True
                        OpenMuch(numArray,boolArray,r,c)
                    else:
                        boolArray[r][c] = True
        elif col==len(numArray[0])-1:
            #0的位置在右上角
            for r in range(0,rol+2):
                for c in range(col-1,col+1):
                    if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                        boolArray[r][c] = True
                        OpenMuch(numArray,boolArray,r,c)
                    else:
                        boolArray[r][c] = True
        else:
            #0的位置在第一排
            for r in range(0,rol+2):
                for c in range(col-1,col+2):
                    if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                        boolArray[r][c] = True
                        OpenMuch(numArray,boolArray,r,c)
                    else:
                        boolArray[r][c] = True
    elif rol==len(numArray)-1:
        if col==0:
            #0的位置在左下角
            for r in range(rol-1,rol+1):
                for c in range(0,col+2):
                    if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                        boolArray[r][c] = True
                        OpenMuch(numArray,boolArray,r,c)
                    else:
                        boolArray[r][c] = True
        elif col==len(numArray[0])-1:
            #0的位置在右下角
            for r in range(rol-1,rol+1):
                for c in range(col-1,col+1):
                    if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                        boolArray[r][c] = True
                        OpenMuch(numArray,boolArray,r,c)
                    else:
                        boolArray[r][c] = True
        else:
            #0的位置在最后一排
            for r in range(rol-1,rol+1):
                for c in range(col-1,col+2):
                    if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                        boolArray[r][c] = True
                        OpenMuch(numArray,boolArray,r,c)
                    else:
                        boolArray[r][c] = True
    elif col==0:
        #在第一列
         for r in range(rol-1,rol+2):
            for c in range(col,col+2):
                if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                    boolArray[r][c] = True
                    OpenMuch(numArray,boolArray,r,c)
                else:
                    boolArray[r][c] = True
    elif col==len(numArray[0])-1:
        #在最后一列
        for r in range(rol-1,rol+2):
            for c in range(col-1,col+1):
                if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)): 
                    boolArray[r][c] = True
                    OpenMuch(numArray,boolArray,r,c)
                else:
                    boolArray[r][c] = True
    else:
        for r in range(rol-1,rol+2):
            for c in range(col-1,col+2):
                if((numArray[r][c] == 0) and((r!=rol) or (c!=col)) and (boolArray[r][c]==False)):
                    #检测标准,这个位置是0,这个位置不是进入时的位置,这个位置没有打开过
                    boolArray[r][c] = True
                    OpenMuch(numArray,boolArray,r,c)
                else:
                    boolArray[r][c] = True
def solveArray(numArray,boolArray,strArray):
    #处理用户的输入
    rol,col = eval(input("请输入要打开位置的行号和列号"))
    #先判断是否打开雷所在位置
    if(numArray[rol][col] == -1):
        return True
    elif(numArray[rol][col] != 0):
        #将该位置打开并打印雷盘
        boolArray[rol][col] = True
        PrintArray(numArray,boolArray,strArray)
        return False
    else:
        #该位置为0打开一大片
        OpenMuch(numArray,boolArray,rol,col)
        PrintArray(numArray,boolArray,strArray)
        return False

#初始化
numArray = [[0 for i in range(9)]for j in range(9)]
boolArray = [[False for i in range(9)]for j in range(9)] #Trueb表示打开
strArray = [['*' for i in range(9)]for j in range(9)]
Leinum = eval((input("请输入雷数")))
for i in range(Leinum):
    rol,col = random.randint(0,8), random.randint(0,8)
    numArray[rol][col] = -1 #有雷的位置用-1表示 雷用+表示
#布雷后的数字计算
CountNumArray(numArray)
PrintArray(numArray,boolArray,strArray)
#循环处理用户输入
while(True):
    if(solveArray(numArray,boolArray,strArray)):
        print("Game Over you Lost")
        break

结果:

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值