计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第3、4章 选择结构、循环结构_第1页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第3、4章 选择结构、循环结构_第2页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第3、4章 选择结构、循环结构_第3页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第3、4章 选择结构、循环结构_第4页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第3、4章 选择结构、循环结构_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算与人工智能概论问题求解、科学计算与AI应用方法第三章分支结构信息科学与工程学院1任务1:合理范围内计算炮弹坐标

任务2:成绩等级评判

任务3:景点门票计算

任务4:钢筋等级与用途

任务5:成绩等级评判目录2任务1:合理范围内计算炮弹坐标任务描述第2章任务1实现了炮弹在任意输入时间t的坐标位置计算,但没有考虑时间t是否合理。例如,如果输入时间是负数或超过炮弹落地时间,根据公式计算出的纵坐标也是负数(假设是平地),这显然不合理。本次任务要求对输入时间进行限制。

任务描述:已知迫击炮发射炮弹的初速度v0=50m/s,角度

=45*

/180,重力加速度g=9.8m/s2,不考虑空气阻力和落点有效区域,利用计算机模拟建立坐标系,编写程序,计算合理范围内某一时刻炮弹的坐标值。炮弹飞行的起始时间0和落地时间tmax3任务1:合理范围内计算坐标点相关知识通过if、elseif、else等保留字提供单分支、双分支和多分支结构。

选择结构让程序能根据条件选择不同路径,这种分支控制能力正是结构化程序设计的精髓所在。让程序突破线性执行的桎梏,在条件判断的分支中展现出智能决策的能力。4任务1:合理范围内计算坐标点单分支结构5执行规则:仅当条件为真(非零值)时执行代码块,否则直接跳过。if(<条件表达式>){

//条件为真时执行的代码块}流程图:语法:单分支结构任务1:合理范围内计算坐标点单分支结构6

用途:单分支结构专为单一条件判断场景设计。

例如,任务1检查用户输入的时间t是否有效,只有t为非负数且小于等于炮弹落地时间,才计算炮弹的坐标并输出结果。if(t>=0&&t<=t_max){//计算炮弹的坐标并输出结果;}任务1:合理范围内计算坐标点单分支结构7

条件表达式支持算术、关系、逻辑运算。如:if(a==b)…if(x>0)…

任何非0和非空(null)值为true,0或者null为false。

代码块置于花括号之内,若代码块只有一条语句,可省略花括号。123注意:代码块建议统一缩进(通常4空格或1个Tab)以提高代码的可读性。4任务1:合理范围内计算坐标点单分支结构85由于浮点数在计算机中是不精确的表示,因此​​,判断一个浮点数f是否近似为零​​,应检查其绝对值是否小于一个定义的精度值(如:1e-6):​​

判断两个浮点数a和b是否近似相等​​,则应检查它们差值的绝对值是否小于精度值:if(fabs(a-b)<1e-6){//代码块}if(fabs(f)<1e-6)){//代码块}任务1:合理范围内计算坐标点双分支结构9流程图:语法:执行规则:当条件为真(非零值)时执行第一个代码块,否则执行else后的代码块。if(条件表达式){//条件为真时执行的代码块}else{//条件为假时执行的代码块}双分支结构任务1:合理范围内计算坐标点双分支结构10

用途:双分支结构专为二元条件判断场景设计。

例如,任务1检查用户输入的时间t是否有效,当t为非负数且小于等于炮弹落地时间时,计算炮弹的坐标并输出结果;否则输出错误提示信息。if(t>=0&&t<=tmax){//计算炮弹的坐标并输出结果;}else{//输出错误提示信息}任务1:合理范围内计算坐标点设计思路11

任务1:合理范围内计算坐标点代码实现12//合理范围内计算炮弹的坐标点00#include<stdio.h>01#include<math.h>02#definePI3.1415926503#defineg9.804intmain(){05doublev0=50.0;//初速度m/s06doubletheta=45.0*(PI/180.0);//角度弧度07doublet;//时间08doublex,y;//坐标值09doublet_max=(2.0*v0*sin(theta))/g;//计算炮弹的落地时间10printf("输入时间(0~%.2lf):",t_max);11scanf("%lf",&t);//获取用户输入的时间12if(t>=0&&t<=t_max){13 x=v0*cos(theta)*t;//炮弹的x坐标值14y=v0*sin(theta)*t-0.5*g*t*t;//炮弹的y坐标值15printf("炮弹在时间%.2lf秒时的坐标为:(%.2lf,%.2lf)\n",t,x,y);16}else{17printf("输入的时间不合理!\n");18}19return0;20}任务1:合理范围内计算坐标点代码分析13

以上程序用于计算炮弹在某一特定时间的坐标,并使用分支结构判断时间是否合理。

程序第9行计算炮弹落地时间tmax;第10行输出提示信息并提醒合理的时间范围0~tmax;第11行通过scanf()函数获取输入的时间,将其保存在变量t中;

第12行判断输入时间t是否在合理的范围内,如果合理则执行13~15行,计算炮弹在时间t的坐标并输出,否则执行第17行输出错误提示。任务1:合理范围内计算炮弹坐标

任务2:成绩等级评判

任务3:景点门票计算

任务4:钢筋等级与用途

任务5:成绩等级评判目录14任务2:成绩等级评判任务描述

全国计算机等级考试(NCRE)是经教育部批准,由教育部考试中心主办,面向社会,用于考查应试人员计算机应用知识与技能的全国性计算机水平测评体系。NCRE考试实行百分制计分,但以等级形式通知考生成绩。分数分为四等:100-90分为“优秀”,89-80分为“良好”,79-60分为“及格”,59-0分为"不及格"。考试成绩在“及格”以上者为通过考试,由教育部考试中心颁发合格证书。

编写程序,输入一个百分制的成绩,以等级形式显示结果。15多分支结构16流程图:语法:if(条件1){

分支1代码块

}elseif(条件2){

分支2代码块

}elseif(条件3){分支3代码块}……else{默认分支代码块

}任务2:成绩等级评判执行规则:多分支结构采用“短路求值”机制,当某个条件满足时,立即执行对应代码块并跳过剩余的判断。多分支结构多分支结构17任务2:成绩等级评判用途:多分支结构可用于区间分级判断、权限验证、游戏状态机等场景。例如,如下代码是权限验证场景:if(userLevel==ADMIN){//开放全部功能}elseif(userLevel==MANAGER){//开放管理模块}elseif(userLevel==STAFF){//开放基础功能}else{//拒绝访问}使用该结构时要注意冗余判断,避免不必要的条件判断,例如:任务2:成绩等级评判相关知识注意:1234多分支结构对条件的顺序具有敏感性,因此,高频条件应前置以提高效率。例如,先判断"score<60"比后续分数区间判断更高效。避免过度复杂的逻辑嵌套。默认分支设计。必须处理所有未明确列出的情况。//错误示范:条件2包含条件1的判断if(x>0&&x<100){...}elseif(x>0){...}//冗余判断//正确写法:if(x>=100){...}elseif(x>0){...}else{...}185将最可能执行的条件放在最前面以提高整体效率。设计思路191.百分制与等级的映射关注。根据题意,百分制分数与等第的对照关系如下:百分制成绩等级[90,100]优秀[80,90)良好[60,80)及格[0,60)不及格2.多分支结构设计。设计if-elseif-else多分支结构,按分数的区段输出结果。if(score>100||score<0)printf("错误的输入\n");//条件表达式1elseif(score>=90&&score<=100)printf("优秀\n");//条件表达式2elseif(score>=80&&score<90)printf("良好\n");//条件表达式3elseif(score>=60&&score<80)printf(“及格\n");//条件表达式4elseif(score>=0&&score<60)printf("不及格\n");//条件表达式5任务2:成绩等级评判设计思路20任务2:成绩等级评判3.多分支结构的优化。多分支结构具有“短路求值”机制,即任何一个表达式的结果为真时,将立即执行对应代码块并跳过剩余的判断。反之,任何一个表达式的结果为假时,才会执行后面的表达式。因此,当已验证前面k-1个表达式为假时,可以优化第k个表达式。例如,条件表达式1为假时,意味着score>100是不成立的,因此不需要在条件表达式2中添加score<=100;同理,条件表达式3、4也可以省略后面的那个条件。对于条件表达式5,由于表达式1不成立,score<0不成立,因此表达式5可以完全省略。多分支结构可以简化为:if(score>100||score<0)printf("错误的输入\n");//条件表达式1elseif(score>=90)printf("优秀\n");//条件表达式2elseif(score>=80)printf("良好\n");//条件表达式3elseif(score>=60)printf(“及格\n");//条件表达式4elseprintf("不及格\n");代码实现21//百分制转换成等级00#include<stdio.h>01intmain(void)02{03floatscore;04printf("请输入分数(0-100):");05scanf("%f",&score);06if(score>100||score<0)printf("错误的输入\n");//条件表达式107elseif(score>=90)printf("优秀\n");//条件表达式208elseif(score>=80)printf("良好\n");//条件表达式309elseif(score>=60)printf(“及格\n");//条件表达式410elseprintf("不及格\n");11}任务2:成绩等级评判代码分析22程序第5行通过scanf()函数接收输入的学生成绩,将其保存在变量score中;程序第6-10使用多分支结构根据输入的程序将成绩划分到不同的区间,并输出相应的等级信息,该结构利用条件表达式执行的先后次序,对结构进行了优化。任务2:成绩等级评判任务1:合理范围内计算炮弹坐标

任务2:成绩等级评判

任务3:景点门票计算

任务4:钢筋等级与用途

任务5:成绩等级评判目录23任务3:景点门票计算任务描述某旅游景点为吸引游客,旺季和淡季门票价格不同,旺季为每年5~10月份,门票不打折,而淡季门票价格是八折。无论旺季还是淡季,65岁及以上的老人免票,14岁以下的孩童半价,其余游客全价。

假设景点全票价格为100元,请编写一个景点门票计费程序,输入浏览月份和游客年龄,输出票价。24嵌套分支结构选择结构可以嵌套使用。一个选择结构的代码块中可以包含另一个选择结构。嵌套的深度没有限制。一般形式如下:if(条件表达式1){

if(条件表达式2){

代码块1;}else{

代码块2;

}}else{

if(条件表达式3){

代码块3;

}else{

代码块4;}}语法:从最内层开始,else总是与它前面最近的未曾配对的if配对。任务3:景点门票计算25相关知识需要注意if与else的配对关系。从最内层开始,else总是与它前面最近的未曾配对的if配对,除非用花括号改变其配对关系。if_else结构的嵌套层次不提倡太多,否则会影响程序的执行效率,并且容易出现判断上的漏洞,导致程序出现不正确的结果。程序的书写可按缩进对齐方式,增加程序代码的美观和可读性。养成良好的编程习惯。注意:任务3:景点门票计算26123分段函数问题任务3:景点门票计算

可用"{}"限定内嵌if语句的范围,将代码修改为:

else跟if(x>=0)配对,则所代表的分段函数为:y=0if(x>=0)if(x>0)y=1;elsey=-1;y=0if(x>=0){if(x>0)y=1;}elsey=-1;分析以下代码所表示的分段函数:因为else实际上是跟if(x>0)配对,以上代码所代表的分段函数为:

27相关知识任务3:景点门票计算嵌套分支结构通常用于需要多层次条件判断的场景。嵌套分支的核心价值在于将复杂问题分解为逐层递进的子问题,适用于逻辑依赖性强、条件间存在“先后关系”的场景。

(1)多阶段决策流程当问题需要分阶段处理,且后续阶段的判断依赖前一阶段的结果时。例如,用户登录系统时,先验证账号是否存在,若存在则继续验证密码,密码正确再判断账号状态(如是否冻结)。每一阶段的判断结果决定能否进入下一阶段,形成链式决策。代码结构如下:if(账号存在){if(密码正确){if(账号状态正常){//允许登录}}}28相关知识任务3:景点门票计算(2)条件细化与优先级当某个外层条件满足后,需对内层条件进一步细分。例如,任务3景点门票计费问题中,外层分支结构用来判断是否旺季,以决定是否八折;内层分支结构用来根据年龄计算票价。if(当前是旺季){if(是65岁及以上老人){//免票}elseif(是14岁以下){//半票}else{//全票}}else{if(是65岁及以上老人){//免票}elseif(是14岁以下){//8折后半票}else{//8折}}29设计思路30任务3:景点门票计算

可设计嵌套分支结构,外层分支处理旺季与淡季,内层分支处理年龄,实现不同季节和不同年龄段的门票价格计算。

首先,根据输入的月份,判断是旺季还是淡季。采用if-else结构完成该判断。

然后,根据输入的游客年龄,进一步判断游客是否符合优惠政策,即65岁及以上的老人免票,14岁以下的孩童半价:

(1)旺季(5~10月份)

如果游客的年龄大于等于65岁,则免票;如果游客的年龄在14岁以下,则半价;否则门票价格全价。采用if-elseif-else结构完成。

(2)淡季(11~4月份)

如果游客的年龄大于等于65岁,则免票;如果游客的年龄在14岁以下,在八折基础上半价;否则门票价格打八折。采用if-elseif-else结构完成。代码实现31//景点门票计费01#include<stdio.h>02intmain()03{04 intmonth,age;05 floatprice=100,money;06 printf("请输入游览月份:"); //输入月份07 scanf("%d",&month);08 printf("请输入游客年龄:");09 scanf("%d",&age);//输入游客的年龄10 if(month>=5&&month<=10){//判断是否旅游旺季11 if(age>=65)money=0;//判断是否65岁以上12 elseif(age<14)money=price/2;//判断是否14岁以下13 elsemoney=price;14 }else{15 if(age>=65)money=0;16elseif(age<14)money=price*0.8/2;17elsemoney=price*0.8;18}19 printf("该游客应购头门票价格为%.1f",money);20}任务3:景点门票计算代码分析32

程序根据旅游季节和游客的年龄来计算门票费用。

程序第7行输入游览月份存储到变量month中,第9行输入游客年龄存储到变量age中,景点门票单价存储到变量price中。

第10行是外层分支语句,判断月份是否在5到10之间,即month>=5&&month<=10是否成立:如果为真是旅游旺季,第11~13行根据游客的年龄进一步判断门票价格:如果游客年龄大于等于65岁(age>=65),门票价格设为0,如果游客年龄小于14岁(age<14),门票价格为一半,否则,门票价格为原价。如果月份不在5到10之间,是旅游淡季,15~17行根据游客的年龄进一步判断门票价格:如果游客年龄大于等于65岁,门票价格设为0;如果游客年龄小于14岁,门票价格为八折的一半(即price*0.8/2),否则,门票价格为原价的80%(即price*0.8)。

最后,第19行使用printf函数输出该游客应购买的门票价格money,保留一位小数。任务3:景点门票计算任务1:合理范围内计算炮弹坐标

任务2:成绩等级评判

任务3:景点门票计算

任务4:钢筋等级与用途

任务5:成绩等级评判目录33任务4:钢筋等级与用途任务描述编写程序,输入钢筋的等级,输出其对应的强度和用途。等级强度特点用途1300属于低强度钢筋,塑性好,伸长率高,便于弯折成型,容易焊接。广泛用于中、小型钢筋混凝土结构的主要受力钢筋,构件的箍筋,以及钢、木结构的拉杆等。2335强度较高,塑性较好,焊接性能理想,表面有纵筋和横肋以增强与混凝土的粘结。用于大、中型钢筋混凝土结构,如桥梁、水坝、港口工程和房屋建筑结构的主筋。3400性能与二级钢筋相似,但强度更高。适用于需要更高强度的建筑结构。4500强度最高,加入钒或钛等合金元素以提高强度和韧性。主要用于预应力混凝土板类构件及大型预应力建筑构件,如屋架、吊车梁等。钢筋等级是根据其强度、化学成分和用途进行划分的,主要用于建筑和工程结构中。下表列出的是常见的钢筋等级及其特点和用途:‌34switch分支结构

在C语言中,switch分支结构是一种基于变量或表达式的值进行多路分支选择的控制结构。

与if-else多分支结构相比,switch提供了一个更加简洁和易读的方法来处理多个条件。任务4:钢筋等级与用途35语法:switch(表达式){case常量1://代码块1break;case常量2://代码块2break;...default://默认代码块}36表达式的值必须是整型、字符型或枚举型,互不相同default是可选分支相关知识任务4:钢筋等级与用途break用于退出switch执行规则:switch分支结构首先计算表达式的值,然后按顺序匹配case常量,找到匹配项后执行对应代码块,若遇到break则退出分支结构。case标签后跟常量37相关知识任务4:钢筋等级与用途例如,学生成绩等级A对应90~100、B对应80~89、C对应70~79、D对应60~69,E对应0~60,下面的代码可以根据成绩等级输出对应的分数区间。switch(grade){case'A':printf("90~100\n");break;case'B':printf("80~89\n");break;case'C':printf("70~79\n");break;case'D':printf("60~69\n");break;case'E':printf("0~60\n");break;}38相关知识任务4:钢筋等级与用途switch与if-else的核心区别(1)结构差异switch基于单一整型/字符型表达式的值进行多分支匹配,通过case标签定义离散值分支。而if-else通过布尔表达式逐级判断,支持任意复杂条件(如范围判断、逻辑组合),灵活性更高。(2)适用场景差异switch擅长处理固定离散值的分支选择,可读性优于多层嵌套的if-else。而if-else适合动态条件或范围判断,能处理浮点运算、字符串比较等非整型条件。(3)性能差异switch结构可能在编译期优化为跳转表(JumpTable,一种编译优化技术,以case标签的值为索引直接检索出相应代码执行地址),以提高case标签的匹配效率。而if-else采用顺序判断,分支较多时效率较低,但现代编译器会优化预测分支。39相关知识任务4:钢筋等级与用途(4)使用场景差异switch更适合如下场景:菜单选择系统(如:1-添加2-删除3-修改)、状态机模式(如订单状态:待支付→已支付→已发货)、错误码处理(如服务器的状态码分类)、枚举类型处理(如文件类型PDF、DOCX、TXT)。if-else则更适合这些场景:范围判断(如:if(score>=90))、动态条件组合(if(a>0&&b<10))、需要提前返回的场景(利用elseif的短路特性)、复杂业务逻辑判断等。40设计思路任务4:钢筋等级与用途由于钢筋的等级是整数值,使用switch结构,可以提高代码可读性并获得编译器的优化加成。采用switch结构程序架构如下:上述结构中,四个标签分别处理四个等级的钢筋。default分支处理非法的输入信息,用于增强程序的健壮性。钢筋等级作为离散的整数枚举值,天然适合采用switch分支结构进行处理,这种选择反映了对问题数据特征的准确识别和匹配。switch(grade){case1://处理1级钢筋case2://处理2级钢筋case3://处理3级钢筋case4://处理4级钢筋default://异常处理}41代码实现任务4:钢筋等级与用途//钢筋等级问题00#include<stdio.h>01intmain(){02intgrade;03printf("请输入钢筋等级(1-4):");//输入提示04if(scanf("%d",&grade)!=1){//获取用户输入,验证是否为整数05printf("错误:请输入有效的数字!\n");06return1;//异常退出}08switch(grade){//使用switch语句处理不同等级09case1:10printf("等级:1\n");11printf("强度:300MPa\n");12printf("用途:广泛用于中、小型钢筋混凝土结构的主要受力钢筋,构件的箍筋,以及钢、木结构的拉杆等。\n");13break;14case2:15printf("等级:2\n");16printf("强度:335MPa\n");17printf("用途:用于大、中型钢筋混凝土结构,如桥梁、水坝、港口工程和房屋建筑结构的主筋。\n");18break;42代码实现任务4:钢筋等级与用途19case3:20printf("等级:3\n");21printf("强度:400MPa\n");22printf("用途:适用于需要更高强度的建筑结构。\n");23break;24case4:25printf("等级:4\n");26printf("强度:500MPa\n");27printf("用途:主要用于预应力混凝土板类构件及大型预应力建筑构件,如屋架、吊车梁等。\n");28break;29default:30printf("错误:无效的钢筋等级!请输入1-4之间的整数。\n");31}32return0;33}43代码分析任务4:钢筋等级与用途

以上程序是根据钢筋等级来输出对应的强度和用途。第3~7行通过键盘输入获得钢筋等级并存储在

grade

变量中,如果输入正确,scanf函数的返回值是1,程序第4行利用该返沪指判断输入的数据是否是整数,如果不是,在第5行输出提示信息并退出整个程序。

第8~31行是用switch语句实现的多分支结构,每个标签对应一种类型的钢筋,default标签用于处理非法的输入数字。任务1:合理范围内计算炮弹坐标

任务2:成绩等级评判

任务3:景点门票计算

任务4:钢筋等级与用途

任务5:成绩等级评判目录44任务5:成绩等级评判任务描述

和任务2一样,仍然是根据输入的成绩输出等级信息,但是要求用switch结构来实现。

分数分为四等,100-90分为“优秀”,89-80分为“良好”,79-60分为“及格”,59-0分为“不及格”。

编写程序,输入一个百分制的成绩,以等级的形式显示结果。45任务5:成绩等级评判case穿透switch语句中,case穿透指的是在一个case子句执行完毕后,如果没有遇到break语句,程序会继续执行下一个case子句的代码。这种特性使得多个case可以共享同一段代码,常用于处理具有连续性的多个值或需要统一处理的多个情况。例如,下面的代码在成绩等级为A、B、C、D时,会发生case穿透现象而执行case'D'的代码块输出“及格”。switch(grade){case'A'://匹配'A'之后,继续执行case'B'的代码块case'B'://匹配'B'之后,继续执行case'C'的代码块case'C'://匹配'C'之后,继续执行case'D'的代码块

case'D':printf(">60\n");break;//执行case'D'的代码块后退出switchcase'E':printf("<60\n");break;//执行case'E'的代码块后退出switch}4647任务4:根据成绩等级打印百分数段设计思路成绩成绩/10成绩等级[90,100]9,10优秀[80,90)8良好[60,80)6,7及格[0,60)0,1,2,3,4,5不及格为了满足将百分制成绩转换为等级的需求,可以利用switch语句的case穿透特性来简化代码。将分数除以10之后的结果作为switch的条件,可以发现成绩/10结果与成绩等级对应关系如下表所示:由于部分成绩等级对应多个整数,例如:优秀对应9和10,及格对应6和7,可以使用case穿透来完成。代码实现4809switch(score/10){//将分数除以10,得到十位数10case10://穿透到下一个case,继续执行11case9:12printf("优秀!\n");13break;14case8:15printf("良好\n");16break;17case7://穿透到下一个case,继续执行18case6:19printf(“及格\n");20break;21default:22printf("不及格\n");23}24return0;25}任务5:成绩等级评判//成绩等级判断(switch)00#include<stdio.h>01intmain(){02intscore;03printf("请输入分数(0-100):");04scanf("%d",&score);05if(score>100||score<0){06printf("错误的输入\n");07return1;08}代码分析49

程序第3~8行处理输入数据,若输入数据不合法输出错误提示并退出程序。

第9~23行是用switch分支结构实现的成绩等级判断,第10~13行用10和9匹配“优秀”等级,注意第10行的case由于没有break会穿透到第11行的case,因此100分和90~99分成绩都会执行第12行输出“优秀”;由于“良好”对应的成绩区间是80~89,除以10之后的结果都是8,因此第14~16行的case模块添加了break语句防止发生case穿透;由于“及格”对应的成绩区间是60~79,除以10之后的结果有两类,即6和7,因此第17~20行利用case穿透完成1到多的映射;

最后,不及格分数除以10的对应多个值(0-5),由default分支统一处理。任务5:成绩等级评判谢谢!50计算与人工智能概论问题求解、科学计算与AI应用方法第四章循环结构信息科学与工程学院51任务1:迫击炮弹运动轨迹

任务2:莱布尼兹级数求圆周率

任务3:素数判断

任务4:输出100以内的全部素数

任务5:打印等腰三角形目录52任务1:迫击炮弹运动轨迹任务描述

第3章任务1实现了对输入时间t的有效性验证。本任务继续进行改进,要求描绘炮弹在飞行期间的轨迹。具体要求如下:

已知迫击炮发射炮弹的初速度v0=50m/s,角度

=45*

/180,重力加速度g=9.8m/s2,不考虑空气阻力和落点有效区域,利用计算机模拟建立坐标系,编写程序,每隔0.1秒计算计算并输出炮弹的坐标,直至炮弹落地为止。炮弹飞行的轨迹53相关知识任务1:迫击炮弹运动轨迹

循环结构是一种程序设计结构,用于多次执行一组语句,直到某个特定条件得到满足。循环结构使得程序能够有效地重复执行相似的任务,而不必在代码中重复相同的语句。它为程序提供了灵活性和效率,使得程序能够更好地应对各种重复性任务和数据处理需求。C语言提供for循环、while循环、dowhile循环三种类型的循环结构。54for循环55for(初始化表达式;条件表达式;循环表达式){

//循环体}语法:任务1:迫击炮弹运动轨迹for循环是C语言中最常用的循环结构,特别适合处理循环次数已知的情况。for循环通过一个计数器变量来控制循环的执行过程,具有初始化、条件判断和更新三个关键部分,这三个部分都集中在循环头部,使得代码结构更加清晰。1.for循环基本语法for循环56任务1:迫击炮弹运动轨迹流程图:(1)‌初始化阶段‌。首先执行初始化表达式,通常用于设置变量的初始值,该变量被称为循环变量。初始化表达式只在循环开始时执行一次。(2)‌条件判断阶段‌。每次循环开始前,都会检查条件表达式是否为真。如果为真(非0),则执行循环体;如果为假(为0),则退出循环。通常使用循环变量构造条件表达式。(3)‌循环体执行阶段‌。执行循环体内的语句。(4)‌更新阶段‌。执行循环表达式,通常用于修改循环变量的值。(5)‌重复阶段。重复执行步骤(2)-(4)‌,直到条件表达式结果为假。for循环执行流程:for循环57任务1:迫击炮弹运动轨迹//打印1到10的数字for(inti=1;i<=10;i++){printf("%d",i);}示例:下面的代码使用for循环输出1到10之间的数字,其中的变量i是循环变量,该变量在初始表达式中初始化,参与条件表达式的判断,在循环表达式中更新。(1)‌无限循环‌for循环任务1:迫击炮弹运动轨迹2.for循环特殊用法

无限循环的for语句中没有条件表达式,因此会进入无限循环。这种循环常用于服务器监听、实时系统、嵌入式设备等需要持续运行的任务。通常结合break或return等退出机制,否则程序会陷入死循环。for(;;){//无限循环体}58(2)多变量控制‌for循环任务1:迫击炮弹运动轨迹for循环支持同时初始化和控制多个变量,适用于需要协调多个条件的复杂场景。

通过在初始表达式、条件表达式和循环表达式部分使用“逗号运算符”,可以并行管理多个循环变量(如for(inti=0,j=10;i<j;i++,j--))。for(inti=0,j=10;i<j;i++,j--){printf("i=%d,j=%d\n",i,j);}59设计思路60任务1:迫击炮弹运动轨迹1.计算炮弹落地时间tmax

炮弹落地时间在循环控制中作为循环终止条件,控制循环的次数。根据任务要求每0.1秒输出一次坐标位置,总的循环次数为10tmax+1。

2.循环控制设计‌

使用for循环来模拟炮弹的运动过程:(1)初始化。定义浮点数变量t记录炮弹发射后的时间(单位为秒),并将t作为循环变量,其初值为0。(2)条件判断。在条件表达式中判断t是否小于等于炮弹落地时间tmax。(3)执行循环体。若条件表达式结果为真,在循环体中计算并输出时刻t的炮弹坐标,否则退出循环结构。(4)更新循环变量。在循环表达式中将变量t增加0.1秒,然后转到步骤(2)。设计思路61任务1:迫击炮弹运动轨迹3.循环体设计‌

循环体中‌计算当前坐标‌,由于使用时间t作循环变量,每次执行循环体时t值是变化的,但计算公式是相同的。循环变量正确地参与任务计算是循环结构设计的重点之一。

在本任务中,循环体在不同轮次循环中执行的计算如下所示:

在for循环结构中,循环体能够自动、高效地重复执行相同的计算任务,这一点体现了计算思维中的自动化思想。第1轮:t=0;x=v0*cos(theta)*0;y=v0*sin(theta)*0-0.5*G*0*0第2轮:t=0.1;x=v0*cos(theta)*0.1;y=v0*sin(theta)*0.1-0.5*G*0.1*0.1第3轮:t=0.2;x=v0*cos(theta)*0.2;y=v0*sin(theta)*0.2-0.5*G*0.2*0.2......代码实现62//计算炮弹轨迹00#include<stdio.h>01#include<math.h>02#definePI3.1415926503#defineg9.804intmain(){05doublev0=50.0;//初速度m/s06doubletheta=45.0*(PI/180.0);//角度弧度07doublet;//时间08doublex,y;//坐标值09doublet_max=(2.0*v0*sin(theta))/g;//计算炮弹的落地时间;10for(t=0;t<=t_max;t+=0.1){11 x=v0*cos(theta)*t;//炮弹的x坐标值12y=v0*sin(theta)*t-0.5*g*t*t;//炮弹的y坐标值13printf("炮弹在时间%.2lf秒时的坐标为:(%.2lf,%.2lf)\n",t,x,y);14}15return0;16}任务1:迫击炮弹运动轨迹代码分析63

以上代码是简单的炮弹轨迹模拟程序,通过计算炮弹在不同时间点的坐标值,模拟出了炮弹的运动轨迹。

程序的输出结果如下(省略了中间的结果):

程序第7行定义了变量t,注意t有着双重身份,即是控制循环次数的循环变量,也是用于计算炮弹坐标的时间;第9行计算炮弹落地时间tmax,该变量将在条件表达式中用于控制循环结束。

第10~14的循环结构中,循环变量t在初始化表达式中初始化为0,在条件表达式中与tmax进行比较,当t小于等于tmax时,执行11~13行的循环体,计算并输出炮弹在时刻t的坐标。任务1:迫击炮弹运动轨迹炮弹在时间0.00秒时的坐标为:(0.00,0.00)炮弹在时间0.10秒时的坐标为:(3.54,3.49)炮弹在时间0.20秒时的坐标为:(7.07,6.88)......炮弹在时间7.10秒时的坐标为:(251.02,4.01)炮弹在时间7.20秒时的坐标为:(254.56,0.54)任务1:迫击炮弹运动轨迹

任务2:莱布尼兹级数求圆周率

任务3:素数判断

任务4:输出100以内的全部素数

任务5:打印等腰三角形目录64任务2:莱布尼兹级数求圆周率任务描述

祖冲之65while循环语法:while(条件表达式){//循环体(条件为真时执行)}任务2:莱布尼兹级数求圆周率661.while循环基本语法while循环是一种‌基于条件表达式‌的循环结构,适用于‌不确定循环次数‌的场景(如读取输入、动态数据遍历等)。while循环流程图:任务2:莱布尼兹级数求圆周率67while循环执行流程:(1)条件判断阶段。先判断条件表达式是否为真。如果为真(非0),则执行循环体;如果为假(为0),则退出循环。通常在while循环结构的前面定义循环变量,然后使用循环变量构造条件表达式。(2)‌循环体执行阶段‌。执行循环体内的语句,循环体中通常包含修改循环变量的代码。(3)‌重复阶段。重复执行步骤(1)-(2)‌,直到条件表达式结果为假。while循环示例:下面代码使用while循环计算1到10的和,其中的变量i是循环变量,该变量在while循环结构之前初始化为0,参与while条件表达式的判断,在循环体的最后更新。inti=1,sum=0;while(i<=10){sum+=i;i++;//必须手动更新循环变量!}printf("Sum=%d",sum);//输出55任务2:莱布尼兹级数求圆周率68while和for循环任务2:莱布尼兹级数求圆周率特性for循环while循环‌适用场景已知循环次数(如遍历数组)不确定循环次数(如输入验证)‌循环变量初始化可在for语句内初始化(inti=0)需在循环外手动初始化‌循环变量更新可在循环表达式内更新需在循环体内手动更新‌代码简洁性适合固定次数的紧凑循环适合复杂条件for循环将‌初始化、条件判断、循环变量更新‌集中在一行,适合固定次数的循环,且代码更为简洁紧凑。while循环则更加灵活,适合‌条件复杂或动态变化‌的情况。for循环与while循环的差别692.while与for循环的区别与互换‌while和for循环任务2:莱布尼兹级数求圆周率for循环和while循环是可以互换的。

步骤为:(1)将for循环的初始化表达式挪动到while循环结构之前;

(2)将for循环的条件表达式放入while循环语句中;

(3)将for循环的循环表达式放到while循环体的末尾。doublet=0;//循环变量的初始化前移while(t<=t_max){//循环语句中只有条件表达式x=v0*cos(theta)*t;//炮弹的x坐标值y=v0*sin(theta)*t-0.5*g*t*t;//炮弹的y坐标值printf("炮弹在时间%.2lf秒时的坐标为:(%.2f,%.2f)\n",t,x,y);t+=0.1;//循环表达式放到循环体末尾}任务1可以修改为如下形式:70do~while循环语法:do{//循环体}while(条件表达式);流程图:do-while循环首先执行循环体,再计算条件表达式。因此,do-while循环的循环体至少被执行一次。任务2:莱布尼兹级数求圆周率713、do-while循环

除了for循环和while循环,C语言还提供了第三种循环结构,即do-while循环。执行流程:三种循环语句三种循环结构比较:1、for循环:侧重在知道循环次数的情况下,计数循环;2、while循环:带条件的循环,先判断,再循环;3、do~while:带条件的循环,先执行,再判断,至少执行一次;4、三种循环可互相转换,可互相替换。任务2:莱布尼兹级数求圆周率72设计思路

73任务2:莱布尼兹级数求圆周率设计思路2.循环结构设计‌(1)变量初始化‌变量‌sum,用于存储部分和,初始值为0;

变量‌i‌,当前项的索引,从0开始,也是循环变量;

变量‌term‌,用于储存当前项的值,初始值为1(即a0=1);

常量‌epsilon‌,精度阈值,值为1e-8;

变量sign,用于储存当前项的符号,符号每次迭代时变成-sign。‌(2)循环条件‌

将while循环的条件表达式设置为fabs(term)>=epsilon。‌74任务2:莱布尼兹级数求圆周率设计思路

75任务2:莱布尼兹级数求圆周率代码实现76//莱布尼兹级数求圆周率00#include<stdio.h>01#include<math.h>02intmain()03{04inti=0;05doublesum=0,term=1,sign=1;06constdoubleepsilon=1e-8;07while(fabs(term)>=epsilon){08sum+=term;//累加到部分和09i++;10sign=-sign;//符号变化11term=sign/(2*i+1);//计算下一项12}13printf("%.8lf\n",sum*4);14return0;15}任务2:莱布尼兹级数求圆周率代码分析77以上程序通过使用循环来计算π的近似值。

程序第5行定义并初始化了三个重要变量,sum变量保存级数的“部分和”,term变量保存级数当前项的值,sign变量保存当前项的符号。

第7~12行是while循环结构,实现term的迭代和累加。第7行的条件表达式根据当前项term与精度epsilon的大小关系决定是否进行循环迭代,在第8行将term累加到sum;第9行更新循环变量,第10行更新符号,第11行更新当前项为下一项。

程序运行之后的结果为3.14159263,发现小数点后的7位都是正确的,因为定义的精度是1e-8,要提高输出结果的正确位数,可减小精度值(如1e-9),但减小精度值将使得循环次数增加。

可添加一个计数器count,在循环体中执行count++,运行后发现,精度为1e-6时,循环体会执行50万次,精度为1e-8时,会执行5000万次。这意味着两者之间时间上的差距达到100倍。可以修改精度值来观察输出结果以及运行时间。任务2:莱布尼兹级数求圆周率任务1:迫击炮弹运动轨迹

任务2:莱布尼兹级数求圆周率

任务3:素数判断

任务4:输出100以内的全部素数

任务5:打印等腰三角形目录78任务3:素数判断任务描述素数又叫质数,指的是大于1的整数中,只能被1和自身整除的正整数。素数具有以下特点:必须是大于1的正整数;只有两个正因子,即1和自身。最小的素数是2,素数有无穷个,如:2、3、5、7、11、13、17…素数在数论和计算机科学中扮演着重要的角色,因为它们有许多特殊的性质,例如在密码学和加密算法中的重要性,以及在质因数分解等问题上的应用。

编写程序,输入一个大于1的正整数i,判断其是否为素数,是素数输出“xxx是素数”,否则输出“xxx不是素数”,其中xxx是i的值。79循环的控制80在C语言中,break、continue和goto是用于控制程序流程的关键字。1.break语句break语句通常用于循环或switch语句中。

执行break语句后,程序将立即跳出循环结构,然后继续执行循环结构后面的代码。在嵌套循环中,break语句只结束最内层的循环。输出结果:1234for(inti=0;i<10;i++){if(i==5){break;//当i等于5时,终止循环}printf("%d\n",i);}

任务3:素数判断循环的控制812.continue语句

continue语句通常用于循环中,在执行时会跳过当前循环内continue语句后面的代码,并继续下一次循环的执行。

下面的代码中,循环变量i从0迭代到9,循环体中判断i如果能整除2则跳过当前循环执行下一次循环,此时不再执行循环体后面的输出语句,因此仅会输出1、3、5、7、9这些奇数。输出结果:13579for(inti=0;i<10;i++){if(i%2==0){continue;//当i为偶数时,跳过后面的输出语句}printf("%d\n",i);}任务3:素数判断循环的控制823.goto语句goto语句可以使程序直接跳转到代码中的标签处继续执行。goto语句通常被认为是一种不推荐使用的语句,因为goto语句经常使程序的流程变得难以理解和维护。在大多数情况下,应该避免使用goto语句。

下面的代码使用goto语句构造了一个循环,输出0~9之间的数字。inti=0;start:if(i<10){printf("%d\n",i);i++;gotostart;//跳转到标签start处继续执行}任务3:素数判断设计思路83任务3:素数判断

根据素数的定义,素数是大于1的整数中,只能被1和自身整除的正整数。因此,一个素数i不能被2~i-1之间的所有整数整除(对于2而言,2~2-1不构成有效区间)。反之,只要i能被2~i-1之间的任何一个整数整除,则判定i不是素数。基于以上分析,可以用如下步骤判断i是否为素数:(1)假设i是素数,定义变量is_prime=1;(2)设计循环结构,循环变量j从2循环到i-1;(3)在循环体中,判断i是否能被j整除,如果能整除,说明i不是素数,推翻假设,令is_prime=0,然后用break退出循环;(4)循环结束后,若is_prime的值为1,则i为素数,否则不是素数。代码实现84//素数判断00#include<stdio.h>01intmain()02{03inti;04intis_prime=1;//假设i为素数05printf("请输入一个大于1的正整数:");06scanf("%d",&i);07if(i<=1){08printf("输入错误!\n");09return1;10}11for(intj=2;j<=i/2;j++){12if(i%j==0){13is_prime=0;//如果j能整除i,则i不是素数14break;15}16}17if(is_prime){18printf("%d是素数\n",i);19}else{20printf("%d不是素数\n",i);21}22return0;23}任务3:素数判断代码分析85

程序第4行定义了变量is_prime且初值为1,用于假设i是素数;

第5~10行处理输入的正整数并检查输入是否合法;

第11~16行的循环结构用来验证假设是否正确,若假设正确,循环体中if结构的条件表达式将一直为假,不会执行if结构中的代码块,从而is_prime将一直保持其初始值1;若假设错误,当j是i的因子时,将执行if结构中的代码块,将is_prime赋值为0从而推翻假设。

第17~21行根据is_prime的结果进行相应的输出。任务3:素数判断任务1:迫击炮弹运动轨迹

任务2:莱布尼兹级数求圆周率

任务3:素数判断

任务4:输出100以内的全部素数

任务5:打印等腰三角形目录86任务4:输出100以内的全部素数

任务描述

素数的分布规律是数论的核心问题之一。素数在自然数中分布稀疏且不规则,研究素数的分布规律对密码学、算法优化和数学理论发展具有重要意义。截至2023年,计算机发现的最大素数是‌282,589,933-1,共有24,862,048位。

本任务要求以5个数字为一行,输出100以内的全部素数。87循环的嵌套88循环结构的嵌套是指在一个循环结构内部包含另一个或多个循环的结构,通常使用外层循环控制整体流程,而内层循环则处理细节。嵌套结构中,外层循环和内层循环可以是for循环,也可以是while循环或do-while循环。例如,外层循环是for循环,内层循环是while循环。for(初始化1;条件1;更新1){//外层循环while(条件2){//内层循环//循环体语句}}任务4:输出100以内的全部素数循环的嵌套89在执行嵌套循环时,外层循环首先开始执行,外层循环的每次迭代都会触发内层循环的一轮完整执行。这意味着,在外循环的每次迭代中,内循环都会被执行若干次,直到其条件不再满足。然后外层循环会继续执行,进入下一次内层循环的迭代。这个过程会一直持续,直到外层循环的条件不再满足为止。

实际中,应该谨慎使用过多层次的循环嵌套,因为过深的嵌套会导致代码难以理解和维护。任务4:输出100以内的全部素数循环的嵌套90

使用嵌套循环时,需要注意嵌套的层次,嵌套的内外层循环不能使用同名的循环变量,而并列的循环结构中可以使用同名的循环变量。

例如,下面的嵌套循环结构中,外层和内层循环分别使用不同的循环变量i和j:

下面的并列循环结构中,使用了相同的循环变量i:for(inti=1;i<=10;i++){//外层循环for(intj=0;j<i;j++){//内层循环//循环体语句}}任务4:输出100以内的全部素数for(inti=1;i<=10;i++){//循环体语句}for(inti=1;i<=15;i++){//循环体语句}设计思路91

设计一个循环结构,以i为循环变量,从2循环到99,再将任务3判断正整数i是否为素数的代码作为循环体,即可判断2~99的每一个整数是否为素数。

上述循环结构与判断素数代码的循环结构一起,构成了一个双重循环结构。

外层循环枚举了2~99之间的所有需要验证是否为素数的数字i,而内层循环则枚举i的所有可能因子j完成判断数字是否为素数的细节。具体实现步骤如下:(1)构造外层循环,循环变量i从2循环到99,外层循环枚举需要判定素数的整数;(2)构造内层循环,循环变量j从2循环到i/2,内层循环枚举i的所有可能因子;(3)内层循环的循环体通过i%j是否为0,判断i是否为素数;(4)外层循环的循环体包含整个内层循环和输出语句,输出语句在内层循环结束后根据判定结果输出素数。任务4:输出100以内的全部素数设计思路92

要实现每行显示5个素数,需要统计素数的个数。可以初始化一个计数器count=0,每找到一个素数时,输出该素数,然后令count加1。若count%5==0,则输出换行符\n,实现每行显示5个数字。任务4:输出100以内的全部素数素数问题的双重循环结构代码实现93//输出100以内的素数00#include<stdio.h>01intmain()02{03intcount=0;04for(inti=2;i<100;i++){//外循环,枚举2到99的整数05intis_prime=1;//假设i为素数06for(intj=2;j<=i/2;j++){//内循环,判断i是否为素数07if(i%j==0){08is_prime=0;//如果j能整除i,则i不是素数09break;10}11}12if(is_prime){13count++;//找到的素数数目加114printf("%-5d",i);15

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论