版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AI生成AI生成第4章循环语句共6个课时
[理论课]L6while循环教学课题while循环基础语法;循环控制(break、continue);计数循环模式;累加/累乘模式;经典案例(棋盘麦粒、冰雹猜想);死循环的识别与避免教学对象师范专业本科生(零基础)教学时数2学时(90分钟)对应教材第4章§4.1循环语句(while循环基础与进阶)教学目标•理解循环的概念和必要性——为什么需要让程序重复执行•掌握while循环的语法结构和工作原理•掌握循环三要素:初始化、条件判断、更新("计数器"模式)•掌握break和continue的使用场景和区别•能够运用while循环实现累加、累乘、计数等常见模式•通过棋盘麦粒案例,理解指数增长和while循环的计算威力•通过冰雹猜想案例,体验while循环在未知次数循环中的应用•能够识别死循环并掌握避免方法教学重点与难点重点•while循环的语法结构和执行流程•循环三要素的完整性和正确性•累加器模式的编写•break和continue的用法难点•循环条件的设计——什么时候继续、什么时候停止•循环变量的更新——忘记更新导致死循环•冰雹猜想中循环终止条件的确定性•大数计算(棋盘麦粒)与数据类型的关系教学过程
温故导入:程序的"重复"能力(约10分钟)
提出问题:如果要输出1到100的数字,用print()写100行?太笨了!如果要让石头剪刀布玩10轮?代码怎么写?引出"循环"概念——让计算机自动重复执行一段代码。展示"顺序执行vs循环执行"的对比,让学生直观感受循环的威力。
while循环基础语法(约18分钟)
(1)语法结构:讲解while循环的语法:while条件:循环体。强调条件为True时执行循环体,条件为False时退出循环。用流程图展示执行逻辑。
(2)循环三要素:初始化(在循环前设置初始值)、条件(每次循环前判断)、更新(循环体内改变影响条件的变量)。用"数到10"的例子逐行分析三要素。
(3)死循环警告:如果忘记更新循环变量,条件永远为True,程序会陷入"死循环"。演示Ctrl+C中断方法。
(4)基础练习:编写输出1-10、求1到100的和两个基础程序。
累加器模式与计数循环(约15分钟)
(1)累加器模式:定义一个变量sum_val=0作为累加器,在循环中不断sum_val+=i。这是最基本也是最重要的循环模式。
(2)求和案例:1到100求和、1到N求和(N由用户输入)。验证高斯公式1+2+...+100=5050。
(3)累乘模式:求N的阶乘(N!)。用product=1作为累乘器的初始值(注意不是0!)。
break与continue(约15分钟)
(1)break:立即跳出整个循环。案例:输入密码,正确则break退出,错误则继续输入(最多3次机会)。
(2)continue:跳过本次循环的剩余部分,直接进入下一次循环。案例:输出1-20中的所有奇数(遇到偶数continue跳过)。
(3)对比与选择:break是"彻底退出",continue是"跳过这次"。通过流程图对比帮助学生理解区别。强调:break和continue是辅助控制手段,不应滥用。
经典案例1:棋盘麦粒问题(约15分钟)
(1)故事引入:古印度国王与棋手的传说——第1格放1粒麦子,第2格放2粒,第3格放4粒……每格翻倍,放满64格。国王以为没多少麦子,结果全印度的麦子都不够。
(2)数学分析:第n格的麦粒数为2^(n-1),总麦粒数为2^0+2^1+...+2^63=2^64-1。
(3)代码实现:用while循环逐格累加,输出每格的麦粒数和累计总数。到第64格时,展示这个天文数字。
(4)教育意义:指数增长的威力——让学生感受数学与编程结合的魅力。
经典案例2:冰雹猜想(约12分钟)
(1)猜想规则:任选一个正整数n,如果n是偶数则n=n/2,如果n是奇数则n=3n+1。重复这个过程,猜想最终都会到达1。
(2)编程实现:用while循环实现——循环条件是n!=1(还没到1就继续)。注意:这里循环次数未知,正是while循环的优势场景。
(3)验证与探索:取n=27(最著名的案例),观察变化序列的长度。这个猜想至今未被数学证明,用程序可以快速验证大量数字。
课堂总结与作业布置(约5分钟)
总结:while循环用于重复执行,三要素缺一不可;累加/累乘是常见模式;break和continue是辅助手段。预告下节课学习for循环——当循环次数已知时更方便的循环方式。
代码示例#while循环基础:输出1到10
i=1#初始化
whilei<=10:#条件
print(i,end="")
i+=1#更新
print()
#累加器:求1到100的和
sum_val=0
i=1
whilei<=100:
sum_val+=i
i+=1
print(f"1到100的和={sum_val}")#5050
#棋盘麦粒问题
grain=1#当前格的麦粒数
total=0#累计麦粒总数
square=1#格子编号
whilesquare<=64:
total+=grain
print(f"第{square}格:{grain}粒,累计:{total}粒")
grain*=2
square+=1
print(f"总计:{total}粒麦子")
#冰雹猜想
n=int(input("请输入一个正整数:"))
steps=0
whilen!=1:
ifn%2==0:
n=n//2
else:
n=3*n+1
steps+=1
print(f"经过{steps}步到达1")课堂练习1.编写程序:用while循环计算1+3+5+...+99(奇数之和)。2.编写程序:输入一个正整数N,计算N的阶乘N!(如5!=120)。注意累乘器的初始值。3.编写程序:模拟猜数字游戏——程序随机生成1-100的整数,用户反复猜测,程序提示"大了"或"小了",直到猜对为止。用while循环和break实现。课后作业1.用while循环编写"数字倒序"程序:输入一个正整数(如12345),输出其倒序数(54321)。提示:利用//和%逐位分离。2.验证冰雹猜想:编写程序,对1到100的所有正整数验证冰雹猜想,找出需要步数最多的那个数(步数最多的起始值)。3.编写"斐波那契数列"程序:输出斐波那契数列的前20项(1,1,2,3,5,8,13,...),每一项等于前两项之和。教学反思
教学提示:循环是编程教学的一大难点,学生容易出现"忘记更新循环变量导致死循环"的错误。建议在课堂上故意展示死循环的效果,让学生体验Ctrl+C的中断操作——这种"犯错体验"比单纯讲解印象深刻。累加器模式是循环编程的基石,要确保每个学生都能独立写出"1到N求和"的程序。棋盘麦粒问题将数学之美与编程之力完美结合,是激发兴趣的绝佳案例。冰雹猜想展示了"循环次数未知"时while循环的优势,也为后续学习for循环做了铺垫。
──────────────────────────────────────────────────[理论课]L7for循环与range()教学课题for循环语法;range()函数的多种用法(一参数、二参数、三参数);for与while的选择;经典案例(数列求和、圆周率估算、蒙特卡洛方法、质数判断)教学对象师范专业本科生(零基础)教学时数2学时(90分钟)对应教材第4章§4.2循环语句(for循环与range())教学目标•掌握for循环的语法结构和工作原理•深入理解range()函数:range(n)、range(start,stop)、range(start,stop,step)•能够根据需要选择for循环或while循环•掌握for循环实现数列求和(等差数列、等比数列)•通过蒙特卡洛方法估算圆周率,体验随机模拟的编程思想•掌握质数判断的算法及其for循环实现•理解嵌套for循环(两层)的基本结构和执行过程教学重点与难点重点•for循环语法及range()的三种用法•for循环与while循环的对比选择•数列求和的编程实现•质数判断算法难点•range()的"左闭右开"区间•蒙特卡洛方法的理解——随机采样估算确定量•质数判断中的优化(只需检查到sqrt(n))•for循环嵌套时内外层循环变量的关系教学过程
温故导入:while循环的局限(约8分钟)
回顾上节课while循环的用法。提出问题:如果知道要循环的确切次数(比如循环100次),while循环需要手动管理计数器变量,略显繁琐。有没有更方便的方式?引出for循环和range()——"让Python替你数数"。
for循环与range()函数(约20分钟)
(1)for循环语法:for变量in可迭代对象:循环体。解释:for循环依次取出可迭代对象中的每个元素,赋值给变量,然后执行循环体。
(2)range()函数——三种形式:
•range(n):生成0,1,2,...,n-1(共n个数)
•range(start,stop):生成start,start+1,...,stop-1
•range(start,stop,step):以step为步长,从start到stop-1
(3)"左闭右开"原则:强调range(1,10)生成的是1到9而非1到10!这是初学者最常犯的错误。通过list(range(10))和list(range(1,10))直观验证。
(4)倒序与步长:range(10,0,-1)生成10到1(倒序),range(0,10,2)生成偶数序列。
for循环遍历字符串(约8分钟)
演示for循环直接遍历字符串:forchin"Hello":print(ch)。说明for循环不仅可以配合range(),还能遍历字符串、列表等可迭代对象。为后续学习数据结构做铺垫。
案例1:数列求和(约12分钟)
(1)等差数列求和:用for循环实现1到N求和。对比while版本的代码量,体会for循环在"已知次数"场景下的简洁优势。
(2)等比数列求和:1+2+4+8+...+2^n(共n+1项)。用变量记录当前项的值,每次乘2。
(3)自定义数列:输入起始值、步长和项数,求任意等差数列的和。
案例2:蒙特卡洛方法估算圆周率(约17分钟)
(1)方法原理:在一个正方形内画一个内切圆,随机撒点。落在圆内的点的比例近似等于圆面积与正方形面积的比=π/4。因此π≈4x(圆内点数/总点数)。
(2)算法分析:生成大量随机坐标(x,y)(x和y在0到1之间),判断x²+y²<=1(是否在单位圆内),统计比例。
(3)代码实现:使用for循环生成N个随机点(importrandom;random.random()生成0到1的随机数),计算圆周率估计值。演示N=1000、N=10000、N=100000时精度的提升。
(4)学科融合:蒙特卡洛方法是计算数学、物理、金融等领域的重要方法,体现编程的跨学科价值。
案例3:质数判断(约15分钟)
(1)质数定义:大于1的自然数,除了1和它本身外没有其他因数。
(2)基本算法:对于n,检查2到n-1是否有人能整除n。如果有则不是质数,如果都没有则是质数。
(3)优化算法:只需检查2到√n即可。因为如果n有因子大于√n,那么它必然也有一个因子小于√n。用int(n**0.5)+1作为循环上限。
(4)代码实现:编写is_prime()判断函数(虽然函数要到第6章才详细学,此处可先以普通代码块实现),输入一个数判断是否为质数。用break优化:一旦发现因子就立即break退出循环。
forvswhile对比与总结(约10分钟)
(1)选择指南:循环次数已知→for循环;循环次数未知、由条件决定→while循环。
(2)等价转换:展示同一个"求和"任务用for和while两种写法,让学生看到它们可以互相转换。
(3)课堂总结:range()是for循环的最佳搭档;蒙特卡洛方法展示了编程的跨学科应用;质数判断展示了算法优化思维。预告下节课:循环嵌套——循环里面还有循环。
代码示例#range()的三种用法
print(list(range(5)))#[0,1,2,3,4]
print(list(range(1,10)))#[1,2,3,4,5,6,7,8,9]
print(list(range(0,10,2)))#[0,2,4,6,8]
print(list(range(10,0,-1)))#[10,9,8,7,6,5,4,3,2,1]
#for循环求1到N的和
n=100
sum_val=0
foriinrange(1,n+1):#注意n+1因为左闭右开
sum_val+=i
print(f"1+2+...+{n}={sum_val}")#5050
#蒙特卡洛方法估算圆周率
importrandom
n=100000#随机点数量
count=0
foriinrange(n):
x=random.random()
y=random.random()
ifx**2+y**2<=1:
count+=1
pi=4*count/n
print(f"圆周率估计值:{pi:.6f}")
#质数判断(优化版)
num=int(input("请输入一个正整数:"))
is_prime=True
ifnum<2:
is_prime=False
else:
foriinrange(2,int(num**0.5)+1):
ifnum%i==0:
is_prime=False
break
ifis_prime:
print(f"{num}是质数")
else:
print(f"{num}不是质数")课堂练习1.使用for循环和range(),输出1到100中所有能被7整除的数。2.编写程序:用for循环计算1!+2!+3!+...+10!(阶乘之和)。3.修改蒙特卡洛程序:尝试不同的随机点数量(100、1000、10000、100000),观察圆周率估计值的精度变化,记录结果。课后作业1.编写程序:输入一个正整数N,输出2到N之间所有的质数(用for循环嵌套实现——外层遍历2到N,内层判断是否为质数)。2.编写程序:用for循环计算莱布尼茨公式π/4=1-1/3+1/5-1/7+...的前10000项,估算圆周率。与蒙特卡洛结果对比。3.编写"九九乘法表"程序:用嵌套for循环输出标准的九九乘法表格式(为下节课循环嵌套做预习)。教学反思
教学提示:range()的"左闭右开"是初学者的痛点,建议在课堂上用list()可视化多次演示。蒙特卡洛案例涉及概率论知识,对于师范生而言这是一个优秀的跨学科案例——展示编程如何帮助理解数学概念。质数判断的优化(检查到sqrt(n))是"算法思维"的启蒙,虽然数学证明不需要展开,但用实例验证(如判断17是否为质数,只需检查2到4)能有效说服学生。建议提醒学生:for循环也可以使用break和continue,用法与while循环完全相同。
──────────────────────────────────────────────────[理论课]L8循环嵌套教学课题循环嵌套的基本结构;字符三角形图案输出;九九乘法表;嵌套循环求100以内质数;循环嵌套的执行顺序与效率意识教学对象师范专业本科生(零基础)教学时数2学时(90分钟)对应教材第4章§4.3循环语句(循环嵌套)教学目标•理解循环嵌套的概念——一个循环体内包含另一个完整循环•掌握嵌套for循环的执行顺序:外层每执行一次,内层执行完整一轮•能够使用嵌套循环输出各种字符图案(直角三角形、等腰三角形、倒三角形等)•能够使用嵌套for循环实现九九乘法表•能够使用嵌套循环结合质数判断算法找出100以内所有质数•初步建立"算法效率"意识:嵌套循环的执行次数与时间复杂度的关系教学重点与难点重点•嵌套for循环的语法结构和执行顺序•字符图案的算法分析(行号与输出字符数的关系)•九九乘法表的实现(内层循环上限与外层变量的关系)•100以内质数的筛选难点•嵌套循环的执行顺序理解("内层跑完一轮,外层才走一步")•图案输出中"空格+星号"的数量关系分析•内层循环范围依赖外层循环变量的模式•循环效率的概念(N²次运算的含义)教学过程
温故导入:单层循环的局限(约8分钟)
回顾for循环输出1到10的代码。提出问题:如果要输出10行,每行分别有1到10个星号怎么办?单层循环只能控制"行"或"列"中的一个维度。要同时控制行列两个维度,就需要"循环嵌套"——循环里面套循环。类比:时钟的时分针——分针转一圈(内层),时针走一格(外层)。
嵌套循环结构与执行顺序(约15分钟)
(1)语法结构:展示双层嵌套for循环的语法。强调内层循环是外层循环体的一部分,缩进要多一层。
(2)执行顺序详解:用"展开法"演示执行过程:外层变量i=1时,内层变量j从1走到5;然后i=2,内层j又从1走到5……用表格或动画直观展示。
(3)简单验证:编写一个嵌套循环输出所有(i,j)组合,如(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)...,让学生亲眼看到执行顺序。
(4)关键理解:"内层跑完一轮,外层才走一步"——用这句话帮助记忆执行顺序。
案例1:字符直角三角形(约15分钟)
(1)需求分析:输出n行三角形图案,第i行有i个星号。
•直角三角形(左对齐):第1行1个*,第2行2个*,...
•倒三角形:第1行n个*,第2行n-1个*,...
(2)算法分析:关键发现——第i行的星号数量等于i(或n-i+1)。因此内层循环的range范围要依赖于外层循环变量i。
(3)代码实现:逐步构建——先输出所有行都是5个*的矩形(内层range固定),再修改为三角形(内层range依赖外层i)。
(4)拓展:等腰三角形:分析空格数与星号数的关系。第i行有(n-i)个空格和(2i-1)个星号。
案例2:九九乘法表(约15分钟)
(1)目标格式:展示标准九九乘法表的输出格式(阶梯状)。
(2)结构分析:外层循环控制行号i(1到9),内层循环控制列号j(1到i,注意上限是i而非9,形成阶梯状)。
(3)输出格式:用f-strings控制对齐:f"{j}x{i}={i*j}",用end="\t"实现制表符分隔。
(4)代码实现:编写完整的九九乘法表程序。运行后展示效果。讨论为什么内层循环是range(1,i+1)而非range(1,10)。
案例3:100以内质数(约15分钟)
(1)算法回顾:回顾上节课的质数判断方法(检查2到√n)。
(2)嵌套结构:外层循环遍历2到100的每个数n,内层循环检查n是否能被2到√n之间的数整除。
(3)代码实现:编写完整程序,输出2到100的所有质数。使用标志变量或for-else结构判断是否为质数。
(4)验证结果:2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97(共25个)。
(5)效率意识:说明这个嵌套循环大约执行了多少次运算,引入"时间复杂度"的初步概念(O(n√n)),让学生意识到算法效率的重要性。
综合拓展与课堂总结(约12分钟)
(1)嵌套层数:理论上可以嵌套任意多层,但实际编程中通常不超过3层。嵌套越深,代码越难读,效率越低。
(2)for-else结构:简要介绍Python特有的for-else语法——如果for循环正常结束(没有被break中断),则执行else块。用质数判断案例演示其简洁性。
(3)前8周回顾:从变量、运算、条件到循环,我们已经掌握了Python编程的核心基础。第9周起将进入数据结构(列表、字典等)的学习,为编写更复杂的程序打下基础。
(4)阶段展望:鼓励学生回顾自己的进步,从"HelloWorld"到循环嵌套,编程能力已有质的飞跃。
课堂练习(约10分钟)
在课堂上完成以下练习,教师巡回指导。
练习1:输出一个由数字组成的直角三角形(第1行输出1,第2行输出12,第3行输出123,以此类推,共5行)。
练习2:输出一个菱形图案(提示:上半部分是递增的等腰三角形,下半部分是递减的倒三角形,可用两个嵌套循环分别实现)。
代码示例#字符直角三角形
n=5
foriinrange(1,n+1):#外层:第i行
forjinrange(i):#内层:输出i个星号
print("*",end="")
print()#换行
#等腰三角形
n=5
foriinrange(1,n+1):
spaces=""*(n-i)#n-i个空格
stars="*"*(2*i-1)#2i-1个星号
print(spaces+stars)
#九九乘法表
foriinrange(1,10):#行
forjinrange(1,i+1):#列,上限随行号变化
print(f"{j}x{i}={i*j}",end="\t")
print()
#100以内质数
forninrange(2,101):#外层:遍历2到100
is_prime=True
foriinrange(2,int(n**0.5)+1):#内层:检查因子
ifn%i==0:
is_prime=False
break
ifis_prime:
print(n,end="")
print()
#for-else版本质数判断(Python特色)
forninrange(2,101):
foriinrange(2,int(n**0.5)+1):
ifn%i==0:
break#发现因子,跳出内层for
else:#for正常结束(没被break),说明是质数
print(n,end="")课堂练习1.编写程序输出"数字三角形":第1行输出"1",第2行输出"12",第3行输出"123",第4行输出"1234",第5行输出"12345"。2.编写程序输出倒直角三角形:第1行5个*,第2行4个*,...,第5行1个*。3.修改九九乘法表,使其输出一个"下三角"格式(即第i行从ix1到ix9)。课后作业1.编写"空心正方形"程序:输入边长n,输出n*n的空心正方形(只有边框是*,内部是空格)。2.编写"数字金字塔"程序:输出5层金字塔,每层数字递增1,居中对齐。效果如下:
1
22
333
4444
555553.编写程序找出1000以内的所有"完全数"(完全数等于其所有真因子之和,如6=1+2+3,28=1+2+4+7+14)。需要嵌套循环:外层遍历数,内层找因子。教学反思
教学提示:循环嵌套是前8周中最抽象的内容。学生最大的困难是理解"内层循环范围依赖于外层变量"这一模式。建议先用固定范围的矩形图案热身,再逐步引入依赖关系。等腰三角形的空格计算是难点中的难点,可以在黑板上画表格辅助分析(行号ivs空格数vs星号数)。九九乘法表是综合运用for嵌套和f-strings格式化的经典案例,建议让学生先手动写出期望的输出格式,再思考代码如何实现。for-else是Python特有语法,简单介绍即可,不必作为考试重点。完成本课后,建议安排一次阶段性测验,检验前8周的学习效果。
──────────────────────────────────────────────────[实践课]P6while循环程序设计实践课题while循环的基本语法与执行流程、循环控制(break/continue)、累加累乘算法、冰雹猜想验证教学对象师范专业本科生(零基础)教学时数2学时(90分钟)实践环境计算机机房,预装Python3.x实践目标•掌握while循环的语法结构,理解"条件为真则循环"的执行逻辑•掌握循环变量的初始化、更新和终止条件设计,避免死循环•熟练运用break和continue控制循环流程•能用while循环实现累加、累乘、计数等基本算法•通过冰雹猜想案例,体会循环在数学问题验证中的应用实践内容与步骤
while循环基础:倒计时程序(约15分钟)
编写脚本countdown.py:
#倒计时程序
n=int(input("请输入一个正整数:"))
whilen>0:
print(n)
n=n-1
print("发射!")
(1)运行程序,输入10,观察输出。
(2)讨论:如果去掉n=n-1这一行,会发生什么?(死循环!)
(3)教师用流程图演示while循环的执行过程。
(4)教师强调:while循环三要素——初始化、条件判断、变量更新。
累加算法:1到N求和(约15分钟)
#计算1+2+3+...+N
n=int(input("请输入N:"))
total=0#累加器,初始值为0
i=1#计数器,从1开始
whilei<=n:
total=total+i
i=i+1
print(f"1+2+3+...+{n}={total}")
#验证公式:N*(N+1)/2
print(f"公式验证:{n}*{n+1}/2={n*(n+1)//2}")
(1)运行程序,输入不同的N值,验证结果与高斯公式一致。
(2)讨论:累加器的初始值为什么是0而不是1?计数器i在循环结束后值是多少?
(3)类比推导:如果要算累乘(1×2×3×...×N),累乘器初始值应该设为多少?
break与continue:猜数字游戏增强版(约15分钟)
importrandom
target=random.randint(1,100)
print("我想了一个1-100的数字,你来猜!")
count=0#猜测次数计数
whileTrue:#无限循环
guess=int(input("你的猜测:"))
count=count+1
ifguess==target:
print(f"恭喜!你用了{count}次猜对了!")
break#猜对后退出循环
elifguess<target:
print("太小了,再大一点!")
else:
print("太大了,再小一点!")
(1)运行程序,体验猜数字过程。
(2)讨论:whileTrue和break的搭配使用场景。
(3)思考:continue的作用是什么?如果把break换成continue会怎样?
核心案例:冰雹猜想验证(约25分钟)
教师讲解冰雹猜想(Collatz猜想):
任选一个正整数n,若n为偶数则除以2,若n为奇数则乘3加1,反复操作,最终都会变为1。
#冰雹猜想(Collatz猜想)验证器
n=int(input("请输入一个正整数:"))
original=n#保存原始值
steps=0#步数计数器
max_val=n#记录过程中出现的最大值
print(f"从{n}开始的冰雹序列:")
print(n,end="")
whilen!=1:
ifn%2==0:#偶数:除以2
n=n//2
else:#奇数:乘3加1
n=n*3+1
print(n,end="")
steps=steps+1
ifn>max_val:
max_val=n
print(f"\n共经过{steps}步到达1")
print(f"过程中最大值为{max_val}")
(1)分别输入27、7、100验证程序,观察序列长度和最大值。
(2)n=27是著名的"长序列"案例,共需111步。
(3)讨论:为什么这个猜想至今未被证明?程序能否"证明"猜想?
循环嵌套初探:多层while(约10分钟)
#使用while循环打印星号三角形
rows=int(input("请输入行数:"))
i=1
whilei<=rows:
print("*"*i)
i=i+1
(1)运行程序,输入5,观察输出。
(2)教师预告:下一节课将学习for循环和更复杂的循环嵌套。
任务实战与总结(约10分钟)
(1)独立完成实践任务书。
(2)教师总结:while循环三要素、break/continue的使用、累加器模式。
(3)强调:避免死循环的关键——确保循环变量在循环体内被正确更新。
实践任务书
任务:数字位数分解器
编写一个程序,输入一个正整数,使用while循环逐位分解并输出每一位数字及其位数(从高到低)。
例如输入12345,输出:第1位是1,第2位是2,...,第5位是5。
要求:
使用while循环实现逐位分解
不能使用字符串处理(即将数字视为整数而非文本)
先计算该数字是几位数,再从最高位开始输出每一位
输出格式整齐美观
参考代码#数字位数分解器
num=int(input("请输入一个正整数:"))
original=num
#先计算位数
temp=num
digits=0
whiletemp>0:
digits=digits+1
temp=temp//10
print(f"{original}是一个{digits}位数")
print("-"*20)
#从最高位开始输出每一位
whilenum>0:
divisor=10**(digits-1)
digit=num//divisor
print(f"第{digits-digits+1}位:{digit}")
num=num%divisor
digits=digits-1
#更清晰的写法
num=original
position=1
#计算最高位的除数
highest=1
whilehighest*10<=num:
highest=highest*10
whilehighest>0:
digit=num//highest
print(f"第{position}位:{digit}")
num=num%highest
highest=highest//10
position=position+1评价标准评价维度优秀(90-100)良好(75-89)合格(60-74)while语法循环三要素完整,无死循环,逻辑正确能编写基本while循环在指导下编写while循环break/continue能灵活运用break和continue控制流程能使用break退出循环了解break的基本用法算法设计位数分解逻辑清晰,先算位数再逐位提取能实现基本功能在指导下完成冰雹猜想程序正确,输出清晰,有步数和最大值统计能完成基本冰雹序列输出在指导下完成冰雹程序拓展挑战
编写一个"猜数字游戏增强版":增加提示"非常接近"(差值在5以内)和"天差地远"(差值超过50)的功能,并限制最多猜7次。如果7次内没猜对,游戏失败并公布答案。提示:使用while循环加计数器,结合多个if-elif条件判断距离。
──────────────────────────────────────────────────[实践课]P7for循环与数值计算实践课题for循环语法、range()函数详解、蒙特卡洛方法估算圆周率教学对象师范专业本科生(零基础)教学时数2学时(90分钟)实践环境计算机机房,预装Python3.x实践目标•掌握for循环的语法结构,理解"遍历可迭代对象"的执行机制•熟练使用range()函数生成各种整数序列:range(n)、range(start,stop)、range(start,stop,step)•能使用for循环实现累加、查找、统计等常见算法•了解蒙特卡洛方法的基本思想,能用随机模拟估算圆周率•对比for循环与while循环,理解各自的适用场景实践内容与步骤
for循环基础与range()函数(约15分钟)
(1)在交互模式中依次尝试:
>>>foriinrange(5):
...print(i,end="")
...
01234
>>>foriinrange(1,6):
...print(i,end="")
...
12345
>>>foriinrange(0,10,2):
...print(i,end="")
...
02468
>>>foriinrange(10,0,-1):
...print(i,end="")
...
10987654321
(2)讨论:range()产生的序列是否包含终点值?步长为负数时起点和终点的关系是什么?
(3)尝试list(range(5)),理解range返回的是一个序列对象。
for循环实现常见算法(约15分钟)
(1)累加:1到100的奇数之和
#1到100的奇数之和
total=0
foriinrange(1,101,2):#步长为2,直接取奇数
total=total+i
print(f"1到100的奇数之和:{total}")
(2)累乘:N的阶乘
#计算N的阶乘
n=int(input("请输入N:"))
factorial=1
foriinrange(1,n+1):
factorial=factorial*i
print(f"{n}!={factorial}")
(3)统计:1到1000中有多少个3的倍数
#统计3的倍数的个数
count=0
foriinrange(1,1001):
ifi%3==0:
count=count+1
print(f"1到1000中3的倍数有{count}个")
for循环遍历字符串(约10分钟)
#遍历字符串中的每个字符
word=input("请输入一个单词:")
forcharinword:
print(char)
#统计元音字母个数
vowels="aeiouAEIOU"
count=0
forcharinword:
ifcharinvowels:
count=count+1
print(f"元音字母共{count}个")
(1)理解:for循环不仅可以遍历range,还可以遍历字符串、列表等。
(2)讨论:charinvowels这种写法的含义。
蒙特卡洛方法估算圆周率(约30分钟)
教师讲解原理:
在一个边长为2的正方形内画一个半径为1的内切圆。随机向正方形内撒点,
点落入圆内的概率=圆面积/正方形面积=pi/4。
因此pi≈4×(圆内点数/总点数)。
importrandom
#蒙特卡洛方法估算圆周率
n=int(input("请输入模拟次数(推荐100000):"))
inside=0#落在圆内的点数
foriinrange(n):
x=random.random()*2-1#生成-1到1之间的随机x坐标
y=random.random()*2-1#生成-1到1之间的随机y坐标
ifx**2+y**2<=1:#判断是否在单位圆内
inside=inside+1
pi_estimate=4*inside/n
print(f"模拟{n}次后估算的圆周率:{pi_estimate:.6f}")
print(f"Pythonmath.pi的值:3.141593")
print(f"误差:{abs(pi_estimate-3.14159265):.6f}")
(1)分别用100、1000、10000、100000、1000000次运行,观察精度变化。
(2)讨论:为什么模拟次数越多,结果越接近真实值?这就是"大数定律"。
(3)教师引导思考蒙特卡洛方法的思想:用随机模拟解决确定性问题。
for与while对比与选择(约10分钟)
(1)教师引导学生对比同一问题的两种写法:
用while计算1到100的和vs用for计算1到100的和
(2)总结选择原则:
已知循环次数→优先用for
循环次数不确定→优先用while
遍历序列中的元素→用for
满足条件才停止→用while
(3)强调:两种循环可以互相转换,但选择合适的会让代码更清晰。
任务实战与总结(约10分钟)
(1)独立完成实践任务书。
(2)教师巡视指导,重点关注range()的参数和蒙特卡洛模拟的理解。
(3)总结:for循环、range()三参数形式、蒙特卡洛方法思想。
实践任务书
任务:自然常数e的蒙特卡洛估算
利用蒙特卡洛方法估算自然常数e。方法:生成N个[0,1]区间的均匀随机数,将它们相乘,重复M次实验,取所有乘积的平均值,则e≈1/平均值。
要求:
使用for循环实现外层实验循环和内层乘积循环(循环嵌套)
使用random.random()生成[0,1)区间的随机数
实验次数M=1000,每次实验生成N=100个随机数
输出估算值,并与math.e(约2.718282)对比
包含详细的中文注释解释蒙特卡洛估算原理
参考代码importrandom
#蒙特卡洛方法估算自然常数e
#原理:N个[0,1]均匀随机数乘积的均值趋近于1/e
#因此e≈1/(所有乘积的均值)
M=int(input("请输入实验次数M(推荐1000):"))
N=int(input("请输入每次实验的随机数个数N(推荐100):"))
sum_of_products=0.0
forexpinrange(M):
product=1.0
foriinrange(N):
product=product*random.random()
sum_of_products=sum_of_products+product
average=sum_of_products/M
e_estimate=1.0/average
print(f"\n进行{M}次实验,每次{N}个随机数")
print(f"估算的e值:{e_estimate:.6f}")
print(f"真实e值:2.718282")
print(f"误差:{abs(e_estimate-2.718282):.6f}")评价标准评价维度优秀(90-100)良好(75-89)合格(60-74)for循环熟练使用for循环和range()各种形式能使用基本for循环和range(n)能编写简单for循环range()函数能灵活使用三参数形式,理解步长正负能使用start和stop参数能使用单参数range(n)蒙特卡洛理解原理,程序正确,能分析精度与次数关系能完成蒙特卡洛模拟程序在指导下完成模拟程序循环嵌套能正确设计内外循环变量,逻辑清晰能实现基本嵌套循环在指导下实现嵌套循环拓展挑战
用蒙特卡洛方法估算定积分f(x)=x^2在[0,1]区间的值(真实值为1/3)。原理:在[0,1]×[0,1]的正方形内随机撒点,曲线y=x^2下方的点数/总点数≈定积分值。思考:这种方法能估算哪些函数的定积分?
──────────────────────────────────────────────────[实践课]P8循环嵌套综合应用实践课题循环嵌套程序设计、九九乘法表打印、质数筛选(埃拉托斯特尼筛法)、图案打印教学对象师范专业本科生(零基础)教学时数2学时(90分钟)实践环境计算机机房,预装Python3.x实践目标•掌握循环嵌套的基本结构,理解内外层循环的执行顺序•能使用嵌套循环打印九九乘法表等规则图案•掌握质数判断的算法,能用嵌套循环筛选指定范围内的质数•了解埃拉托斯特尼筛法的思想和实现方法•综合运用前7次课所学知识(变量、运算符、条件判断、循环)解决复杂问题实践内容与步骤
循环嵌套基础:矩形星号图案(约10分钟)
#打印rows行cols列的星号矩形
rows=int(input("请输入行数:"))
cols=int(input("请输入列数:"))
foriinrange(rows):#外层循环控制行
forjinrange(cols):#内层循环控制列
print("*",end="")
print()#每行结束后换行
(1)运行程序,输入4和6,观察输出。
(2)教师用表格演示:外层循环每执行1次,内层循环执行完整的cols次。
(3)思考:如果将print()(换行)去掉或放到内层循环中,会怎样?
直角三角形图案(约10分钟)
#左对齐直角三角形
n=int(input("请输入行数:"))
foriinrange(1,n+1):
forjinrange(i):#内层循环次数=当前行号
print("*",end="")
print()
#倒三角形
foriinrange(n,0,-1):
print("*"*i)
(1)分别运行两个图案,理解内层循环次数如何随行号变化。
(2)讨论:如何打印居中的等腰三角形?(提示:每行前面加空格)
九九乘法表(约20分钟)
#九九乘法表
print("=====九九乘法表=====")
foriinrange(1,10):#外层:被乘数1-9
forjinrange(1,i+1):#内层:乘数1到i
print(f"{j}×{i}={i*j:2d}",end="")
print()#每行换行
(1)运行程序,观察输出格式。
(2)讨论:为什么内层循环是range(1,i+1)而不是range(1,10)?
(3)教师逐步讲解执行过程:i=1时j走1次,i=2时j走2次,...,i=9时j走9次。
(4)尝试改为"全表"(9×9完整表,而非阶梯形):内层改为range(1,10)。
质数判断与筛选(约20分钟)
(1)先实现质数判断函数思路(尚未学函数,用循环实现):
#判断一个数是否为质数
n=int(input("请输入一个正整数(≥2):"))
is_prime=True#先假设是质数
foriinrange(2,n):#试除2到n-1
ifn%i==0:#如果能整除,则不是质数
is_prime=False
break#找到一个因子即可停止
ifis_prime:
print(f"{n}是质数")
else:
print(f"{n}不是质数")
(2)优化:只需试除到int(n**0.5)(即n的平方根)即可。
(3)扩展:筛选2到100之间的所有质数:
#筛选2-100之间的所有质数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 角磨机安全知识测试题及答案
- 期货实习报告总结
- 有机无机面试高频问题和答案
- 统考课试题及答案
- 职高plc试题及答案
- 2025届七台河市勃利县四年级数学第二学期期末教学质量检测试题含答案解析
- 2026年初中物理电磁学综合测试题
- 2026年四川省北师大版高二地理选择性必修综合练习题
- 2026年金融投资决策与风险控制测试卷
- 2026年重庆市湘教版初中化学下册第7章能力提升测试卷
- 2025年医疗保障局职位遴选模拟题及答案解析
- 神木煤炭核心指标解析
- 《那么旧那样新》(2024年江苏常州中考满分作文26篇附审题指导)
- 2025年眼镜定配工(高级)理论知识培训题库(含答案)
- 实验室生物安全管理年度工作计划
- 外研版2019高中英语必修一单词表
- 污水处理厂智能控制系统-深度研究
- 土石方机械设备安全培训
- 混凝土结构与砌体结构高职完整全套教学课件
- NB/T 11446-2023煤矿连采连充技术要求
- GB/T 13077-2024铝合金无缝气瓶定期检验与评定
评论
0/150
提交评论