SCAU期末笔记 - Python专业选修课课后习题

完结了数据结构和算法 不知道各位考的怎么样 现在距离Python考试还有一周 我们再写一写Python的题解吧 我上的是郭玉斌老师的公选课 所以按照她的题纲 不考的部分我就不写了

第2章 Python语言基础

第一章是教你怎么下载Python的我就跳过了 第2-4章则是简单介绍了一下Python的语法 不同于上个学期C语言的学习 有了C语言的基础 Python的语法学习直接开了速通模式

第二章对应的就是C语言中引用头文件和简单的加减乘除的操作 我们再Python里面则是引用库 加减乘除倒是区别不大

计算复利

a=input("请输入本金:")
b=input("请输入年利率:")
c=input("请输入年数:")
amount=float(a)*(1+float(b)/100)**int(c)
print(str.format("本金利率和为:{0:2.2f}",amount))

计算球的表面积和体积

r=input("输入球的半径:")
import math
v=4/3*math.pi*float(r)**3
s=4*math.pi*float(r)**2
print(str.format("球的表面积为:{0:2.2f},体积为:{1:2.2f}",s,v))

计算复利函数版

def getValue(a,b,c):
    amount=float(a)*(1+float(b)/100)**int(c)
    return amount

a=input("请输入本金:")
b=input("请输入年利率:")
c=input("请输入年数:")
amount=getValue(a,b,c)
print(str.format("本金利率和为:{0:2.2f}",amount))

解一元二次方程

直接求根公式

#用求根公式
import math
a=1
b=-10
c=16
delta=b*b-4*a*c
if delta<0:
    print("此方程无解")
else:
    a1=(-b+math.sqrt(delta))/(2*a)
    a2=(-b-math.sqrt(delta))/(2*a)
    print(str.format("方程x*x-10x+16=0的解为:{0:.1f} {1:.1f}",a1,a2))

计算年龄

主要就是教你引用库 和C语言头文件不同 我们可以随时引用 顺带多提一句 这里我们每次用库里的函数都要写一下库的名字 其实C++同样需要 我们每次打代码时写的using namespace std;其实就是省略了这一点 否则你在使用cin和cout等一大堆函数时都要写成std:cin 当然我们实际工程的过程中肯定是很少使用using namespace的 毕竟它的作用就是防止重名嘛

name=input("请输入您的姓名:")
birthyear=input("请输入您的出生年份:")
import datetime
nowyear=datetime.datetime.now().year
age=nowyear-int(birthyear)
print(str.format("您好,{0}。您{1}岁。",name,age))

第3章 程序流程控制

对应C语言中的顺序结构 主要就是循环怎么写 判断怎么写 和C语言区别也不是特别大

计算1到100之和

注意Python里面的range函数是左闭右开区间 所以range(1,101)才是从1数到100

res=0
for i in range(1,101):
    res+=i
print(res)

计算10到1之和

我知道他想考察反向数数 但是确实有点小难绷 range还可以有第三个传入值表示步长 也就是C语言for循环里面i+=的那个数字

res=0
for i in range(10,0,-1):
    res+=i
print(res)

计算1到100间的奇数和

res=0
for i in range(1,100,2):
    res+=i
print(res)

计算1到100间的偶数和

res=0
for i in range(2,101,2):
    res+=i
print(res)

输出2000到3000间所有闰年

主要关注一下 在print后面写一个end=‘ ’使每次输出完后跟的是空格而不是回车

cnt=0
for year in range(2000,3001):
    if year%4==0 and year%100!=0 or year%400==0:
        cnt+=1
        print(year,end=' ')
        if(cnt%18==0):
            print()

计算1-3+5-7+······

n=int(input())
tme=-1
cnt=0
for i in range(1,n+1):
    if(i%2!=0):
        tme=-tme
        cnt+=tme*i
print(cnt)

计算1+1/2+1/3+······+1/n

n=int(input())
ans=0.0
for i in range(1,n+1):
    ans+=1.0/i
print(ans)

输出九九乘法表的多种形式

cmd=int(input("上三角请按1,下三角请按2,矩形块请按3:"))
if cmd==1:
    for i in range(1,10):
        for j in range(1,10):
            if j<=10-i:
                print("%d*%d=%d"%(i,j,i*j),end=' ')
                if(i*j<10 and j!=1):
                    print(end=' ')
        print()
elif cmd==2:
    for i in range(1,10):
        for j in range(1,10):
            if j<=i:
                print("%d*%d=%d"%(i,j,i*j),end=' ')
                if(i*j<10 and j!=1):
                    print(end=' ')
        print()
elif cmd==3:
    for i in range(1,10):
        for j in range(1,10):
            print("%d*%d=%d"%(i,j,i*j),end=' ')
            if(i*j<10 and j!=1):
                print(end=' ')
        print()

判断三角形的存在性并计算周长面积

a=float(input("请输入三角形的边A:"))
b=float(input("请输入三角形的边B:"))
c=float(input("请输入三角形的边C:"))
print(str.format("三角形的三边分别为:{0:.1f},{1:.1f},{2:.1f}",a,b,c))
if(a<0 or b<0 or c<0 or a+b<=c or a+c<=b or b+c<=a):
    print("无法构成三角形!")
else:
    s=(a+b+c)/2
    area=(s*(s-a)*(s-b)*(s-c))**0.5
    length=a+b+c
    print(str.format("三角形的周长为:{0:.1f},面积为:{1:.1f}",length,area))

计算分段函数

为了解决这道题 我们首先要知道单分支语句、双分支结构和条件运算语句的区别是什么 正巧我也不知道 问一下copilot吧

看完他的解释还没懂的我相信你看一眼代码立马就懂了

import math
PI=3.1415926
e=2.7182818
x=float(input("请输入x:"))
#单分支语句
if x>=0:
    y1=(x*x-3*x)/(x+1)+2*PI+math.sin(x)
    print(str.format("方法一:x={0:.1f},y={1:.14f}",x,y1))
if x<0:
    y1=math.log(-5*x)+6*math.sqrt(abs(x)+e**4)-pow((x+1),3)
    print(str.format("方法一:x={0:.1f},y={1:.14f}",x,y1))

#双分支结构
if x>=0:
    y2=(x*x-3*x)/(x+1)+2*PI+math.sin(x)
else:
    y2=math.log(-5*x)+6*math.sqrt(abs(x)+e**4)-pow((x+1),3)
print(str.format("方法二:x={0:.1f},y={1:.14f}",x,y2))

#条件运算语句
y3=(x*x-3*x)/(x+1)+2*PI+math.sin(x) if x>=0 else math.log(-5*x)+6*math.sqrt(abs(x)+e**4)-pow((x+1),3)
print(str.format("方法三:x={0:.1f},y={1:.14f}",x,y3))

 解一元二次方程 升级版

虽然我数学没学好 但是好在他已经把公式全部给我了 那就填进去就行

a=int(input("请输入系数a:"))
b=int(input("请输入系数b:"))
c=int(input("请输入系数c:"))
if a==0 and b==0:
    print("此方程无解!")
elif a==0 and b!=0:
    x=-c/b
    print(str.format("此方程的解为:{0:.1f}",x))
elif b*b-4*a*c==0:
    x=-b/(2*a)
    print(str.format("此方程有两个相等实根:{0:.1f}",x))
elif b*b-4*a*c>0:
    x1=(-b+(b*b-4*a*c)**0.5)/(2*a)
    x2=(-b-(b*b-4*a*c)**0.5)/(2*a)
    print(str.format("此方程有两个不等实根:{0:.1f}和{1:.1f}",x1,x2))
else:
    realPart=-b/(2*a)
    imagPart=(-b*b+4*a*c)**0.5/(2*a)
    print(str.format("此方程有两个共轭复根:{0}+{1}i和{0}-{1}i",realPart,imagPart))

计算阶乘

n=-1
while(n<0):
    n=int(input("请输入非负整数n:"))
#for循环
ans1=1
for i in range(1,n+1):
    ans1*=i
print(str.format("  for循环:{0}!={1}",n,ans1))
#while循环
ans2=1
tmp=n
while(tmp>0):
    ans2*=tmp
    tmp-=1
print(str.format("while循环:{0}!={1}",n,ans2))

随机整数求lcm和gcd

import random
a=random.randint(1,100)
b=random.randint(1,100)
print(str.format("整数1={0},整数2={1}",a,b))
x,y=a,b
while(y!=0):
    r=x%y
    x=y
    y=r
y=a*b//x
print(str.format("最大公约数={0},最小公倍数={1}",x,y))

第4章 常用内置数据类型

与C语言不同 Python里面我们摆脱了long long 所以我们只需要注意浮点数的输出保留小数以及定义相关的问题

输出杨辉三角

def yanghui(n):
    if n == 1:
        return [[1]]
    else:
        L = yanghui(n-1)
        L.append([1]+[L[-1][i]+L[-1][i+1] for i in range(len(L[-1])-1)]+[1])
        return L
def print_yanghui(L):
    width = len(' '.join(map(str,L[-1])))
    for i in L:
        print(' '.join(map(str,i)).center(width))
print_yanghui(yanghui(5))

解直角三角形

A=0
while A<=0:
    A=float(input("请输入直角三角形的直角边A:"))
B=0
while B<=0:
    B=float(input("请输入直角三角形的直角边B:"))
C=(A**2+B**2)**0.5
print(str.format("直角三角形的三边分别为:a={0:.1f},b={1:.1f},c={2:.1f}",A,B,C))
length=A+B+C
area=A*B/2
print(str.format("三角形的周长={0:.1f},面积={1:.1f}",length,area))
import math
sinA=A/C
sinB=B/C
a=round(math.asin(sinA)*180/math.pi,0)
b=round(math.asin(sinB)*180/math.pi,0)
print(str.format("三角形的两个锐角的度数分别为:{0:.1f}和{1:.1f}",a,b))

生成随机数并排序

import random
a=random.randint(1,100)
b=random.randint(1,100)
c=random.randint(1,100)
print(str.format("原始值:a={0},b={1},c={2}",a,b,c))
big=max(a,b,c)
small=min(a,b,c)
middle=a+b+c-big-small
if(a>b):
    a,b=b,a
if(a>c):
    a,c=c,a
if(b>c):
    b,c=c,b
print(str.format("(方法一)升序值:a={0},b={1},c={2}",a,b,c))
print(str.format("(方法二)升序值:a={0},b={1},c={2}",small,middle,big))

计算缴费

salary=int(input("请输入您的工资:"))
f=0
if salary<=3000:
    f=0.5/100*salary
elif salary<=5000:
    f=1/100*salary
elif salary<=10000:
    f=1.5/100*salary
else:
    f=2/100*salary
print(str.format("月工资={0},需交费={1}",salary,f))

简易计算器

x=float(input("请输入操作数x:"))
y=float(input("请输入操作数y:"))
cmd=input("请输入操作符:")
res=0.0
if cmd=="+":
    res=x+y
    print(str.format("{0:.1f}+{1:.1f}={2:.1f}",x,y,res))
elif cmd=="-":
    res=x-y
    print(str.format("{0:.1f}-{1:.1f}={2:.1f}", x, y, res))
elif cmd=="*":
    res=x*y
    print(str.format("{0:.1f}*{1:.1f}={2:.1f}", x, y, res))
elif cmd=="/":
    if y==0:
        print("分母为0,零除异常!")
    else:
        res=x/y
        print(str.format("{0:.1f}/{1:.1f}={2:.1f}", x, y, res))
elif cmd=="%":
    if y==0:
        print("分母为0,零除异常!")
    else:
        res=x%y
        print(str.format("{0:.1f}%{1:.1f}={2:.1f}", x, y, res))

判断三角形性质

a=int(input("请输入三角形的边a:"))
b=int(input("请输入三角形的边b:"))
c=int(input("请输入三角形的边c:"))
if not(a+b>c and a+c>b and b+c>a) or a<=0 or b<=0 or c<=0:
    print("无法构成三角形!")
elif a==b and b==c:
    print("该三角形为等边三角形!")
elif a==b or a==c or b==c:
    print("该三角形为等腰三角形!")
if a*a+b*b==c*c or a*a+c*c==b*b or b*b+c*c==a*a:
    print("该三角形为直角三角形!")

鸡兔同笼

head=int(input("请输入总头数:"))
foot=1
while foot%2!=0:
    foot=int(input("请输入总脚数(必须是偶数):"))
#解方程法
r1=(foot-2*head)/2
c1=head-r1
if r1>=0 and c1>=0:
    print(str.format("方法一:鸡:{0}只,兔:{1}只",int(c1),int(r1)))
else:
    print("方法一:无解,请重新运行测试!")
#枚举法
flag=False
for c2 in range(0,head+1):
    r2=head-c2
    if 2*c2+4*r2==foot:
        print(str.format("方法二:鸡:{0}只,兔:{1}只",c2,r2))
        flag=True
        break
if not flag:
    print("方法二:无解,请重新运行测试!")

计算Pow(e,x)

x=float(input("请输入x:"))
e=1.0
m=1.0
i=1.0
while abs(pow(x,i)/m)>=0.000001:
    e+=pow(x,i)/m
    i+=1
    m*=i
print(str.format("Pow(e,x)={0:.16f}",e))

迭代法求算术平方根

import math
a=int(input("请输入整数a:"))
x=1
while abs(math.sqrt(a)-x)>=0.000001:
    x=(x+a/x)/2
print(str.format("{0}的算数平方根是{1:.16f}",a,x))

韩信点兵

print("0-1000中用3除余2,用5除余3,用7除余2的数有:")
for i in range(-1,1001):
    if i%3==2 and i%5==3 and i%7==2:
        print(i,end=" ")

小球反弹

h=50.0
sum=200.0
for i in range(2,11):
    h=h/2
    sum=sum+h*2
print(str.format("小球在第10次落地时,共经过{0}米\n第10次反弹高度为{1}米",sum,h))

吗喽吃桃

p=1
print(str.format("第8天桃子数为:{0}",p))
for i in range(7,0,-1):
    p=(p+1)*2
    print(str.format("第{0}天桃子数为:{1}",i,p))

规律数求和

import random
n=random.randint(1,10)
ans=0
now=1
for i in range(1,n+1):
    ans+=now
    now=now*10+1
print(str.format("n={0} m={1}",n,ans))

第5章 序列数据类型

如章名所示 我们要学习类似C语言中数组的数据结构 虽然和C语言语法差距比较大 但是如果你看过我在数据结构里面介绍的C++的容器的使用方法的话 相信Python的序列你也能很快上手

单词统计

第一题 我们使用与C语言一样的查询方法 方括号加下标即可

string=input("请输入字符串:")
cnt=1
for i in range(len(string)):
    if string[i]==' ':
        cnt+=1
print(str.format("单词总数为:{0}",cnt))

删除重复元素

函数append用于将一个元素加入列表尾部 类似vector里面的push_back

遍历元素可以用for i in a 类似于C++里面的for i : a

查询元素不在一个列表内可以直接写not in

输出可以直接print一整个列表 出来就是方括号括起来的形式

a=[1,1,2,3,4,4,4,5,8,8,6,8,5,6,2,3,5,7,8]
s=[]
for i in a:
    if(i not in s):
        s.append(i)
print(s)

输出列表相关值

书接上文 这一题我们就总结一下目前我们学到的遍历列表的所有方式

s=[9,7,8,3,2,1,55,6]
cnt=0
for i in s:
    cnt+=1
print("元素个数为",cnt)

m=1e9
for i in range(0,len(s)):
    m=min(m,s[i])
print("最小值为",m)

m=0
i=0
while i<len(s):
    m=max(m,s[i])
    i+=1
print("最大值为",m)

sum=0
i=len(s)-1
while i>=0:
    sum+=s[i]
    i-=1
print("和为",sum)

sum=0
i=0
while True:
    sum+=s[i]
    i+=1
    if i==len(s):
        break
sum/=len(s)
print("平均值为",sum)

偶数平方

使用我们新学的高端技术

s=[9,7,8,3,2,1,55,6]
for i in s:
    if i%2==0:
        i=i*i
print(s)

发现列表不为所动 这就说明上面的遍历的方法适用范围还是有区别的 我们这一题就要使用间接遍历的方式

s=[9,7,8,3,2,1,55,6]
for i in range(0,len(s)):
    if s[i]%2==0:
        s[i]=s[i]*s[i]
print(s)

字符串转换

s=input("请输入一个字符串:")
a=[]
for i in s:
    a.append(ord(i))
print(a)

第6章 输入和输出

虽然这章说的大部分用不到但我们还是学一下 这个不是我们一般的编译运行的方式 如果是用Pycharm的话在下面找到终端 然后输入命令"python 文件地址 输入的参数"然后才能跑起来

计算长方形周长和面积

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('--length',default=10,type=int,help='长度')
args=parser.parse_args()
area=args.length*args.length
perimiter=4*args.length
print('面积=',area)
print('周长=',perimiter)

读取输入文件并输出

import sys
filename = sys.argv[1] #原本argv[0]就是本文件名 后面就是输入的内容 具体看课本6.2.1
f=open(filename,'r',encoding='utf-8')
line_no=0
while True:
    line_no+=1
    line=f.readline()
    if line:
        print(line_no,':',line)
    else:
        break
f.close()

with读取输入文件并输出

import sys
filename=sys.argv[1]
line_no=0
with open(filename,'r',encoding='utf-8') as f:
    for line in f:
        line_no+=1
        print(line_no,':',line)
f.close()

输入输出流

import sys
n=int(sys.argv[1])
i=0
f=open('out.log','w')
sys.stdout=f
while i<=n:
    print(i,end=' ')
    print(2*i,end=' ')
    print(2**i)
    i+=1
sys.stdout=sys.__stdout__
print('done!')

第8章 函数和函数式编程

说实话 在函数这块语法和C倒是真没啥区别 就还是跟之前一样不用写数据类型而已

计算阶乘

def fact(n):
    if n==0:
        return 1
    else:
        return n * fact(n-1)

n=-1
while n<0:
    n=int(input("请输入整数n(n>=0):"))
print(n,"!=",fact(n))

斐波那契数

反而是输出格式比较难 让copilot自动生成的

def fib(n):
    if n==1 or n==2:
        return 1
    else:
        return fib(n-1)+fib(n-2)
#输出前20个斐波那契数 每十个换行 每个占五个字符 靠右对齐
for i in range(1,21):
    print("%5d" % fib(i),end="")
    if i%10==0:
        print()

自制min函数

高端的来了 Python里面我们可以这样往函数里传一大堆的数据

def min_n(a,b,*c):
    m=a if a<b else b
    for i in c:
        m=i if i<m else m
    return m
print(min_n(8,2))
print(min_n(16,1,7,4,15))

列表处理

我们的函数可以传入列表 自适应不同类型 还能返回元组!

def solve(s):
    min=s[0]
    max=s[0]
    cnt=0
    for i in s:
        if i>max:
            max=i
        if i<min:
            min=i
        cnt+=1
    return (max,min,cnt)

list=[9,7,8,3,2,1,55,6]
print("list=",list)
a,b,c=solve(list)
print("最大值=",a,",最小值=",b,",元素个数=",c)
list=['apple','pear','melon','kiwi']
print("list=",list)
a,b,c=solve(list)
print("最大值=",a,",最小值=",b,",元素个数=",c)
list="TheQuickBrownFox"
print("list=",list)
a,b,c=solve(list)
print("最大值=",a,",最小值=",b,",元素个数=",c)

第9章 面向对象的程序设计

这个其实C里面也有 但是我们高程还没用上 如果你做课设的时候copy了的话可能会见到

我个人目前浅显的理解就是自己写像我们之前STL容器内函数那样用法的高端函数

求圆和球的相关数据

class MyMath:
    #计算圆的周长面积以及球的表面积体积
    def __init__(self, r):
        self.r = r
    def get_circumference(self):
        return 2 * 3.14 * self.r
    def get_area(self):
        return 3.14 * self.r ** 2
    def get_ball_area(self):
        return 4 * 3.14 * self.r ** 2
    def get_ball_volume(self):
        return 4 / 3 * 3.14 * self.r ** 3

n=int(input("请输入半径:"))
m=MyMath(n)
print(str.format("圆的周长={0:.2f}",m.get_circumference()))
print(str.format("圆的面积={0:.2f}",m.get_area()))
print(str.format("球的表面积={0:.2f}",m.get_ball_area()))
print(str.format("球的体积={0:.2f}",m.get_ball_volume()))

温度转换

class Temperature:
    def __init__(self, org):
        self.org = org
    def ToFahrenheit(self):
        return self.org * 9 / 5 + 32
    def ToCelsius(self):
        return (self.org - 32) * 5 / 9

c=int(input("请输入摄氏温度:"))
m=Temperature(c)
print(str.format("摄氏温度={0:.1f},华氏温度={1:.1f}",c,m.ToFahrenheit()))
c=int(input("请输入华氏温度:"))
m=Temperature(c)
print(str.format("华氏温度={1:.1f},摄氏温度={0:.1f}",m.ToCelsius(),c))

第10章 模块和客户端

说起来非常高大上 其实和我们之前第6章的内容一模一样 也就没什么好多说的了

自制计算器

import sys
import math
a=int(sys.argv[1])
cmd=sys.argv[2]
b=int(sys.argv[3])
if cmd=='+':
    print("=",a+b)
elif cmd=='-':
    print("=",a-b)
elif cmd=='*':
    print("=",a*b)
elif cmd=='/':
    print("=",a/b)
elif cmd=='**':
    print("=",a**b)

求面积和体积

r=float(input("请输入半径:"))
print(str.format("圆的面积={0:.2f}",3.14*r**2))
print(str.format("球体体积={0:.2f}",4/3*3.14*r**3))

读取输入值

argv可以理解为元组 所以直接用len()就可以获取长度

import sys
cnt=len(sys.argv)
print(str.format("参数个数={0}",cnt))
for i in range(0,cnt):
    print(str.format("sys.argv[{0}]={1}",i,sys.argv[i]))

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值