目录
一、实验目的与要求
二、实验内容
三、主要程序清单和程序运行结果
第1题
第2题
第3题
第4题
四、实验结果分析与体会
一、实验目的与要求
(1)通过本次实验,学生应掌握多分支语句 if …elif…else结构的用法;
(2)掌握循环语句for、while结构的用法以及跳转语句continue、break的应用;
(3)能应用print()函数和字符串的format方法控制输出内容的格式;
(4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)
二、实验内容
请使用 Python 语言在 Jupyter Notebook 环境下编程,完成下列题目的要求。
1、请编写一个成绩转换程序。每次输入一个百分制的学生成绩,成绩大于或等于90且小于或等于100的输出为“A”,成绩大于或等于80且小于90的输出为“B”,成绩大于或等于70且小于80的输出为“C”,成绩大于或等于60且小于70的输出为“D”,成绩小于60的输出为“E”。如果输入数据不合法(大于100或者小于0)时输出“data error!”。允许重复输入成绩进行转换,直接输入回车时结束程序。
2、编写程序,要求从键盘输入一个10以内的正整数n,计算并输出的结果。当输入的内容不符合要求时,提示用户重新输入,直到符合要求为止。
3、在玩数7游戏中,要求凡是数到7、7的倍数、以及带7的正整数时一律(例如7、14、27都要跳过)不允许说出来,请按这种规则输出100以内允许说出来的那些正整数,要求每行最多输出10个。
4、打印如下图所示星号图形(两个分开实现):
三、主要程序清单和程序运行结果
第1题
1、请编写一个成绩转换程序。每次输入一个百分制的学生成绩,成绩大于或等于90且小于或等于100的输出为“A”,成绩大于或等于80且小于90的输出为“B”,成绩大于或等于70且小于80的输出为“C”,成绩大于或等于60且小于70的输出为“D”,成绩小于60的输出为“E”。如果输入数据不合法(大于100或者小于0)时输出“data error!”。允许重复输入成绩进行转换,直接输入回车时结束程序。
while True:score = input("请输入成绩:")if score=="": #输入时直接回车会结束print("程序结束")breakelse: #输入不是直接回车时,需要把输入的数字字符串转换成数值score=int(score)if 90<=score<=100:print("A")elif 80<=score<90:print("B")elif 70<=score<80:print("C")elif 60<=score<70:print("D")elif 0<=score<60:print("E")else:print("Data Error!")
第2题
2、编写程序,要求从键盘输入一个10以内的正整数n,计算并输出的结果。当输入的内容不符合要求时,提示用户重新输入,直到符合要求为止。
法1:单层循环
while True:n=int(input("请输入一个正整数n(0<n<10):"))if 0<n<10:breakelse:print("输入不符合要求,请重新输入")
sum=0
item=1 #item用于保存各项的阶乘,初始化时1!=1for i in range(1,n+1):item*=i #当前项的阶乘=前项的阶乘*isum+=item print("{}!={}".format(i,item))print("前{}个正整数的阶乘之和={}".format(n,sum))
法2:两层循环
while True:n=int(input("请输入一个正整数n(0<n<10):"))if 0<n<10:breakelse:print("输入不符合要求,请重新输入")
sum=0
for i in range(1,n+1): #外层循环求阶乘的和item=1for j in range(1,i+1): #内层循环求阶乘item*=jsum+=itemprint("{}!={}".format(i,item))print("前{}个正整数的阶乘之和={}".format(n,sum))
第3题
3、在玩数7游戏中,要求凡是数到7、7的倍数、以及带7的正整数时一律(例如7、14、27都要跳过)不允许说出来,请按这种规则输出100以内允许说出来的那些正整数,要求每行最多输出10个。
法1:使用求余数(%)和求商运算(//)表达判断条件
num=0 #num用于控制每行输出的数字个数,num等于10的倍数就需要换行显示
for i in range (1,101):#下面语句中i%7==0表示能整除7的数,i%10==7表示个位是7的数,i//10==7表示十位是7的数 if i%7==0 or i%10==7 or i//10==7: continueelse:print(i,end=" ")num+=1if num%10==0:print()
print("满足要求的数字共有{}个".format(num))
法2:使用求余数(%)和字符串类型转换以及成员运算(in)表达判断条件
num=0 #num用于控制每行输出的数字个数,num等于10的倍数就需要换行显示
for i in range (1,101):#下面语句中i%7==0表示能整除7的数, "7" in str(i)判断字符"7"是否包含在数值i转换产生的字符串中 if i%7==0 or "7" in str(i): continueelse:print(i,end=" ")num+=1if num%10==0:print()
print("满足要求的数字共有{}个".format(num))
第4题
4、打印如下图所示星号图形(两个分开实现):
法1:巧妙利用居中对齐进行显示
#显示菱形,使用字符串的format方法进行居中
for i in range(0,4):print("{: ^7}".format("*"*(2*i+1)))
for i in range(0,3):print("{: ^7}".format("*"*(5-2*i)))print()
#显示菱形,使用字符串的center方法进行居中,该方法的原型是:str.center(width[, fillchar])
for i in range(0,4):print(("*"*(2*i+1)).center(7," "))
for i in range(0,3):print(("*"*(5-2*i)).center(7," "))
#显示三角形,使用字符串的format方法进行居中
for i in range(1,9):if i==8: #输出最后一行的多个星号print('*'*(2*i-1))elif i==1: #居中输出第一行的1个星号print('{:^15}'.format('*'))else: #居中输出中间行的多个星号print('{:^15}'.format('*'+' '*(2*i-3)+'*'))
法2:使用空格字符填充最左侧星号出现的左侧空白区域
#显示菱形
#先输出菱形的上4行:
for i in range(1,5):space_num=4-i #发现上部的规律:每行左侧的空格数(space_num)=4减去每行的星数(star_num),star_num=2*i-1 #发现上部的规律:每行的星数(star_num)=循环控制变量i的值乘以2再减去1for j in range(1,space_num+1):print(' ',end='')for k in range(1,star_num+1):print('*',end='')print()
#再输出菱形的下3行:
for i in range(1,4):space_num=i #发现下部的规律:每行左侧的空格数(space_num)=循环控制变量i的值减去1,star_num=7-i-space_num #发现下部的规律:每行的星数(star_num)+每行左侧的空格数(space_num)+循环控制变量i的值=常数7 for j in range(1,space_num+1):print(' ',end='')for k in range(1,star_num+1):print('*',end='')print()
提示:菱形中每行左侧的空格、每行星号个数与行号的关系如下
上面4行的行号i | 每行左侧的空格数space_num | 每行的星号数star_num | i与space_num的关系 | i与star_num的关系 |
---|---|---|---|---|
1 | 3 | 1 | i+space_num=4 | star_num=2*i-1 |
2 | 2 | 3 | ||
3 | 1 | 5 | ||
4 | 0 | 7 |
下面3行的行号i | 每行左侧的空格数space_num | 每行的星号数star_num | i与space_num的关系 | i与star_num的关系 |
---|---|---|---|---|
1 | 1 | 5 | space_num=i | i+space_num+star_num=7 |
2 | 2 | 3 | ||
3 | 3 | 1 |
for i in range(1,9): left_space=8-i #left_space表示每行最左边的星号左侧的空格数left_star=1 #left_star表示每行最左侧的星号个数#mid_num表示每行最左侧星号和最右侧星号之间的字符个数mid_num=(i-1)*2-1 if i>1 else 0 #注意:三目运算中表达式只能作为左值,右值不能出现赋值表达式#right_star表示每行最右侧的星号个数right_star=1 if i>1 else 0#mid_char表示每行最左侧星号和最右侧星号之间的字符种类,除第8行是星号填充外,其他行都是空格填充mid_char=' 'if i!=8 else '*'#每行由左侧空格、最左边星号、中间字符和最右边星号四部分构成line=" "*left_space+"*"*left_star+mid_char*mid_num+"*"*right_star print(line)
提示:三角形中的每行可看成由左侧空格、最左边星号、中间字符和最右边星号四部分构成
每行的行号i | 每行最左侧的星号左边的空格数left_space | 每行最左侧的星号个数left_star | 每行最左侧星号和最右侧星号之间的字符个数mid_num | 每行最右侧的星号个数right_star |
---|---|---|---|---|
1 | 7 | 1 | 0 | 0 |
2 | 6 | 1 | 1 | 1 |
3 | 5 | 1 | 3 | 1 |
4 | 4 | 1 | 5 | 1 |
第i行 | 8-i | 1 | (i-1)*2-1 | 1 |
8 | 0 | 1 | 13 | 1 |
可见:
除了第1行的mid_num和right_star外,上述4个变量都具有统一的规律;
另外,除了第8行的最左侧星号和最右侧星号中间的字符是用星号填充外,其他行的中间字符都是空格;
这些例外情况都可以通过两分支的三目运算符来简洁的表达。
四、实验结果分析与体会
通过本次流程控制结构实验,掌握了多分支语句 if…elif…else结构的用法,分支条件嵌套语句的使用,并了解了循环语句for、while结构的用法和跳转语句continue、break的应用,能应用print()函数和字符串的format方法控制输出字符图形。For循环用来遍历集合,通过不使用下标的方式来实现对集合中每一个元素的访问,此外,在while循环中,代码块的程序会一直执行,直到循环条件为0或False。但这里需要注意的是,若是循环条件一直为True,则程序无法跳出循环,称为死循环,必要时需要break跳出循环。使用continue语句,我们可以停止循环当前迭代,并继续下一个;使用break语句,即使while条件为真,我们也可以停止循环。