头歌Python实训答案——函数二

第1关:函数的参数 - 搭建函数房子的砖

编程要求

本关的编程任务是补全src/Step1/plus.py文件的代码,实现相应的功能。具体要求如下:

定义函数plus,功能是对参数(一个列表)中的数值元素进行累加,列表中的元素个数不确定;

函数返回累加结果。

#coding=utf-8

 

#创建一个空列表numbers

numbers = []

 

#str用来存储输入的数字字符串,lst1是将输入的字符串用空格分割,存储为列表

str = input()

lst1 = str.split(' ')

 

#将输入的数字字符串转换为整型并赋值给numbers列表

for i in range(len(lst1)):

   numbers.append(int(lst1.pop()))

 

# 请在此添加函数plus的代码,函数参数为一个列表,对列表中的数值元素进行累加求和

#********** Begin *********#

def plus(number):

   add=0

   for i in number:

       add += i

   return(add)

 

#********** End **********#

 

#调用plus函数,并将返回结果存储到变量d中

d = plus(numbers)

print(d)

 

第2关:函数的返回值 - 可有可无的return

编程要求

本关的编程任务是补全src/step2/return.py文件的代码,实现相应的功能。具体要求如下:

  • 定义一个函数gcd,功能是求两个正整数的最大公约数;                                                            

    #coding=utf-8

     

    #输入两个正整数a,b

    a = int(input())

    b = int(input())

     

    # 请在此添加函数gcd代码,求两个正整数的最大公约数

    #********** Begin *********#

    def gcd(a,b):

        if a<b:

            a,b=b,a

        x=a%b

        while x!=0:

            a=b

            b=x

            x=a%b

        return(b)

    #********** End **********#

     

    #调用函数,并输出最大公约数

    print(gcd(a,b))

     

  • 第3关:函数的使用范围:Python作用域

编程要求

本关的编程任务是补全src/step3/scope.py文件的代码,实现相应的功能。具体要求如下:

  • 编写程序,功能是求两个正整数的最小公倍数;
  • 要求实现方法:先定义一个private函数 _gcd()求两个正整数的最大公约数,再定义public函数lcm()调用 _gcd()函数求两个正整数的最小公倍数。

 

#coding=utf-8

 

#输入两个正整数a,b

a = int(input())

b = int(input())

 

# 请在此添加一个private函数_gcd()求两个正整数的最大公约数

#********** Begin *********#

def _gcd(a,b):

    if a<b:

        a,b=b,a

        x=a%b

    while x!=0:

        a=b

        b=x

        x=a%b

    return(b)

#********** End **********#

 

#请在此添加一个public函数lcm(),在lcm()函数中调用_gcd()函数,求两个正整数的最小公倍数

#********** Begin *********#

def lcm(a,b):

    return(a*b//_gcd(a,b))

#********** End **********#


 

#调用函数,并输出a,b的最小公倍数

print(lcm(a,b))


第4关:函数综合训练※

第一题

若三角形的三边分别为a,b,c ,令p=(a+b+c)/2,则该三角形的面积为:

S=p(p−a)(p−b)(p−c)​

本题将利用triArea函数计算如下图阴影部分的面积,并打印出结果。你的任务是编程实现函数triArea(a,b,c),利用上述公式计算三角形的面积。

47eb2b1c1905bf3d5b9e0cdcddd3299a.png

第二题

本题通过编程验证哥德巴赫猜想,即:任何一个大于或等于6的偶数,可以表示成两个素数之和。例如:11111112 = 11 + 11111101 。你的任务:1)编程实现一个函数isPrime(x),判断整数x是否为素数;2)程序将使用函数Goldbach(N)将整数N分解成两素数之和以验证哥德巴赫猜想,你需要补充完整该函数代码。

第三题

已知某型迫击炮发射初速度为300m/s, 炮弹飞行过程中无动力,不考虑空气阻力,重力加速度取9.8m2/s。在不同的角度下,炮弹落地的时间与飞行的位置都不一样。本题通过编程绘制角度分别为[30, 45, 60, 75]度时的炸弹轨迹。其中函数calBombT\frace(theta)计算炮弹飞行过程中n个位置坐标,时间样本为均匀分配。你的任务是补充完整该程序代码。

计算逻辑示例如下(编程时不需要取整):

当角度为为30度时,炸弹空中飞行时间约为30.6s

若取5个均匀的时间样本,分别约为[ 0, 7.6, 15.3, 22.9, 30.6 ]

则对应的x坐标则为[0,1988, 3976, 5964, 7953]

对应的y坐标则为[ 0, 860,1147, 860, 0 ]

第四题

如图所示,一致函数的方程为

f(x)=exsin(x)

求函数曲线在[0,pi]区间的长度。
你的任务:1)编写函数f(x)计算上述函数的值;2)编写函数pt(a, b)利用勾股定理计算直角三角形的斜边长。

提示:把区间分成n个小区间,曲线可以近似看成线段。当小区间的区间数量足够多时,近似长度接近真实值。

f401051cac4190abc3f165eb64b04d82.png

 

import numpy as np

import matplotlib

matplotlib.use('Agg')

import matplotlib.pyplot as plt     #导入matplotlib.pyplot

 

# 第一题

######## begin ###########

# 请编写函数triArea(a ,b , c),返回三角形的面积

def triArea(a,b,c):

    p=((a+b+c)/2)

    S=pow(p*(p-a)*(p-b)*(p-c),1/2)

    return(S)

######## end #########

 

S1 = triArea(9.8, 9.3, 6.4)

S2 = triArea(2.9, 4.1, 4.7)

S3 = triArea(2.0, 1.4, 2.3)

print('%.6f' %(S1-S2+S3))

 

# 第二题

######## begin ###########

# 请编写函数isPrime(x)。判断x是否是素数,返回True或者False

def isPrime(x):

    n=0

    for i in range(2,x//2):

        if x%i==0:

            n+=1

    if n==0:

        return("True")

    else:

        return("False")

 

#######  end    ############


 

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):  # 想想为什么是从2到N/2

            # 调用isPrime函数,得到符合要求的小于N的两个素数

            ######## begin ###########

            if isPrime(x)=="True" and isPrime(N-x)=="True":

            ######## end ###########

                print(N, '=', x, '+', N - x)

                break


 

N = int(input())

Goldbach(N)

 

# 第三题

# calBombTrace 函数

def calBombTrace(theta):

    v0, g, n = 300, 9.8, 30

    theta_d = np.radians(theta)     #因numpy中cos、sin的输入为弧度值,故先将theta从度转换为弧度

    v0_x = v0*np.cos(theta_d)       #炮弹水平初速度

    v0_y = v0*np.sin(theta_d)       #炮弹垂直初速度

    tmax = 2*v0_y/g                 #落地时间,即v0_y*t-0.5gtt=0的解

    t = np.linspace(0, tmax, n)     #n个时刻

    xt = v0_x*t                     #n个时刻的横坐标

    yt = v0_y*t-1/2*g*t**2          #n个时刻的纵坐标

    return xt, yt

 

for theta in [30, 45, 60, 75]:

    ############ begin #########

    # 调用函数,得到theta返回的值,并存储到xt与yt变量

    xt,yt=calBombTrace(theta)

    ########### end #############

    plt.plot(xt, yt)

 

plt.grid('on')

plt.axis([0, 10000, 0, 5000])

plt.savefig('./src/step4/res/轨迹.png')

 

plt.close()

print([round(x,6) for x in xt])

print([round(x,6) for x in yt])

 

# 第四题

# 在此添加代码,编写函数f(x),计算f(x)的值

from math import * 

########### begin #############

def f(x):

    a=((np.e)**x)*(np.sin(x))

    return(a)

 

########### end #############

 

# 在此添加代码,编写函数pt(a, b),利用勾股定理计算直角三角形的斜边长

########### begin #############

def pt(a, b):

    c=pow(a**2+b**2,1/2)

    return(c)

########### end #############

 

n = 1000  # 细分成n个子区间

x = np.linspace(0, np.pi, n + 1)  # n个子区间的n+1个端点

l, h = 0, np.pi / n  # l为曲线长度、h为子区间宽度

for i in range(n):  # 对每个子区间

    li = pt(f(x[i + 1]) - f(x[i]), h)  # 曲线在第i个子区间的近似长度

    l = l + li  # 将航渡累加到l中

 

print('l = %.6f' %l)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值