Python学习笔记(02)

目录

第四章  流程控制

1.顺序结构

2.选择结构

3.循环结构

4.程序实例


第四章  流程控制

1.顺序结构

(1)程序设计的面向过程思想

<1> 变量初始化(名称、个数、初始值)

<2> 输入(input() )(内容,间隔符)

<3> 处理(算法)

<4> 输出(print())(内容,格式)

(2)原则:自顶向下,逐步细化,由上到下逐条执行,清晰第一,效率第二

(3)例1:输入一个十进制数,输出二进制、八进制、十六进制

num = int(input('输入一个十进制数:'))
print('二进制为:',bin(num))
print('八进制为:',oct(num))
print('十六进制为:',hex(num))

结果:

例2:输入华氏温度,输出摄氏温度,公式为:C=5/9*(F-32)

F = int(input('输入华氏温度:'))
C=5/9*(F-32)
print('摄氏温度:%.2f'%C)

例3:键盘输入两个整数a和b,合并成一个新四位数,例如:a=54,b=12,c=5142

a = int(input('输入两位数的a:'))
b = int(input('输入两位数的b:'))
c = a//10*1000+b//10*100+a%10*10+b%10
print('c为:',c)

例4:发工资遇到一个问题,根据每个人工资总额计算钞票面值的张数,且总张数最少

15896
100:158
50:1
20:2
10:0
5:1
1:1
money = int(input('工资金额为:'))
print('100元的张数为:',money//100,'张')
print('50元的张数为:',money%100//50,'张')
print('20元的张数为;',money%100%50//20,'张')
print('10元的张数为:',money%100%50%20//10,'张')
print('5元的张数为:',money%100%50%20%10//5,'张')
print('1元的张数为:',money%100%50%20%10%5//1,'张')

例5:输入三角形边长,输出面积:
公式:

其中s=(a+b+c)/2

import math
a = int(input())
b = int(input())
c = int(input())
s = (a+b+c)/2
area = math.sqrt(s*(s-a)*(s-b)*(s-c))
print('面积为:',area)

2.选择结构

(1)单分支结构

<1> 语法:

if  表达式:
    语句块

<2> 流程图

<3> 例:输入两个数,输出最大值

a = int(input())
b = int(input())
max = a
if a<b:
    max = b
print(max)

<4> 注意:

1> 表达式:一般表达式、常量、变量、关系表达式、逻辑表达式

2> 优先级:!(非)>算数运算符>关系运算符>and和or>赋值运算符

3> 规则:逻辑表达式只检测是否为非0或非空字符串或非none就会执行对应分支

4> 分支语句的缩进

(2)双分支结构

<1> 语法:

if  表达式:
    语句块1
else:
    语句块2

<2> 流程图:

<3> 例:输入一个整数,判断奇偶数

c = int(input('请输入一个整数:'))
if c%2==1:
    print('奇数')
else:
    print('偶数')
c = int(input('请输入一个整数:'))
if c&1==1:
    print('奇数')
else:
    print('偶数')

<4> 判断一个数能被7或11整除,但不能同时被7或11整除

d = int(input('请输入一个整数'))   # 优先级:and>or
if (d%7==0 or d%11==0) and d%77!=0:
    print('yes')
else:
    print('no')

<5> 例:判断闰年:可被4整除,不能被100整除,可被400整除

year = int(input('请输入四位数年份:'))
if year%4==0 and year%100!=0 or year%400==0:
    print('此年为闰年')
else:
    print('此年是平年')

(3)多分支结构

<1> 语法1:

if  表达式1:
    语句块1:
else:
    if  表达式2:
        语句块2:
    else:
        ......
# 逻辑嵌套推荐不超过七层

<2> 语法2:

if  表达式1:
    语句块1:
elif 表达式2:
     语句块2:
elif 表达式3:
     语句块3:
...
else:
     语句块n

<3> 流程图:

<4> 例:输入三个整数,降序输出:

a = int(input())
b = int(input())
c = int(input())
if a>b:
    if a>c:
        if b>c:
            print(a,b,c)
        else:
            print(a,c,b)
    else:
        print(c,a,b)
else:
    if a>c:
        print(b,a,c)
    elif b>c:
        print(b,c,a)
    else:
        print(c,b,a)

<5> 例:输入一个百分制成绩,输出等级

m = int(input('请输入一个百分制成绩(0-100):'))
if m>100 or m<0:
    print('输入有误,请输入0-100范围内的数字')
elif m>=90:
    print('优秀')
elif 90>m>=80:
    print('良好')
elif m>=60:
    print('及格')
else:
    print('补考')

<6> 注意:

1> if  else  elif之后的冒号不能省略:

2> elif和else不能单独使用

3> 通过缩进判断是否是同一语句块

3.循环结构

(1)while循环:

<1> 格式:

while  条件表达式:
    循环体语句

<2> 流程图

(2)for循环

<1> 格式:

for  迭代变量  in 对象:
    循环体
# 数值循环:
for  迭代变量  in  range (start,end,step):
    循环体

<2> range()函数

1> Python3中内置函数,用于生成一系列连续的整数

2> start:计数起始值,省略则为0

3> end:计数终止值,不包含(开区间)。如:range(9) 表示产生0-8的整数,end参数不可省略

4> step:步长,默认为1

PS:range()函数只有一个参数时,该参数表示end,两个参数时为start和end,三个参数时最后一个为step

例:

# while循环
sum = 0  # 累加和变量
i = 1
while i<=100:
    sum = sum+i
    i+=1
print('sum=',sum)

# for循环
sum = 0
for i in range(101):
    sum+=i
print('sum=',sum)

<3> 注意

1> 循环表达值为非0时执行循环体

2> 循环区间尽量使用开区间

3> 循环嵌套时钟长循环应在内部,短循环在外部,以减少内外循环跨越次数

4> 循环嵌套应限制在3层以内,以提高理解性

4.程序实例

(1)累加和迭代

<1> 框架:

sum = 0
for i in range(终止值):
    sum = sum+新项

<2> 例:计算下列多项式的值:

sum = 0
for i in range(1,101):
    sum = sum + 1/i
print('sum = %.6f'%sum)
# sum = 5.187378

<3> 例:计算下列多项式的值:

sum = 1
num = 1
for i in range(2,101):
    num = num + i
    sum = sum + 1/num
print('sum = %.6f'%sum)
# sum = 1.980198

<5> 例:计算下列多项式的和

# 备份旧分子
# 新分子 = 旧分子 + 旧分母
# 新分母 = 备份分子
a = 3
b = 2
sum = 0
for i in range(20):
    sum = sum + a/b
    t = a
    a = a + b
    b = t
print('sum=%.6f'%sum)
# sum=32.278295

<6> 例:计算π的近似值公式

pi = 1
f = -1
i = 3
while 1/i>1e-6:
    pi = pi +1/i*f
    f = -f
    i = i+2
print('pi=%.6f'%(pi*4))
# pi=3.141591
# 多项式迭代某一项运算结果大于1e-6时说明其值需要累加,误差较大时需要继续运算,小于等于1e-6时则结束循环迭代,表明当前项数值,误差可控可以结束循环

<7> 例:用泰勒级数计算e的近似值

sum = 1
t = 1
i = 1
while 1/t>1e-6:
    t = t*i
    sum = sum + 1/t
    i += 1
print('sum=%.6f'%sum)
# sum=2.718282

<8> 例:计算a+aa+aa+aaa…aaa的值,计算前六项和,a=2

a = 2
sum = 0
for i in range(6):
    sum = sum + a
    a = a*10 + 2
print('sum = ',sum)
# sum =  246912

(2)素数判断

<1> break语句(结束循环):终止当前循环,执行循环外的下一条语句,一般与if搭配使用

例:计算r=1到r=10时的圆的面积,直到面积大于100为止

import math as a
for r in range(1,11):
    area = a.pi*r*r
    if area>100:
        break
print('r:',r,'area: is:%.6f'%area)
# r: 6 area: is:113.097336

<2> continue语句(加速循环):跳出当前次循环,继续执行下一次循环,一般与if语句搭配使用,若执行到continue语句,该语句之下的所有循环体语句将不在执行,直接跳到下一次步长迭代处

例:将100-150之间的不能被3整除的数输出,一行输出10个数

i = 0
for n in range(100,151):
    if n%3 == 0:
        continue
    print(n,end='  ')
    i+= 1
    if i%10 == 0:
        print()
# 100  101  103  104  106  107  109  110  112  113
# 115  116  118  119  121  122  124  125  127  128
# 130  131  133  134  136  137  139  140  142  143
# 145  146  148  149

<3> for-else结构:for循环执行完或者未进入循环(即for循环不是通过break语句跳出而中断的)情况下执行else。

例:找出2,3,5的最小公倍数

for i in range(1, 100):
    if i % 2 == 0 and i % 3 == 0 and i % 5 == 0:
        print('%d是2,3,5的最小公倍数' % i)
        break
else:
    print('未找到!')
# 30是2,3,5的最小公倍数
执行过程:当for循环正常执行完毕则会执行else之后的语句,若执行break异常跳出,则不会执行else语句。
(若删除break,所有公倍数都会被打印,又满足循环正常结束,则else之后的‘未找到!’也正常打印出来)

<4> 素数:只能被1和自己整除的数为素数

例:输入整数,判断是否为素数:

法一:
p = int(input('请输入一个正整数:'))
if p<2:   # 保证输入数据大于2
    print('请输入大于2的正整数!')
else:    
    for i in range(2,p):
        if p%i == 0:
            print('平数')
            break
    else:   # 循环顺利结束后执行
        print('素数')
判断的范围【2,n-1】
判断的方法【整除%】
法2:
p = int(input('请输入一个正整数:'))
i = 2
if p<2:   # 保证输入数据大于2
    print('请输入大于2的正整数!')
else:
    while p%i !=0:   # 检测结果是否为非0
        i = i+1
    if i == p:
        print('素数')
    else:
        print('平数')

法3:筛选法

(3)穷举法

<1> 在指定范围内寻找符合条件的数

<2> 框架:

for i in range(起始,终止,步长)
    if  条件表达式:
        处理

<3> 例:输出100以内的素数

for i in range(2,100):   #遍历2-99
    for j in range(2,i):
        if i%j == 0:
            break
    else:
        print(i,end='  ')  # 输出素数

<4>  例:输出200-400的非素数

for m in range(200, 400):
    for n in range(200, m):
        if m % n == 0:
            print(i, end='  ')
            break

<5> 例:输出大于s且紧随s的k个素数

s = int(input('请输入起始值:'))
k = int(input('请输入需要的素数个数:'))
i = s + 1
t = 0  # 计数器,记录找到的素数个数
while t < k:  # 当自己找到的素数个数t小于指定个数k的时候,继续寻找
    for j in range(2, i):   # 判断i是否为素数
        if i % j == 0:
            break
    else:
        t = t + 1   # 记录找到的素数个数
        print(i, end='  ')  # 输出素数
    i = i + 1  # 继续下一个数的寻找

<6> 输入100以内被9整除,余数为2的数,计算其平均值的平方根并输出

a = 0
t = 0  # 计数器
for i in range(100):
    if i % 9 == 2:  # 计算对9取余,余数为2
        print(i,end='  ')
        a = a + i  # 计算和值
        t = t + 1  # 记录个数
print('\n a=%.2f'%((a/t)**0.5))

<7> 输出水仙花数,一个三位数,每位立方和等于原值

for i in range(100,1000):
    if (i%10)**3 + (i//10%10)**3 + (i//100)**3 ==i:
        print('水仙花数:',i)

<8> 例:输出1000以内的完数,完数:因子之和等于原值,如:6==1+2+3

for i in range(6,1000):  #遍历0-999
    sum = 0  # 每判断一个i,必须先清零其因子之和
    for j in range(1,i):  # 寻找因子
        if i%j == 0:
            sum = sum + j  # 计算因子之和
    if sum==i:
        print(i,end='  ')

<9> 例:输出100以内的同构数,同构数:一个正整数出现在它的平方书的右侧则为同构数。

如:5==25  6==36  25==625

for i in range(100):
    # 100以内同构数平方后可能为2位数或者3位数
    if i==i*i%10 or i==i*i%100:
        print(i,end='  ')

<10> 例:输出200以内的回文数字

for i in range(200):
    t = 0  # 倒置后数
    m = i
    while m > 0:  #对i进行整数倒置
        t = t*10 + i%10
        m=m//10
    if t == i:
        print(i,end=' ')

(4)数学问题

<1> 例:求整数a与b的最小公倍数

# 法1:
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
i = 1
while 1:  # 循环恒真时执行下列语句
    if i % a == 0 and i % b == 0:
        print('最小公倍数:', i)
        break  # 第一次找到公倍数就跳出,保证是最小公倍数
    i = i + 1
# 法2
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
i = 0
while 1:  # 循环恒真时执行下列语句
    i += a  # i默认是a的倍数,
    if i % b == 0:
        print('最小公倍数:', i)
        break  # 第一次找到公倍数就跳出,保证是最小公倍数

<2> 例:求整数x和y的大公约数以及最小公倍数

x = int(input('请输入第一个整数:'))
y = int(input('请输入第二个整数:'))
l = x * y  # l是最小公倍数
while x % y != 0:  # 辗转相除法
    t = x % y
    x = y
    y = t
g = y  # g是最大公约数
l = l // g
print('最大公约数:', g, '最小公倍数', l)

<3> 例:在键盘输入四位数整数,转换为英文单词输出。如:1024  one zero two four

a = int(input('请输入一个四位数整数:'))
t = 1000
if a >= 1000 and a < 10000:
    while t > 0:
        if a // t % 10 == 0:
            print('zero', end='  ')
        elif a // t % 10 == 1:
            print('one', end='  ')
        elif a // t % 10 == 2:
            print('two', end='  ')
        elif a // t % 10 == 3:
            print('three', end='  ')
        elif a // t % 10 == 4:
            print('four', end='  ')
        elif a // t % 10 == 5:
            print('five', end='  ')
        elif a // t % 10 == 6:
            print('six', end='  ')
        elif a // t % 10 == 7:
            print('seven', end='  ')
        elif a // t % 10 == 8:
            print('eight', end='  ')
        elif a // t % 10 == 9:
            print('nine', end='  ')
        t = t // 10
else:
    print('您输入的数据有误')
# 整数由左向右拆分

<4> 例:fibonacci数列,古典数学问题:一对兔子,出生后第三个月都生出一对兔子,小兔子到第三个月又生出一对兔子,兔子不死,问兔子的出生规律:1 1 2 3 5 8 13……

a1 = 1
a2 = 1
for i in range(6):
    print(a1,a2,end=' ')
    a1 = a1 + a2
    a2 = a1 + a2
# fibonacci:当前项等于前两项之和

<5> 例:计算fibonacci数列中大于t的最小值,如:t = 6,输出8

a1 = 0
a2 = 1
a3 = 1
t = int(input('请输入需要的t的大小:'))
while a3 <= t:
    a1 = a2
    a2 = a3
    a3 = a1 + a2
print('大于t的fibonacci最小值为:', a3)

<6> 有一张足够大的纸,厚度为0.09mm,对折多少次后超过8848m(珠穆朗玛峰高度)

t = 0
h = 0.09e-3  # 纸的厚度,单位统一为米
while 1:
    h = h * 2  # 对折,厚度乘2
    t = t + 1  # 记录对折次数
    if h>8848:
        break
print('对折了',t,'次')

<7> 例:爱因斯坦阶梯问题,多级阶梯,每步跨2阶余1阶、跨3阶余2阶、跨5阶余4阶、跨6阶余5阶、跨7阶正好到顶。一共多少阶?

i = 7
while 1:
    if i%2==1 and i%3==2 and i%5==4 and i%6==5 :
        break
    i +=7
print('阶梯总数为:',i)  #119

<8> 例:百钱买百鸡问题。鸡翁值钱5,鸡母值钱3,鸡雏3值1钱,百钱买白鸡,鸡翁,鸡母,鸡雏各几何?

for c in range(101):
    for h in range(101):
        for ch in range(101):
            if c + h + ch ==100 and c*5 + h*3 + ch//3 == 100 and ch%3 ==0:
                print('公鸡=',c,'只','母鸡=',h,'只','小鸡=',ch,'只')

<9> 例:搬砖问题:36个人36块砖,男4女3,小孩2人1块,一次性搬完,需要各多少人?

for m in range(10):
    for w in range(14):
        for c in range(37):
            if m+w+c==36 and m*4 + w*3 + c//2 == 36 and c%2 == 0:
                print('男=',m,'人','女=',w,'人','小孩=',c,'人')

<10> 例:猴子偷桃:一天吃一半还多吃一个,第七天吃完,偷桃总数?

n = 0
for i in range(7):
    n = (n + 1) * 2
print('桃子总数:', n)

(5)打印图形

<1> 如下:

h = int(input('请输入图形高度:'))
for i in range(h):
    for j in range(0, h - i - 1):
        print(' ', end='')
    for k in range(0, 2 * i + 1):
        print('*', end='')
    print()

<2> 打印以下图形:

h = int(input('请输入图形高度:'))
for i in range(h):
    for j in range(i):
        print(' ', end='')
    for k in range( 2 *(h-i)-1 ,0, -1):
        print('*', end='')
    print()

<3> 例:打印以下图形

h = int(input('请输入图形高度:'))
for i in range(h):
    for j in range(h-i):
        print(' ',end='')
    for k in range(i+1):
        print('*',end='')
    print()

5.项目:打印指定月份的日历

(1)软件瀑布模型:自顶向下,重复分析

问题的定义:需要解决的问题是什么?

可行性分析:该软件是否可以实现,成本分析、技术分析

需求分析:需求功能的分解(重要)---软件架构师

概要设计:模块功能设计、模块规模设计、参数传递、数据库设计等

详细设计:数据结构,算法

实现:编写代码,实现功能

测试:单元测试、集成测试、功能测试、回溯测试

运行维护:上线运行、版本迭代

(2)日历软件的制作:

问题定义:用户输入年、月、日,屏幕打印日历,参照windows日历

可行性分析:yes

需求分析:

输入:年、月、日

处理:

<1> input()接收输入结果

<2> 判断闰年、判断大月、小月

<3> 大月:31天    小月:30天   二月:28  29(闰年)

<4> 判断输入月份在1-12之间

<5> 判断每月第一天是星期几:蔡勒公式

1> 蔡勒公式:判断1582年10月4日以后的任意日期是星期几  #计算每月第一天是星期几

2> w=(y%100)+(y%100//4)+(y//100//4)-(2*(y//100))+26*(m+1)+1-1

3> w是星期几的数字代号,星期一:1  星期二:2 。。。。。。。星期日:0

4> w可能为负数,需要处理为整数

5> 蔡勒公式中若为1月或2月表示为上一年的13月和14月,需要进行处理

<6> 输出一\t二\t三\t四\t五\t六\t日

<7> 根据计算的w将本月的第一天与对应的星期几对齐

<8> 输出每月的数字,间隔符是\t,逢7换行

输出

概要设计:略

详细设计:略

实现:

测试:黑盒---4组

(3)代码实现:

# y:年  m:月  d:日  w:周几  其他未控制
# 2022-10-19 1.0版本
y = int(input('请输入年份:'))
m = int(input('请输入月份:'))
t = 0  # t用于表示平年和闰年的标志位
if y % 4 == 0 and y % 100 != 0 or y % 400:
    t = 1
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12:
    d = 31  # 计算大月天数
elif m == 2 and t == 0:
    d = 28  # 计算平年2月天数
elif m == 2 and t == 1:
    d = 29  # 计算闰年2月的天数
elif m == 4 or m == 6 or m == 9 or m == 11:
    d = 30  # 计算小月天数
else:  # 保证输入月份在1-12月
    print('输入有误,请重新输入')
if m >= 1 and m <= 12:
    print('\n======', y, '年', m, '月', '======\n')
    if m == 1:
        m = 13
        y = y - 1  # 若为1月则蔡勒公式中为上一年13月
    elif m == 2:
        m = 14
        y = y - 1  # 若为1月则蔡勒公式中为上一年13月
    # 蔡勒公式
    w = (y % 100) + (y % 100 // 4) + (y // 100 // 4) - (2 * (y // 100)) + 26 * (m + 1) + 1 - 1
    w = (w % 7 + 7) % 7  # 保证w为正数
    if w == 0:  # 蔡勒公式中星期日数值为0,改为7
        w = 7
    print('一\t二\t三\t四\t五\t六\t日')
    i = 1
    while i < w:  # 将本月第一天与星期几对齐
        print('\t', end='')
        i += 1
    i = 1
    while i <= d:  # 循环输出本月的天数
        print('%2d' % i, '\t', end='')
        w = w % 7  # 逢7换行
        if w % 7 == 0:
            print()
        w = w + 1
        i = i + 1
    print('\n=========================\n')

import calendar as c
y=int(input('请输入四位数年份数字:'))
m=int(input('请输入月份数字:'))
cal = c.month(y,m)
print(cal)
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨天_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值