版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言教程内容重点内容一、教学对象 计算机科学与技术系新生(第二学期) 二、教学目标 程序设计的重要性 程序设计的基本概念与基本方法 编程解题的思路与典型方法 数学模型简介 算法及算法步骤 程序结构与相应语句 编码与上机调试绪论 三、教学重点 1. 程序设计的基本概念,基本方法; 2.在 C语言的环境下,学会如何针对问题进行分析,得出数学模型,理出算法并编程实现; 3.有条有理有根有据的编程实践; 4.养成良好的编程风格与习惯; 5.重在思维方法的学习,鼓励创新。绪论四、指导思想1. 立足改革,以培养高素质有创造精神的人才为这门课的教学目标。2. 以学生为中心,采用与现实生活贴切和具有趣味性的
2、实例进行讲解,有利于调动学生学习的积极性,引导学生主动学习。 3. 强化实践,这门课主张程序设计是高强度的脑力劳动,不是听会的、也不是看会的,而是练会的。引导学生在解题编程的实践中探索其中带规律性的认识。将感性认识升华到理性高度。绪论五、学习方法 1.动手动脑,理论指导下的实践 有条有理的实践。 2.在编写大量程序之后,才能感到运用自如。绪论六、教学内容安排 1. 简单C程序设计; 2. 分支结构程序设计; 3. 循环结构程序设计; 4. 数组; 5. 函数; 6. 递归及其实现方法 7. 指针; 8. 结构体与链表。绪论1.1 认识C语言程序 1.程序实例#include /预编译命令,将标
3、准输入输出函数 /作为头文件包扩到用户源文件中 #include /预编译命令,将系统提供的数学函数 /作为头文件包扩到用户源文件中 main( ) /主函数,名为main, /函数体.开始 float a,b,c; /声明部分.定义变量类型 b=30.0; /执行部分.赋值语句 a=sin(b*3.14159/180); /执行部分.赋值语句 printf(“%fn”,a);/执行部分.输出语句 /函数体.结束第一讲 简单的C程序设计1.2 实例总结 程序结构预编译命令主函数 main( ) 函数体开始 声明部分 执行部分 函数体结束第一讲 简单的C程序设计2.变量的类型 整型:int 长整
4、型:long 浮点型:float 双精度型:double 字符型:char 用户自定义类型第一讲 简单的C程序设计 3.声明的作用 为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。 4. 变量 其值可以改变的量,是内存单元的符号地址。 通过符号b可以找到相应的存储单元地址,假设为1000。 语句 ; 是将值存放在地址为1000的存储单元。第一讲 简单的C程序设计5.对变量的赋值 赋值符号“=” b = 30.0;/ 读作将表达式的值赋给变量b a=sin(b*3.14159/180); / 读作将表达式(正弦函数)的值赋给变量a 第一讲 简单的C程序设计6.变
5、量赋值特点 (1)先定义,后使用 int d,e,f;定义三个变量为整数类型 如未定义,则在编译时被查出,认为非法 (2)变量未被赋值前,值为未知 (3)对变量赋值过程是“覆盖”过程,用新值去替换旧(4)读出变量的值,该变量保持不变 (5)参与表达式运算的所有变量都保持原来的值不变第一讲 简单的C程序设计变量赋值过程 d e f未赋值前执行d=7执行 e=d 执行 f=d+e执行 d=d+1 000-12349723431607234316077077148714第一讲 简单的C程序设计7. 输出语句 printf函数(格式输出函数) 一般形式为 printf(参数1,参数2,参数3,参数n)
6、 其中参数1格式控制 参数2,参数3,参数n输出表列 举例: float a; int b; a = 85.56; b = 100; printf(%f %d, a, b);第一讲 简单的C程序设计格式控制是用双引号括起来的字符串,称“转换控制字符串”%f 第一个输出表列的格式说明,以小数形式输出单、双精度实数,隐含输出6位小数 %d 第二个输出表列的格式说明,以带有符号的十进制形式输出整数(正数不输出符号) 显然,%f是控制实数a的;%d是控制整数b的第一讲 简单的C程序设计为了醒目,格式控制项中除格式说明之外可以有普通字符例: printf(“a=%f b=%d, a, b); 输出结果为
7、: a=85.560000 b=100换行符号 例: printf(“a=%fnb=%d”,a,b);输出结果为: b=100域宽和精度例:printf(”%5.3f”,a);第一讲 简单的C程序设计8. 数学函数 sin(x)x为弧度,double x,double sin(x) cos(x) cos(x)exp(x) exlog(x) logexlog10(x) log10 xfabs(x) xfmod(x,y) 整除x/y的余数floor(x) 求不大于x的最大整数pow(x, y) xysqrt(x) x1/2第一讲 简单的C程序设计9. 算术运算符 加 减 *乘 / 除 % 模(取余
8、数)第一讲 简单的C程序设计1.3 作业第一讲 简单的C程序设计 我们在日常生活中经常需要处理具有两个分支的问题,例如,如果明天下雨,则在教室内组织活动,否则去野游。 在C语言中,这类问题需要使用if语句解决,而判断操作通常使用关系运算符。关系运算符和关系表达式 大于 =大于等于 = 小于等于 =等于 !=不等于第二讲 分支结构2.1 掌握if语句的使用方法【实例】编写程序,判断输入的整数是否为6,若是,显示“Right!”和“Great!”,否则显示“Wrong!”和“Sorry!”。 1编程思路: 要显示“Right!”和“Great!”,应执行两条语句“printf(”Right!n“)
9、;”和“printf(”Great!n“);”,要显示“Wrong!”和“Sorry!”,执行两条语句“printf(”Wrong! n“);”和“printf(”Sorry!n“);”。本题需要根据所输入的值(假设赋给a)是否为6来选择执行相应的两条语句。 在C语言中判断a中的值是否为6,使用“if(a=6)”形式。 第二讲 分支结构本实例的流程图如图所示 开始输入a值a=6显示“Right!”显示“Great!”显示“Wrong!”显示“Sorry!”结束假真第二讲 分支结构本实例的N-S流程图如图所示输入a的值a=6显示“Right!” 显示“Great!” 显示“Wrong!” 显示“
10、Sorry! ” 第二讲 分支结构2程序代码:#include main() int a=0; printf(Input a:); scanf(%d,&a); printf(a=%dn,a); if(a=6)/* if语句开始 */ printf(Right!n); printf(Great!n); else printf(Wrong!n); printf(Sorry!n); /* if语句结束 */第二讲 分支结构3运行结果: 第1次运行结果: Input a:6 a=6 Right! Great! 第2次运行结果: Input a:5 a=5 Wrong! Sorry!第二讲 分支结构4归
11、纳分析: (1)程序中的“a=6”是关系表达式。用关系运算符把两个C语言表达式连接起来的表达式称为关系表达式。关系运算的判断结果只有“真”或“假”两种可能,关系成立时为“真”,不成立时为“假”。关系表达式的值只能是1或0,当关系运算的判断结果为“真”时,关系表达式的值为 1,否则,关系表达式的值为0。例如,当a的值为6时,关系表达式“a=6”的值为1,当a的值为5时,关系表达式“a=6”的值为0。第二讲 分支结构(2)程序中的“if(a=6)”是if语句的开始部分。 本例题需要根据“a=6”是否为“真”来选择执行不同的两个输出语句。处理两个分支的问题时常使用if语句。if语句根据其后面括号中表
12、达式的结果,选择执行某个分支程序段。 if语句的一般形式如下: if(表达式) 语句组1 else 语句组2 “if”和“else”是关键字。当表达式结果为“真”(即不等于0)时,执行语句组1,表达式结果为“假”(即等于0)时,执行语句组2。在语句组1和语句组2中只能选择执行一组,而后执行整个if语句后面的语句。 第二讲 分支结构(3) C语言中允许程序中的if语句不带else部分。省略else的if语句一般形式如下: if(表达式) 语句组 此if语句的执行过程: 当表达式结果为“真”时,执行语句组,表达式结果为“假”时,不处理。 第二讲 分支结构学会使用逻辑运算符 处理问题时经常需要同时判
13、断多个条件。例如,在某学生数学和英语成绩中判断是否至少有一门课程是不及格。这时使用逻辑运算符。逻辑运算符共有三种: & 逻辑与 | 逻辑或 ! 逻辑非这3个运算符按高到低的优先级顺序是“!”、“&”、“|” 一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。 第二讲 分支结构【实例】编写程序,判断某人的体重是否在50公斤至55公斤之间,若在此范围之内,显示“Ok”,否则显示“No”。1编程思路: 先将体重存放在变量w中,要使w的值在50至55范围内,应同时满足“w=50”和“w=50 & w=50”和“w=50 & w=55显示“Ok”显示
14、“No”第二讲 分支结构2程序代码:#include main() float w=0.0; printf(Input w:); scanf(%f,&w); printf(w=%.1fn,w); if(w=50&w=55) printf(Okn); else printf(Non);第二讲 分支结构3.运行结果:第1次运行结果:Input w:53.5Ok第2次运行结果:Input w:60.7No第二讲 分支结构4归纳分析: 程序中的“w=50 & w0且w0 & w=50 w=55) /* 内嵌if语句开始 */printf(“Okn);elseprintf(Non);/* 内嵌if语句结
15、束 */ elseprintf(Data over!n);/* 外嵌if语句结束 */第二讲 分支结构3运行结果:第1次运行结果:Input w:53.5Ok第2次运行结果:Input w:60.7No第3次运行结果:Input w:201.7Data over!第二讲 分支结构4归纳分析:(1)本程序在一个if语句中包含了另一个if语句。在if语句的语句组1或语句组2中又包含另一个分支结构的if语句称为嵌套的if语句。(2)本程序中出现了两次else。 C语法规定,在if语句中,若多次出现else,则每一个else总是与前面最近的if配对,所以本例题中第一个else与内嵌的if配对,第二个e
16、lse与最上面的if配对。程序中由于采用了缩进格式,if与else的配对关系一目了然。 第二讲 分支结构if-else if形式的嵌套if语句 【实例】编写程序,求下面分段函数的值,要求x的值从键盘输入。 x+2 (0 x5)y=0 (x0)x2-3 (5x10)10 (x10)第二讲 分支结构1编程思路: 开始输入x值x0结束假真真假显示x和y的值x5真假x10y=x+2y=10y=x2-3y=0第二讲 分支结构2程序代码:#include main() float x=0,y=0;printf(Input x:); scanf(%f,&x); if(x0)y=0; else if(x5)
17、y=x+2; else if(x10) y=x*x-3; else y=10; printf(x=%f,y=%fn,x,y);第二讲 分支结构2.5 switch语句 在日常生活中经常遇到菜单选择操作,例如,用ATM自动取款机取钱时,从菜单中可以选择语种、取款额;用自动服务系统给手机充值时,可以选择查余额还是充值,对本机充值还是对其他号码充值等。这些问题一般使用switch语句解决。 总之,这些问题都是多分支情况。第二讲 分支结构【实例】编写程序,在如下菜单中选择一个运算类型,并进行相应的运算。如选择了加法,则进行求和运算。Please choose + : addition- : subtr
18、action* : multiplication/ : division第二讲 分支结构1程序代码:#include main()float a=5.0,b=2.0,c=0.0;char sym=0;printf(Please choosen);printf(+ : additionn);printf(- : subtractionn);printf(* : multiplicationn);printf(/ : divisionn);sym=getchar();printf(%f%c%f=,a,sym,b); /* 显示算式 */第二讲 分支结构switch(sym) /* 计算算式 */
19、case +: c=a+b; break; case -: c=a-b; break; case *: c=a*b; break; case /: c=a/b; break; printf(%fn,c); /* 显示结果 */第二讲 分支结构2运行结果:Please choose+ : addition- : subtraction* : multiplication/ : division/ 第二讲 分支结构3归纳分析:switch语句的一般形式为:switch(表达式) case 表达式1: 语句组1 break; case 表达式2: 语句组2 break; case 表达式n: 语句组
20、n break; default: 语句组n+1 break;其中switch、case、default和break是关键字,所有表达式均为整型或字符型。在表达式1、表达式2、表达式n中只能出现常量和运算符,而且每个表达式的值不能相等。 第二讲 分支结构2.6 条件运算符及其表达式 C语言中条件运算符由“?”和“:”组成,例如“ab ? a : b”。条件表达式的一般形式为:表达式1 ?表达式2 :表达式3当表达式1的值为非0时,以表达式2的值作为条件表达式的值,否则,以表达式3的值作为条件表达式的值。例如,当ab成立时,条件表达式“ab ? a : b”的值为a中的值,否则为b中的值。 使用
21、条件表达式也可以实现分支结构。 第二讲 分支结构课堂讨论:谁做的好事? 忻州师院有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:C胡说。 已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。画出N-S流程图并写出程序。第二讲 分支结构1、编程思路: 如何找到该人,一定是“先假设该人是做好事者,然后到每句话中去测试看有几句是真话”。“有三句是真话就确定是该人,否则换下一人再试”。 比如,先假定是A同学,让 thisman=A; 代入到四句话中 A说:thisman!=A;A!=A假,值为0
22、。 B说:thisman=C;A=C假,值为0。 C说:thisman=D;A=D假,值为0。 D说:thisman!=D;A!=D真,值为1。显然,不是A做的好事(四个关系表达式值的和为1)第二讲 分支结构再试B同学,让thisman=B;代入到四句话中A说:thisman!=A;B!=A真,值为1。 B说:thisman=C;B=C假,值为0。C说:thisman=D;B=D假,值为0。D说:thisman!=D;B!=D真,值为1。显然,不是B所为(四个关系表达式值的和为2)第二讲 分支结构再试C同学,让thisman=C;代入到四句话中A说:thisman!=A;C!=A真,值为1。
23、B说:thisman=C;C=C真,值为1。 C说:thisman=D;C=D假,值为0。 D说:thisman!=D; C!=D真,值为1。显然,就是C做了好事(四个关系表达式值之和为3)这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去试,四句话中有三句为真,该人即所求。第二讲 分支结构 循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 语言提供了三种循环语句,可以组成各种不同形式的循环结构,它们是: 语句 语句 语句第三讲 循环结构3.1 简单循环【实例】古典问题:有一对兔子,
24、从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.该数列的规律为 a1=1 a2=1 an=an-1+an-2 这里求前20项第三讲 循环结构i=20a1=1;a2=1; i=3an=a1+a2输出ani=i+1;a1=a2;a2=an;YendbeginN第三讲 循环结构该题目的N-S流程图a1=1;a2=1;an=0;i=20an=a1+a2输出ani=i+1a1=a2a2=an第三讲 循环结构2.程序源代码:方法一:for循环语句#include std
25、io.hmain( )long a1,a2,an;int i;a1=a2=1;for(i=3;i=20;i+) an=a1+a2; printf(“a%d=%ld”,i,an); a1=a2; a2=an; 可否调换?第三讲 循环结构方法二:while循环语句#include stdio.hmain( )long a1,a2,an;int i;a1=a2=1;i=3; while(i=20) an=a1+a2; printf(“a%d=%ld”,i,an); a1=a2; a2=an; i+; 第三讲 循环结构方法三:do-while循环语句#include stdio.hmain( )lon
26、g a1,a2,an;int i;a1=a2=1;i=3; do an=a1+a2; printf(“a%d=%ld”,i,an); a1=a2; a2=an; i+; while(i=20);第三讲 循环结构3.归纳分析(1)for语句格式: for ( 表达式1 ; 表达式2 ; 表达式3 ) 语句 即: for (循环变量赋初值 , 循环结束条件 , 循环变量增值 ) 语句第三讲 循环结构For语句执行过程表达式1 表达式2 表达式3 语 句 YN第三讲 循环结构表达式可以省略,但分号不能省略a) 省略表达式1 i=1 for ( ;i=50 ;i+ ) sum=sum+2*ib) 省略
27、表达式2产生死循环 for ( i=1; ;i+ ) sum=sum+2*ic) 省略表达式3 for ( i=1;i=50 ;) sum=sum+2*i; i+;d) 省略表达式1 , 省略表达式3 i=1 for ( ;i=50 ;) sum=sum+2*i; i+; 第三讲 循环结构表达式1,表达式3可以是: a) 简单的表达式 b)逗号表达式表达式2 一般是关系表达式或逻辑表达式例:for ( sum=0 , i=1 ; i=50 ; i+,i+ ) sum=sum+2*i;或:for ( sum=0 , i=1 ; i=50 ; i=i+2 ) sum=sum+2*i第三讲 循环结构
28、(2) while语句的一般形式为: while(表达式) 语句; 其中表达式是循环条件,语句为循环体。while语句的语义是: 计算表达式的值,当值为真(非0)时,执行循环体语句。第三讲 循环结构使用while语句应注意以下几点:语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。2.循环体如包括有一个以上的语句,则必须用括起来, 组成复合语句。3.应注意循环条件的选择以避免死循环,一般需要在循环体中动态改变循环条件的值。第三讲 循环结构(3) do-while语句的一般形式为: do语句; while(表达式); 其中语句是循环体,表达式是循环条件。do-wh
29、ile语句的语义是:先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。第三讲 循环结构(4)循环体语句可使用break 和continue语句break:可以用来从循环体内跳出循环体(提前结束循环)continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断例:输出100以内能被7整除的数。 int n;for(n=7;n=100;n+)if (n%7!=0)
30、continue;printf(%d ,n);第三讲 循环结构练习:1.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.求出这个数列的前20项之和。2.求1+2!+3!+.+20!的和。3.用牛顿切线法求x-sin(x)=0在区间(0,)之间的解。4.任意输入两个数,求这两个数的最大公约数。5.从键盘输入一个数判断其是否为素数。第三讲 循环结构作业:求s=a+aa+aaa+aaaa+aa.a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它
31、在第10次落地时,共经过多少米?第10次反弹多高?求1+2!+3!+.+20!的和猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?第三讲 循环结构循环的嵌套使用【实例】 搬砖问题。36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干?1.分析: 列方程,得出问题条件: w+m+c=36 4*m+3*w+c/2=36 可以用枚举的方法,让变量w在09 、m在012 、c在036的偶
32、数中取值,形成满足上述条件的w 、m、c的组合第三讲 循环结构N-S流程图m9w12c=36-m-w且c%2=04*m+3*w+c/2=36输出m、w、cTrueFalsew=0w=w+1;m=m+1;m=0第三讲 循环结构2.程序main()int m,w,c; for(m=0;m9;m+) for(w=0;w12;w+) c=36-w-m; if(c%2!=0)continue; if(4*m+3*w+c/2=36) printf(“m=%d,w=%d,c=%d”,m,w,c); 第三讲 循环结构练习:1.输出9*9口诀。2.判断101-200之间有多少个素数,并输出所有素数。3.打印出所
33、有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方5的三次方3的三次方。第三讲 循环结构作业:1.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。2.一个数如果恰好等于它的因子之
34、和,这个数就称为“完数”。例如6=123.编程找出1000以内的所有完数。第三讲 循环结构课堂讨论:五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。 A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一; 决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。第三讲 循环结构思路:1 首先是将五个人的预测写成逻辑表达式:让关系运算符“=”的含义是“是”。让数字1、2、3、4、5分别表示名次第一、第二,第五。 让整型变量A、B、C、D、E分别表示每个选手所得名次。
35、A选手说:B=2,A=3;B选手说:B=2,E=4;C选手说:C=1,D=2;D选手说:C=5,D=3;E选手说:E=4,A=1;第三讲 循环结构2 考虑到每个人说的话是一对一错,即一真一假,比如A说的,若B=2为真,则A=3为假,为真取值为1,为假取值为0,则两个关系表达式之和必为1。即(B=2)+(A=3)应该是1 我们可以归纳出要同时满足五个人所说的话都符合一半对一半错的条件是ta=(B=2)+(A=3)=1; 符合A选手的话,则ta为1tb=(B=2)+(E=4)=1; 符合B选手的话,则tb为1tc=(C=1)+(D=2)=1; 符合C选手的话,则tc为1td=(C=5)+(D=3)
36、=1; 符合D选手的话,则td为1te=(E=4)+(A=1)=1; 符合E选手的话,则te为1第三讲 循环结构3.仍然可以用枚举的方法,让变量A、B、C、D、E在15中取值,形成满足上述条件且A、B、C、D、E取值均不同的AE的组合,即是所求。可以考虑A、B、C、D、E取值均不同的条件为 A *B*C*D*E=120第三讲 循环结构第三讲 循环结构For(A=1;A=5;A+)For(B=1;B=5;B+)For(C=1;C=5;C+)For(D=1;D=5;D+)E=15-(A+B+C+D)A*B*C*D*E=120求ta、tb、tc、td、tet=ta+tb+tc+td+tet=5输出A
37、BCDETrueTrueFalseFalse作业: 某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: 1)A、B至少有一人作案; 2)A、D不可能是同案犯; 3)A、E、F三人中至少有两人参与作案; 4)B、C或同时作案,或与本案无关; 5)C、D中有且仅有一人作案; 6)如果D没有参与作案,则E也不可能参与作案。 试编一程序,将作案人找出来。第三讲 循环结构1 案情分析:将案情的每一条写成逻辑表达式,第一条用CC1表示,第二条用CC2表示,CC1:A和B至少有一人作案 令A变量表示A作案 B变量表示B作案 ABCC1 000 101 011 111 显然这是或的关系,因此有CC1=(A|B)
38、第三讲 循环结构CC2:A和D不可能是同案犯 可以分析为: A如果是案犯,D一定不是案犯,写成A&(!D) D如果是案犯,A一定不是案犯,写成D&(!A) 这两者之间是或的关系,因此有 CC2=!(A&D) AD A&D CC2 0 0 1 11 1 0 00 0 1 01 0 1第三讲 循环结构CC3:A、E、F中有两人涉嫌作案,分析有三种可能 第一种,A和E作案,(A&E) 第二种,A和F作案,(A&F) 第三种,E和F作案,(E&F) 这三种可能性是或的关系,因此有 CC3= (A&E)|(A&F)|(E&F)第三讲 循环结构CC4:B和C或同时作案,或都与本案无关 第一种情况:同时作案
39、(B & C) 第二种情况:都与本案无关(!B & !C) 两者为或的关系,因此有 CC4=(B & C)|(!B & !C)CC5:C、D中有且仅有一人作案 CC5=(C & !D)|(D & !C)CC6:如果D没有参与作案,则E也不可能参与作案。CC6=!D !E=D|!E第三讲 循环结构2 采取枚举方法,枚举什么呢? 枚举组合。 6个人每个人都有作案或不作案两种可能,因此有26种组合,从这些组合中挑出符合6条分析的作案者。 定义6个整数变量,分别表示6个人A,B,C,D,E,F。 枚举每个人的可能性: 让0表示不是罪犯; 让1表示就是罪犯。第三讲 循环结构第三讲 循环结构for(A=0
40、;A=1;A+)for(B=0;B=1;B+)for(C=0;C=1;C+)for(D=0;D=1;D+)for(E=0;E=1;E+)for(F=0;F=1;F+)计算CC1 CC2 CC3 CC4 CC5 CC6判断这些值是否都为1TrueFalse输出ABCDEF为1的问题:哪只羊最重? 中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的数组。第四讲 数组1.程序分析:max=0.0 将记录最重的羊的重量for(i=0;i10;i+)提示输入第i只羊的重量
41、输入第i只羊的重量sheepimaxsheepiYesNomax=sheepik=i输出max和k的值第四讲 数组2.程序main()/ 主函数 float sheep10;/ 数组,有10个浮点类型元素float max;/ 浮点类型变量,存放最肥羊的重量int i,k; /整型变量,i用于计数循环,k用于记录最肥羊的号max = 0.0;/ 赋初值0 for ( i=0; i10; i=i+1 )/ 计数循环 printf(“请输入羊的重量sheep%d=”, i); scanf(“%f”, &(sheepi); if ( max sheepi ) max = sheepi;/ 让第i只羊
42、为当前最肥羊 k=i; printf(“max=%fn number=%dn”, max , k);第四讲 数组3.归纳分析(1)数组的定义 类型说明符数组名 常量表达式 例:float sheep10; int a20011000; 说明 数组名的第一个字符应为英文字母; 用方括号将常量表达式括起; 常量表达式定义了数组元素的个数;第四讲 数组数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素; 例如int a5 定义了5个数组元素如下: a0, a1, a2, a3, a4 这是5个带下标的变量,这5个变量的类型是相同的 常量表达式中不允许包含变量; 例如int n; n =
43、5; int an;不合法!第四讲 数组(2)数组初始化 是定义数组完成赋初值的任务 例如 int a5 = 3, 5, 4, 1, 2 ; aa0 = 3; a1 = 5; a2 = 4; a3 = 1; a4 = 2;3 5 4 1 2下标 0 1 2 3 4第四讲 数组(3)数组在内存中分配一段连续的存储空间内存地址变量名FF02FF01FF00FF03FF04FF05FF06FF07a0a1a2a3FF08FF09a4a数组名第四讲 数组思考:1.#include void main() int a4;/ 声明项 printf(“a0=%d; a1=%d; a2=%d; a3=%dn”
44、, a0, a1, a2, a3); 2.其他不变,改变声明项为 int a4 = 0, 1, 2, 3 ;第四讲 数组3.其他不变,改变声明项为 int a4 = 3, 8 ; 4.其他不变,改变声明项为 int a4 = 2, 4, 6, 8, 10 ;5.其他不变,改变声明项为 int a4 = 2, 4, 6, d ;6.其他不变,改变声明项为 int n=4; int an = 0, 1, 2, 3 ;第四讲 数组第四讲 数组【实例】将几个数从大到小排序并输出,冒泡排序法 i=1 i=2 i=3 i=4 i=5 i=6a1 a2 a3 a4 a5 a6初始值 1 8 3 2 4 9比
45、较1和8,调换 1 8 3 2 4 9比较1和3,调换 8 1 3 2 4 9比较1和2,调换 8 3 1 2 4 9比较1和4,调换 8 3 2 1 4 9比较1和4,调换 8 3 2 4 1 91到达位置 8 3 2 4 9 1比较8和3,不动 8 3 2 4 9 1比较3和2,不动 8 3 2 4 9 1比较2和4,调换 8 3 2 4 9 1比较2和9,调换 8 3 4 2 9 12到达位置 8 3 4 9 2 1i=1 i=2 i=3 i=4 i=5 i=6a1 a2 a3 a4 a5 a6中间值 8 3 4 9 2 1比较8和3,不动 8 3 4 9 2 1比较3和4,调换 8 3
46、 4 9 2 1比较3和9,调换 8 4 3 9 2 13到达位置 8 4 9 3 2 1比较8和4,不动 8 4 9 3 2 1比较4和9,调换 8 4 9 3 2 14到达位置 8 9 4 3 2 1比较8和9,调换 8 9 4 3 2 18到达位置 9 8 4 3 2 1第四讲 数组从表中可以看出最小的一个数第一遍扫描就交换到a6如果将a1视为水底,a6视为水面: 最轻的(最小的)一个数 1 最先浮到水面,交换到a6;次轻的 2 第二遍扫描交换到a5; 再轻的 3 第三遍扫描交换到a4; 依此类推,有6个数,前5个数到位需5遍扫描,第6个最重的数自然落在a1中。因此,6个数只需5遍扫描,
47、即j=n-1, n=6。 第四讲 数组再看在每遍扫描中,相邻两数组元素的比较次数。 当j=1时,i=1,2,n-j。n=6时,比较5次之后a6中有一个最小数到达,这时a6不必再参与比较了。 因此在第二遍搜索时,j=2, i=1,2,n-j,即i=1,2,3,4。比较4次之后次小的一个数到达了a5。这时a5不必再参与比较了。 因此,j=3时,i=1,2,3;j=4时,i=1,2;j=5时,i=1第四讲 数组为了表述方便,定义以下3个变量: n 待排序的数的个数,这里 n=6 j 扫描遍数,j=1,2,n-1 i 第j遍扫描待比较元素的下标,i=1,2,n-j 第四讲 数组采用两重计数型循环: 步
48、骤1:将待排序的数据放入数组中; 步骤2:置j为1; 步骤3:让i从1到n-j,比较ai与ai+1, 如果 ai = ai+1,位置不动; 如果 ai ai+1,位置交换, 即 p=ai; ai=ai+1; ai+1=p; 步骤3结束后 an-j+1中的数为最小的数 步骤4:让j=j+1;只要jn就返回步骤3,将an-j+1的值排好。当j=n时执行步骤5 步骤5:输出排序结果第四讲 数组2.程序main()/ 主函数 int i, j, p, a7;/ 整型变量 for (i=1; i=6; i=i+1) / 键入6个数,放入a数组中 printf(“请输入待排序的数a%d=”, i);sca
49、nf (“%d”, &ai); for ( j=1; j=5; j=j+1)/ 冒泡排序,外层循环 for ( i=1; i=6-j; i=i+1 )/ 内层循环 if ( ai ai+1 ) p = ai; ai = ai+1; ai+1 = p; for ( i=1; i=6; i=i+1)/ 输出排序结果 printf(“%dn”, ai);第四讲 数组作业:船长与水手的问题: 有载有50个人的大船,突然触礁,船底撞了一个大窟窿,水不停地涌进船里,船不断下沉。这时,聪明的船长把所有人召集到一起,给每人一个编号,手拉手围成一圈,从1号开始报数,报的数为9时,这个人出列,跳入大海,剩下的人继
50、续围成一圈,后面的人从1开始继续报数,重复上面地步骤,聪明的船长却最后留在了船上。问:船长是几号才能最后一个跳入大海?第四讲 数组讨论问题: 使用筛法求100以内的所有素数思路 1.想象将100个数看作沙子和小石头子,让小石头子当作素数;让沙子当作非素数。弄一个筛子,只要将沙子筛走,剩下的就是素数了。 2.非素数一定是2、3、4 的倍数。 3.使用数组,让下标就是100以内的数,让数组元素的值作为筛去与否的标志。比如筛去以后让元素值为1。第四讲 数组1至100这些自然数可以分为三类: 单位数:仅有一个数1。 素数: 是这样一个数,它大于1,且只有1和它自身这样两个正因数。 合数: 除了1和自身
51、以外,还有其他正因数。1不是素数,除1以外的自然数,当然只有素数与合数。 筛法实际上是筛去合数,留下素数。 为了提高筛选法效率,注意到: 令n为合数(这里是100),c为n的最小正因数,则据初等数论 只要找到c就可以确认n为合数,将其筛去。第四讲 数组for(i=2;i=100:i+)primi=0;for(i=3;i=100:i+)a=sqrt(i)for(j=2;j=a:j+)i%j=0primi=1for(i=2;i=100;i+)primi=0输出iYesYesNoNo第四讲 数组二维数组问题:求矩阵a的最大值 1 3 5 a= 7 9 2 4 6 8第四讲 数组1二维数组定义格式:
52、类型说明符 数组名常量表达式 常量表达式 例: int a2 3 =3,5,4,1,2,6;说明: a)每一维的下标从0开始,整个数组元素为:23=6个 b)C语言中,二维数组中元素排列的顺序是按行存放。 即:先存放第一行的元素,再存放第二行的元素第四讲 数组二维数组在内存中的分配情况内存地址变量名FF02FF01FF00FF03FF04FF05FF06FF07a00a01a10a11FF08FF09a20a数组名第四讲 数组c)可以计算数组元素在数组中的序号 假设 mn的数组a,计算aij序号的公式: in+j 如33数组中: a01 03+1=1(第二个) a12 13+2=5(第六个)
53、a22 23+2=8(第九个)第四讲 数组求矩阵a的最大值 1 3 5 a= 7 9 2 4 6 8问题分析:将矩阵放入二维数组a33中首先定义变量max=a00,max与a01比较,若发现maxa01,则将max=a01,这样max与数组元素逐个比较,最后找到数组中最大的一个。采用二重循环分别对行和列进行控制。外层控制行标,内层控制列标。第四讲 数组作业1.打印魔方阵:8 1 63 5 74 9 2算法:1.将1放到第1行的中间。2.下一个数放在该数的前一行后一列。3.若该位置已经有数,则放在前一数的正下方。4.当前数是右上角时,其下一个数放在其下方。5.若当前是第1行,则其前一行为第n行,
54、若当前列是第n列,则其后一列为第1列。第四讲 数组问题:编程求解我们用函数来编写这个题的程序,参考程序如下:#include /预编译命令 #define n 6 /定义n为6 #define k 4 /定义k为4 void main() /主函数 printf(sum of %dth powers of integers from 1 to %d=,k,n ); printf(%dn,SOP(n,k); /输出结果,其中SOP(n,k)为被调用函数 第五讲 函数int SOP(m,l) /整型自定义函数,m,l 为形参 int m,l; /形参m,l 为整型变量 int i,sum=0; /
55、整型变量i,sum for (i=1; i=m; i=i+1 ) sum=sum+power( i ,l ); return (sum) ; /返回值sum给函数sop(n,k) /以下函数是被函数sop(n,k)调用的函数 int power(p,q) /整型自定义函数 int p,q; /形参p,q 为整型变量 int i,product=1; for(i=1; i=q; i=i+1) product=product*p; return(product); /累乘值product返回给power第五讲 函数 ()例:int power(p,n) power为函数名,要以英文字母开头。 in
56、t是函数值的数据类型,这里是int(整型)。 (p,n)括号中的p,n为函数的形式参数,形式参数也要定义其数据类型。函数定义的一般格式: () 函数的定义格式:第五讲 函数第五讲 函数1、形式参数是在定义函数时放在函数名后括号中的参数。在未进行函数调用时,并不对形式参数分配内存单元。在发生函数调用时,立刻给形式参数分配内存单元。调用结束后,释放掉行参所占的内存单元。 2、因此,形参变量属于局部变量,其作用域在它所在的函数体内。 3、在定义函数的时候,必须指定形参变量的类型,如何指定?有二种方法:形式参数与实在参数(1) int power(p,n) int p,n; (2) int power
57、(int p,int n) 有些编译系统不认识第(2)种形式4、实在参数是一个具有确定值的表达式。函数在调用时,将实在参数赋给形式参数。 比如,主函数调用SOP(n,k),这时,n,k为实在参数,n的值为6,k的值为4。在被调用函数定义中,int SOP(m,l)中的m,l为形式参数,在SOP被调用时,系统给m,l这两个形式参数分配了内存单元之后,n的值6赋给m,k的值4赋给l。 实在参数的个数及类型应与形式参数一致。赋值时前后对应关系不会改变。下面画出主函数与SOP函数,调用与被调用时参数传递关系:第五讲 函数主函数执行下述语句时, printf(“%dn”,SOP(n,k); 传值给被调用
58、函数 int SOP(m,l) n的值6传给m, k的值4传给l。 6和4为实在参数,m和l为形式参数。 被调用函数在其形式参数被赋值之后,开始执行函数体,先是让累加器初始化为0(sum=0),接着进入以i为控制变量的计算循环,i从1变到m(m=6),即累加m次(即6次)。循环体为sum=sum+power(i,l)。当6次循环执行完后,实现的是注意这里 xl 是由另一个自定义函数power(i,l)实现的。第五讲 函数power(i,l)处在SOP(m,l)函数中,表示SOP函数去调用power 函数。其中i,l为实在参数,而int power(p,q)中的p,q为形式参数。 比如,执行SO
59、P(6,4)时,l=4,m=6, 当i=1时, sum=sum+power(1,4) 这里1,4为实在参数,调用power(p,q),两个形式参数p,q分别被赋以1,4。第五讲 函数6i=2: sum = sum + power(i,l) = 1 + 16= 17调用返回执行power(2, 4):product = 2*2*2*2return(16) = 16i=3: sum = sum + power(i,l)= 17 + 81= 98调用返回执行power(3, 4):product = 3*3*3*3return(81) = 81i=4: sum = sum + power(i,l)=
60、 98 + 256= 354调用返回执行power(4, 4):product = 4*4*4*4return(256) = 256i=5: sum = sum + power(i,l)= 354 + 625= 979调用返回执行power(5, 4):product = 5*5*5*5return(625) = 625执行power(6, 4):product = 6*6*6*return(1296) = 1296调用= 0 + 1= 1返回执行SOP(6,4) l=4sum=0i=1: sum = sum + power(i,l)执行power(1, 4):product = 1*1*1*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年铁路货物运输与专用线运营合同
- 2025年度建筑劳务分包合同标的工程进度与质量监管条款3篇
- 2024年赠与股份合同:父子权益的传递与确认
- 2024庭院园艺景观设计与生态修复工程包工合同范本6篇
- 2024年电子商务平台送货员聘用合同
- 2024年航空航天产业投资合作意向书(国家战略版)3篇
- 2024年社交媒体品牌建设与维护服务条款3篇
- 2024年版权许可合同违约责任认定
- 2024年资产重组合同范本
- 2024物业管理实务客户关系管理与满意度调查合同3篇
- 2023年机械员之机械员专业管理实务题库及参考答案(a卷)
- 班组安全培训试题含完整答案(各地真题)
- 《论语》中的人生智慧与自我管理学习通超星期末考试答案章节答案2024年
- 2022版义务教育物理课程标准
- 期末测试-2024-2025学年语文四年级上册统编版
- 全国国家版图知识竞赛题库及答案(中小学组)
- 初中语文《国学经典》校本教材
- 江西省外经贸融资担保有限公司招聘笔试题库2024
- 2024年国家公务员考试行政职业能力测验真题及答案
- 2024年便携式储能行业分析报告
- 2024-2025学年广东省广州市广州大附中初三3月教学质量监测考试数学试题(理甲卷)版含解析
评论
0/150
提交评论