Python程序设计(二)
04分支结构
1.除法
正常计算结果为一个实数,当用户输入b为0时输出"除零错误"
#计算a除以b,结果保留2位小数
a = eval(input())
b = eval(input())
if b != 0:
print(round(a/b,2))
else:
print('除零错误')
2.计算平方根
import math
a = input()
for i in a:
if a.isalpha()==True:
print("请输入正确的参数。")
break
elif 'a'<= i <='z'or'A'<= i <='Z':
print("请输入正确的参数。")
break
else:
b = math.sqrt(eval(a))
print("{0}的平方根为{1:.2f}。".format(a,b))
break
#楼主发现 如 12ss 此类 '数字+字母'的字符不能检测,来帮帮lz呀
3.温度划分
根据用户输入的温度值(例如:C23.5),系统输出对应的温度等级。 温度等级的划分如下:
温度 <= 0度:寒冷
0 < 温度 <= 10度:冷
10< 温度 <= 20度:凉爽
a = input()
for i in a:
if i[0]!='C':
print("请输入正确的温度值。")
break
a = eval(a[1:])
if a<=0:
print("寒冷")
break
elif 0 < a <= 10:
print("冷")
break
elif 10 < a <= 20:
print("凉爽")
break
4.回文判断
回文例如:“上海自来水来自海上”。
用户输入一个字符串,编写程序判断该字符串是否为回文。
如果是回文,显示“True”,否则显示“False”。
x= input()
#方法一
a,b = len(x),len(x)
q = 0
for i in range(a):
if x[i] == x[a-1]:
a-= 1
q+= 1
if q == b:
print("True")
else:
print("False")
#方法
a = len(x)
i = 0
count = 1
while i <= a//2:
if x[i] == x[a-i-1]:
count =1
i+= 1
else:
count = 0
break
if count == 1:
print('True')
else:
print("False")
#方法三 字符串顺序逆序核对
if x[::] == x[::-1]:
print("True")
else:
print("False")
5.二分法求平方根
设计一个用二分法计算一个大于或等于 1 的实数 n 的平方根的函数sqrt_binary(n),计算精度控制在计算结果的平方与输入的误差不大于1e-6。【不了解二分法的童鞋可以参考:二分法求平方根详细讲解】
import math
def sqrt_binary(num):
low, high= 0,num
while True:
x = (high + low)/2
if abs(x**2 - num)<=1e-6:
return x
elif x**2 - num<0:
low = x
else:
high = x
num = float(input())
if num >=0:
print(sqrt_binary(num))
print(math.sqrt(num))
else:
print('请输入一个非负数!')
6. 温度转换【★】
温度的刻画有两个不同体系:摄氏度(Celsius)和华氏度(Fabrenheit)。转换算法如下:(C表示摄氏度、F表示华氏度)
C = ( F - 32 ) / 1.8
F = C * 1.8 + 32
要求如下:
(1) 输入输出的摄氏度采用大写字母C开头,温度可以是整数或小数,如:C12.34指摄氏度12.34度;
(2) 输入输出的华氏度采用大写字母F开头,温度可以是整数或小数,如:F87.65指摄氏度87.65度;
(3) 不考虑异常输入的问题,输出保留小数点后两位;
temp = input("")
if temp[0] in ['f','F']:
C = (eval(temp[1:]) - 32)/1.8
print("C{:.2f}".format(C))
elif temp[0] in ['C','c']:
F = 1.8*eval(temp[1:]) + 32
print("F{:.2f}".format(F))
05选择,循环结构
1.求最大值
输入整数的个数N,再依次输入N个整数,找出其中的最大值并输出。如果N<=0,则输出“ERROR”
x = eval(input())
if x <= 0:
print("ERROR")
else:
a = eval(input())
x -=1
while x > 0:
b = eval(input())
a= max(a,b)
x-= 1
print("max={}".format(a))
2.象限判断+异常处理
象限(Quadrant)是平面直角坐标系(笛卡尔坐标系)中里的横轴和纵轴所划分的四个区域,每一个区域叫做一个象限。象限以原点为中心,x,y轴为分界线。右上的称为第一象限,左上的称为第二象限,左下的称为第三象限,右下的称为第四象限。
坐标轴上的点不属于任何象限。
依次输入坐标值(x,y),输出坐标的象限(Q1,Q2,Q3,Q4)。如果坐标位于坐标轴上,则直接输出x与y的值。
用户可以多次输入,直到输入任意一个字母时停止,系统输出“EXIT”(本题测试暂不考虑输入其他符号的情况)
tips: x.isalpha()可以判断x是否是字符,函数返回逻辑值True或False。
a = 1
while a == 1:
try:
x, y = eval(input()), eval(input())
if x > 0 and y > 0:
print("Q1")
a = 1
elif x<0 and y >0:
print("Q2")
a = 1
elif x<0 and y <0:
print("Q3")
a = 1
elif x>0 and y <0:
print("Q4")
a = 1
else:
print("x={}\ny={}".format(x,y))
a = 1
except:
print("EXIT")
i = 0
break
3.统计字符
用户从键盘输入一个字符串,系统分别统计其中中文字符、英文字符、数字、空格和其他字符的个数。
提示:
(1)中文字符的范围是在 u’\u4e00’ 到 u’\u9fa5’ 之间(包含)
(2)是否是英文字符,可以运用str.isalpha()进行判断。
x = input()
a,b,c,d,e = 0,0,0,0,0
for i in x:
if i >='\u4e00' and i<='\u9fa5':
a +=1
elif (i>='a' and i<='z')or (i>='A' and i<='Z'):
b +=1
elif i>='0' and i<='9':
c +=1
elif i == ' ':
d +=1
else: e +=1
print('您输入的字符串中有:{}个空格,{}个数字,{}个中文字符,{}个英文字符,{}个其他字符。'.format(d,c,a,b,e))
4.猜数游戏(太大太小刚刚好)
让计算机随机产生一个预设数字,范围落在0-30之间,让用户通过键盘输入所猜想的数。如此循环,直至猜到该数,显示“预测N次,你猜中了!”,其中N是用户输入数字的次数。
#猜数youxi
import random
n =0
x = random.randint(0,30)
y = eval(input('请输入一个数字!\n'))
while x!=y:
if x>y:
print('遗憾,太小了!')
elif x<y:
print('遗憾,太大了!')
y = eval(input())
n +=1
print('预测{}次,你猜中了!'.format(n))
5.异常捕捉【※】
用户在第一行输入一串连续的数字number,中间没有分割。例如:“1234566”。
用户在第二行输入两个整数,用逗号分隔:
第1个数字loc表示从上述一串连续的数字获取第loc个数字(loc从0开始)。
第2个数字div表示上述数字被div除。
系统计算 number[loc]/div 的结果(保留小数点后2位),并显示。例如:1/5 = 0.20。
注意处理异常情况:
(1)如果被0整除,系统提示:“除0错误。”
(2)如果loc超出了number的长度,系统提示:“索引下标超出范围。”
(3)其他错误,系统提示:“出错了。”
如果没有错误,最后系统显示“赞!运行正确,没有错误。”
try:
number = input()
loc,div = eval(input())
result = eval(number[loc])/div
print("{}/{} = {:.2f}".format(eval(number[loc]),div,result))
except ZeroDivisionError:
print("除0错误。")
except IndexError:
print("索引下标超出范围。")
except:
print("出错了。")
else:
print("赞!运行正确,没有错误。")
6.棋盘放米
达依尔回答说:“国王只要在国际象棋的棋盘第1个格子里放一粒麦子,第2个格子里放两粒,第3个格子里放四粒,第4个格子里放八粒…按此比例以后每一格加一倍,一直放到64格(国际象棋棋盘是8×8=64格),我就感恩不尽,其他的我什么也不要了。”
国王想:“这有多少,还不容易!”让人扛来一袋小麦,但不到一会儿全用没了,再来一袋很快又没有了,结果全印度的粮食全部用完还不够…
国王纳闷,怎样也算不清这笔账…
请你编写程序帮国王计算一下,共需多少粒麦子?
#棋盘64格,第一格1粒米,第二格2粒米,第三格4粒米…放满64格要多少米?
#2^0 + 2^1 + 2^2 + ......+2^63 = ?
#方法1:
sum = 0
for i in range(64):
t = 2**i
sum = sum + t
print(sum)
#方法2:
print(sum([2**i for i in range(64)]))
#方法3
alist = []
for i in range(64):
alist.append(2**i)
print(sum(alist))
7.Collatz猜想
Collatz猜想也叫3n+1猜想,给一个正整数,如果是偶数,则减半;如果是奇数,则变为它的三倍加一。直到变为1停止。猜想对于所有正整数经过足够多次变换最终达到1。
x = eval(input())
while x!=1:
if x % 2==0:
x /=2
else:
x = 3*x+1
print('{:.1f}'.format(x))
06函数
1.对指定r计算圆的面积(补全代码)
def getCircleArea(r):
if r >= 0:
pi = 3.1415926
s = pi*r*r
return s
n=int(input())
if n >= 0:
for i in range(n):
r=float(input())
print('{:.3f}'.format(getCircleArea(r)))#调用getCircleArea并打印结果
print('END.')
2.计算三维空间某点距离原点的欧式距离(补全代码)
欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义。
请定义为:三维空间里点a和b的坐标如果分别为a(x1,y1,z1)、b(x2,y2,z2),则a和b的距离的计算机公式是
编写函数distance计算两点的欧式距离,并输出(保留小数点后两位)
import math
def distance(a,b,c):
d = math.sqrt(a*a + b*b + c*c)
return d
x,y,z=input().split(",")
d=distance(float(x),float(y),float(z)) #调用distance函数
print("这个点与原点的距离为{:.2f}。".format(d)) #输出距离值,保留两位小数
3.质数判断
def isPrime(x):
if x <= 3 and x >= 1:
return True
else:
#y = int(math.sqrt(x))
for i in range(2,x):
if (x % i == 0):
return False
else:
return True
num=int(input()) #读入并转换为整数类型
if isPrime(num): #调用isPrime函数判断num是否为素数
print('yes')
else:
print('no')
4. 统计字符次数
def count_letter(s,c):
count = 0
for i in s:
if i == c:
count +=1
return count
string=input()#读入字符串
char=input()#读入字符
print(count_letter(string,char)) #调用count_letter函数统计char在string中出现的次数
5.七段数码管
import turtle
import datetime
def drawgap():#提笔向前5步数码管间隔
turtle.penup()
turtle.fd(5)
def drawline(draw):#单端数码管
drawgap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawgap()
turtle.right(90)
def drawdigit(d):#根据数字绘制七段数码管
drawline(True) if d in [2,3,4,5,6,8,9] else drawline(False)
drawline(True) if d in [0,1,3,4,5,6,7,8,9] else drawline(False)
drawline(True) if d in [0,2,3,4,5,6,8,9] else drawline(False)
drawline(True) if d in [2,0,6,8] else drawline(False)
turtle.left(90)
drawline(True) if d in [0,4,5,6,8,9] else drawline(False)
drawline(True) if d in [0,2,3,7,5,6,8,9] else drawline(False)
drawline(True) if d in [0,1,2,3,4,7,8,9] else drawline(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawdate(date):
turtle.pencolor('red')
for i in date:#绘制下标年月日
if i == '-':
turtle.write('年',font=('Arial',18,'normal'))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=('Arial',18,'normal'))
turtle.pencolor("green")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=('Arial',18,'normal'))
else:
drawdigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-350)
turtle.pensize(5)
drawdigit('2019-11=11+')
#(datetime.datetime.now().strftime('%Y-%m=%d+'))
turtle.hideturtle()
main()
6.兔子问题
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。
假如兔子都不死,用户输入一个月份数,计算并在一行内输出该月的兔子总对数以及前一个月与该月兔子数量的比值,比值结果保留小数点后3位,数字间用空格分隔。
# 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
def fibonacci(n):
if n==1 or n==2:
return 1
else:
return(fibonacci(n-1)+fibonacci(n-2))
m=int(input())
print("{} {:.3f}".format(fibonacci(m),fibonacci(m-1)/fibonacci(m)))
7.合法括号生成
给定括号的个数n,编写程序生成所有格式正确的括号组合
def f(oput, first, last, iput):
if first == iput and last == iput:
ls.append(oput)
else:
if first < iput:
f(oput + "(", first + 1, last, iput)
if last < first:
f(oput + ")", first, last + 1, iput)
ls = []
n = eval(input(""))
f("", 0, 0, n)
print(ls)