第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)
,利用上述公式计算三角形的面积。
第二题
本题通过编程验证哥德巴赫猜想,即:任何一个大于或等于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
个小区间,曲线可以近似看成线段。当小区间的区间数量足够多时,近似长度接近真实值。
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)