hnu计算机与人工智能概论答案3.1

第1关:函数定义调用与返回-求两个点的距离

本关任务: 1、定义一个函数求两个点坐标的函数 def calTwodist(x1,y1,x2,y2) : #函数说明 ''' 根据参数值计算两个点的距离 :param x1:第一个点的横坐标 :param y1:第一个点的纵坐标 :param x2:第二个点的横坐标 :param y2:第二个点的纵坐标 :return: 两个点的距离 ''' 2、 函数调用,从键盘输入两个点的坐标,并输出两个点的距离。

第一关,很简单,按照要求输入函数就行。

import math
#定义函数返回两个点的距离
def  calTwodist(x1,y1,x2,y2) :
  #函数说明
    #   根据参数值计算两个点的距离
    #   :param x1:第一个点的横坐标
    #   :param y1:第一个点的纵坐标
    #   :param x2:第二个点的横坐标
    #   :param y2:第二个点的纵坐标
    #   :return: Dist两个点的距离
    
##########begin################ 
  #从此开始计算两个点的坐标值
  d = math.sqrt((x1-x2)**2+(y1-y2)**2)
  #返回两个点的坐标值
  return d
##########ends################ 

#########主程序begin##########
#从键盘输入两个点的坐标值
x1,x2,y1,y2 = eval(input())
#函数调用求解两个点的距离
d = calTwodist(x1,x2,y1,y2)
#输出两个点的距离,保留小数点后4位 
print ("result="+'%.4f'%d)

##########ends################

第2关:函数不同参数调用方法-求三角形面积

根据提示,在右侧编辑器补充代码,编写下列程序:

1、定义一个判断是否是三角形的函数,是返回1,否则返回0;

2、定义一个计算三角形的面积的函数,设置默认参数为(a=3,b=4,c=5);

3、从键盘输入任意的三条边的长度,通过位置参数调用函数求面积并输出,面积保留小数点后4位;

4、根据默认参数计算三角形的面积并输出; 5、设置关键字参数计算指定三角形的面积; 6、计算多边形阴影部分的面积

 第二关,第一问感觉老师给的代码有些复杂,可以简化。后面注意保留小数,也可像之前题目中一样定义一个print_函数简化print后内容。这里补充一个知识点:==(判断是否相等)、!=(判断是否不相等)、>=(判断是否大于)他们输出的结果都是布尔数(False、True)可作为if条件的判断条件。还有如果报错可以检查一下自己的if后有没有加上“:”。

import math
def IsTriange(a,b,c):    
  #函数说明
    #   根据参数值判断是否是三角形的函数
    #   :param a:三角形一条边的长度
    #   :param b:三角形一条边的长度
    #   :param c:三角形一条边的长度
    #   :return: 0或1 
   
#程序代码已经给出请认真阅读   
##########begin################    
    t1=(a+b)>c and (a+c)>b and (b+c)>a
    if  t1 :
       return 1
    else:
       return 0   
    
    
##########ends################      
 
#定义一个计算三角形的面积的函数,TriArea(a,b,c),
#其中a,b,c为三角形三条边,如果构成三角形,返回三角形的面积,否则返回0    
def TriArea(a=3,b=4,c=5):#设置默认参数
##########begin################     
   if IsTriange(a,b,c)==1:
      p = (a+b+c)/2
      S = math.sqrt(p*(p-a)*(p-b)*(p-c))
      return S
   else:
      return 0
    
    
##########ends################
        
#3、从键盘输入任意的a,b,c 按位置调用函数实现计算三角形面积的函数,如果不能构成三角形,返回0,否则输出三角形面积。
##########begin################  
a,b,c = eval(input())
print ("三角形面积:",'%.4f'%TriArea(a,b,c),sep='')
 
##########ends################
print('*'*20) #输出20个*
#4、按默认参数调用函数计算三角形的面积,保留小数点后4位
##########begin################ 
S1 = TriArea()
print ("三角形面积:",'%.4f'%S1,sep='')
##########ends################ 
print('*'*20)#输出20个*
#5、设置关键字参数调用函数计算(c=10,b=20,a=15)三角形的面积
##########begin################ 
print ("三角形面积:",'%.4f'%TriArea(c=10,b=20,a=15),sep='')
##########ends################ 
print('*'*20)#输出20个*

#6、计算多边形阴影部分面积,保留小数点后4位
##########begin################ 
S2 = TriArea(9.8,9.3,6.4)-TriArea(2.9,4.1,4.7)+TriArea(2.0,1.4,2.3)
print("多边形面积为:",'%.4f'%S2,sep='')
##########ends################ 
print('*'*20,end='')#输出20个*

第3关:lambda函数的使用-求三个数的最大值和最小值

1、定义两个求两个数最大值和最小值的lambda函数,

2、调用lambda函数完成求3个数的最大值和最小值的程序

第三关,这里也可以直接用Python自带的函数max、min但是题目中要求了,咱么就自己定义一下吧。多个数值比较就可以两两相比再从中选出更大(小)的与三者相比。

#定义2个lambda函数,求两个数的最大值max1,和最小值min1的函数 
##########begin##########
max1 = lambda a,b:a if a>=b else b
min1 = lambda a,b:a if a<=b else b 
##########ends##########
 
#从键盘输入3个数,调用max1和min1函数完成求3个数的最大值和最小值的程序,输出最大值和最小值
##########begin##########    
x,y,z = eval(input())
print (max1(max1(x,y),z),min1(min1(x,y),z))
      
##########ends##########    

第4关:函数基础训练-银行本息计算法

本关任务:编程定义实现本息利率计算的函数,并计算从键盘输入本金,按中国人民银行整存整取1年期利率1.75%,3年期利率2.75%,5年期利率2.75% ,调用函数计算本息和并输出。结果保留小数点后4位。

第四关,这里注意一下,这边的利息是复利,也就是我们俗称的“利滚利”算不对的可以看看是不是这里错了。这里只是让你输出本息和,变量只有本金,所以函数的数值可以直接输入,没必要写那么复杂。

def moneyrate1(pays,rate,year):
    
    #函数说明
    #
    #   根据参数值计算存款本息值
    #   :param pays:本金
    #   :param rate:利率
    #   :param year:年份
    #   :return: 本息和
    
##########begin##########
    total = pays*((1+rate)**year)
    return total
##########ends##########
 
#调用moneyrate1函数计算从键盘输入的本金存1年,3年和5年的本息和并输出结果 
##########begin##########    
pays = eval(input())
total1 = moneyrate1(pays,0.0175,1)
print ("1年的本息和为",'%.4f'%total1,sep='')
total2 = moneyrate1(pays,0.0275,3)
print ("3年的本息和为",'%.4f'%total2,sep='')
total3 = moneyrate1(pays,0.0275,5)
print ("5年的本息和为",'%.4f'%total3,sep='')

##########ends##########    

第5关:函数基础训练-绝对素数和哥德巴赫猜想

根据提示,在右侧编辑器补充代码,计算并输出数组的平均值和最大值。 1、 编程实现一个函数isPrime(x),判断整数x是否为素数,是输出1,否则输出0

2、求出所有两位数的绝对素数的程序。 绝对素数:一个素数,当它的数字位置对换以后仍为素数,这样的数称为绝对素数。例如17和71都是素数,所以17和71是绝对素数 注意: 每一对绝对素数的输出格式为:17和71是绝对素数

3、 验证哥德巴赫猜想,即:任何一个大于或等于6的偶数,可以表示成两个素数之和。例如:11111112 = 11 + 11111101 定义函数Goldbach(N)将整数N分解成两素数之和以验证哥德巴赫猜想,你需要补充完整该函数代码。

第五关,首先是定义素数。这里我们用到素数的定义为素数的因数只有1和他本身。所以,我们只需要让除了1和他本身之外的数与它相除,如果余数都不是0,那么它就是素数。这里注意一下,判断素数时,要把(2,x)都遍历一遍,如果都不满足,才输出1,所以要注意最后一个return的缩进。如果和if平行写一个else,那么就会多出很多素数。例如:15在进入这个循环时,不满足if的条件,就会进入else分支,输出1(也就15是素数)。

后面对换数字的时候,我这边用的是求出十位和个位,再重新组合。也可直接用字符串reversed,但是记得转化为数字类型。

这里判断两个数均为素数我用了两种方法,一种是同时等于1,也可以使他们的和为2.。

#1定义一个判断一个数是否是素数的函数,如果是输出1,否则输出0
#######begin########
def isprime(x):
    for i in range(2,x):
        if x%i ==0:
            return 0
    return 1

 
#######ends########
    
#2调用isprime()函数求两位数内的绝对素数并输出
#######begin########    
def h(x):
    a=x%10 #a为个位
    b=x//10 #b为十位
    y= a*10+b
    return y
for i in range(10,100):
    if isprime(i)==1 and isprime(h(i))==1 :
        print(i,'和',h(i),'是绝对素数',sep='')
    
#######ends########
print('*'*20) 
       
#3定义一验证歌德巴赫猜想函数  
def Goldbach(N):  # 将N分解成两素数之和
    if N < 6 or N % 2 == 1:  # 若N小于6或N为奇数
        print('N应该是大于等于6的偶数')
    else:
        # 循环判断,得到符合要求的小于N的两个素数,并打印
        for x in range(2, N //2 + 1):  # 想想为什么是从2到N/2
            # 调用isPrime函数得到符合要求的小于N的两个素数
          ######## begin ###########
           if isprime(x)+isprime(N-x)==2:
          ######## end ###########
                print(N, '=', x, '+', N - x)
                break
for num in [88, 68, 50, 1000]:
    Goldbach(num) 
print('*'*20)

第6关:函数综合实训-打印日历

第1题

信用卡号是否合法的判断规则为: a) 对给定的8位信用卡号码,如43589795,从最右边数字开始,隔一位取一个数相加,如5+7+8+3=23。 b) 将卡号中未出现在第一步中的每个数字乘2,然后将相乘的结果的每位数字相加。例如,对上述例子,未出现在第一步中的数字乘2后分别为(从右至左)1818108,则将所有数字相加为1+8+1+8+1+0+8=27。 c) 将上述两步得到的数字相加,如果得数个位为0,则输入的信用卡号是有效的。

请在指定位置完成函数的编写,判断用户输入的8位信用卡号码是否合法。

第2题

在指定位置完成函数编写,根据年和月,打印该月的日历。(计算y年m月d日是星期几的公式为:

hnu计算机与人工智能概论答案3.1_第1张图片

试题中已定义了三个函数,请完成这三个函数, 函数day用于计算并返回某年某月某日是星期几; 函数isLeapYear用于判断某年是否是闰年; 函数calendar打印所给年月的日历,注意输出格式要求和空格的对齐,如下图所示,具体的空格数请参见本题代码。

 第六题没什么多说的,难度较大,自行理解。

#1题 :信用卡的验证程序
def validCreditCard(num):
    #请在下面编写代码
    # ********** Begin ********** #
    numb=str(num)
    s=[]
    for k in numb:
        s+=[int(k)]
    s1=sum(s[::-2])
    s2=s[-2::-2]
    ss=0
    for i in s2:
        j=i*2
        if j-10>=0:
            ss+=j//10+j-10
        else:
            ss+=j
    jud=s1+ss
    if str(jud)[-1]=='0':
        valid=True
    else:
        valid=False

    # ********** End ********** #
    return valid    
    #请不要修改下面的代码
for num in [1234567, 43589795, 87539319, 123456789]:
    valid = validCreditCard(num)
    print(valid)
print('*'*20) 



#2题:打印日历

def day(y, m, d):#计算y年m月d日是星期几
    # 请在下面编写代码
    # ********** Begin ********** #
    y0 = y - (14-m)//12
    x = y0 + y0//4 - y0//100 +y0//400
    m0 = m +12*((14-m)//12)-2
    d0 = (d + x +(31*m0)//12)%7
    # ********** End ********** #    
    # 请不要修改下面的代码
    return d0

def isLeapYear(year): #判断year年是否闰年
    # 请在下面编写代码
    # ********** Begin ********** #
    if year%4 ==0 and year%100!=0:
        isLeapYear = True
    elif year%100 ==0 and year%400 !=0 :
        isLeapYear = False
    elif year%400 == 0:
        isLeapYear = True
    else :
        isLeapYear = False
    
    # ********** End ********** #    
    # 请不要修改下面的代码
    return isLeapYear

def calendar(y, m): #打印y年m月日历
    print('       {}年{}月'.format(y,m))
    print('Su\tM\tTu\tW\tTh\tF\tSa')
    # 请在下面编写代码调用函数计算y年m月1日是星期几保存在变量date中
    # ********** Begin ********** #
    date = day(y,m,1)
    
    # ********** End ********** #

    days = 0  #初始化y年m月的天数为0
    # 请在下面编写代码计算y年m月的天数
    # ********** Begin ********** #
    list_maxm = [1, 3, 5, 7, 8, 10, 12]  # 创建大月的列表
    list_litem = [4, 6, 9, 11]  # 创建小月的列表
    if m in list_maxm:
        days = 31
    elif m in list_litem:
        days = 30
    elif m==2 and isLeapYear(y) == True:
        days = 29
    elif m==2 and isLeapYear(y) == False:
        days = 28
    # ********** End ********** # 
    count = date  # y年m月1日是星期几
    for i in range(date):
        print('\t', end='')
    for d in range(1, days + 1):
        print(str(d) + '\t', end="")
        count = (count + 1) % 7
        if count == 0:
            print()
    print()
   
    # 请不要修改下面的代码 
for (y,m) in [(2017,8), (2017,10),(2015,8), (2017,2), (2016,2)]:
        calendar(y, m)
        print('-'*27)

你可能感兴趣的:(python,机器学习,算法)