




已阅读5页,还剩88页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章第二章 程序基本结构程序基本结构 2.1 2.1 关系运算和逻辑运算关系运算和逻辑运算 2.2 2.2 分支结构分支结构 2.3 2.3 循环结构循环结构 2.4 2.4 breakbreak和和continuecontinue语句语句 2.5 2.5 gotogoto 语句语句 2.6 2.6 指针程序设计指针程序设计 2.7 2.7 经典算法举例经典算法举例 Date 1 引言引言 第一章中我们学习了顺序结构的C程序设计方法 ,但是实际应用中,很多问题仅有顺序结构的方法 是无法解决的。 算法算法 问题1:输入三个整数,按从大到小的顺序输出。 问题2:编写程序计算:1+2+3+100。 算法算法 Date 2 问题问题1 1的算法:的算法: S1:输入3个整数, 分别赋值给a,b,c S2: 如果a 、=、=、!=!= 说明:说明: 1 1、优先级优先级:前前4 4种相同,后种相同,后2 2种也相同,但前种也相同,但前4 4种高于后种高于后 两种;所有关系运算符的优先级都两种;所有关系运算符的优先级都低于算术运算符低于算术运算符而而高于赋高于赋 值运算符值运算符。 2 2、结合性结合性:自左至右自左至右 ab-cab-ca(b-c)a(b-c) a=b=ca=b=ca=(b=c)a=(b=c) a=b!=ca=b!=ca=(b!=c)a=(b!=c) Date 4 二、关系表达式二、关系表达式 用用关系运算符将两个表达式连接起来的式子关系运算符将两个表达式连接起来的式子。 其中其中被连接的表达式可以是被连接的表达式可以是算术表达式算术表达式、关系关系 表达式表达式、逻辑表达式逻辑表达式、赋值表达式赋值表达式或或字符表达式字符表达式。 如:如:a+bc+da+bc+d、xy=c+dxy=c+d、aAaA 关系表达式的值只能是关系表达式的值只能是1 1或或0 0,当表达式成立即为当表达式成立即为“ “真真” ” 时,值为整数时,值为整数1 1;否则为;否则为“ “假假” ”,值为整数,值为整数0 0。因此可看作。因此可看作整型整型 表达式表达式。 假设假设a=3, b=2, c=1a=3, b=2, c=1,求以下关系表达式的值:求以下关系表达式的值: ab (ab)=cab (ab)=c abc abc f=abb=1|!ba=1|!b ( (a=1)|(!b)a=1)|(!b) 二、逻辑表达式二、逻辑表达式 逻辑表达式的值应该是逻辑表达式的值应该是“逻辑真逻辑真”或或“逻辑假逻辑假”。 语言以数值语言以数值代表代表“真真”, ”, 以数值以数值代表代表“假假” ;但参加运算的运算量可以是;但参加运算的运算量可以是任何数值任何数值,进行判断时,进行判断时, 非零值非零值代表代表“真真”,零值零值代表代表“假假”。 若若a=100a=100,b=5b=5,则则! !a a=? =? a (! + -) 负类指针有地址, (-, 类型转换, *, ( /所有的单目运算符比如+ - +(正) -(负) 指针运算* /这个“余”是指取余运算即% 移位五,关系六; /移位运算符: ,关系: = b,ab,则则a a b S3:输出a,b C C语言单分支结构:语言单分支结构: if (if (表达式表达式 ) ) 语句语句 ; ; Date 11 if (if (表达式表达式) ) 语句语句 一般形式: 表达式表达式 语句语句 真真( (非非0)0) 假假(0)(0) 流程图: 注意:此位置不注意:此位置不 使用分号使用分号“ “;” ”! Date 12 #include void main( ) int a,b,temp; printf(“Input a,b:“); scanf(“%d%d“, if (ab) /* 判断a、b的关系 */ temp=a; a=b; b=temp; /* a大于b,则交换a,b 的值 */ printf(“Result is %d,%dn“,a,b); /*按从小到大顺序 输出 */ 例2.1的C语言程序如下: 复合语句:复合语句:在同一个在同一个 条件下作为一个整体条件下作为一个整体 执行的多条语句执行的多条语句 Date 13 例例2.22.2输入三个数输入三个数x1,x2,x3,x1,x2,x3,按从小到大的顺序输出这三个数按从小到大的顺序输出这三个数 。 #include void main() int x1,x2,x3,temp; scanf(“%d%d%d”, if(x1x2) temp=x1;x1=x2;x2=temp; if(x1x3) temp=x1;x1=x3;x3=temp; if(x2x3) temp=x2;x2=x3;x3=temp; printf(“%d,%d,%d”,x1,x2,x3); 输入输入a , b, ca , b, c ab?ab? a ab b ac?ac? bc?bc? a ac c b bc c 输出输出a, b, ca, b, c 是是 是是 是是 否否 否否 否否 输入:输入:3 5 13 5 1 输出:输出:1 1,3 3,5 5 Date 14 2.2.2 2.2.2 双分支结构双分支结构 例2.3: 输入两个整数,输出其中较大的一个。 算法:算法: S1: S1: 输入两个整数输入两个整数a,ba,b S2: S2: 如果如果ab,ab,则输出则输出a a, 否则输出b C C语言单分支结构:语言单分支结构: if (if (表达式表达式 ) ) 语句语句1;1; elseelse 语句语句2;2; Date 15 一般形式: if (if (表达式表达式) ) 语句语句1 1 elseelse 语句语句2 2 流程图: 表达式表达式 语句语句2 2 真真( (非非0)0)假假(0)(0) 语句语句1 1 Date 16 例例2.3 2.3 输入两个整数,输出其中较大的一个。输入两个整数,输出其中较大的一个。 N-SN-S流程图流程图 输入输入x1,x2x1,x2 x1x2x1x2 Y Y N N 输出输出x1x1输出输出x2x2 #include void main() int x1,x2; scanf(“%d%d”, if(x1x2) printf(“%dn”,x1); else printf(“%dn”,x2); Date 17 判断某年是否闰年?若是,输出判断某年是否闰年?若是,输出 XXXXXXXX年是闰年,若不是,输出年是闰年,若不是,输出 XXXXXXXX年不是闰年。年不是闰年。 提示:闰年的判断,能被4整除不能被100整除, 或者能被400整除的都是闰年。 Date 18 2.2.3 2.2.3 多分支结构多分支结构 一、一、if if语句嵌套语句嵌套 一般形式: 流程图: if (if (表达式表达式1)1) 语句语句1 1 else if (else if (表达式表达式2)2) 语句语句2 2 else if (else if (表达式表达式3)3) 语句语句3 3 else if (else if (表达式表达式n)n) 语句语句n n else else 语句语句n+1n+1 表达式表达式1 1 语句语句2 2 真真( (非非0)0)假假(0)(0) 语句语句1 1 表达式表达式2 2 真真( (非非0)0) 语句语句1 1 语句语句2 2 假假(0)(0) Date 19 关于关于if if语句的说明语句的说明: 1 1、表达式一般为关系表达式或逻辑表达式。但在、表达式一般为关系表达式或逻辑表达式。但在C C语言语言 中它也中它也可以是任意的数值表达式可以是任意的数值表达式。 if (3)if (3) n=1; n=1; if (a)if (a) printf(“%dprintf(“%d“, a);“, a); if (n=3-3)if (n=3-3) x=1; x=1; elseelse x=-1; x=-1; 2 2、表达式后面不能有任何标点符号表达式后面不能有任何标点符号! 3 3、elseelse只能与只能与ifif配对使用配对使用。仅。仅elseelse本身不能单独作为一个语本身不能单独作为一个语 句使用。句使用。 if (x5)if (x5); ; y=x; y=x; elseelse y=2*x-1; y=2*x-1; if (x5)if (x5) ; ; y=x;y=x; elseelse y=2*x-1; y=2*x-1; 将出现语法错误将出现语法错误 Date 20 4 4、每个语句序列可以是一个语句也可以是若干个语句,、每个语句序列可以是一个语句也可以是若干个语句, 但要但要用花括号括起来用花括号括起来构成复合语句构成复合语句。 if (ab) t=a; a=b; b=t; if (a+bc area=sqrt(s*(s-a)*(s-b)*(s-c); printf(“area=%.2fn“, area); else printf(“It is not a trilateral!n“); 复合语句的复合语句的花括号后不能再写分号花括号后不能再写分号。复合语句。复合语句 在语法上是一个整体,相当于一个语句。在语法上是一个整体,相当于一个语句。 Date 21 5 5、ifif语句的嵌套语句的嵌套 在在ifif语句的原语句的原“语句语句”中又包含一个或多个中又包含一个或多个ifif语句语句 1. 1. if (if (表达式表达式1)1) if (if (表达式表达式2) 2) 语句语句 2. 2. if (if (表达式表达式1) 1) 语句语句1 1 elseelse if (if (表达式表达式2) 2) 语句语句2 2 3. 3. if (if (表达式件表达式件1) 1) 语句语句1 1 elseelse if (if (表达式表达式2) 2) 语句语句2 2 else else 语句语句3 3 4. 4. if if ( (表达式表达式1)1) if if ( (表达式表达式2) 2) 语句语句1 1 elseelse 语句语句2 2 二义性?二义性? 语言规定:语言规定:elseelse总是与它前面最近的且未曾配对的总是与它前面最近的且未曾配对的if if配对。配对。 if (if (表达式表达式1)1) if (if (表达式表达式2) 2) 语句语句1 1 else else 语句语句2 2 if (if (表达式表达式1)1) if (if (表达式表达式2) 2) 语句语句1 1 elseelse 语句语句2 2 Date 22 例例2.4 2.4 输入输入3 3个数,判断组成什么类型三角形个数,判断组成什么类型三角形 if(a+b)c”); else if(a=b|b=c|a=c) else if(a=b|b=c|a=c) printf(“dengyao!nprintf(“dengyao!n”);”); else else printf(“budengbian!nprintf(“budengbian!n”);”); else else printf(“Erro!nprintf(“Erro!n”);”); Date 23 例例2.2.5 5 编程求解函数:编程求解函数: -1-1 0 0 1 1 ( (x0)(x0) y=y= 程序1: if (x=0) if (x0) y=1; else y=0; else y=-1; y=-1 y=0y=1 x=0x=0 x0x0 真假 真假 eg502.c Date 24 程序3: y=0; if (x!=0) if (x0) y=1; else y=-1; y=y=0 0 x!=0x!=0 x0x0 y=1y=-1 真 真 假 假 -1-1 0 0 1 1 ( (x0)(x0) y=y= Date 25 例: 求一元二次方程ax2+bx+c=0的根,a,b,c由键 盘输入。 分析:对于一元二次方程有以下几种可能: a=0,不是二次方程; b2-4ac=0,有两个相等的实根; b2-4ac0,有两个不等的实根; b2-4ac void main()void main() float float a,b,c,d,x1,x2,realpart,imagpart;a,b,c,d,x1,x2,realpart,imagpart; scanf(“%f%f%f”,a,b,cscanf(“%f%f%f”,a,b,c); ); if(fabs(aif(fabs(a)1e-6) if(disc1e-6) x1=(-b+sqrt(disc)/(2*a);x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(“hasprintf(“has distinct real distinct real roots:%f,%fn”,x1,x2);roots:%f,%fn”,x1,x2); else else realpartrealpart=-b/(2*a);=-b/(2*a); imagepartimagepart=sqrt(-=sqrt(- disc)/(2*a);disc)/(2*a); printf(“%f+%fin”,realpart,printf(“%f+%fin”,realpart, imagpartimagpart); ); pritnf(“%f-pritnf(“%f- %fin”,realpart,imagpart%fin”,realpart,imagpart); ); Date 27 1、条件运算符: ? :(C中唯一的三目运算符) 优先级仅高于赋值类,右结合性 2、条件表达式的一般形式: 表达式1?表达式2:表达式3 运算过程:首先求表达式1的值,若为真(非0),则求表达式 2的值,且整个表达式的值为表达式2的值;若表达式1为假(0 ),则求表达式3的值,且整个表达式的值为表达式3的值。 二、条件运算符二、条件运算符 Date 28 (2)右结合性: (3)“表达式1?表达式2:表达式”中,表达式2和 表达式3不仅可以是数值表达式,还可以是赋值表达 式或函数表达式 例如: ab?(a=100):(b=100) ab?printf(“”%dn”,a):printf(“%dn”,b) (4)表达式1、表达式2和表达式3的类型都可以不同。 表达式值的类型是表达式2、3中类型较高的类型。 例如:xy?1:1.5 表达式值是double类型 (1)优先级高于赋值,低于关系运算符和算数运算符 例:x= ab? a:b+1;x= (ab)? a:(b+1); ab? a : cd? c : dab? a : (cd? c : d) if (ab) x=a; else x=b+1; Date 29 例2.7:输入一个字符,如果是大写字母,转换为小写, 如果不是不转换。最后输出。 #include void main() char ch; scanf(“%c”, /*ch=getchar();*/ ch=(ch=A x, y ; scanf(“%dscanf(“%d”, /”, /输入输入2 2? switch(x) switch(x) case 1 : y=10; case 1 : y=10; printf(“%dnprintf(“%dn“, y) ;“, y) ; case 2 : y=20; case 2 : y=20; printf(“%dnprintf(“%dn“, y) ;“, y) ; case 3 : y=30; case 3 : y=30; printf(“%dnprintf(“%dn“, y) ;“, y) ; default : y=0; default : y=0; printf(“%dnprintf(“%dn“, y) ;“, y) ; 5 5、casecase后常量后常量 表达式只起语表达式只起语 句标号的作用句标号的作用 ,每个,每个casecase之后之后 通常都有一个通常都有一个 breakbreak,使流程使流程 跳出跳出switchswitch语句语句 , ,否则流程转到否则流程转到 下一个下一个 case(default)case(default)中中 继续执行;继续执行; Date 33 6 6、多个、多个casecase可以共用一组执行语句;可以共用一组执行语句; case 6 : case 6 : case 7 : case 7 : printf(“Resetnprintf(“Resetn“); break; “); break; 但不能写成:但不能写成:casecase 6,76,7: : printf(“Resetnprintf(“Resetn“); break;“); break; 7 7、switchswitch语句可以嵌套;但有多层语句可以嵌套;但有多层switchswitch语句时,语句时,breakbreak 只能退出本层的只能退出本层的switchswitch语句体;语句体; Date 34 举例: 在学生成绩管理中,成绩经常要在百分制与等级制 之间进行转换。90分以上为A等,80-89为B等,70-79为C等 ,60-69分为D等,其余为E等。编制程序,根据输入的百分 制,输出对应的等级。 void main() int score; printf(“Input score of student:“); scanf(“%d“, if(score=90) printf(“A“); else if(score=80) printf(“B“); else if(score=70) printf(“C“); else if(score=60) printf(“D“); else printf(“E“); Date 35 void main( ) int score,temp; printf(“Input score of student:“); scanf(“%d“, temp=score/10; switch(temp) case 10: case 9: printf(“A“); break; case 8: printf(“B“); case 7: printf(“C“); break; case 6: printf(“D“); break; default: printf(“E“); break; Date 36 简单选择界面的编程。从键盘输入整数,输出不同的字符串: 输入1,输出Good morning; 输入2,输出Good afternoon; 输入3,输出Good evening; 输入4,输出Good night; 输入其它数字,输出Bye-bye。 Date 37 问题2:编写程序计算:1+2+3+100。 算法算法 2.3 循环结构 2.3.1 循环结构的引出 Date 38 问题问题2 2的算法:的算法: 算法1:直接写出算式 S1: result=1+2+3+4+5+100 容易实现吗?容易实现吗? 算法算法2 2: 考虑到考虑到1+2+3+1001+2+3+100可以改写为可以改写为 :(1+2)+3)+100)(1+2)+3)+100) S1: p1=1+2S1: p1=1+2 S2: p2=p1+3 S2: p2=p1+3 S3: p3=p2+4 S3: p3=p2+4 S99: p99=p98+100 S99: p99=p98+100,结果在结果在p99p99里里 。 定义定义9999个变量,个变量, 容易实现吗?容易实现吗? 注意观察:每注意观察:每 一步都类似一步都类似 Date 39 算法算法3 3: S0: p=0, i=1S0: p=0, i=1 S1: p=p+i, i=i+1 S1: p=p+i, i=i+1 S2: p=p+i, i=i+1 S2: p=p+i, i=i+1 S3: p=p+i, i=i+1 S3: p=p+i, i=i+1 S99: p=p+i, i=i+ 1 S99: p=p+i, i=i+ 1 S100: p=S100: p=p+ip+i, i=i+ 1, i=i+ 1 完全一样的完全一样的9999步步 算法算法4 4: S0: p=0, i=1S0: p=0, i=1(循环初值)循环初值) S1: p=p+i, i=i+1S1: p=p+i, i=i+1(循环体)循环体) S2: S2: i void main() char ch; while(ch=getchar()!=0) ch=(ch=A i=1; while (i void main( ) int i , j ; for ( i=1; i void main( ) int i , j ; for( i=1; i main( ) int i , j ; for( i=1; i=1 ; i- -) for ( j=1; j void main( ) float r, area; for (r =1; r 100) break; printf(“%6.2fn“, area); 输出结果输出结果: : 3.14 3.14 12.56 12.56 28.26 28.26 50.24 50.24 78.50 78.50 Date 69 2.4.2continue语句 1、格式: continue; 2、功能: 提前结束本次循环体的执行(不再执行循环体中 continue后面的语句),接着进行下一次是否执行 循环的判定 3、说明: 、continue语句只能用于循环语句中,它是一 种具有特殊功能的转移语句; 、continue与break不同:continue语句只结束 本次循环,而不是终止整个循环的执行;而break语 句则结束整个循环,不再判断循环条件是否成立。 Date 70 例2.15:把10到20之间能被3整除的数输出 #include void main( ) int n; for (n=10; n=n) printf(“ %d is sushu!”,n); Date 72 判断素数 算法改进1:可以定义一个标志变量,判断起来很方便。 flag0; for(i=2;i=k+1) printf(“ %d is sushu!”,n); Date 74 例:打印3100之间的全部素数。 for (m=3; m void main( ) int x,y,z; printf(“* 百鸡问题 *n“); for (x=1;x void main() int x,y,z; printf(“* 百鸡问题 *n”); for (z=3;z=1;day-) x1=(x2+1)*2; x2=x1; printf(“peach are %dn“,x1); Date 83 2.2.6 6 指针程序设计指针程序设计 2.6.1指针 1 1、指针指针的含义:变量的地址的含义:变量的地址 指针变量就是一类存取其他变量或函数的地址的变量指针变量就是一类存取其他变量或函数的地址的变量 。 说明说明: (1 1)系统为每个变量分配一个确定、唯一的地址。)系统为每个变量分配一个确定、唯一的地址。 (2 2)存取变量的值时,有两种方式:)存取变量的值时,有两种方式:1 1)直接访问直接访问: 通过变量名;通过变量名;2 2)间接访问间接访问:通过变量的地址。:通过变量的地址。 (3 3)变量的地址就是其所占内存空间的首地址。)变量的地址就是其所占内存空间的首地址。 Date 84 2 2、指针变量指针变量的定义:的定义: 基类型基类型 * *指针变量名指针变量名=初始值初始值; ; 变量名前的*表示该变量 是一个指针变量,以示 与普通变量的区别。 可以是C语言中的任何一 种数据类型,是指针变量 所指向的对象的类型。 初始值可以省略初始值可以省略 例如:例如: intint i=65535, *pi= i=65535, *pi= /定义指针变量的同时赋初值定义指针变量的同时赋初值 char c=z,*pcchar c=z,*pc; pcpc= /先定义变量,再赋初值先定义变量,再赋初值 指针变量、变量、变量地址和变量的值的关系指针变量、变量、变量地址和变量的值的关系见下图见下图 Date 85 01111000 11111111 00010010 00000000 . . . 01111100 11111111 00010010 00000000 . . . 11111111 11111111 00000000 00000000 01111010 变量的值 0012FF67 0012FF68 0012FF69 0012FF6A . . . 0012FF70 0012FF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年度安全培训学时证明课件
- 年底安全教育培训课件
- 2025年什邡市事业单位考试真题
- 数控机床订购合同7篇
- 姚安交通安全培训课件
- 工业安全培训目标课件
- Ethyl-3-3-dimethyl-4-nitrobutanoate-生命科学试剂-MCE
- 农发行鹤岗市工农区2025秋招群面案例总结模板
- 国家管网北京智网数科公司高校毕业生招聘笔试真题2024
- 平角焊两层课件
- 《搞定:无压工作的艺术》完整课件
- 京东方岗位胜任力测评题库
- 印刷包装公司安全生产管理方案
- 高中数学64数列求和省公开课获奖课件市赛课比赛一等奖课件
- 二手车国庆节活动方案
- 人教版八年级上册地理教学计划及进度表
- 2025高考物理步步高同步练习必修3练透答案
- 分包单位与班组签订合同
- DZ∕T 0215-2020 矿产地质勘查规范 煤(正式版)
- 2024年初中升学考试九年级数学专题复习新课标要求-中考33讲
- (高清版)DZT 0289-2015 区域生态地球化学评价规范
评论
0/150
提交评论