《C语言入门教程.ppt》由会员分享,可在线阅读,更多相关《C语言入门教程.ppt(434页珍藏版)》请在课桌文档上搜索。
1、C语言程序设计Copyer:Vigiking,第一章 计算机语言与C语言概述,1.1 计算机语言概念 计算机语言定义 计算机能够识别和接受的语言。要使计算机按自己的意图工作,必须使用计算机所能接受、理解和执行的指令指挥计算机工作。,计算机语言的种类 机器语言 低级语言 汇编语言(面向计算机)BASIC 入门语言 F77 科学计算 高级语言 Foxpro 数据库管理(面向问题)C 多用途,计算机语言,机器语言 最早问世,用二进制代码构成指令。如:100000(+)110000(-)用机器语言编程的缺点:繁琐、不直观、不易调试。如计算y=2x2+3x-1需要七八条指令。移植性差。依赖于计算机。,汇
2、编语言 用符号构成指令,如:MOV、ADD 用汇编语言编程:相对直观,但仍繁琐,仍是面向计算机的语言。汇编语言是计算机间接接受的语言,高级语言与低级语言相比,有根本性的区别:是面向问题的语言。高级语言的一条指令(语句):y=2*x*x+3*x-1;对应于:y=2x2+3x-1 y=sin(x);对应于:y=sinx用高级语言编程:直观、易懂、移植性好(不依赖于具体计算机),上机运行高级语言程序需经过编译:编译 执行 要上机完成一个计算问题,主要的任务就是用高级语言编写出相应的源程序。即至少要学会一种计算机语言。,高级语言源程序,机器指令目的程序,结果,编译程序,1.2 C语言的特点 集高级语言
3、和低级语言的优点于一身:能实现低级语言的大部分功能(如直接访问内存物理地址、进行位操作等)。图形功能强。运算符和数据结构丰富。语法限制不太严格,程序设计自由度大。生成目标代码质量高,程序执行效率高。,1.3 简单的C程序介绍 例1:main()主函数说明 程序框架 printf(“abcdef”);函数体 语句 程序的功能是输出字符串:abcdef,例2:求两数之和。main()int a,b,c;a a=100;b=50;b c=a+b;c printf(“n c=%d”,c);程序运行结果:c=150,例3:求两数中的最大值。函数类型 函数名 形参main()int max(int x,i
4、nt y)int a,b,c;int z;scanf(“%d,%d”,a x b y c z(两个函数组成),3,5,3,5,5,5,总结上例可知:(1)C程序由函数构成。(2)函数由两部分组成:函数说明部分:函数名、函数类型、形参名、形参类型。函数体:实现函数的具体操作;由语句构成。(3)程序总是从main函数开始执行。(4)书写格式自由。(5)语句必须有分号。:,第二章 算法 2.1 算法的概念 要利用计算机处理问题,光学习语言的语法规则还不够,最重要的是要学会针对各类型的问题,拟定出有效的解题方法和步骤。解题方法和步骤就是算法。,算法:为了解决一个问题而采取的有限步骤。计算机算法:如何使
5、计算机一步一步地工作的具体过程。,利用计算机处理问题的步骤:1)设计好算法算法设计;2)用计算机语言实现算法程序设计。算法必须是“有效”的。算法设计还要充分考虑算法的好坏。衡量算法好坏的主要标准:程序简练。执行速度快。占空间少。,例:考虑 的算法。算法:直接表达。直接用语句 s=1+2+3+4+5+6+7+8+9+10,当项数较多时该算法不适用,s=i,1,10,算法:迭代法(累加求和法)s=1+2+3+4+5+6+7+8+9+10 算法步骤:s i 使s=0+使i=1 累加器 记数器 s+is i+1i 若i10转,否则转 输出s,0,1,1,2,3,3,6,4,10,5,该算法通用,是好算
6、法,2.2 算法的表示 算法需要有统一的表示方法 常用的表示方法有:自然语言 流程图 结构化流程图 N-S流程图.,1、自然语言 对于计算 s=1+2+3+4+5+6+7+8+9+10 用自然语言表示为:使s=0(s为累加器)使i=1(i为计数器)s+is(累加求和公式)i+1i(计数器加1)若i10转,否则转 输出s的值 特点:通俗易懂、文字冗长、含义不大严格。,2、流程图 用流程图符号表示算法。常用的流程图符号 起止框 输入输出框 处理框 流程线 判断框,对于计算 s=1+2+3+4+5+6+7+8+9+10 用流程图表示为:,s+i s,i+1 i,S+i s,S+i s,i10,输出s
7、,0 s,1 i,直观形象,易于理解,次序清楚,Y,N,3、结构化流程图 传统的流程图有一个弊端:对流程线没有严格的限制,对于较复杂的算法可能会变成乱麻一般(BS型算法)。为克服这一弊端,提出了由三个基本结构组成算法流程图的思想:结构化流程图,三个基本结构:顺序结构 按固定顺序(从上到下或从左到右)执行的结构。,A,B,a,b,选择结构 根据条件P选择执行哪一个分支。成立 不成立,p,A,B,a,b,成立,不成立,例:计算 y=1/x 当x0时 y=10000 当x=0时 的算法流程图图:选择结构,输入x,X=0?,10000y,1/xy,输出y,Y,N,循环结构 重复执行某些操作的结构。分为
8、两种:当型循环和直到型循环。当型循环 直到型循环,P1,A,A,P2,a,a,b,b,Y,Y,N,N,可以看出,每个基本结构都只有一个入口和一个出口,因此,用三个基本结构构成的流程图不会象乱麻一般,用三个基本结构构成的流程图就成为结构化流程图,用结构化流程图描述的算法称为结构化算法,相应的程序设计就称为结构化程序设计。,观察前例:,0 s,1 i,S+i s,i+1 i,i10,输出s,顺序结构,循环结构,y,n,4 N-S流程图N-S流程图的三个基本结构:,A,B,P,成立,不成立,A,B,A,B,当P1,直到P2,顺序结构,选择结构,循环结构,例:计算 y=1/x 当x0时 y=10000
9、 当x=0时 的N-S流程图:,输入x,X=0?,是,否,10000y 1/xy,输出y,例:计算 s=1+2+3+4+5+6+7+8+9+10 的N-S流程图:i10 直到i10 直到型 当型,0 s,1 i,输出s,1 i,0 s,s+i s,i+1 i,s+i s,i+1 i,输出s,第三章 数据类型、运算符 与 表达式 3.1 C 的数据类型基本类型(整型、实型、字符型、枚举型)构造类型(略)指针类型(略)空类型 各类型包含常量与变量,3.2 常量与变量 常量与符号常量 常量 在程序运行过程中其值保持不变的量。符号常量 用来代表一个常量的标识符。#define PI 3.1415926
10、,例:#define PI 3.1415926 main()float r=2,c;c=2*PI*r;printf(“%f”,c);,变量 其值可以改变的量。变量的三要素:变量名每个变量有一个名字,作为识别该变量的标识符。变量的值 每个变量有一个值,变量的值是随时可以改变的。,变量的存储单元 每个变量占据一个内存单元,用于存放变量的值。变量名 a 变量值 存储单元,3,变量的命名规则:由字母、数字和下划线组成 以字母或下划线开头 a、x1、y_2、_b1、_1c 合法 1x、a+2、不合法 变量必须先定义后使用。程序中何时使用常量?何时使用变量?,3.3 整型数据 整型常量 即整常数,c的整常
11、数有三种形式:十进制整数 与数学中的整数一致,如:100,123,15等。八进制整数 以0开头的整数,如:010,07,020等。十六进制整数 以0 x开头的整数,如:0 x10,0 xff,0 x2a等。,整型变量 用于存放整数的变量。分4种类型:基本型:int a 16位,可表示的数值范围:-3276832767 短整型:short int b 16位,可表示的数值范围:-3276832767 长整型:long int c 32位,数值范围:-21474836482147483647,无符号型:加上 unsigned 只存放正数。如:unsigned int x 变量x为无符号整数,16位
12、全表示数码,数值范围:065535 在程序设计中,如果要使用整型变量,必须首先选择以上类型符来定义变量,然后才能使用;,例:main()定义 int a,b,c;a=100;b=50;使用 c=a+b;printf(“%d”,c);一般根据什么原则选择变量的类型?,3.4 实型数据 实型常量 可使用两种形式表示:小数形式:如 1.23,3.1415926 15.48 指数形式:如 1e-20 1.23e5,实型变量 用于存放实数的变量 分单精度和双精度两种:float a,b 定义a和b为单精度型变量 32位,7位有效数字,10-381038 double x,y 定义x和y为双精度型变量 6
13、4位,15位有效数字,10-30810308,例:main()float r,c;double r,c;r=5;c=2*3.1415926*r;printf(“%f”,c);,3.5 字符型数据 字符常量 用单引号括起来的一个字符。a,x,*,1等 除此外,以开头的字符如n,t等 称为转义字符,祥见书表3.3,字符型变量 用于存放字符的变量。char c1,c2 定义c1和c2为字符型变量 c1=a;c2=b;字符赋值 字符型变量存放一个字符,占据一个字节,字符型数据的存储形式 存放ASCII码 不是 而是 如字符a在内存中存放97,b 存放98。与整数的存储形式一致,它们之间可以通用 一个字
14、符数据既可以作字符用,也可以作整数用(取其ASCII代码)。如:32+a相当于 32+97 若 int x;char c;则 x=a;c=97;x=97;c=a;都允许,a,97,字符串常量 用双引号括起来的字符序列。如:”abcde”,”china”a”也属字符串。注意”a”与a的区别。对于:char c;c=”a”;用法错误,字符串中每个字符各占一个字节,并且在字符串结尾加上一个结束标记0 如:”china”在内存中占6个字节。c h i n a 0 C语言中专门的字符串变量,可用字符数组存放(以后介绍)。,3.6 变量赋初值 在定义变量的同时给相应的变量赋初值。如:int a=3;a f
15、loat b=5.2;char c=a;int x=y=z=6;效果:在给变量分配内存单元的同时在相应的单 元中存放初值。,3,3.7 各数值型数据间的混合运算 整型、实型、字符型数据间可以进行混合运算,如:10-a*1.5 运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:将优先级低的类型转换到优先级高的类型,数据类型的优先级:高 double float long unsignde 低 int char,3.8 算术运算符与算术表达式 基本的算术运算符+-*/%算术表达式 用算术运算符将运算对象连接起来的式子 用于表达数学公式的式子 如:2*x+y-1/a
16、 表达式经过运算最终得到一个值:算术表达式的值,运算符的优先级与结合性 优先级:在对表达式求值时,如果存在多个运算符,则运算的先后次序按运算符的优先级别从高到底进行。运算符的优先级关系为:高:*/%低:+-如:a-2*x 先算*2*(a+2)有括号的情况?,结合性:如果在一个运算对象两边的运算符的优先级相同,则按规定的“结合方向”处理。如:a-b+c b与-结合是从左到右,称“左结合性”。b与+结合是从右到左,称“右结合性”。每个运算符都有相应的优先级和结合性。基本算术运算符都是左结合性。,计算表达式例:2+A-1/2.0 1+3/2-1构造表达式例 2x2+3x-1,a+b a-b,a+b
17、a-b x+y x-y,a+b/a-b?,(a+b)/(a-b),2*x*x+3*x-1(*不能省),(a+b)/(a-b)/(x+y)/(x-y),(a+b)/(a-b)/(x+y)/(x-y),(a+b)/(a-b)/(x+y)*(x-y),强制类型转换可以用强制类型转换运算符将一个表达式的值转换成所需类型:如:(int)(x+y)(float)(7%3),应用举例:int a=200,b=300,c;c=a*b/100;?可知,有自动转换和强制转换,当自动转换达不到目的时,可用强制转换。,c=(long)a*b/100;,c=(long)(a*b)/100;,自增、自减运算符 自增运算符
18、:+使变量值加1 自减运算符:-使变量值减1 两种用法:+i,-i 先加(减)后用 i+,i-先用后加(减)两种用法对i效果一样,但表达式的值不同。例:假设i的原值为5:j=+i;j=?j=i+;j=?,注意:+和-只能用于变量。如:3+和(a+1)+不合法+和-为右结合性。(-i)+-i+-(i+)若i的原值是5,则该表达式的值是多少?,例:分析执行下列语句后的结果:a=5;a b c d b=a+;c=-a-b+;d=(a+)-(+b)+c-;,5,5,6,5,0,6,7,-2,6,-1,两种特殊情况:k=(i+)+(i+)+(i+)i+j 是 i+(+j)还是(i+)+j?i+虽然与i=
19、i+1等效,但使用自增自减运算符的代码优化程度好,因而经常使用;但用时需特别小心。,3.9 赋值运算符和赋值表达式 赋值运算符“=”称赋值运算符,其作用是将一个数据赋给一个变量。如:a=5 不要理解为“等号”。执行赋值运算的结果,是将右边的数据存入左边变量所对应的内存单元中。,赋值规则 如果赋值运算符两侧的类型不一致,则在赋值时要进行类型转换,转换规则为:实型整变量 舍去小数部分。int a=5.5;a中为5。整型实变量 数值不变,以浮点形式存储。字符型整变量 放在整形变量低8位。保持原值不变原则。int a=A;,复合赋值运算符 在赋值运算符前加上其它运算符,可以构成复合赋值运算符。a+=3
20、 a=a+3 b-=x+5 b=b-(x+5)x*=c-6 x=x*(c-6)y/=a*4 y=y/(a*4)k%=b-2 k=k%(b-2)属于高效率运算符。,赋值表达式 主要实现赋值运算的表达式。一般形式:=如:a=5 y=2*x+3 a=a+1 不是衡等作用:将右边表达式的值赋给左边的变量。赋值表达式的值取左边变量的值。,赋值表达式右边的可以是任何表达式,如:a=(b=5)赋值表达式中包含赋值表达式 赋值运算符的优先级低于所有算术运算符,且是右结合性。a=(b=5)与 a=b=5 等效。,例:计算以下表达式的值:a=b=c=5 a=5+(c=6)a=(b=4)+(c=6)a=(b=4.5
21、)+(c=6.5)(a、b、c为整型变量)a+=a-=a*a(设a的原值为3),赋值表达式是C语言中的一个重要成分,在赋值表达式后加一分号就成为常用的赋值语句。如 y=2*x+1;赋值表达式作为表达式的一种,可以出现在任何表达式中,如:x+2-(b/3-(a=k-5)+b,3.10 逗号表达式 逗号也是一种运算符,用它对两个表达式实现连接运算。3+5,6+8 称逗号表达式。逗号表达式的一般形式:表达式1,表达式2 取表达式2的值作为整个逗号表达式的值。如:a=3*5,a*4 逗号表达式的值为:60,一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如:(a=3*5,a*4),a+5 因
22、此,逗号表达式的一般形式可以扩展为:表达式1,表达式2,表达式3,,表达式n 取表达式n的值作为整个逗号表达式的值。逗号运算符的优先级最低,且是左结合性。逗号运算符只起到连接作用,没有实际操作。,第四章 最简单的C程序设计,C 程序最基本的成分是语句 目前我们已掌握的语句:变量说明语句:int a,b,c;表达式语句:x+y;特别地:a=5;赋值语句,可以编写简单程序如:main()int x,y;x=5;y=2*x*x+3*x-1;该程序语法上完整,但还缺少输出。,数据的输出 用输出函数实现,其中的两种输出函数:1.putchar 函数(字符输出函数)用于输出一个字符。如:putchar(a
23、);putchar(100);char c=b;putchar(c);,例:输出单词Boy的完整程序:#include“stdio.h”注意该语句的作用 main()char a,b,c;a=B;b=o;c=y;putchar(a);putchar(b);putchar(c);,2.printf函数(格式输出函数)任意类型、任意格式、任意个数。例如:int a=100,b=56;printf(“a=%d,b=%d”,a,b);普通字符 格式说明 格式控制 输出表列 输出结果:a=100,b=56“%”后的字符称格式字符,不同格式字符对应不同的数据类型。,d格式符:按整数格式输出 几种用法:%d
24、 不指定宽度,按实际宽度输出%md 按指定宽度输出,m为宽度%ld 用于输出长整型数,例:int a=125,b=453;long c=65535;printf(“a=%d,b=%5d,c=%ld”,a,b,c);输出结果:a=125,b=453,c=65535,%ld也可以按指定宽度输出:printf(“c=%8ld”,c);输出结果:c=65535注意:格式字符的类型要与对应的输出对象的类型一致。,c格式符:用于输出字符 char c=A;printf(“c=%c,%c”,c,B);输出结果:c=A,B 输出对象既可以是字符变量、字符常量,还可以是整型表达式。,如:int a=100;ch
25、ar b=A;printf(“n%d,%c”,a,a);printf(“n%c,%d”,b,b);输出结果:100,d A,65,s格式符:用于输出字符串%s 不指定宽度%-ms 指定宽度,左靠齐%ms 指定宽度,右靠齐%m.ns 指定宽度m,只取左端n个字符,右靠齐%-m.ns 指定宽度m,只取左端n个字符,左靠齐,例:printf(“1:%s”,”abcd”);printf(“2:%8s”,”abcd”);printf(“3:%-8s”,”abcd”);printf(“4:%8.3s”,”abcd”);printf(“5:%-8.3s”,”abcd”);1:abcd2:abcd3:abcd
26、 4:abc5:abc,f格式符:按小数形式输出实数%f 由系统指定宽度(6位小数)%m.nf 指定宽度m,小数位数n,右靠齐%-m.nf 指定宽度m,小数位数n,左靠齐 注意:宽度包括符号和小数点。,例:float a=3.141592654,b=14.326795,c=-125.2468;printf(“na=%f,b=%8.3f,c=%-10.2f”,a,b,c);输出结果:a=3.141592,b=14.326,c=-125.24,完整前面的程序:,main()int x,y;x=5;y=2*x*x+3*x-1;printf(“n y=%d”,y);,程序设计例:,编写程序计算如图中的
27、电流I.假设 U=220,R1=30,R2=60,R3=45,U,I,R1,R2,R3,算法设计:I=U/R1+U/R2+U/R3程序设计:main(),I=U/R1+U/R2+U/R3;,int U=220,R1=30,R2=60,R3=45;float I;,printf(“n I=%f”,I);,正确的程序:main()int U=220,R1=30,R2=60,R3=45;float I;I=(float)U/R1+(float)U/R2+(float)U/R3;printf(“n I=%f”,I);,考虑通用:main()int U,R1,R2,R3;float I;输入 U,R1,
28、R2,R3 I=(float)U/R1+(float)U/R2+(float)U/R3;printf(“n I=%f”,I);,数据的输入 getchar函数(字符输入)#include“stdio.h”main()char c;c=getchar();等待键盘输入 putchar(c);,scanf 函数(格式输入),与printf函数相反。用于输入若干任意类型的数据。scanf(“%d%d%d”,格式控制 地址列表,scanf(“%d%d%d”,执行此函数时,等待从键盘输入三个整数给a,b,c 若从键盘输入 3 5 8 则系统即从键盘缓冲区取出这三个数分别赋给a,b,c 注意与printf
29、的区别,注意格式的匹配,如:scanf(“%3d%2d%4d”,在键盘输入时,用分隔符把每个数据隔开,标准的分隔符是空格。如:123 150 23 若想用逗号作分隔符,则:scanf(“%d,%d,%d”,不要随便使用普通字符,如使用:scanf(“a=%d,b=%d c=%d”,&a,&b,&c)对应数据输入:a=123,b=150,c=23,前面的欧姆定律:main()int U,R1,R2,R3;float I;scanf(“%d%d%d%d”,求三角形面积,#include“math.h”main()float a,b,c,area,s;scanf(“%f,%f,%f”,使用数学函数,
30、使用三角函数,#include“math.h”main()float x,y;scanf(“%f”,第五章 选择结构程序设计,对于如下的函数计算,算法上属于一个选择结构。y=用于实现选择结构的主要是if语句。,1/x 当x0时,10000 当x=0时,if语句的最常见形式为:if(关系表达式)语句1;else 语句2;如:if(x!=0)y=1/x;else y=10000;其中 x!=0 就是一个关系表达式!=就是一个关系运算符,51 关系运算符和关系表达式1、关系运算符用于进行比较运算的运算符。共有六种:=!=优先级与结合性:前4种大于后两种。低于算术运算符而高于赋值运算符。左结合性。,2
31、、关系表达式一般形式:表达式关系运算符表达式 如:ab a+bb+c 经过关系运算后最终有一个值-关系表达式的值。关系表达式的值只有 0(假)或1(真),例:设 a=2,b=4,c=1 计算以下关系表达式的值:ab a+bb+cab 可以是字符表达式(x=2)(y=5)可以是赋值表达式(a(bc)甚至可以是关系表达式ab=bc,例:假设 x=3,y=5,z=1,计算以下关系表达式的值:x+zyxz=xzyxz(x=y-2)x+1,52 逻辑运算符和逻辑表达式有时,只用一个简单的关系表达式无法完整地表达一个条件,如:y=其中的条件需要用逻辑表达式来表达:x!=0&a!=0&就是一种逻辑运算符。,
32、1/x+1/a 当x0,a0时,10000 其它,1、逻辑运算符&逻辑与 两个操作数都为真时&运算结果为真。|逻辑或 两个操作数之一为真时即为真。!逻辑非(单目运算)操作数为真(假)时为假(真)。如:若 a=2,b=3,c=0 则:ab&bc 0 ab|bc 1!(ab)0,优先级(由高到低):!逻辑非算术运算符关系运算符&逻辑与|逻辑或赋值运算符结合性:左结合性,2、逻辑表达式 实际上,前面所举例子即为逻辑表达式:ab&bc ab|bc!(ab)逻辑表达式的值同样只有1和0,但参加逻辑 运算的操作数可以是任意类型的数据,可以是 任意大小。例:a+b&b+c 是合法的逻辑表达式。此时以0代表假
33、,非0代表真。,例:设 a=2,b=3,c=0,计算以下表达式的值:a&b b&c a|c!a+c&b+c!c+a=b|bc+10,对于逻辑表达式的两种基本技能:逻辑表达式的计算。逻辑表达式的构造。,逻辑表达式的构造举例:abc a和b之一为0,但不同时为0,a=b=c 5=4=3,a=b&b=c,a=0&b!=0|a!=0&b=0,a*b=0,a*b=0&a+b!=0,对于 a=0&b!=0|a!=0&b=0 a=0可以用!a代替 a!=0可以直接用a!a&b|a&!b但必须是运算结果作为逻辑量的情况下。y=(a!=0)与 y=a 不等效,53 if语句1、if语句的三种形式if(表达式)语
34、句;有一分支为空。scanf(“%d”,if(表达式)语句1;else 语句2;if(x!=0)y=1/x;else y=10000;,if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else 语句n;if(score=100)printf(“A”);else if(score=90)printf(“B”);else if(score=80)printf(“C”);else if(score=70)printf(“D”);else if(score=60)printf(“E”);else printf(“F”);,对于:,1/x 当x0时,10000
35、 当x=0时,一般用:if(x!=0)y=1/x;else y=10000;,也可用:y=10000;if(x!=0)y=1/x;,y=,?y=1/x;if(x=0)y=10000,例:(习题5.5):,x(x1),2x-1(1x10),3x-11(x10),y=,main()float x,y;scanf(“%f”,说明:语句中的表达式可以是任意表达式:if(x)y=1/x;else y=10000;一个if结构不可分割:if(x)y=1/x;z=10;else y=10000;一个分支中包含多个语句时,要用:if(a0)x=1;y=2;else x=10;y=20;,分支程序设计举例(基本
36、技巧和算法)例:从键盘输入三个整数到变量a,b,c,输出其中最大的数。两种典型算法:枚举法(将各种可能性枚举出来)。选择法(先假设后判断更新)。,选择法main()int a,b,c,max;scanf(“%d,%d,%d”,例:从键盘输入三个整数到变量a,b,c,要求按从大到小的顺序输出。两种典型算法:枚举法(将各种可能的排列枚举出来)。换位法(将a,b,c中的数据换位)。,换位法main()int a,b,c,t;scanf(“%d,%d,%d”,3,5,8,5,3,8,5,5,3,a,b,c,2、if语句的嵌套在if语句中,又包含一个或多个if语句:if(score=80)if(scor
37、e=90)printf(“A”);else printf(“B”);else if(score=60)printf(“C”);else printf(“D”);注意else与if的匹配,3、条件运算符如果两个分支的内容都是给同一个变量赋值,则可用简单的条件运算符处理:if(ab)max=a;else max=b;可用:max=ab?a:b;赋值运算符右边为一条件表达式。条件表达式的一般形式:表达式1?表达式2:表达式3,条件表达式的执行过程:ab?a:b优先级:低于关系运算符,高于赋值运算符。结合性:右结合性。,表达式1,条件表达式取表达式3的值,条件表达式 取表达式2的值,非0,0,例:求a
38、,b,c中的最大值:max=ab?(ac?a:c):(bc?b:c);,54 switch语句(多分支)适用于根据一个表达式的值就可确定走哪个分支的情况。switch(表达式)常量表达式1:语句1 常量表达式2:语句2 常量表达式n:语句n default:语句n+1,例:成绩分档:switch(score/10)case 10:printf(“A”);case 9:printf(“B”);case 8:printf(“C”);case 7:printf(“E”);case 6:printf(“F”);default:printf(“G”);注:应使用break.,switch(score/1
39、0)case 10:printf(“A”);break;case 9:printf(“B”);break;case 8:printf(“C”);break;case 7:printf(“E”);break;case 6:printf(“F”);break;default:printf(“G”);,55 程序举例(习题5.10)有4个圆塔,圆心分别为:(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。,算法设计:条件“在某一圆内”:“在圆1内或在圆2内或在圆3内或在圆4内”若设变量c
40、1、c2、c3、c4分别代表是否在相应的圆内,则以上条件为:c1|c2|c3|c4,10 在某一圆内,0 在圆外,(x,y),h=,c1=(x-2)2+(y-2)21c2=(x+2)2+(y-2)21c3=(x+2)2+(y+2)21c4=(x-2)2+(y+2)21,main()int h,c1,c2,c3,c4;float x,y;scanf(“%f%f”,第六章 循环控制 61 概述 所谓循环控制,就是如何实现循环结构的控制问题。有4种方法:用goto语句和if构成循环。用while语句。用do-while语句。用for语句。,62 用goto语句和if语句构成循环例:对于计算 s=1+
41、2+3+4+5+6+7+8+9+10,0 s,1 i,s+i s,i+1 i,i10,输出s,y,n,s=0;i=1;lable:s+=i;i+;if(i=10)goto lable;printf(“%d”,s);,语句标号,无条件转向语句,goto 语句可以构造循环,但不主张用,因为它容易破坏结构化程序设计。,goto 语句可以构造循环,但不主张用,因为它容易破坏结构化程序设计。,63 while语句 while语句是专门用于实现循环控制的语 句之一。其一般形式为:while(表达式)语句 含义:当表达式的值为非0时,执行循环体,否则执行后续语句。,语句关键,表达循环条件的表达式,循环体,语
42、句关键字,执行过程:while(表达式)语句,表达式,循环体,0,非0,i10?,s=0 i=1,s=s+ii=i+1,例:用while语句实现前面算法:main()int i=1,s=0;while(i=10)s=s+i;i+;printf(“n%d”,s);,注意与if语句的区别。循环体中要有使循环条件趋于成立的条件,y,n,while(i=10)s=s+i;i+;可简写为:while(i=10)s+=i+;,非0(真),0(假),表达式,循环体,64 do-while语句 do-while语句主要用于实现直到型循环。其一般形式为:do 循环体 while(表达式);执行过程:,真,s=0
43、i=1,i10?,s=s+ii=i+1,假,例:用do-while语句实现前面算法:main()int i=1,s=0;do s+=i+;while(i=10);printf(“n%d”,s);注意与while语句的区别。,假,表达式2,求解表达式1,循环体,求解表达式3,真,65 for 语句 for语句是一种使用最为灵活,并且是用得最多的循环控制语句,其一般形式为:for(表达式1;表达式2;表达式3)循环体大体含义:对于()的情况执行循环体内容。,例:用for语句实现前面的算法:s=0;for(i=1;i=10;i+)s+=i;标准形式,表达式1,表达式2,表达式3,循环体,可以理解:循
44、环变量i从初值1开始到终值10,步长为1,重复执行循环体。,for语句的常见变化:s=0;i=1;for(;i=10;i+)s+=i;s=0;for(i=1;i=10;)s+=i+;s=0;i=1;for(;i=10;)s+=i+;,省略表达式1,省略表达式3,省略表达式1和3,s=0;i=1;for(;)s+=i+;if(i10)break;s=10;i=10;for(;-i;)s+=i;,省略表达式2,表达式2是任意表达式,s=0;for(i=1,j=10;ij;i+,j-)s+=i+j;1 2 3 4 5 6 7 8 9 10在程序设计中不要过分追求它的多变性,i,j,用逗号表达式,例:
45、求n!n!=1*2*3(n-1)*n 参照累加求和main()int i,n=5,s=1;for(i=1;i=n;i+)s*=i;printf(“n s=%d”,s);注意s的初值。注意当n较大时的情况。求和与连乘都是最常用的算法,要熟练掌握。,例:求自然数1-100中能被3整除的数之和。main()int i,s=0;printf(“n%d”,s);求能被3整除但不被7整除的数之和?,for(i=1;i=100;i+)s+=i;,for(i=1;i=100;i+)if(i%3=0)s+=i;,for(i=3;i=100;i+=3)s+=i;,for(i=3;i=100;i+=3)if(i%7
46、)s+=i;,例:求任意100个数中的最大值。main()int i,a,max;max=?for(i=1;imax)max=a;printf(“n max=%d”,max);循环体中没有引用循环变量。i的作用?求任意个数中的最大值?,for(i=1;i+),if(a=-9999)break;,max=-32768;,外重循环,内重循环,执行200次,要掌握多重循环执行的全过程,66 循环的嵌套 循环体内又包含另一个完整的循环结构(多重循环)。for(i=1;i=10;i+)for(j=1;j=20;j+)s+=i+j;,以上多重循环结构可以简写为:for(i=1;i=10;i+)for(j=
47、1;j=20;j+)s+=i+j;,例:找出行号乘以列号等于100的座位。main()int i,j;for(i=1;i=30;i+)for(j=1;j=20;j+)if(i*j=100)printf(“n%d,%d”,i,j);,注意循环的关系,例:百钱买百鸡问题。给定100块钱,要求正好买100只鸡,已知公鸡5元/只,母鸡3元/只,小鸡1元/3只,问公鸡、母鸡和小鸡应各买多少只?若考虑用方程组:x+y+z=100 5x+3y+z/3=100 是一多解问题。,用测试法求解的程序:main()int x,y,z;for(x=1;x=100;x+)for(y=1;y=100;y+)for(z=1
48、;z=100;z+)if(x+y+z=100,程序可进一步简化为:main()int x,y,z;for(x=1;x=20;x+)for(y=1;y=33;y+)z=100-x-y;if(5*x+3*y+z/3.0=100)printf(“n%d,%d,%d”,x,y,z);,用测试法求解问题的典型例子,测试法求解的程序设计有两个要点:通过循环列出所有可能的解。对所有列出的可能的解进行条件测试。,例:判断一个数m是否为素数。main()int i,m;scanf(“%d”,用测试法求解,例:(习题6.6)打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。
49、如:153是一水仙花数,因为 153=13+53+33。,main()int i,j,k,n;for(n=100;n=999;n+)i=?j=?k=?if(i*i*i+j*j*j+k*k*k=n)printf(“n%d”,n);通过循环列出n的所有可能的范围,i=n/100;,k=n%10;,j=n/10%10;,main()int i,j,k,n;for(i=1;i=9;i+)for(j=0;j=9;j+)for(k=0;k=9;k+)n=i*100+j*10+k;if(i*i*i+j*j*j+k*k*k=n)printf(“n%d”,n);通过循环列出i,j,k的所有可能的范围,例:(习题
50、6.4),求S=,i!=1!+2!+3!+4!+19!+20!,20,i=1,main()int i,j;float t,s=0;for(i=1;i=20;i+)s+=?;printf(“n s=%f”,s);用两重循环实现,s+=t;,t=1;for(j=1;j=i;j+)t*=j;,用递推法:递推公式:ti=ti-1.i,求S=,i!=1!+2!+3!+4!+19!+20!,20,i=1,=1+(i-1)!.i=1+ti-1.i,20,i=2,20,i=2,main()int i,j;float t=1,s=t;for(i=2;i=20;i+)t=t*i;s+=t;printf(“n s=