#大学计算机基础 作业2 问题求解表达式 #笔记

本文采用了markdown语法编辑。

飞行炮弹空气阻力计算

转换取整数

任务描述

炮弹弹道是武器学中的一个重要概念,是指炮弹出炮口后在空中的飞行轨迹。在研究炮弹弹道时,空气阻力往往不可忽略。 已知炮弹在空中飞行时所受空气阻力(单位为N)的计算公式如下: F=(½)​CρS(v^2) 其中,阻力系数C=0.1,空气密度ρ=1.2kg/m^3,S为垂直于速度方向的炮弹横截面积(单位为m^2),v为炮弹的飞行速度(单位为m/s)。

编程要求

补全Begin-End区间的代码,其功能是根据给定的横截面积S(用变量S表示)与飞行速度v(用变量v表示),计算炮弹所受空气阻力F(用变量F表示),说明如下: 1. S和v的值在程序运行时由系统自动设置(初始代码第1-2行),不要再额外设置,编程时假设其已知即可; 2. 初始代码最后一行是打印计算结果,不要再额外添加打印语句,按要求算出变量 F 的值即可; 3. 不要改动Begin-End区间之外的代码; 4. 公式中,阻力系数C取0.1,空气密度取 1.2kg/m3; 5. F只保留整数部分,即算出F后,要用int函数将其转换成整数类型。

S = eval(input()) #获取炮弹的横截面积S
v = eval(input()) #获取炮弹的飞行速度v
########## Begin ##########

c=0.1
p=1.2         #这里偷个懒,干脆写成p字了。赋值只要公式格式不出错,理论上可以写任何字母进去。

f=(1/2)*c*p*S*(v**2)   #按题目要求放置公式

F=int(f)              #嵌套赋值

########## End ##########
print(F)          #打印炮弹受到的空气阻力

关于int的用法参阅了 https://blog.csdn.net/jpch89/article/details/89762939

不带参数直接用int(),得到的是整数0。

Thanks♪(・ω・)ノ

海啸等级计算

任务描述

海啸是一种具有强大破坏力的海浪,常由海底地震、火山爆发、海底滑坡等事件引发,海啸冲上陆地后往往会造成巨大的损失。为更好地对海啸进行研究,科学家定义了海啸等级的计算方法,下面是其中一种:

Mt=log10⁡​H+log10​⁡D+5.8

其中,H 是潮位计观测到的海啸波最大振幅(单位为米)、D 是观测站到海啸中心的直线距离(单位为千米)。 本关任务是根据上式计算海啸等级 Mt。

相关知识

  在求解该问题的过程中,需要计算对数,可以使用 math 库中的log函数。例如下面程序计算的是 log2​⁡16。

    import math
    x = math.log(16, 2)
    print(x)

编程要求

补全 Begin-End 区间的代码,其功能是根据给定的振幅 H(用变量H表示)与距离 D(用变量D表示),计算海啸等级 Mt(用变量Mt表示),说明如下: 1. H和D的值在程序运行时由系统自动设置(初始代码第 2-3 行),不要再额外设置,编程时假设其已知即可; 2. 初始代码最后一行是打印计算结果,不要再额外添加打印语句,按要求算出变量Mt的值即可; 3. 不要改动Begin-End区间之外的代码。

import math
H = eval(input())                 #获取振幅H
D = eval(input())                 #获取距离D
########## Begin ##########

Mt=math.log(H,10)+math.log(D,10)+5.8       #放置公式

########## End ##########
print(int(Mt))                      #打印海啸等级(保留整数)

注意log的写法:log a ​x应该写成math.log(x,a)

喜欢的话,可以用x,y的形式做赋值式,也可以不做。

x=math.log(H,10)
y=math.log(D,10)
Mt=x+y+5.8

重温受力分析题

小木块从粗糙斜面顶端静止释放,已知摩擦系数μ=0.1、斜面长度为l、斜面角度为θ、重力加速度g=9.8m/s^2,现要计算小木块从顶端滑到底部的时间t。

a=gsin⁡θ−μgcos⁡θ t=(2*l/a)^0.5

因而 t=((2*1)/(gsin⁡θ−μgcos⁡θ))^0.5

可转化为 t=((21)/((9.8sin⁡θ)−(0.19.8cos⁡θ)))^0.5

但是这样看上去会显得很长条,建议是前期多放置赋值式,最后用简单式组合。

import math
l = eval(input())     #获取斜面长度l
theta = eval(input())     #获取斜面角度θ(输入的是角度)
########## Begin ##########
mu=0.1
g=9.8

theta=math.radians(theta)   #调用函数

a=(g*math.sin(theta))-(mu*g*math.cos(theta))    #关门放公式!

t=(2*l/a)**0.5       #或者写成t=math.sqrt(2*l/a)

########## End ##########

print(int(t))         #打印木块滑行时间(保留整数)

这题的cos和sin中应该传入弧度,所以需要用radians函数把角度转化成弧度。

关于星期的冷知识

星期以七天为周期,日期也存在周期,你是不是隐隐感觉两者之间存在一些关系?其实它们之间存在转换公式,利用公式可以方便地计算某年某月某日是星期几。

任务

具体来说,计算公元y年m月d日,对应星期几的公式如下:

y0​=y−(14−m)//12 x=y0​+y0​//4−y0​//100+y0​//400 m0​=m+12×((14−m)//12)−2 w=(d+x+(31×m0​)//12)%7

w即为计算结果,如w=0则表示星期日。 在以上公式中,//表示求整数商(简称整除)、%表示求余数(简称求余),例如, 7//3的结果为2、7%3的结果为1(即7除以3的整数商为2、余数为1)。 本关任务是实现上面的公式,计算某一天是星期几。

相关知识

整除和求余

  上面的公式包含整除和求余运算,若在正整数范围内讨论,则 Python 中与之相对应的运算符是//和%,例如:

    a = 7//3
    b = 7%3
    print('7除3的整数商为', a)
    print('7除3的余数为', b)

用%格式化字符串

初始程序最后一行的功能是打印结果,括号中的内容是:

'%d年%d月%d日是星期%d' % (y, m, d, w)

这其实是一个对字符串进行处理的表达式,其格式包含以下三部分: 1. 左边是一个包含n个占位符的字符串(占位符以%开头,%d就是一种占位符); 2.中间是一个%; 3. 最后是n个用括号括起来、以逗号分割的值,这n个值与n个占位符一一对应。

其处理过程是用n个值替换 n 个占位符,如y、m、d、w的值分别为321、3、7、1,则本例的结果为:'321年3月7日是星期1'。尝试以下程序:

    y, m, d, w = 321, 3, 7, 1
    print('%d年%d月%d日是星期%d' % (y, m, d, w))

用之前的方法也可以实现相同的功能,但这种方式更加便于程序的编写、阅读和修改。

    y, m, d, w = 321, 3, 7, 1
    print(y, '年', m, '月', d, '日是星期', w)

占位符的类型

占位符分为不同的类型,如%d代表整数型、%f代表浮点型、%s代表字符串类型。在将值代入占位符时,会将值转换成占位符对应的类型,尝试如下程序:

    print('%d' % (3.14))
    print('%f' % (3))

第 1 行在将浮点数 3.14 代入占位符时,会将其转换成%d对应的类型,即整数型,所以打印的结果是3。第 2 行在将整数 3 代入%f时,会将其转换成浮点型,所以打印结果是3.000000。

不同类型的占位符还支持不同的格式设置,尝试如下程序:

    print('%.2f' % (3.1415926))
    print('%30s' % ('Hello World!'))
    print('%30s' % ('Hello Python!'))

第1条语句中的.2表示保留两位小数,第2、3条语句中的30表示将字符串的宽度设置为30个字符(从而达到右对齐的效果)。

编程要求

补全 Begin-End 区间的代码,其功能是计算y年m月d日(分别用变量y、m、d表示)是星期几(用变量w表示),说明如下: 1. y、m、d的值在程序运行时由系统自动设置(初始代码第 1-3 行),不要再额外设置,编程时假设其已知即可; 2. 初始代码最后一行是打印计算结果,不要再额外添加打印语句,只要算出变量w的值即可; 3. 不要改动Begin-End区间之外的代码。

y = eval(input()) #获取年:y
m = eval(input()) #获取月:m
d = eval(input()) #获取日:d
########## Begin ##########

y0 = y - (14 - m) // 12

x= y0 + (y0//4) - (y0//100) + (y0//400)

m0= m + 12 * ((14-m) // 12) - 2

w= (d + x + (31*m0) //12) % 7

########## End ##########
print('%d年%d月%d日是星期%d' % (y, m, d, w))

照抄公式即可。

时间单位换算

提示:使用整除运算//和求余运算%,详见上关。

补全Begin-End区间的代码,其功能是将秒(用变量sec表示)转化为时、分、秒(分别用变量h、m、s表示),说明如下: 1. sec的值在程序运行时由系统自动设置(初始代码第1行),不要再额外设置,编程时假设其已知即可; 2. 初始代码最后一行是打印计算结果,不要再额外添加打印语句,按要求算出变量h、m、s的值即可; 3. 不要改动Begin-End区间之外的代码。

sec = eval(input())               #获取以秒表示的时间
########## Begin ##########
h=sec//3600

m=(sec%3600)//60

s=sec%60
########## End ##########
print('%d小时%d分%d秒' % (h,m,s)) #打印以时分秒表示的时间

我的做题思路:首先考虑时/分/秒的换算。 1时=60分,1分=60秒,1时=60*60=3600秒

有故事的求根公式

设一元三次方程的一般形式为: a(x^3)+b(x^2)+cx+d=0 a0​=0 令: p=((3ac)–(b^2))/(3(a^2)) q=((2(b^3))–(9abc)+(27(a^2)d))/(27*(a^3))

补全Begin-End区间的代码,其功能是根据一元三次方程的系数a、b、c、d(分别用变量a、b、c、d表示),利用卡尔丹公式计算实数根x1​(用变量x1表示)。

算平方根的方式如下

    import numpy as np #导入numpy库
    x = np.sqrt(2)     #利用sqrt函数计算算术平方根
    print('2的算术平方根是',x)

算立方根的方式如下

    import numpy as np #导入numpy库
    x = np.cbrt(a)     #利用cbrt函数计算立方根
    print('a的立方根是',x)

难点是多层嵌套的开根号。

import numpy as np
a = eval(input()) #获取a的值
b = eval(input()) #获取b的值
c = eval(input()) #获取c的值
d = eval(input()) #获取d的值
########## Begin ##########
p=(3*a*c-b**2)/(3*(a**2))

q=((2*(b**3))-(9*a*b*c)+(27*(a**2)*d))/(27*(a**3))

delta=((q**2)/4)+((p**3)/27)

x1= ((-b)/(3*a)) + np.cbrt((-q/2) + np.sqrt(delta)) + np.cbrt((-q/2) - np.sqrt(delta))
########## End ##########
print('%.1fx^3+%.1fx^2+%.1fx+%.1f=0的实数根为:%.4f' % (a,b,c,d,x1))

要特别注意利用括号保证四则运算的有效性。这也算老生常谈了。

公式续

同上一题

import numpy as np
a = eval(input()) #获取a的值
b = eval(input()) #获取b的值
c = eval(input()) #获取c的值
d = eval(input()) #获取d的值
########## Begin ##########
A = b * b - 3 * a * c
B = b * c - 9 * a * d
C = c * c - 3 * b * d
delt = B * B - 4 * A * C

y1 = A * b + 3 * a * (-B + np.sqrt(delt)) / 2
y2 = A * b + 3 * a * (-B - np.sqrt(delt)) / 2

x1 = (-b - (np.cbrt(y1) + np.cbrt(y2))) / (3 * a)

########## End ##########
print('%.1fx^3+%.1fx^2+%.1fx+%.1f=0的实数根为:%.4f' % (a,b,c,d,x1))

高斯

import math

########## Begin ##########

left = math.cos(2 * math.pi / 17)

m1 = 17
m2 = math.sqrt(m1)
m3 = math.sqrt(2 * (m1 - m2))

right = (-1 + m2 + m3 + 2 * math.sqrt(m1 + 3 * m2 - m3 - 2 * math.sqrt(2 * (m1 + m2)))) / (m1 - 1)

########## End ##########
print('等式左边:%.8f' % (left))
print('等式右边:%.8f' % (right))
print('左右之差:%.8f' % (left-right))

前往mastodon @jiangshanghan@slashine.onl 与我互动。 连载放置于 https://jiangshanghan.art.blog

知识共享许可协议
本作品由 江尚寒 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。