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

下载本文档

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

文档简介

计算与人工智能概论问题求解、科学计算与AI应用方法第二章简单问题求解信息科学与工程学院1任务1:计算炮弹坐标点

任务2:闰年判断

任务3:编制密码

任务4:计算复杂表达式目录2任务1:计算炮弹坐标点任务描述

迫击炮是一种间接火力武器,通常被设计为便携式、轻型的炮兵武器。它们的主要特点是射程相对较短,发射角度相对较高,弹道呈弯曲的抛物线状。迫击炮是靠变换装药和改变射角调控射程的。最小射程有的仅46米,最大射程可达8千米。

假设迫击炮发射炮弹的初速度v0=50m/s,重力加速度g=9.8m/s2,角度

=45*

/180,不考虑空气阻力和落点有效区域,编写程序,计算某时刻炮弹的坐标点,结果精确到小数点后2位。3任务1:计算炮弹坐标点Dev-C++编程环境采用Dev-C++作为代码的编辑器与编译器,Dev-C++是一款免费的C/C++集成开发环境(IDE),特别适合编程初学者使用。

具有如下特点:轻量级(安装包仅约50MB)、界面简洁直观、学习曲线平缓、内置代码编辑器与编译器以及调试器、支持多种编译器(GCC、MinGW等)、完全免费且开源。4任务1:计算炮弹坐标点Dev-C++编程环境安装步骤:(1)下载安装包访问官方下载地址:/projects/orwelldevcpp/,选择最新版本(如Dev-C++5.11)下载,文件名为Dev-Cpp-5.11-TDM-GCC-4.9.2-Setup.exe。(2)运行安装程序双击下载的安装文件,选择安装语言,点击"IAgree"接受许可协议,然后选择安装组件(保持默认全选即可),再选择安装位置(默认安装路径为C:\ProgramFiles(x86)\Dev-Cpp)。(3)完成安装

点击"Install"开始安装,完成后勾选"RunDev-C++"选项,点击"Finish"完成。5任务1:计算炮弹坐标点Dev-C++编程环境Dev-C++主界面菜单栏‌‌工具栏项目管理窗口‌‌代码编辑区状态栏‌编译日志窗口‌6任务1:计算炮弹坐标点Dev-C++编程环境创建第一个程序(1)新建源代码文件:

点击菜单栏的"文件"->"新建"->"源代码"(或快捷键Ctrl+N),

点击“文件”->“保存”或“另存为”(或快捷键Ctrl+S)->输入带有.c或.cpp(C语言或C++语言)的文件名(如“main.c”或“hello.cpp”),选择好路径后点击“保存”

。(2)编写代码并编译运行:在‌代码编辑区输入代码,可直接选择"运行"菜单->"编译运行"(或快捷键F11),系统会自动完成编译并在成功后运行程序。7数据类型与计算思维任务1:计算炮弹坐标点1.整数类型使用计算机求解问题,首先要将信息编码为二进制信息。信息编码可分为两大类,即数值性信息编码和非数值性信息编码。数值性信息编码通常对整数和小数分别采用定点数编码和浮点数编码。

用定点数表示整数时,小数点的位置固定不动。

例如,一个8位的二进制整数10010011,其对应的十进制数为1*20+1*21+1*24+1*27=147。

为了表达负数,使用最高二进制位作为符号位,同时,出于简化CPU设计的考虑(使用加法代替减法),使用补码表达负数。在补码方式下,正数保持不变,负数将最高位置1,将数值的二进制进行反转(1变成0、0变成1)然后再加1。有符号数减法转化为加法的过程例如,计算5-1时,将其转化为加法5+(-1),00000101与11111111之和为九位二进制数100000100,忽略最高位产生的进位后,结果为00000100,即十进制数4。8数据类型与计算思维任务1:计算炮弹坐标点数据类型存储大小有符号数值范围无符号数值范围短整型(short)通常占用2个字节(16位)-32,768(-215)到32,767(215-1)0到65535(216-1)整型(int,long)通常占4个字节(32位)-2,147,483,648(-231)到2,147,483,647(231-1)0到4294967295(232-1)长长整型(longlong)通常占8个字节(64位)-9,223,372,036,854,775,808(-263)到9,223,372,036,854,775,807(263-1)0到18,446,744,073,709,551,615(264-1)

在C语言中,根据不同的位长,整数类型通常有16位的short、32位的int和long(注:本书设定long为32位),以及64位的longlong,不同整数类型的可表达数值范围是不同的。对于无符号整数,使用unsigned关键字来修饰整数类型,例如,32位无符号整数的类型是unsignedint或unsignedlong。

注意:整型的存储大小和值范围可能会随着系统和编译器的不同而有所变化。C语言的整数类型9数据类型与计算思维任务1:计算炮弹坐标点整型常量:

可以用十进制、二进制、八进制和十六进制来表示。十进制整数常量:这是最常见的表示方式intdecInt=10;//十进制整数常量二进制整数常量:以0b开头intbinInt=0b1010;//二进制整数常量,等于十进制的10八进制整数常量:以数字0开头表示intoctInt=0O12;//八进制整数常量,等于十进制的10十六进制整数常量:以0x或0X开头表示inthexInt=0xA;//十六进制整数常量,等于十进制的10补充:可以使用sizeof操作符来获取特定类型的数据在内存中占用的字节数。printf("Sizeofint:%dbytes\n",sizeof(int));/*输出int类型的字节数*/printf("Sizeofshort:%dbytes\n",sizeof(short));//输出short类型的字节数printf("Sizeoflong:%dbytes\n",sizeof(long));printf("Sizeoflonglong:%dbytes\n",sizeof(longlong));10数据类型与计算思维任务1:计算炮弹坐标点

浮点数采用科学记数法思想,将数值表示为符号位、指数位(即阶码)和尾数位三部分。

以“+245.25”为例,其浮点数形式可理解为“+245.25=+1.916015625*2+7”,使用1位符号位表示正负(本例用0表示正数),5位指数部分用来表示幂(本例的幂为+7),10位尾数部分记录尾数(本例为1.1110101010省略最前面的1,即十进制的1.916015625)。2.浮点数类型

浮点数的编码形式(以+245.2为例)11数据类型与计算思维任务1:计算炮弹坐标点C语言提供两种浮点型数据类型:float和double。float类型:用于存储单精度浮点数,通常占4个字节(32位),可以精确到小数点后6到7位数字,能够表示的数值范围是-3.4E38到3.4E38。double类型:用于存储双精度浮点数,通常占8个字节(64位),可以精确到小数点后15到16位数字,能够表示的数值范围是-1.7E308到1.7E308。浮点数可以用科学计数法表示,通过使用e或E来表示一个数的乘方。例如,要表示3.0x108,可以写成3.0e8或3.0E8。科学计数法对于表示非常大或非常小的数字非常有用。例如:

注意:由于浮点数是通过二进制数来表示,因此无法精确地表示所有的十进制小数。在进行浮点数运算时,可能会出现精度损失的问题。floatf1=3.14;doubled1=12345.6789;floatf2=6.022E23;printf("%e\n",f2);//以科学计数法格式打印12数据类型与计算思维任务1:计算炮弹坐标点3.字符类型ASCII(美国信息交换标准代码)是用7位二进制数(0-127)表示字符的编码标准,涵盖英文字母、数字、标点及32个控制符(如换行符\n)。ASCII编码表13数据类型与计算思维任务1:计算炮弹坐标点C语言中的char类型(字符型)是基本数据类型,用于存储单个ASCII字符或小型整数值,占用1字节(8位)内存空间。char类型具有字符和整数的双重属性:用char类型存储字符时,可保存ASCII字符(如'A'、'3')或转义符(如'\n'换行、'\t'制表符)。用char类型存储整数时,可以存储范围-128~127之间的整数值。char类型的变量可直接参与算术运算。例如:

charc='A';printf("%d",c);//输出65(ASCII码值)14数据类型与计算思维任务1:计算炮弹坐标点15数据类型与计算思维任务1:计算炮弹坐标点4.变量变量是C语言程序设计的核心概念,是计算机内存中存储数据的命名容器。通过变量,程序实现数据的存取、运算和传递。变量是程序运行期间可修改的‌具名内存空间‌,由数据类型、名称和值三要素构成。例如:intage=20;//整型变量age存储数值20变量的声明语法:数据类型变量名[=初始值];//方括号表示可选inta=5;//声明了一个整型变量a,并给出初始值floatb;//声明了一个单精度浮点型变量b,没有给出初始值charc;//声明了一个字符型变量c,没有给出初始值//定义变量a=10;//将整型变量a赋值为10b=3.14;//将单精度浮点型变量b赋值为3.14c='A';//将字符型变量c赋值为'A'变量可以被赋值和修改,通过赋值操作符‘=’将右边的值赋给左边的变量。16数据类型与计算思维任务1:计算炮弹坐标点C语言中变量的命名需要符合下面的规则:(1)变量名必须由字母、数字和下划线组成,首字符不能是数字。(2)变量名区分大小写(如count与Count不同)。(3)变量名不得使用C语言关键字(如int,return等)。注意:在使用变量之前必须通过赋值对变量进行初始化,否则,变量的值是未定义的,未初始化变量的值可能是随机值,也可能是0,具体情况和使用的编译器相关。17数据类型与计算思维任务1:计算炮弹坐标点5.常量常量是指在程序运行过程中值不会发生变化的量。在C语言中,常量可以分为字面常量和符号常量。(1)字面常量

字面常量直接出现在源代码中的常量值,包括整数常量、浮点数常量、字符常量、字符串常量,例如5、3.14、'a'、"Hello"等。

可以使用常量对变量进行初始化:intn1=10;//十进制整数常量intn2=0X4b;//十六进制整数常量(对应十进制75)charc1='a';//字符常量(小写字母a)charc2='\n';//转义字符常量(换行符)charstr1[20]="湖南大学";//字符串常量18数据类型与计算思维任务1:计算炮弹坐标点(2)符号常量

符号常量包括宏定义常量和const常量。

宏定义常量‌通过预处理指令#define实现文本替换。

例如:#definePI3.14159intR=10;intperimeter=PI*R;使用宏定义了符号常量PI,然后利用PI计算圆周长。C语言编译器在处理宏定义时进行文本替换,即上述代码将被处理成:intR=10;intperimeter=3.14159*R;使用const关键字修饰的变量是const常量,该变量的值不能修改:constdoublePI=3.14159;19数据类型与计算思维任务1:计算炮弹坐标点6.算术表达式算术表达式由运算符和操作数组成,用来执行各种数学运算。C语言中常见的算术运算及其相应的运算符:(1)加法运算:用加号(+)表示(2)减法运算:用减号(-)表示(3)乘法运算:用星号(*)表示(4)除法运算:用斜杠(/)表示(5)取模运算:用百分号(%)表示,用于求余数intsum=5+3;//将5和3相加,结果赋值给sum变量intproduct=6*7;//将6和7相乘,结果赋值给product变量intmod=10%3;//计算10模3,结果为1floatquotient=10.0/3.0;//将10.0除以3.0,结果赋值给quotient变量intdifference=10-4;//10减去4,结果赋值给difference变量20数据类型与计算思维任务1:计算炮弹坐标点7.输入与输出功能‌:将数据按指定格式输出到标准输出(如屏幕)。函数‌原型如下‌:其中,参数format是格式控制字符串,包含普通字符和格式说明符(如%d、%f),...表示可变参数列表,对应格式符的变量值。(1)printf函数intprintf(constchar*format,...);格式符数据类型示例%dintinti=25;printf("%d",i);%ffloatfloatpi=3.1415;printf("%.2f",pi);(输出3.14)%lfdoubledoublepi=3.1415;printf("%.2lf",3.1415);(输出3.14)%ccharprintf("%c",'A');%s字符串(char[])printf("%s","Hello");printf函数的格式符及其示例21数据类型与计算思维任务1:计算炮弹坐标点在使用printf函数之前,需使用#include预处理指令将头文件stdio.h包含进来。方法:姓名:Alice,年龄:25,薪资:8000.50#include<stdio.h>intage=25;floatsalary=8000.5;charname[]="Alice";printf("姓名:%s,年龄:%d,薪资:%.2f\n",name,age,salary);//输出多类型数据输出结果:#include<stdio.h>注意格式控制字符串中格式符的数目与可变参数的数目必须严格一致,且类型也必须一致。

例如,其中%s与变量name匹配,%d与age匹配,%.2f与salary匹配。22数据类型与计算思维任务1:计算炮弹坐标点(2)scanf函数格式符数据类型示例%dintintnum;scanf("%d",&num);%ffloatfloatprice;scanf("%f",&price);%lfdoubledoublevalue;scanf("%lf",&value);%ccharcharch;scanf("%c",&ch);%s字符串(char[])charstr[10];scanf("%s",str);scanf是C语言标准库中的格式化输入函数,用于从标准输入(如键盘)读取数据并存储到指定变量中。其函数原型为:参数format是格式控制字符串,指定输入数据的类型和格式,参数...是可变参数列表,为接收数据的变量地址,与printf函数不同的是,变量前面需用&取地址符。scanf函数的格式符及其示例intscanf(constchar*format,...);注意:最后一行的变量str前面无取地址符&,因为变量str是字符数组,数组名本身就是一个地址。23数据类型与计算思维任务1:计算炮弹坐标点例如:使用scanf函数获得3个输入,分别存入3个变量中。

和printf函数一样,格式控制字符串中格式符的数目与可变参数的数目必须严格一致,且类型也必须一致。inta,b;doublec;printf("请输入两个整数和一个浮点数(用空格分隔):");scanf("%d%d%lf",&a,&b,&c);24设计思路25任务1:计算炮弹坐标点计算思维的抽象视角来看,炮弹运动问题的建模过程完美展现了如何将复杂的物理现象分解为可计算的数学模型。水平方向抽象为匀速直线运动,其速度恒为v₀cosθ。保留了运动最本质的线性特征,对应数学表达式:x(t)=v₀cosθ·t。垂直方向则抽象为匀变速直线运动,初始速度v₀sinθ与重力加速度g构成动态平衡,得到方程:y(t)=v₀sinθ·t-½gt²。这种抽象建立了时间变量t与空间坐标(y)之间的可计算映射关系。炮弹运动的分解

代码实现26//计算炮弹的坐标点01#include<stdio.h>02#include<math.h>03#defineG9.8//定义常量重力加速度G04intmain(){05doublev0=50.0;//初速度06doubletheta=45.0*M_PI/180.0;//角度转换为弧度07doublet;//时刻08doublex,y;//坐标点09//获取用户输入的时刻10printf("请输入时刻t(秒):");11scanf("%lf",&t);12//计算炮弹的坐标点13x=v0*cos(theta)*t;//x轴上的位置14y=v0*sin(theta)*t-0.5*G*t*t;//y轴上的位置15//输出结果16printf("炮弹在时间%.2lf秒时的坐标为:(%.2lf,%.2lf)\n",t,x,y);17return0;18}任务1:计算炮弹坐标点代码分析27

程序的第1行包含了输入输出头文件stdio.h,printf和scanf都定义在该文件中,第2行包含了数学库头文件math.h,三角函数定义在该文件中。第3行定义了重力加速度G。

程序第6行计算角度θ的弧度值,将45°转换为弧度,这是通过将角度乘以π然后除以180来实现的,即θ=45*M_PI/180。其中,M_PI是一个宏定义,在math.h头文件中定义,表示π的值,即3.14159265358979323846。在部分早期DevC++版本中,需要在#include<math.h>之前增加一行#define_USE_MATH_DEFINES,否则编译器会给出M_PI未定义的错误。

程序第11行利用scanf语句输入时间t。第13~14行计算炮弹在时刻t的坐标点。其中的cos函数和sin函数是math.h头文件中的数学函数,用于计算给定角度(以弧度表示的角度)的余弦值和正弦值。

最后,第16行使用printf语句将坐标点x和y保留两位小数输出。任务1:计算炮弹坐标点任务1:计算炮弹坐标点

任务2:闰年判断

任务3:编制密码

任务4:计算复杂表达式目录28任务2:闰年判断任务描述

闰年是人为协调回归年与历法年差异的特殊年份。地球绕太阳公转周期约365.2425天,为平衡历法误差,每4年增加1天形成闰年,闰年2月有29天。闰年机制对农业、天文观测及节日计算具有重要影响,体现了人类智慧与自然规律的精妙融合。闰年具体规则:能被4整除但不能被100整除的年份,或能被400整除的年份(如2000年闰,1900年不闰)。

任务要求:从键盘输入一年份,计算该年份是否为闰年,如果是则输出“xxxx年是闰年”,否则输出“xxxx年不是闰年”,其中xxxx年是输入的年份。

平年与闰年29任务2:闰年判断各类运算符运算符优先级作用示例++高

自增1(变量值加1)a++或++a--自减1(变量值减1)b--或--b*中

乘法a*b/除法a/b%模运算(整数相除,结果取余数)a%b+低

加法a+b-减法a-b算术运算符及其优先级1.算术运算符C语言的算术运算符是执行数学运算的核心工具,涵盖基本四则运算及扩展功能。30任务2:闰年判断各类运算符说明:(1)整数除法会截断小数部分(如5/2结果为2)。(2)取模运算符(%)用于计算余数,结果符号与被除数一致(如-5%3得-2)。(3)自增运算符

++

和自减运算符

--

分别用于增加或减少变量的值,可以放在变量前面(前置)或变量后面(后置)。前置++/--先将变量的值加1或减1,再使用该变量。后置++/--先使用该变量,再将变量的值加1或减1。二者区别:inta=5;intb,c;b=++a;//运行之后a和b都是6c=a++;//运行之后a为7,c为631任务2:闰年判断各类运算符2.关系运算符C语言中的关系运算符是实现数值或逻辑比较操作的,通过二元操作对两个操作数进行特定关系的判定。运算符优先级描述示例>

高大于5>3<

小于5<3>=大于等于5>=5<=小于等于5<=3==低相等5==5!=不相等5!=5关系运算符及其优先级关系运算符的使用规则为:(1)操作数需为相同或兼容的数据类型(如整型、浮点型、字符型)。(2)运算结果为整型布尔值(1/0)。32任务2:闰年判断各类运算符关系运算符常用于条件语句和逻辑表达式。例如:inta=5,b=6,c=10;intx=(a<=b);//x的结果为1inty=(b>c);//y的结果为0使用时注意:(1)避免将等于运算符==误写为赋值运算符=,此错误会导致逻辑错误而非编译报错。(2)关系运算符优先级低于算术运算符,但高于赋值运算符,复杂表达式建议使用括号明确运算顺序。(3)浮点数的比较需谨慎处理精度误差,宜采用误差范围判断而非直接相等比较。

33任务2:闰年判断各类运算符3.逻辑运算符C语言中的逻辑运算符是构建复合逻辑表达式的重要工具,通过布尔运算连接简单条件,形成复杂的判断逻辑。逻辑运算符及其优先级运算符优先级描述示例!高逻辑非用于取反操作!A&&中逻辑与当且仅当两个操作数都为真时为真A&&B||低逻辑或当两个操作数中至少有一个为真时为真A||B34任务2:闰年判断各类运算符逻辑运算符的使用规则:(1)操作数应为整数类型或可隐式转换为整数类型的表达式(非零值视为真,零为假);(2)运算结果为整型值1(真)或0(假);(3)具有短路求值特性:&&运算中若左操作数为假,则直接返回0且不计算右操作数。

||运算中若左操作数为真,则直接返回1且不计算右操作数。inta=5,b=3,c=2;intx=(a>b)&&(b>c);//x=1(5大于3且3大于2)

inty=(a<b)||(b<c);//y=0(5不小于3且3不小于2)

intz=!(a==b);//z=1(5不等于3)逻辑运算符常用于条件语句和复杂逻辑判断。例如:使用时注意:(1)短路特性可能影响包含函数调用或自增/自减操作的表达式,例如表达式5>8&&i++中因为5>8为假,i++将不执行。(2)多层逻辑嵌套时建议使用括号明确优先级,如(A||B)&&C与A||(B&&C)语义不同。35任务2:闰年判断各类运算符4.位运算符C语言中的位运算符是对二进制位进行直接操作的工具,其本质是通过位级运算实现数据的精细控制。运算符优先级描述示例~高位非用于按位取反操作~0b10100101→0b01011010<<

左移指定位数k向左移动k位,高k位丢失,低k位补00b10100101<<2→0b10010100>>

右移指定位数k向右移动k位,低k位丢失,高k位补00b10100101>>1→0b01010010&低位与当且仅当两个二进制位都为1时为10b10100101&0b11000110→0b10000100^异或两个二进制相同结果为0,不同结果为10b10100101^0b11000110→0b01100011|位或当两个二进制位中至少有一个为1时为10b10100101|0b11000110→0b11100111位运算符及其优先级36任务2:闰年判断各类运算符使用位运算符时,操作数必须为整数类型(如longlong、long、int、char),运算结果也是整数类型。位运算直接操作内存中的二进制位,常用于底层硬件编程、权限控制及优化算法。例如:chara=5,b=3;//5(0b00000101)3(0b00000011)charx=a&b;//x=0b00000001(十进制1)

chary=a|b;//y=0b00000111(十进制7)

charz=~a;//z=0b11111010(十进制-6)charw=a^b;//w=0b00000110(十进制6)使用位运算符时,应注意:(1)除了~,位运算符优先级低于关系运算符,高于逻辑运算符,建议用括号明确运算顺序;(2)右移负数的行为依赖编译器实现(算术右移或逻辑右移)。(3)位运算不可逆,如a<<1后无法通过右移1位还原原始值(若最高位为1)。(4)合理运用位运算可显著提升程序效率,但需谨慎处理可移植性和代码可读性。37任务2:闰年判断各类运算符5.条件运算符C语言中的条件运算符(?:)是唯一的三元运算符,也称三目运算符,其本质是通过条件判断动态选择表达式结果。语法结构为:表达式1通常是条件表达式或逻辑表达式,也可以是其他表达式。当表达式1的结果为真时,其结果是表达式2的值,否则,结果是表达式3的值。例如:表达式1?表达式2:表达式3inta=5,b=3;intmax=(a>b)?a:b;//求a和b的最大值

代码中条件表达式的含义为:如果

a

大于b,表达式的结果是a,否则为b。由于a>b成立,因此条件表达式的结果为a,然后将a赋值给max,因此max的值为5。38任务2:闰年判断各类运算符6.逗号运算符逗号运算符是一个二元运算符,用于分隔两个表达式。按照从左到右的顺序计算两个表达式,并返回第二个表达式的值。常用于在一条语句中执行多个操作,尤其是for循环的初始化部分或在需要连续赋值但不希望使用分号分隔的场合。语法形式:表达式1,表达式2,…表达式n;在逗号运算符中,从左到右依次计算各个子表达式,并以逗号分隔。整个逗号运算符的值是最后一个表达式的值。例如:inta=5,b=3,c=10;intresult=(a++,b++,c+=a+b);//result的值为20逗号运算符(a++,b++,c+=a+b)

计算了三个子表达式a++,

b++和c+=a+b,返回最后一个子表达式

c

的值。a++

即a的值增加1,a为6;b++即b的值增加1,b为4;c+=a+b,c的值为a+b+c的和,即6+4+10=20。整个逗号运算符的值是最后一个表达式c的值,所以

result

的值为20。39任务2:闰年判断各类运算符7.赋值运算符C语言的赋值运算符用于将右侧表达式的值赋给左侧变量,是数据传递的核心机制。赋值运算符包含基本赋值(=)和复合赋值(如+=、-=等)两类。赋值运算符及其优先级运算符优先级描述示例=相同赋值将右边表达式的值赋给左边的变量inta=5;/=、*/、%=、+=、-=<<=、>>=、&=、^=、|=相同复合赋值对变量进行相应操作后再赋值inta=5;a*=3;//a的值为1540任务2:闰年判断各类运算符使用赋值运算符的语法规则:(1)左侧必须为可修改的左值(如变量),右侧可为任意合法表达式;(2)复合赋值运算符自动包含类型转换,如:a+=3.5等价于a=(int)(a+3.5);(3)支持连续赋值(如a=b=c=0),但需注意运算顺序从右到左。inta=5,b=3;a+=b;//a=8(等价于a=a+b)

b*=2+1;//b=9(等价于b=b*(2+1))

intc=(a>b)?a:b;//条件赋值,c=9使用赋值运算符时,应注意:(1)避免将比较运算符==误写为赋值运算符=,此错误会导致逻辑错误但没有编译错误。(2)复合赋值运算符优先级高于逗号运算符,低于其他运算符,复杂表达式建议加括号。(3)自增(++)、自减(--)运算符具有前置和后置两种形式,和赋值语句一起使用时需注意其副作用。例如:41任务2:闰年判断设计思路闰年判断条件:(1)如果年份能被4整除,但不能被100整除,则是闰年。(2)如果年份能被400整除,则也是闰年。可以写成:(year能被4整除且不能被100整除)或者(year能被400整除)对于条件1,year能被4整除、year不能被100整除可分别表达为:

要求这两个表达式的结果都为真,可用逻辑与运算符&&连接:对于条件2,year能被400整除表达为:条件1和条件2任意一个成立即为闰年,可使用逻辑或运算符

||

连接:条件1:year%4==0&&year%100!=0)条件2:year%400==0(year%4==0&&year%100!=0)||(year%400==0)year%4==0year%100!=042任务2:闰年判断代码实现//闰年判断00#include<stdio.h>01intmain(){02intyear,flag;//flag表示是否为闰年03printf("请输入一个年份:");04scanf("%d",&year);//输入年份存放到变量year05//计算年份是否是闰年,并将结果存储在flag变量中06flag=(year%4==0&&year%100!=0)||year%400==0;07//使用条件运算符来输出结果08printf("%d年%s闰年\n",year,flag?"是":"不是");09return0;10}43任务2:闰年判断代码分析程序功能是读取用户输入的年份,然后判断该年份是否是闰年。代码分析如下:

程序第2行定义了两个变量,变量year

用于存储用户输入的年份,变量flag

用于存储是否是闰年。

第6行使用逻辑表达式

(year%4==0&&year%100!=0)||year%400==0

来判断年份是否是闰年,结果存储在

flag

变量中。如果输入的年份是闰年,则flag的值是1;否则flag的值是0。

第8行使用条件运算符

flag?“是”:“不是"

来输出结果。如果

flag

为真(非0),则输出"xxxx年是闰年",否则输出"xxxx年不是闰年",其中xxxx是输入的年份。44任务1:计算炮弹坐标点

任务2:闰年判断

任务3:编制密码

任务4:计算复杂表达式目录45任务3:编制密码任务描述凯撒密码是古罗马凯撒大帝使用的古典加密法,属替换加密。其原理是通过固定偏移量(例如3位)移动字母表,明文A→D、B→E,以此类推,末位Z循环至C。解密时反向移动相同位数。例如“HELLO”偏移3位后密文为“KHOOR”,解密则反向移3位还原。图中展示了一个凯撒密码轮,旋转外面的圆环可以实现任意偏移量的加密与解密。

该算法因密钥空间仅25种(偏移1-25)易被穷举破解,但作为密码学雏形,展现了字母移位加密思想,影响后世密码技术发展。

任务要求编制一个凯撒密码加密器,实现英文文字加密,英文文字由字母a~z组成,每输入一个字母,输出其后的第三个字母。凯撒密码轮46任务3:编制密码字符输入输出函数1、字符输入函数getchargetchar()函数是标准输入流(stdin)字符读取的基础工具。原型为:功能:从输入缓冲区读取1个字符。其返回值是字符的ASCII码值(0-255)。该函数在stdio.h头文件中声明。charc;while((c=getchar())!='\n'){//逐字符读取直至换行

putchar(c);//回显字符

}intgetchar(void);下面的例子逐字符读取直至换行为止:47任务3:编制密码字符输入输出函数1、字符输出函数putcharputchar函数是标准输出流(stdout)字符写入的基础工具。原型为:功能:将单个字符参数c转换为unsignedchar类型后输出到标准输出设备(通常为屏幕),返回值为成功输出的字符。和getchar函数一样,也是声明于stdio.h头文件。使用putchar函数输出字符:相比printf格式化输出函数,putchar在输出单个字符时效率更高。intputchar(intc);putchar('A');//输出字符Aputchar('\n');//输出换行符48任务3:编制密码设计思路字符移位方法分析1.大小写转换char类型的本质是代表字符编码的整数,依据ASCII表可知,对于任何大写字母,将其ASCII码值加上32,就可以得到对应的小写字母的ASCII码值。同理,对于任何小写字母,将其ASCII码值减去32,就可以得到对应的大写字母。大小写转换方法//将大写字母转换为小写字母并输出charc1,c2;c1=getchar()c2=c1+32putchar(c2)//将小写字母转换为大写字母并输出charc1,c2;c1=getchar()c2=c1-32putchar(c2)49任务3:编制密码设计思路

假设待加密的字符是小写字母,有两种方法可以完成字符移位。(1)边界修正法

为实现字符向后移动3位,首先,将字符x的编码加上3,得到移位后的编码x’。

小写字母的移位结果如下所示:2.字符移位的方法a(ASCII97)→97+3=100→d(ASCII100)b(ASCII98)→98+3=101→e(ASCII101)......w(ASCII119)→119+3=122→z(ASCII122)x(ASCII120)→120+3=123→{(ASCII123)y(ASCII121)→121+3=124→|(ASCII124)z(ASCII122)→122+3=125→}(ASCII125)50任务3:编制密码设计思路可以发现,字母x、y、z后移动3位之后超出了边界范围,需要进行修正。修正的方法是再往回移动26个单位,可以通过将编码再减去26来完成:x(ASCII120)→120+3=123→123-26=97→a(ASCII97)y(ASCII121)→121+3=124→124-26=98→b(ASCII98)z(ASCII122)→122+3=125→125-26=99→c(ASCII99)边界修正法直观体现字母循环特性,是完成凯撒加密的直观方法。51任务3:编制密码设计思路(2)模运算标准化法

模运算是求余数运算,通过%符号实现。利用模26运算,可自动处理字母循环问题。

首先,需要进行零基转换,将字母转换为0-25的数值(以a=0,b=1,...z=25);

然后,执行“加3运算”并利用“模26运算”进行自动循环;

最后,将加密零基编码转换回ASCII字符。a(ASCII97)→97-97=0b(ASCII98)→98-97=1c(ASCII99)→99-97=2......x(ASCII120)→120-97=23y(ASCII121)→121-97=24z(ASCII122)→122-97=25a(ASCII97)→97-97=0=>(0+3)%26=3b(ASCII98)→98-97=1=>(1+3)%26=4c(ASCII99)→99-97=2=>(2+3)%26=5......x(ASCII120)→120-97=23=>(23+3)%26=0y(ASCII121)→121-97=24=>(24+3)%26=1z(ASCII122)→122-97=25=>(25+3)%26=2①零基编码=原字母-'a':②加密零基编码=(零基编码+3)%26:52任务3:编制密码设计思路③加密字母=加密零基编码+'a',注意字母a的ASCII码为97:a(ASCII97)→97-97=0=>(0+3)%26=3=>3+97=100→d(ASCII100)b(ASCII98)→98-97=1=>(1+3)%26=4=>4+97=101→e(ASCII101)c(ASCII99)→99-97=2=>(2+3)%26=5=>5+97=102→f(ASCII102)......x(ASCII120)→120-97=23=>(23+3)%26=0=>0+97=97→a(ASCII97)y(ASCII121)→121-97=24=>(24+3)%26=1=>1+97=98→b(ASCII98)z(ASCII122)→122-97=25=>(25+3)%26=2=>2+97=99→c(ASCII99)password=(letter-'a'+3)%26+'a';上面三个步骤可用如下表达式完成,其中letter是待加密字母,password是加密后字母:53任务3:编制密码代码实现//字母加密(边界修正)00#include<stdio.h>01intmain(){02charletter,password;03printf("输入字母(a-z):");04scanf("%c",&letter);05password=letter+3;//向右移动3位06password=(password>'z')?password-26:password;//如果超出z,向左回移26位07printf("加密后的字母是:%c\n",password);08return0;09} 1.基于边界修正的代码实现54任务3:编制密码代码分析

输入字母会被转换成对应的密码字母,按照离输入字母相隔三个位置以循环的方式将其转换为密码字母。

程序第2行定义了两个字符类型的变量

letter和

password,用来存储输入的字母和加密后的字母。第4行使用

scanf

函数从用户输入中读取一个字母,并将其存储在

letter变量中。

程序第5行将输入的字符编码向右移动3位;第6行进行边界判断,若移位后的编码超出字母的范围,则向左移动26位回到正确的范围之内。这样就实现了字母依次向后偏移3个位置,形成了密码。

最后,第7行使用

printf

函数来输出加密后的字母。55任务3:编制密码代码实现//字母加密(模运算)00#include<stdio.h>01intmain(){02charletter,password;03printf("输入字母(a-z):");04scanf("%c",&letter);05password=(letter-'a'+3)%26+'a';06printf("加密后的字母是:%c\n",password);07return0;08}2.基于模运算的代码实现56任务3:编制密码代码分析

输入字母会被转换成对应的密码字母,按照离输入字母相隔三个位置以循环的方式将其转换为密码字母,直接使用数学计算方式来实现加密。

第5行将将输入字符编码平移到零基编码,然后加上3再模26,最后再转换回ASCII码。这样就实现了字母依次向后偏移3个位置,形成了密码。57任务1:计算炮弹坐标点

任务2:闰年判断

任务3:编制密码

任务4:计算复杂表达式目录58任务4:计算复杂表达式任务描述下面所示的表达式中包含了三角函数、指数、自然对数、平方根等运算。计算并输出表达式的结果,要求精确到小数点后4位。其中x为45度对应的弧度。

59任务4:计算复杂表达式数学函数库类型典型函数功能描述三角函数sin(),cos(),tan()计算正弦、余弦、正切值反三角函数asin(),acos(),atan()计算反正弦、反余弦、反正切值双曲函数sinh(),cosh(),tanh()计算双曲正弦、余弦、正切值指数/对数exp(),log(),log10(),pow() 计算指数、自然对数、常用对数、幂取整函数ceil(),floor(),round()向上取整、向下取整、四舍五入其他函数fabs(),sqrt(),fmod()计算浮点数绝对值、平方根、浮点余数C语言标准库<math.h>提供了丰富的数学函数,涵盖基础运算、三角函数、指数对数等高级数学功能。使用数学函数库时,需注意所有函数参数和返回值均为double类型。在使用前,需要包含头文件:#include<math.h>C语言数学函数库1.数学库函数概述60任务4:计算复杂表达式数学函数库(1)正弦函数doublesin(doublex);参数:x为弧度值;返回值:[-1,1]之间的正弦值;示例:doubleangle=M_PI/4;//45度doubleresult=sin(angle);//≈0.7071M_PI是math.h中的宏定义,代表圆周率。(2)余弦函数doublecos(doublex);参数:x为弧度值;返回值:[-1,1]之间的余弦值;示例:doubleresult=cos(M_PI/3);//cos(60度)≈0.5(3)正切函数doubletan(doublex);参数:x为弧度值(≠π/2+kπ);返回值:任意实数;示例:doubleresult=tan(M_PI/4);//tan(45度)=1.0

2.三角函数61任务4:计算复杂表达式数学函数库(1)反正弦函数

doubleasin(doublex);

参数:x∈[-1,1];返回值:[-π/2,π/2]弧度值;

示例:doubleresult=asin(0.5);//≈0.5236(30度)(2)反余弦函数

doubleacos(doublex);

参数:x∈[-1,1];返回值:[0,π]弧度值;

示例:doubleresult=acos(0.5);//≈1.0472(60度)(3)反正切函数

doubleatan(doublex);

参数:任意实数;返回值:[-π/2,π/2]弧度值;

示例:doubleresult=atan(1);//≈0.7854(45度)

3.反三角函数62任务4:计算复杂表达式数学函数库(1)双曲正弦

doublesinh(doublex);

参数:任意实数;返回值:任意实数;

示例:doubleresult=sinh(1);//≈1.1752(2)双曲余弦

doublecosh(doublex);

参数:任意实数

温馨提示

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

最新文档

评论

0/150

提交评论