1、一、教学对象 计算机科学与技术系新生(第二学期) 二、教学目标程序设计的重要性 程序设计的基本概念与基本方法 编程解题的思路与典型方法 数学模型简介 算法及算法步骤 程序结构与相应语句 编码与上机调试,绪论,三、教学重点 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 实例总结1.C程序结构,预编译命令,主函数 main( ) 函数体开始 声明部分 执行部分 函数体结束,第一讲 简单的C程序设计,2.变量的类型整型:int 长整型:l
4、ong浮点型:float双精度型:double字符型:char用户自定义类型,第一讲 简单的C程序设计,3.声明的作用 为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。 4. 变量 其值可以改变的量,是内存单元的符号地址。 通过符号b可以找到相应的存储单元地址,假设为1000。语句b=30.0;是将值30.0存放在地址为1000的存储单元。,第一讲 简单的C程序设计,5.对变量的赋值 赋值符号“=” b = 30.0; / 读作将表达式的值30.0赋给变量b a=sin(b*3.14159/180); / 读作将表达式(正弦函数)的值赋给变量a,第一讲 简单的
5、C程序设计,6.变量赋值特点 (1)先定义,后使用 int d,e,f; 定义三个变量为整数类型 如未定义,则在编译时被查出,认为非法 (2)变量未被赋值前,值为未知 (3)对变量赋值过程是“覆盖”过程,用新值去替换旧 (4)读出变量的值,该变量保持不变 (5)参与表达式运算的所有变量都保持原来的值不变,第一讲 简单的C程序设计,变量赋值过程d e f 未赋值前 执行d=7 执行 e=d 执行 f=d+e 执行 d=d+1 000,第一讲 简单的C程序设计,7. 输出语句 printf函数(格式输出函数) 一般形式为 printf(参数1,参数2,参数3,参数n) 其中参数1格式控制 参数2,
6、参数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); 输出结果为: a=8
7、5.560000 b=100 换行符号 例: printf(“a=%fnb=%d”,a,b); 输出结果为: a=85.560000b=100 域宽和精度 例:printf(”%5.3f”,a);,第一讲 简单的C程序设计,8. 数学函数 sin(x) x为弧度,double x,double sin(x) cos(x) cos(x) exp(x) ex log(x) logex log10(x) log10x fabs(x) x fmod(x,y) 整除x/y的余数 floor(x) 求不大于x的最大整数 pow(x, y) xy sqrt(x) x1/2,第一讲 简单的C程序设计,9. 算
8、术运算符 加 减 * 乘 / 除 % 模(取余数),第一讲 简单的C程序设计,1.3 作业,第一讲 简单的C程序设计,我们在日常生活中经常需要处理具有两个分支的问题,例 如,如果明天下雨,则在教室内组织活动,否则去野游。在C语言中,这类问题需要使用if语句解决,而判断操 作通常使用关系运算符。 关系运算符和关系表达式 大于= 大于等于= 小于等于= 等于!= 不等于,第二讲 分支结构,2.1 掌握if语句的使用方法 【实例】编写程序,判断输入的整数是否为6,若是,显示“Right!”和“Great!”,否则显示“Wrong!”和“Sorry!”。 1编程思路:要显示“Right!”和“Grea
9、t!”,应执行两条语句“printf(”Right!n“);”和“printf(”Great!n“);”,要显示“Wrong!”和“Sorry!”,执行两条语句“printf(”Wrong! n“);”和“printf(”Sorry!n“);”。本题需要根据所输入的值(假设赋给a)是否为6来选择执行相应的两条语句。在C语言中判断a中的值是否为6,使用“if(a=6)”形式。,第二讲 分支结构,本实例的流程图如图所示,第二讲 分支结构,本实例的N-S流程图如图所示,第二讲 分支结构,2程序代码: #include main() int a=0;printf(“Input a:“); scanf(
10、“%d“, /* if语句结束 */ ,第二讲 分支结构,3运行结果:第1次运行结果:Input a:6a=6Right!Great!第2次运行结果:Input a:5a=5Wrong!Sorry!,第二讲 分支结构,4归纳分析: (1)程序中的“a=6”是关系表达式。 用关系运算符把两个C语言表达式连接起来的表达式称为关系表达式。关系运算的判断结果只有“真”或“假”两种可能,关系成立时为“真”,不成立时为“假”。 关系表达式的值只能是1或0,当关系运算的判断结果为“真”时,关系表达式的值为 1,否则,关系表达式的值为0。例如,当a的值为6时,关系表达式“a=6”的值为1,当a的值为5时,关系
11、表达式“a=6”的值为0。,第二讲 分支结构,(2)程序中的“if(a=6)”是if语句的开始部分。本例题需要根据“a=6”是否为“真”来选择执行不同的两个输出语句。处理两个分支的问题时常使用if语句。if语句根据其后面括号中表达式的结果,选择执行某个分支程序段。if语句的一般形式如下:if(表达式) 语句组1 else 语句组2 “if”和“else”是关键字。当表达式结果为“真”(即不等于0)时,执行语句组1,表达式结果为“假”(即等于0)时,执行语句组2。在语句组1和语句组2中只能选择执行一组,而后执行整个if语句后面的语句。,第二讲 分支结构,(3) C语言中允许程序中的if语句不带e
12、lse部分。 省略else的if语句一般形式如下:if(表达式)语句组此if语句的执行过程:当表达式结果为“真”时,执行语句组,表达式结果为“假”时,不处理。,第二讲 分支结构,2.2学会使用逻辑运算符 处理问题时经常需要同时判断多个条件。例如,在某学生数学和英语成绩中判断是否至少有一门课程是不及格。这时使用逻辑运算符。 逻辑运算符共有三种:& 逻辑与| 逻辑或! 逻辑非 这3个运算符按高到低的优先级顺序是“!”、“&”、“|” 一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。,第二讲 分支结构,【实例】编写程序,判断某人的体重是否在50
13、公斤至55公斤之间,若在此范围之内,显示“Ok”,否则显示“No”。 1编程思路:先将体重存放在变量w中,要使w的值在50至55范围内,应同时满足“w=50”和“w=50 & w=50”和“w=55”。,第二讲 分支结构,2程序代码: #include main() float w=0.0;printf(“Input w:“);scanf(“%f“, ,第二讲 分支结构,3.运行结果: 第1次运行结果: Input w:53.5 w=53.5 Ok 第2次运行结果: Input w:60.7 w=60.7 No,第二讲 分支结构,4归纳分析: 程序中的“w=50 & w=55”是逻辑表达式。
14、用逻辑运算符把两个C语言表达式连接起来的表达式称为逻辑表达式。逻辑运算的判断结果也只有“真”或“假”两种可能,逻辑运算的规则如下: 逻辑与:1&1=1,其它为0 逻辑或:0|0=0,其它为1 逻辑非:!0为1,!1为0,!2为0,!a为0(当a不为0时) 逻辑表达式的值也只能是1或0,当逻辑运算的判断结果为“真”时,逻辑表达式的值为 1,否则,逻辑表达式的值为0。,第二讲 分支结构,2.3 学会使用嵌套的if语句有些问题必须在满足某种条件后,再继续分支处理。例如,某单位男职工60岁退休,女职工55岁退休,为了判断某职工是否应退休,首先要判断该职工是男职工还是女职工,然后再根据职工性别判断年龄是
15、否到规定年龄。这时需要使用嵌套的if语句。,第二讲 分支结构,【实例】编写程序,判断若输入的体重大于0且小于200,再判断该体重是否在50公斤至55公斤之间,若在此范围之内,显示“Ok”,否则显示“No”;若所输入的体重不大于0或不小于200,则显示“Data over!”。 1编程思路: 在上实例中,输入w的值后立刻用if语句实现选择执行“printf(“Okn“);”或“printf(“Non“);”的功能,但由于本题目是在w的值大于0且小于200的情况下,才能执行此if语句,所以在此if语句外面还需要套另一个if语句。,第二讲 分支结构,本实例的程序流程图:课堂作业:请根据此图画出其N-
16、S流程图。,第二讲 分支结构,2程序代码: main() float w=0.0;printf(“Input w:“);scanf(“%f“,/* 外嵌if语句结束 */ ,第二讲 分支结构,3运行结果: 第1次运行结果: Input w:53.5 w=53.5 Ok 第2次运行结果: Input w:60.7 w=60.7 No 第3次运行结果: Input w:201.7 w=201.7 Data over!,第二讲 分支结构,4归纳分析: (1)本程序在一个if语句中包含了另一个if语句。 在if语句的语句组1或语句组2中又包含另一个分支结构的if语句称为嵌套的if语句。 (2)本程序中
17、出现了两次else。C语法规定,在if语句中,若多次出现else,则每一个else总是与前面最近的if配对,所以本例题中第一个else与内嵌的if配对,第二个else与最上面的if配对。程序中由于采用了缩进格式,if与else的配对关系一目了然。,第二讲 分支结构,2.4学会使用if-else if形式的嵌套if语句 【实例】编写程序,求下面分段函数的值,要求x的值从键盘输入。,第二讲 分支结构,1编程思路:,第二讲 分支结构,2程序代码: #include main() float x=0,y=0;printf(“Input x:“);scanf(“%f“, ,第二讲 分支结构,2.5 sw
18、itch语句在日常生活中经常遇到菜单选择操作,例如,用ATM自动取款机取钱时,从菜单中可以选择语种、取款额;用自动服务系统给手机充值时,可以选择查余额还是充值,对本机充值还是对其他号码充值等。这些问题一般使用switch语句解决。总之,这些问题都是多分支情况。,第二讲 分支结构,【实例】编写程序,在如下菜单中选择一个运算类型,并进行相应的运算。如选择了加法,则进行求和运算。 Please choose + : addition - : subtraction * : multiplication / : division,第二讲 分支结构,1程序代码: #include main() floa
19、t 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) /* 计算算式 */case +: c=a+b; break;case -: c=a-b; break;case *:
20、 c=a*b; break;case /: c=a/b; break; printf(“%fn“,c); /* 显示结果 */ ,第二讲 分支结构,2运行结果: Please choose + : addition - : subtraction * : multiplication / : division / 5.000000/2.000000=2.500000,第二讲 分支结构,3归纳分析: switch语句的一般形式为: switch(表达式) case 表达式1: 语句组1 break;case 表达式2: 语句组2 break; case 表达式n: 语句组n break;defa
21、ult: 语句组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中的值。使用条件表达式也可以实
22、现分支结构。,第二讲 分支结构,课堂讨论:谁做的好事?忻州师院有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:C胡说。 已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。画出N-S流程图并写出程序。,第二讲 分支结构,1、编程思路:如何找到该人,一定是“先假设该人是做好事者,然后到每句话中去测试看有几句是真话”。“有三句是真话就确定是该人,否则换下一人再试”。比如,先假定是A同学,让 thisman=A; 代入到四句话中A说:thisman!=A; A!=A 假,值为0。 B说:thi
23、sman=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说:thism
24、an!=A; C!=A 真,值为1。 B说:thisman=C; C=C 真,值为1。 C说:thisman=D; C=D 假,值为0。 D说:thisman!=D; C!=D 真,值为1。 显然,就是C做了好事(四个关系表达式值之和为3) 这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去试, 四句话中有三句为真,该人即所求。,第二讲 分支结构,循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 语言提供了三种循环语句,可以组成各种不同形式的循环结构,它们是: 语句语句语句,第三讲
25、循环结构,3.1 简单循环 【实例】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 该数列的规律为 a1=1a2=1an=an-1+an-2这里求前20项,第三讲 循环结构,i=20,a1=1;a2=1; i=3,an=a1+a2,输出an,i=i+1;a1=a2;a2=an;,Y,end,begin,N,第三讲 循环结构,该题目的N-S流程图,a1=1;a2=1;an=0;,i=20,an=a1+a2,输出an,i=i+1,a1=a
26、2,a2=an,第三讲 循环结构,2.程序源代码: 方法一:for循环语句 #include “stdio.h“ main( ) 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.h“ main( ) long a1,a2,an; int i; a1=a2=1;i=3;while(i=20) an=a1+a2;printf(“a%d=%ld”,i,an); a1=a
27、2; a2=an; i+; ,第三讲 循环结构,方法三:do-while循环语句 #include “stdio.h“ main( ) long 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语句执行过程,第三讲 循环结构,表达式可以省略,但
28、分号不能省略 a) 省略表达式1i=1for ( ;i=50 ;i+ ) sum=sum+2*i b) 省略表达式2产生死循环for ( i=1; ;i+ ) sum=sum+2*i c) 省略表达式3for ( i=1;i=50 ;) sum=sum+2*i; i+; d) 省略表达式1 , 省略表达式3i=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;
29、 或:for ( sum=0 , i=1 ; i=50 ; i=i+2 )sum=sum+2*i,第三讲 循环结构,(2) while语句的一般形式为: while(表达式)语句; 其中表达式是循环条件,语句为循环体。 while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。,第三讲 循环结构,使用while语句应注意以下几点: 1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。 2.循环体如包括有一个以上的语句,则必须用括起来, 组成复合语句。 3.应注意循环条件的选择以避免死循环,一般需要在循环体中动态改变循环条件的值。,第
30、三讲 循环结构,(3) do-while语句的一般形式为: do 语句; while(表达式); 其中语句是循环体,表达式是循环条件。 do-while语句的语义是: 先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。 do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。,第三讲 循环结构,(4)循环体语句可使用break 和continue语句 break:可以用来从循环体内跳出循环体(提前结束循环) continue:用于
31、跳过循环体中下面尚未执行的语句,接着重新执行循环的判断 例:输出100以内能被7整除的数。 int n; for(n=7;n=100;n+) if (n%7!=0) 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+
32、aa.a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 求1+2!+3!+.+20!的和 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?,第三讲 循环结构,3.2循环的嵌套使用 【实例】 搬砖问题。36块砖,36人搬,男搬4
33、,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干? 1.分析: 列方程,得出问题条件: w+m+c=364*m+3*w+c/2=36可以用枚举的方法,让变量w在09 、m在012 、c在036的偶数中取值,形成满足上述条件的w 、m、c的组合,第三讲 循环结构,N-S流程图,第三讲 循环结构,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.输出
34、9*9口诀。 2.判断101-200之间有多少个素数,并输出所有素数。 3.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方5的三次方3的三次方。,第三讲 循环结构,作业: 1.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n, 重复执行第一步。
35、 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 2.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=123.编程找出1000以内的所有完数。,第三讲 循环结构,课堂讨论: 五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。 A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第四,A第一; 决赛成绩公布之后,每位选手的预测都只说对了一半, 即一对一错,请编程解出比赛的实际名次。,第三讲 循环结构,思路:1 首先是将五个人的预测写成逻辑表达式: 让关系运算符“=”的含义
36、是“是”。 让数字1、2、3、4、5分别表示名次第一、第二,第五。 让整型变量A、B、C、D、E分别表示每个选手所得名次。 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为1 tb=(B
37、=2)+(E=4)=1; 符合B选手的话,则tb为1 tc=(C=1)+(D=2)=1; 符合C选手的话,则tc为1 td=(C=5)+(D=3)=1; 符合D选手的话,则td为1 te=(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
38、+),For(D=1;D=5;D+),E=15-(A+B+C+D),A*B*C*D*E=120,求ta、tb、tc、 td、te,t=ta+tb+tc+td+te,t=5,输出ABCDE,True,True,False,False,作业:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: 1)A、B至少有一人作案;2)A、D不可能是同案犯; 3)A、E、F三人中至少有两人参与作案; 4)B、C或同时作案,或与本案无关; 5)C、D中有且仅有一人作案; 6)如果D没有参与作案,则E也不可能参与作案。 试编一程序,将作案人找出来。,第三讲 循环结构,1 案情分析:将案情的每一条写成逻辑表达式,第一条
39、用CC1表示,第二条用CC2表示, CC1:A和B至少有一人作案 令A变量表示A作案 B变量表示B作案 A B CC1 0 0 0 1 0 1 0 1 1 1 1 1 显然这是或的关系,因此有CC1=(A|B),第三讲 循环结构,CC2:A和D不可能是同案犯 可以分析为: A如果是案犯,D一定不是案犯,写成A&(!D) D如果是案犯,A一定不是案犯,写成D&(!A) 这两者之间是或的关系,因此有 CC2=!(A&D) A D A&D CC2 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1,第三讲 循环结构,CC3:A、E、F中有两人涉嫌作案,分析有三种可能 第一种,A和E作案,(A
40、&E) 第二种,A和F作案,(A&F) 第三种,E和F作案,(E&F) 这三种可能性是或的关系, 因此有 CC3= (A&E)|(A&F)|(E&F),第三讲 循环结构,CC4:B和C或同时作案,或都与本案无关 第一种情况:同时作案(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个人每个人都有作案
41、或不作案两种可能,因此有26种组合,从这些组合中挑出符合6条分析的作案者。 定义6个整数变量,分别表示6个人A,B,C,D,E,F。 枚举每个人的可能性: 让0表示不是罪犯; 让1表示就是罪犯。,第三讲 循环结构,第三讲 循环结构,for(A=0;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,判断这些值是否都为1,True,False,输出ABCDEF为1的,问题:哪只羊最重?中秋佳节,有贵客来到草原,主人要从羊群
42、中选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的数组。,第四讲 数组,1.程序分析:,第四讲 数组,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”
43、, ,第四讲 数组,3.归纳分析 (1)数组的定义 类型说明符 数组名 常量表达式 例: float sheep10; int a20011000; 说明 数组名的第一个字符应为英文字母; 用方括号将常量表达式括起; 常量表达式定义了数组元素的个数;,第四讲 数组,数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素; 例如 int a5 定义了5个数组元素如下: a0, a1, a2, a3, a4 这是5个带下标的变量,这5个变量的类型是相同的 常量表达式中不允许包含变量; 例如 int n; n = 5; int an; 不合法!,第四讲 数组,(2)数组初始化 是定义数组完成
44、赋初值的任务 例如 int a5 = 3, 5, 4, 1, 2 ; aa0 = 3; a1 = 5; a2 = 4; a3 = 1; a4 = 2;,第四讲 数组,(3)数组在内存中分配一段连续的存储空间,内存,地址,变量名,FF02,FF01,FF00,FF03,FF04,FF05,FF06,FF07,a0,a1,a2,a3,00000000,00000011,00000000,00000101,00000000,00000100,00000000,00000001,00000000,00000010,FF08,FF09,a4,a,数组名,第四讲 数组,思考: 1.#include voi
45、d main() int a4; / 声明项 printf(“a0=%d; a1=%d; a2=%d; a3=%dn”, 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=6,a1 a2 a3 a4 a5 a6,初始值 1 8 3 2 4 9,比较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 9,1到达位置 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 1,