《C语言程序设计一课件》由会员分享,可在线阅读,更多相关《C语言程序设计一课件(168页珍藏版)》请在金锄头文库上搜索。
1、 安 庆 师 范 学 院 计 算 机 与 信 息 学 院C语言程序设计语言程序设计( 一一) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院第第1章章 C语言概述语言概述1.1 C语言概况语言概况 1.2 简单的简单的C语言程序语言程序 1.3 算算 法法 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.1 C语言概况语言概况1.1.1 C语言的发展语言的发展C语言的的前身是ALGOL语言(ALGOL 60是一种面向问题的高级语言)。 1963年英国剑桥大学推出CPL(Combined Programming Language)语言 。1970年美国贝尔实验室的肯汤姆逊进一步
2、简化,提出了B语言。1972年美国贝尔实验室的布朗W卡尼汉和丹尼斯M利奇对其完善和扩充,提出了C语言 。1987年美国标准化协会制定了C语言标准“ANSI C”,即现在流行的C语言。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.1 C语言概况语言概况1.1.2 C语言的特点语言的特点(1)C语言简洁、紧凑,使用方便、灵活(2)运算符丰富,表达式能力强(3)数据结构丰富,便于数据的描述与存储(4)C语言是结构化、模块化的编程语言(5)语法限制不太严格,程序设计自由度大(6)C语言是具有低级语言功能的高级语言(7)生成目标代码质量高,程序执行效率高(8)可移植性好 安 庆 师 范 学
3、 院 计 算 机 与 信 息 学 院1.21.2 简单的简单的C C语言程序语言程序 一个完整的语言程序由一个或多个具有相对独立功能的程序模块组成,这样的程序模块称为“函数”。因此,函数是程序的基本单位。 一个C程序,不管它有多简单,都必须有且只有一个主函数,例如:main() 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.21.2 简单的简单的C C语言程序语言程序 【例1-1】在计算机屏幕上输出“Howareyou!”/*EX1-1.C*/main()printf(Howareyou!n); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.21.2 简单的简单的C C
4、语言程序语言程序 【例1-2】己知圆的半径,求圆的周长和面积。/*EX1-2.C*/main()intr;/*说明圆半径r为整型变量*/floatl,s;/*说明周长l、面积s为实型变量*/r=8;/*给半径r赋初值*/l=2*3.1416*r;/*计算l的值*/s=3.1416*r*r;/*计算s的值*/printf(“r=%d,l=%f,s=%fn”,r,l,s);/*输出圆的半径、周长和面积*/ 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.21.2 简单的简单的C C语言程序语言程序 【例1-3】输入直角三角形的两个直角边的长,求该三角形的面积。/*EX1-3.C*/mai
5、n()intx,y,z;scanf(%d,%d,&x,&y);/*输入直角三角形的两个直角边的长*/z=x*y/2;/*求直角三角形面积的值*/printf(areais%dn,z);/*输出三角形的面积*/ 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.21.2 简单的简单的C C语言程序语言程序 通过以上三个通过以上三个C程序的例子,可以看出:程序的例子,可以看出:(1)C程序由函数组成。每个C程序有且仅有一个主函数,该主函数的函数名规定为main,也可以包含一个main函数和若干个子函数。(2)C程序的书写格式自由,一行内可以写几条语句,一条语句也可以写在多行上。每条语句后必
6、须以“;”作为语句的结束。(3)C程序的执行总是从主函数开始,并在主函数中结束。(4)C语言本身没有输入输出语句。输入和输出操作是由库函数scanf和printf等函数来完成的。C对输入输出实行“函数化”。(5)可以用/*/对C程序中的任何部分作注释。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.3 算 法1.3.1 算法概述算法概述1算法的定义算法的定义所谓算法,是指在使用计算机解题前,需要将解题方法转换成一系列具体的在计算机上可执行的步骤,这些步骤能够清楚地反映解题方法一步步“怎么做”的过程,这个过程就是通常所说的算法。2算法的特征算法的特征(1)有穷性(有限性)。(2)确定
7、性(唯一性)。(3)可行性(能行性)。(4)有0到多个输入。(5)有1到多个输出。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.3 算 法1.3.2 算法的表示算法的表示1传统流程图传统流程图美国国家标准化协会ANSI规定了一些常用的流程图符号,如图所示。起止框处理框判断框或流程线连接点 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.3 算 法 【例例1-4】画画出出求求2+4+6+8+100之之和和的的流流程程图图。流流程程图如图所示。图如图所示。YNi100开始s+is,i+2i0s,2i结束输出s的值 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.3
8、 算 法2N-S图图(1)顺序结构顺序结构(2) 选择结构选择结构(3) 循环结构循环结构当型循环直到型循环 A BP成立成立 不成立不成立A B当当P成成立立 AA直到直到P成立成立 安 庆 师 范 学 院 计 算 机 与 信 息 学 院1.3 算 法【例【例1-4】的】的N-S图如图所示。图如图所示。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院第第2章章 C语言基础语言基础 2.1数据类型2.2标识符、常量与变量2.3基本运算2.4 数据类型转换2.5 程序举例 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.1
9、 数据类型数据类型 2.1.1 数据类型概述数据类型概述 整型(整型(int)数据类型数据类型基本类型基本类型整型整型单精度型(单精度型(float)字符型(字符型(char)长整型(长整型(long)短整型(短整型(short)实型实型双精度型双精度型(double)枚举类型(枚举类型(enum)共用体类型(共用体类型(union)构造类型构造类型结构体类型(结构体类型(struct)数组类型数组类型空类型(空类型(void)指针类型(指针类型(*) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.1 数据类型数据类型2.1.2 整型整型 归纳起来,C语言定义了6种整型,分别是:基
10、本整型int无符号基本整型unsignedint短整型short或shortint无符号短整型unsignedshort或unsignedshortint长整型long或longint无符号长整型unsignedlong或unsignedlongintC语言没有规定各种整数类型的表示范围,也就是说,没有规定各种整数的二进制编码长度,即数据在内存中所占的位数。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.1 数据类型数据类型表中列出了一般PC机上规定的整数类型及相关数据。【注意】在Visual C+ 6.0中,基本整型(无符号基本整型)与长整型(无符号长整型)在内存中所占的字节数以
11、及表示的取值范围对应相同。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.1 数据类型数据类型2.1.3实型C语言中实型数据又称浮点型数据。TurboC提供了三种表示实数的类型:单精度浮点数类型,简称浮点类型float双精度浮点数类型,简称双精度类型double长双精度类型longdouble实型的相关规定 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.1 数据类型数据类型2.1.4 字符型字符型字符类型的数据包括计算机所用编码字符集中的所有字符。常用的ASCII字符集包括所有大小写英文字母、数字、各种标点符号字符,还有一些控制字符,一共128个。扩展的ASCII字符集
12、包括ASCII字符集中的全部字符和另外的128个字符,总共256个字符。字符类型的数据在内存中存储的是它的ASCII码值,一个字符通常占用一个字节的内存空间。除了占用的存储空间不同(因而数据的取值范围不同)以外,字符数据与整型数据是相似的。为了方便处理,C语言规定字符类型与整型基本一致,即也有有符号和无符号两种类型。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.1 数据类型数据类型字符类型的相关规定。由于ASCII码字符的取值范围是0127,因此,既可以用char类型表示,也可以用unsignedchar类型表示;扩展ASCII码字符的取值范围是0255,因此,在128255范围
13、内的扩展ASCII码字符只能用unsignedchar类型表示。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 2.2.1 标标识符符1.标识符标识符具体命名规则如下:(1)标识符的只能由下划线“_”、数字09与26个大小写字母(az,AZ)构成。Turbo C最多识别32个字符,MicrosoftC最多识别8个字符。(2)标识符的首字符必须是字母或下划线“_”而不能是数字或其它符号。(3)C语言中大小写字母是敏感的,即在标识符中,大写字母和小写字母代表不同的意义。例如:Name和name是两个不同的标识符。(4)标识符不能使用系统关键字,
14、因为关键字是系统的保留字,它们已有特定的含义。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 2.关键字关键字所谓关键字是指系统预定义的保留标识符,又称之为保留字。它们有特定的含义,不能再作其它用途使用。ANSIC定义的关键字共32个: 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 2.2.2 常量常量1.整型常量整型常量(1)十进制整数:如154、565、-6523。(2)八进制整数:以0开头的数是八进制数。如0123表示八进制数的(123)8,等于十进制数83。(3)十六进制整数:以
15、0x开头的数是十六进制数。如0x4a即(4a)16,等于十进制数74。在上述方法表示的整数后面附一个字母l或L作后缀,即可表示该数据的类型是长整型的。例如-63L、0123LU、0x4aL等分别表示十进制有符号长整型数、八进制无符号长整型数和十六进制有符号长整型数。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 2.实型常量实型常量实型常量只能用十进制形式表示,不能用八进制和十六进制形式表示。(1) 小数形式:由数字和小数点组成,如3.1415926、-0.12、.4、3.等都是实数。(2)指数形式:如1.8e5或1.8E5都代表1.8x1
16、05。但注意字母e(或E)之前必须有数字,且e后面指数必须为整数,如e3、2.1e3.2、e等都不是合法的指数形式。3.字符常量字符常量字符型常量是由一对单引号括起来的单个字符构成,例如,a,b,1等都是有效的字符型常量。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 C语言中的常用转义字符及这些字符的含义 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 4.字符串常量字符串常量字符串常量是由一对双引号括起来的字符序列组成的,例如“abc”、“a”等都是字符串常量。字符串常量与字符常量的区
17、别:(1)字符常量由单引号括起来,字符串常量由双引号括起来。(2)字符常量占一个字节的内存空间。字符串常量在内存中存储时由系统自动在存储的所有字符尾部添加串结束标记0,所以,字符串常量占的内存字节数等于字符串中字符所占的字节数加1。注意不要将单个字符组成的字符串常量与字符常量混淆。不能把一个字符串常量赋给一个字符变量。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 5.符号常量符号常量符号常量就是使用符号代表常量。C语言中允许用标识符定义一个常量,这种常量定义在C语言中被称之为“宏定义”。2.2.3 变量变量一个变量有3个相关的要素:变量名
18、;变量的存储单元;变量(存储单元存放)的值。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 1.变量的定义和赋值变量的定义和赋值C语言要求程序中使用的每个变量都必须先定义,然后才能使用。定义变量需要用变量定义语句进行,其形式为:类型变量名=初值,变量名=初值,;例如:inta;intx,y,min;intm,n=3,w=5;若对定义的多个变量赋相同的初值,不能采用连续赋初值的形式,如inta=b=c=5,必须采用形式inta=5,b=5,c=5。【注意】除了不能用关键字做变量名外,可以用任何标识符作为变量名。 安 庆 师 范 学 院 计 算
19、 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 2.整型数据的存储整型数据的存储shortint型补码为16位二进制数,它表示一个有符号整数,其特点是:当首位为0时表示一个正数,当首位为1时表示一个负数。正数的补码与其原码相同,而负数的补码为其对应的正数的反码加1。如:+4补=0000000000000100-4补=1111111111111100一个用补码表示的二进制数,最高位为符号位,当符号位为“0”(即正数)时,其余位即为此数的二进制值;但当符号位为“1”(即负数)时,其余位不是此数的二进制值,应把它们按位求反,且在最低位加1,才是它的二进制值。如:X补=11111
20、11111111101则X=-000000000000011=-3 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.2 标识符、常量与变量标识符、常量与变量 3.实型数据的存储实型数据的存储实型数据是按指数形式存储的。以微机中存储实型数据是按指数形式存储的。以微机中存储float型数据型数据为例,为例,float型数据在内存中占据型数据在内存中占据4个字节即个字节即32位二进制信息,位二进制信息,分别存放符号位、规格化的尾数、阶符位和阶码。分别存放符号位、规格化的尾数、阶符位和阶码。例如,实数例如,实数-32.28E-20-32.28E-20的存储情况如图所示。的存储情况如图所示。4
21、.4.字符型数据的存储字符型数据的存储用一个字节(用一个字节(8 8位二进制信息)存储字符类型数据。对于无位二进制信息)存储字符类型数据。对于无符号字符类型(符号字符类型(unsigned charunsigned char)数据直接存放)数据直接存放ASCIIASCII码或码或扩展扩展ASCIIASCII码。对于有符号字符类型(码。对于有符号字符类型(charchar)的数据也是用)的数据也是用补码存储的。补码存储的。 -0.322800-18 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算2.3.1算术运算1.基本算术运算符基本算术运算符C语言规定:语言规定
22、:(1) %运运算算符符仅仅用用于于整整型型变变量量或或整整型型常常量量的的运运算算,a%b的的结结果果为为a除以除以b的余数,余数的符号与被除数相同。的余数,余数的符号与被除数相同。(2) +、-、*、/ 运运算算符符的的两两个个操操作作数数既既可可以以是是整整数数,也也可可以以是是实实数数。当当两两个个操操作作数数均均是是整整数数时时,结结果果仍仍是是整整数数;若若参参加运算的两个操作数中有一个是实数,则结果为加运算的两个操作数中有一个是实数,则结果为double型。型。(3) 当当对对两两个个整整型型的的数数据据相相除除时时结结果果为为整整数数。但但是是如如果果除除数数或或被被除除数数中
23、中有有一一个个为为负负数数,则则舍舍入入的的方方向向是是不不固固定定的的。如如:-5/3在在有有的的机机器器上上得得到到结结果果-1,有有的的机机器器则则给给出出结结果果-2。多多数数机机器器采采取取“向向零零取取整整”方方法法,即即-5/3=-1,取取整整后后向向零零靠拢。靠拢。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算2.算术表达式算术表达式(1) 算术表达式定义算术表达式定义由由算算术术运运算算符符、括括号号以以及及操操作作对对象象组组成成的的符符合合C语语言言语语法法规则的表达式称为算术表达式。如:规则的表达式称为算术表达式。如:a+b-c/d*(
24、a-c) 。(2) 优先级和结合性优先级和结合性在在表表达达式式求求值值时时,先先按按运运算算符符的的优优先先级级别别高高低低次次序序执执行行。若若一一个个运运算算对对象象两两侧侧的的运运算算符符的的优优先先级级别别相相同同,如如a-b+c,则按规定的则按规定的“结合方向结合方向”处理。处理。算算术术运运算算符符的的结结合合方方向向为为“自自左左至至右右”,又又成成为为左左结结合合性性,即即先先左左后后右右,因因此此b先先与与减减号号结结合合,执执行行a-b的的运运算算,再再执执行加行加c的运算。的运算。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算3.自增、
25、自减运算符自增、自减运算符既可以放在操作数前,也可以放在操作数后,并且操作对既可以放在操作数前,也可以放在操作数后,并且操作对象只能是变量,不能是常量或表达式。象只能是变量,不能是常量或表达式。 如如i+,i- /* 表示在使用表示在使用i值之后将值之后将i的值加的值加(减减)1 */+i,-i /* 表示在使用表示在使用i值之前将值之前将i的值加的值加(减减)1 */例如:设例如:设i的原值为的原值为5,则执行下面的赋值语句:,则执行下面的赋值语句:j=i+; /* 先先将将i的的值值赋赋给给j,i再再自自增增1,赋赋值值语语句句执执行行完完 后后i的值为的值为6,j的值为的值为5 */j=
26、+i; /* 先先将将i的的值值自自增增1,再再赋赋给给j,赋赋值值语语句句执执行行完完 后后i的值为的值为6,j的值为的值为6 */ 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算【注意】【注意】 (1) 自自增增自自减减运运算算符符的的优优先先级级较较高高,和和单单目目运运算算符符相相同同。其其结合方向是结合方向是“自右向左自右向左”(右结合性)。(右结合性)。考考虑虑表表达达式式-i+,由由于于“-”和和“+”优优先先级级相相同同,均均为为右右结合性,因此相当于结合性,因此相当于-(i+)。(2) 尽尽管管自自增增自自减减运运算算符符给给程程序序员员带带来
27、来了了方方便便,但但同同时时也也带带来了副作用。来了副作用。例例如如,“printf(%d,%dn,i,i+);”在在不不同同的的编编译译环环境境下下结结果果有有可可能能不不同同。若若i的的值值为为3,则则结结果果可可能能是是“3,3”,也可能是也可能是“4,3”。(3) C编编译译在在处处理理时时尽尽可可能能多多地地自自左左而而右右将将若若干干个个字字符符组组成成一一个个运运算算符符(在在处处理理标标识识符符和和关关键键字字时时也也按按同同一一原原则则处处理理),如,如i+j,将解释为,将解释为(i+)+j,而不是,而不是i+(+j)。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院
28、2.3 基本运算基本运算2.3.2赋值运算1.赋值运算符赋值运算符C语语言言中中,赋赋值值被被认认为为是是一一种种运运算算,由由赋赋值值运运算算符符将将一一个个变变量量和和一一个个表表达达式式连连接接起起来来的的式式子子称称为为赋赋值值表表达达式式。其其形形式是:式是: 赋值表达式的值也可以再赋给其它变量,如:赋值表达式的值也可以再赋给其它变量,如:a=(b=3+5)。【注注意意】赋赋值值运运算算符符“=”不不同同于于数数学学中中使使用用的的符符号号,它它没没有有“相相等等”的的含含义义。如如果果赋赋值值运运算算符符两两侧侧的的数数据据类类型型不不同同时,在赋值时要进行类型转换。时,在赋值时要
29、进行类型转换。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算2.复合赋值运算符复合赋值运算符C语语言言允允许许在在赋赋值值运运算算符符“=”之之前前加加上上其其他他运运算算符符以以构构成成复合的赋值运算符。复合的赋值运算符。例如:例如:a+=5; 等价于等价于a=a+5;a*=b+5; 等价于等价于 a=a*(b+5);a%=5; 等价于等价于 a=a%8;在在C语言中,可以使用的复合赋值运算符有:语言中,可以使用的复合赋值运算符有:+=,-=,*=,/=,%=,=,&=,=,|=3.运算符的优先级和结合性运算符的优先级和结合性赋赋值值运运算算符符和和复复合合
30、赋赋值值运运算算符符的的优优先先级级相相同同,且且都都具具有有右右结合性。结合性。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算【例【例2-1】分析下面程序的运行结果】分析下面程序的运行结果/* EX2-1.C */main() int a=12;a+=a-=a*a;printf(%d n,a); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算2.3.3 位运算位运算 运算规则运算规则 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算1.按位取反按位取反【格式】【格式】x【例【例2-2】分析下面程序
31、的运行结果】分析下面程序的运行结果/* EX2-2.C */main() unsigned char x=56,y;y=x;printf(%d n,y); 其运算过程为:其运算过程为:56(00111000) 56(00111000) 199(11000111) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算2.按位与按位与【格式】【格式】x&y【例【例2-3】分析下面程序的运行结果】分析下面程序的运行结果main() unsigned char x=56,y=157,z;z=x&y;printf(%d n,z); 其运算过程为:其运算过程为: 56: 0011
32、1000 &157: 10011101 00011000 24 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算3.按位或按位或【格式】【格式】x | y【例【例2-4】分析下面程序的运行结果】分析下面程序的运行结果main() unsigned char x=56,y=157,z;z=x|y;printf(%d n,z); 其运算过程为:其运算过程为: 56: 00111000 | 157: 10011101 10111101 189 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算4.按位异或按位异或【格式】【格式】x y【例【例
33、2-5】分析下面程序的运行结果。】分析下面程序的运行结果。main() unsigned char x=56,y=157,z;z=xy;printf(%d n,z); 其运算过程为:其运算过程为: 56: 00111000 157: 10011101 10100101 165 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算5.左位移左位移【格式】【格式】x要位移的位数要位移的位数【功功能能】把把操操作作对对象象的的二二进进制制数数向向左左移移动动指指定定的的位位,并并在在右面补上相应的右面补上相应的0,高位溢出。,高位溢出。【示例】如【示例】如x=0000111
34、1,y=x要位移的位数要位移的位数【功功能能】把把操操作作对对象象的的二二进进制制数数向向右右移移动动指指定定的的位位,移移出出的的低低位舍弃;高位则:位舍弃;高位则:(1) 对无符号数和有符号中的正数,补对无符号数和有符号中的正数,补0;(2) 有有符符号号数数中中的的负负数数,取取决决于于所所使使用用的的系系统统:补补0的的称称为为“逻逻辑辑右右移移”,补补1的的称称为为“算算术术右右移移”。Turbo C和和其其它它一一些些C编编译译采用的是算术右移。采用的是算术右移。【示例】如【示例】如x=01010001,y=x2,则,则y=00010100。【注注意意】右右移移会会引引起起数数据据
35、的的变变化化,具具体体说说,右右移移一一位位相相当当于于对对原原来来的的数数值值除除以以2。右右移移n位位相相当当于于对对原原来来的的数数值值除除以以2n。但但此此结论只适用于该数右移被溢出舍弃的低位中不包含结论只适用于该数右移被溢出舍弃的低位中不包含1的情况。的情况。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算【说明】【说明】(1) 复合赋值运算符复合赋值运算符除按位取反运算外,其余除按位取反运算外,其余5个位运算符均可与赋值运算符一个位运算符均可与赋值运算符一起,构成复合赋值运算符:起,构成复合赋值运算符: &=、|+、=、=。(2) 不不同同长长度度数
36、数据据间间的的位位运运算算低低字字节节对对齐齐,短短数数的的高高字字节节按最高位补位:按最高位补位: 对无符号数和有符号中的正数,补对无符号数和有符号中的正数,补0; 有符号数中的负数,补有符号数中的负数,补1。2.3.4逗号运算1.逗号运算符逗号运算符 其一般形式为:其一般形式为: 表达式表达式1,表达式,表达式2 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.3 基本运算基本运算逗逗号号表表达达式式的的求求值值过过程程是是:先先求求表表达达式式1的的值值,再再求求表表达达式式2的值,表达式的值,表达式2的值就是整个逗号表达式的值。的值就是整个逗号表达式的值。 一一个个逗逗号号表
37、表达达式式可可以以与与另另一一个个表表达达式式构构成成一一个个新新的的逗逗号号表表达式。达式。例如:例如: (a=5-3,a*5),a+15逗号表达式的一般形式可以扩展为:逗号表达式的一般形式可以扩展为: 表达式表达式1,表达式,表达式2,表达式,表达式3,表达式,表达式n2.运算符的优先级和结合性运算符的优先级和结合性逗号运算符是所有运算符中级别最低的。逗号运算符是所有运算符中级别最低的。逗号表达式的结合性为自左向右的。逗号表达式的结合性为自左向右的。 【注意】并不是任何地方出现的逗号都是作为逗号运算符。【注意】并不是任何地方出现的逗号都是作为逗号运算符。 安 庆 师 范 学 院 计 算 机
38、 与 信 息 学 院2.3 基本运算基本运算【例【例2-6】分析下面程序的运行结果。】分析下面程序的运行结果。main() int a=5,b=6,c=1;printf(%d %dn,(+a,b+),c+2); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.4 数据类型转换数据类型转换2.4.1 类型自动转换类型自动转换 转换规则转换规则 高高 double float long unsigned 低低 int char,short 图图中中横横向向向向左左的的箭箭头头表表示示必必定定的的转转换换,纵纵向向的的箭箭头头表表示示当当运算对象为不同类型时转换的方向。运算对象为不同类型时
39、转换的方向。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.4 数据类型转换数据类型转换2.4.2赋值类型转换(1)当整型数据赋给浮点型变量时,数值上不发生任何变化,但有效位增加。(2)当单、双精度浮点型数据赋给整型变量时,浮点数的小数部分将被舍弃。(3)将字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为4个字节,因此将字符数据(8位)放到整型变量低8位中。将unsignedchar型数据赋给unsignedint或int型变量时,高24位补0。将char型数据赋给unsignedint或int型变量时,若字符值最高位为0,则高24位补0;若字符值最高位为1,则高24位
40、全补1。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.4 数据类型转换数据类型转换【例【例2-7】分析下面程序的运行结果。】分析下面程序的运行结果。main() unsigned char a; char b; unsigned int x; int y; a=0xfe; x=a; y=a; printf(%x %xn,x,y); b=0x7e; x=b; y=b; printf(%x %xn,x,y); b=0xfe; x=b; y=b; printf(%x %xn,x,y); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.4 数据类型转换数据类型转换(4) 当当长
41、长度度长长的的整整型型数数据据赋赋给给长长度度短短的的变变量量时时,将将进进行行截截断断赋值。赋值。 【例【例2-8】分析下面程序的运行结果。】分析下面程序的运行结果。/* EX2-8.C */main() unsigned short a;short b;unsigned long x;x=0x6a8b5cfd; a=x; b=x;printf(%x %xn,a,b); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.4 数据类型转换数据类型转换(5) 当整型数据赋给长度相同的变量时,将进行原样赋值。当整型数据赋给长度相同的变量时,将进行原样赋值。【例【例2-9】分析下面程序的运行
42、结果。】分析下面程序的运行结果。/* EX2-9.C */main() unsigned int a;int b;a=0xffff;b=a;printf(%x %xn,a,b); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.4 数据类型转换数据类型转换2.4.3 强制类型转换强制类型转换 强制类型转换的一般形式为:强制类型转换的一般形式为: (类型名类型名) (表达式表达式)【注意】【注意】(1) 表达式应该用括号括起来。表达式应该用括号括起来。 (2) 经经强强制制类类型型转转换换后后,得得到到的的是是一一个个所所需需类类型型的的中中间间变变量量,原来变量的类型并没有发生任何变
43、化。原来变量的类型并没有发生任何变化。【例【例2-10】分析下面程序的运行结果。】分析下面程序的运行结果。main() int a; float b=3.5; a=(int)b; printf(a=%d,b=%fn,a,b); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.5 程序举例程序举例 【例【例2-11】分析下面程序的运行结果。】分析下面程序的运行结果。/* EX2-11.C */main() int x, y; x=40; y=(x=x-4, x%7); printf(y=%dn,y); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.5 程序举例程序举例 【例
44、【例2-12】分析下面程序的运行结果。】分析下面程序的运行结果。/* EX2-12.C */main( )int m,n, k;m=3; n=9;k=(+m)+(-n);printf(m=%d,n=%d,k=%dn,m,n,k);m=3, n=9;k=(m-)+(n+);printf(m=%d,n=%d,k=%dn,m,n,k); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2.5 程序举例程序举例 【例【例2-13】取一个整数】取一个整数x从右端开始的从右端开始的47位。位。【分析】【分析】(1) 先使先使x右移右移4位,目的是使要取出的那几位移到最右端。位,目的是使要取出的那几位
45、移到最右端。右移到右端可以用下面方法实现:右移到右端可以用下面方法实现:x 4(2) 设置一个低设置一个低4位全为位全为1,其余全为,其余全为0的数。的数。可用下面方法实现:可用下面方法实现: ( 0 4) & ( 04; n=(04); k=m&n; printf(%x,%dn%x,%dn,m,m,k,k); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院第第3 3章章 简单程序设计简单程序设计 3.1 C语言的基本语句语言的基本语句3.2 顺序结构顺序结构3.3 数据输入与输出数据输入与输出3.4 程序举例程序举例 安 庆 师
46、 范 学 院 计 算 机 与 信 息 学 院C C语句可分为以下语句可分为以下5 5种类型种类型: :1.1.表达式语句表达式语句 由表达式组成,其一般形式是:由表达式组成,其一般形式是: 表达式表达式; ; 典型例子典型例子 :赋值语句:赋值语句:赋值语句:赋值语句 x=5; x=5; 2.2.函数调用语句函数调用语句 由一个函数调用加上一个分号构成,其作用是完由一个函数调用加上一个分号构成,其作用是完成特定功能。它的一般形式是:成特定功能。它的一般形式是: 函数名函数名( (参数列表参数列表);); 典型例子典型例子 :printf(“%d”,x); printf(“%d”,x); 3.1
47、 C C语言语言的基本的基本语句语句 安 庆 师 范 学 院 计 算 机 与 信 息 学 院3.3.控制语句控制语句 用于完成一定的控制功能,以形成程序的各种用于完成一定的控制功能,以形成程序的各种结构和流程控制。结构和流程控制。C C语言有语言有9 9种控制语句,分三类:种控制语句,分三类:(1)条件判断语句,构成选择结构:条件判断语句,构成选择结构: if if语句、语句、switchswitch语句语句(2)循环语句,构成循环结构:循环语句,构成循环结构: for for语句、语句、whilewhile语句、语句、do-whiledo-while语句语句(3)转向控制语句转向控制语句 限
48、定转向语句限定转向语句: :breakbreak、continuecontinue、returnreturn语句语句 无条件转向语句无条件转向语句:goto:goto语句语句 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.4.复合语句复合语句 是用大括号是用大括号将若干语句组合在一起,在将若干语句组合在一起,在语法上相当于一条语句。用于语法上相当于一条语句。用于ifif语句的一个分支或语句的一个分支或循环语句的循环体等。由于复合语句中还可以定义循环语句的循环体等。由于复合语句中还可以定义变量,因此又称分程序。变量,因此又称分程序。 注意:复合语句外没有分号,其中最后一个语注意:复合
49、语句外没有分号,其中最后一个语句的分号不能省略。句的分号不能省略。5.5.空语句空语句 只有一个分号没有其他内容的语句。其形式为:只有一个分号没有其他内容的语句。其形式为: ; 常用于循常用于循环中,表示循中,表示循环体什么都不做。体什么都不做。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 程序结构分为顺序、选择、循环三种。任何复杂的程序结构分为顺序、选择、循环三种。任何复杂的程序都是由这三种基本结构组成。程序都是由这三种基本结构组成。3.2 顺序结构顺序结构顺序结构,按语句出现先后顺序依次执行的程序结构。顺序结构,按语句出现先后顺序依次执行的程序结构。选择结构,又称选取或分支结构
50、,根据给定条件是否成立,选择结构,又称选取或分支结构,根据给定条件是否成立,以决定程序的分支转向的程序结构,详见第以决定程序的分支转向的程序结构,详见第4章。章。循环结构,又称重复结构,根据条件反复执行某一部分语句循环结构,又称重复结构,根据条件反复执行某一部分语句的程序结构,详见第的程序结构,详见第5章。章。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院顺顺序序结结构构是是程程序序设设计计中中最最简简单单、最最基基本本的的结结构构,其其特特点点是是程程序序运运行行时时,按按语语句句书书写写的的次次序序依依次次执执行行,其结构如右图所示。其结构如右图所示。顺顺序序结结构构一一般般由由
51、函函数数调调用用语语句句、说说明明语语句句、表表达达式式语句和输入输出语句组成。语句和输入输出语句组成。AB顺序结构顺序结构图图 顺序结构流程图顺序结构流程图 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() int a,b,c; a=123;b=456; c=a+b; printf(nc=%dn,c);【例【例3-1】分析下面程序分析下面程序预处理命令预处理命令变量变量a a,b b,c c声明声明a a,b b赋初值赋初值赋值语句赋值语句c=a+bc=a+b输出变量输出变量c c的值的值例例3-13-1的流程的流程 安 庆 师 范 学 院 计 算 机 与
52、 信 息 学 院从例从例3-13-1可以看出,顺序结构的程序框架如下:可以看出,顺序结构的程序框架如下:# #开头的预编译命令行开头的预编译命令行main()main() 局部变量声明语句局部变量声明语句; ; 可执行语句可执行语句; ; 安 庆 师 范 学 院 计 算 机 与 信 息 学 院3.3 数据输入与输出数据输入与输出 printf( )函数的功能是向系统显示器输出若干函数的功能是向系统显示器输出若干个任意类型的数据。个任意类型的数据。1. .printf( )函数调用形式函数调用形式 printf( (格式控制字符串,输出列表格式控制字符串,输出列表) )注意:调用输入输出函数时,
53、一般在程序开头加头文件:注意:调用输入输出函数时,一般在程序开头加头文件: #include ,printf( )和和scanf( )可省略。可省略。3.3.1 格式化输出函数格式化输出函数 printf( ) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院格式说明格式说明一般字符一般字符按原样输出按原样输出转义字符转义字符作用:换行作用:换行输出列表输出列表printf(a=%dn,a);printf函数简例函数简例 安 庆 师 范 学 院 计 算 机 与 信 息 学 院格式控制字符串和输出列表都是函数的参数,其中:格式控制字符串和输出列表都是函数的参数,其中:(1)格式控制字符串,
54、它包括两个信息:)格式控制字符串,它包括两个信息: 格式说明符。由格式说明符。由“%”开头,以格式字符结束的一串字符,开头,以格式字符结束的一串字符,最简单的如最简单的如%d,%c,%f等。它的作用是将要输出的数据转化成等。它的作用是将要输出的数据转化成指定的格式输出。指定的格式输出。 原样输出字符,含一般字符和转义字符。一般起提示、原样输出字符,含一般字符和转义字符。一般起提示、分隔数据和换行等作用。如例分隔数据和换行等作用。如例3-1中中printf(printf(“nc=%dnnc=%dn”,c);c);中双撇号内的中双撇号内的nn和和c=c=。(2)输出列表是需要输出的常量、变量、函数
55、、表达式。)输出列表是需要输出的常量、变量、函数、表达式。【说明说明】 安 庆 师 范 学 院 计 算 机 与 信 息 学 院格式说明符的一般形式为:格式说明符的一般形式为: %-+0#整数整数1.整数整数2l或或h 格式字符格式字符它是由它是由“%”开头,以格式字符开头,以格式字符(英文字母英文字母)结束的一串字符,用结束的一串字符,用以说明输出数据的类型、长度、位数等,其中以说明输出数据的类型、长度、位数等,其中 表示可选项。表示可选项。因此,除了因此,除了%以外,格式字符是格式说明符中必须要有的,它控以外,格式字符是格式说明符中必须要有的,它控制输出列表里相应输出项数据的输出类型。表制输
56、出列表里相应输出项数据的输出类型。表3-2给出了常用的给出了常用的格式字符及含义。注意:有符号整数按无符号格式将输出其补格式字符及含义。注意:有符号整数按无符号格式将输出其补码;无符号整数按有符号格式将作为补码输出其数。码;无符号整数按有符号格式将作为补码输出其数。格式说明符格式说明符 安 庆 师 范 学 院 计 算 机 与 信 息 学 院printf函数常用类型格式字符表函数常用类型格式字符表格式字符格式字符含义d或i表示以十进制形式输出一个带符号的整数o表示以八进制形式输出一个无符号的整数X,x表示以十六进制形式输出一个无符号的整数u表示以十进制形式输出一个无符号的整数f表示以小数形式输出
57、带符号的实数(包括单、双精度)E,e表示以指数形式输出带符号的实数G,g表示选择%f或%e格式输出实数(选择占宽度较小的一种格式输出)c表示输出一个单字符s表示输出一个字符串注:大写字母表示输出中的字母为大写格式说明符各项的意义如下图所示。格式说明符各项的意义如下图所示。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院整数整数1.整数整数2:整数:整数1控制输出长度控制输出长度(域宽域宽),整数,整数2对不同格对不同格式符有不同含义,具体作用见上图。式符有不同含义,具体作用见上图。1、两者缺省情况下:、两者缺省情况下: 对整数和字
58、符串按实际字符数输出;对整数和字符串按实际字符数输出; (VC中中)对实数对实数(float和和double): 小数型:整数部分原样输出,默认输出小数型:整数部分原样输出,默认输出6位小数,多余小位小数,多余小数舍入处理。数舍入处理。 指数型:正数默认输出指数型:正数默认输出1位整数、小数点、位整数、小数点、6位小数、位小数、4位位指数指数(e或或E、+或或号及号及3位整数位整数)共共13个字符个字符(负数负数12个字符个字符)。2、有整数、有整数1无整数无整数2:默认输出:默认输出(整数、字符串全部;实数同整数、字符串全部;实数同上上)3、无整数、无整数1有整数有整数2:按上图说明输出:按
59、上图说明输出(实数整数部分全部输实数整数部分全部输出出)【说明说明】 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4、域宽情况、域宽情况(有整数有整数1,有或无整数,有或无整数2) 指定域宽不足,按需增加域宽。指定域宽不足,按需增加域宽。 指定域宽富余:指定域宽富余: 缺省缺省右对齐右对齐: 无无0控制:前加空格;控制:前加空格; 有有0控制:数值型前加控制:数值型前加0填齐;填齐; 其它类型前加空格。其它类型前加空格。 有有控制左对齐,按域宽后面加空格。控制左对齐,按域宽后面加空格。 长度修正长度修正l:长度修正:长度修正l可与可与d、i、o、x、X、u、f、e、E、g、G配合使用
60、,配合使用,long型整数在基本整数范围内、型整数在基本整数范围内、double型实数在型实数在float型实数范围内可以不加型实数范围内可以不加l输出,否则,必须加长度修正输出,否则,必须加长度修正l才能才能正常输出正常输出 。【说明说明】 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【注意注意】(1)实数精度)实数精度(有效数字有效数字)由输出项类型控制由输出项类型控制(float7位位double 16位位),对,对float型输出项用型输出项用%lf格式不能增加精度格式不能增加精度;增增大大“整数整数2”可增加实数输出的小数位数,但不能增加精度。可增加实数输出的小数位数,但不
61、能增加精度。(2)输出项从右向左计算后,按格式说明的顺序、类型和)输出项从右向左计算后,按格式说明的顺序、类型和要求对应输出。格式说明和输出项的个数类型应相同,如不要求对应输出。格式说明和输出项的个数类型应相同,如不匹配系统不能正确输出匹配系统不能正确输出格式说明的个数少于输出项个数,多余的输出项将不格式说明的个数少于输出项个数,多余的输出项将不输出;输出;格式说明的个数多于输出项个数,多余的格式说明将格式说明的个数多于输出项个数,多余的格式说明将输出随机的值。输出随机的值。整型数据按整型数据按%f 输出或者实型数据按输出或者实型数据按%d 输出,均出现输出,均出现输出错误结果。输出错误结果。
62、 安 庆 师 范 学 院 计 算 机 与 信 息 学 院(3)格式字符除)格式字符除X(表示输出的十六进制数用大写(表示输出的十六进制数用大写字母输出)、字母输出)、E(表示输出的指数(表示输出的指数e用大写字母用大写字母E输输出)、出)、G(表示若选用指数形式输出,则用大写字(表示若选用指数形式输出,则用大写字母母E输出)外,必须是小写字母。如输出)外,必须是小写字母。如%d不能写成不能写成%D。(4)若想输出字符)若想输出字符“%”,则在格式字符串中用连,则在格式字符串中用连续两个续两个%表示。如:表示。如:printf(“%f%”,1.0/4); 则则输出:输出:0.250000% 【注
63、意注意】 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() int a,b,c; a=123;b=456; c=a+b; printf(a+b=%d+%d=%dn,a,b,c); printf(“a+b=%hd+%hd=%hdn”,a,b,c); printf(a+b=%2d+%2d=%5dn,a,b,c); printf(a+b=%02d+%02d=%05dn,a,b,c); 【例【例3-2】分析下面程序运行结果】分析下面程序运行结果 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() unsigned int a=655
64、35; int b=-2; printf(“a=%d,%o,%x,%un”,a,a,a,a); printf(“a=%d,%o,%x,%un”,a,a,a,a);【例【例3-3】无符号数据的输出无符号数据的输出 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() float x,y,z; x=123.234;y=0.000345;z=-98.567; printf(x=%.4f, x=%.2f, x=%+en,x,x,x); printf(y=%f, y=%8.4f, y=%10.3en,y,y,y); printf(z=%+f, z=%+e, z=%+gn,
65、z,z,z);【例【例3-4】分析下面程序运行结果分析下面程序运行结果 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() double x,y,z; x=123.234;y=-0.000345;z=-98.567; printf(“x=%lf,x=%.4lf,x=%2lf,x=%+e n”,x,x,x,x); printf(y=%lf, y=%+lf, y=%len,y,y,y); printf(z=%fn,z);【例【例3-5】分析下面程序运行结果分析下面程序运行结果 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() p
66、rintf(n %c,a); /*输出单个字符输出单个字符*/ printf(n %s,abc); /*输出一个字符串输出一个字符串*/【例【例3-6】分析下面程序运行结果分析下面程序运行结果 安 庆 师 范 学 院 计 算 机 与 信 息 学 院3.3.2 格式化输入函数格式化输入函数 scanf scanfscanfscanf()函数的功能是从键盘上将数据按用户指定的()函数的功能是从键盘上将数据按用户指定的格式输入并赋给指定变量。格式输入并赋给指定变量。1.scanf1.scanf()函数调用形式()函数调用形式 scanf scanf(格式控制字符串,地址列表);(格式控制字符串,地址
67、列表); 格式控制字符串的定义与使用方法和格式控制字符串的定义与使用方法和printfprintf函数相函数相似,但不能显示非格式字符串,即不能显示提示字符串。似,但不能显示非格式字符串,即不能显示提示字符串。地址列表是要赋值的各变量地址,地址是由地址运算符地址列表是要赋值的各变量地址,地址是由地址运算符“&”“&”后跟变量名组成,如后跟变量名组成,如&x&x表示变量表示变量x x的地址。的地址。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院格式说明符以格式说明符以%开始,后面跟一个格式符,中间可以有若干个附开始,后面跟一个格式符,中间可以有若干个附加字符,格式字符串一般形式为:加字
68、符,格式字符串一般形式为: %输入数据宽度输入数据宽度m长度长度 类型类型其中:其中: :表示可选项:表示可选项:表示输入的数值不赋给相应的变量,即跳过该数据不读。:表示输入的数值不赋给相应的变量,即跳过该数据不读。输入数据宽度输入数据宽度m:表示按十进制正整数:表示按十进制正整数m的宽度输入数据。的宽度输入数据。长度长度:长度格式符为:长度格式符为l和和h,l表示输入长整型数据或双精度实表示输入长整型数据或双精度实型数据;型数据;h表示输入短整型数据。表示输入短整型数据。类型:是格式说明符中必须要有的,其格式符的意义与类型:是格式说明符中必须要有的,其格式符的意义与printf函函数基本相同
69、,具体如表数基本相同,具体如表3-3所示。所示。2. 格式说明符格式说明符 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院表表3-33-3 scanfscanf函数常用类型格式符表函数常用类型格式符表格式字符格式字符含义d(i)表示以十进制形式输入一个整数o表示以八进制形式输入一个整数x(X)表示以十六进制形式输入一个整数u表示以十进制形式输入一个无符号的整数f或e(E)表示输入一个实数,可以是小数形式或指数形式g(G)与f或e的作用相同c表示输入一个字符s表示输入一个字符串 安 庆 师 范 学 院 计 算 机 与 信 息 学 院
70、【注意注意】(1)scanf函数中的函数中的“格式控制字符串格式控制字符串”后面应该是变量的地后面应该是变量的地址,而不应是变量名。例如输入语句址,而不应是变量名。例如输入语句scanf(“%d,%d”,a,b);是错误的,是错误的,&不能少。不能少。(2)输入数据时不能规定数据的精度。如)输入数据时不能规定数据的精度。如scanf(%8.2f ,&a);是不合法的。是不合法的。(3)在)在“格式控制字符串格式控制字符串”中除了格式说明符外,还有其他字中除了格式说明符外,还有其他字符,则在输入数据时在对应位置上应输入与这些字符相同的字符,则在输入数据时在对应位置上应输入与这些字符相同的字符。例
71、如符。例如 scanf (a=%d,b=%d,&a,&b);则输入时应输入:则输入时应输入: a=12,b=-2其他任何输入形式都不正确。其他任何输入形式都不正确。例例3-7 安 庆 师 范 学 院 计 算 机 与 信 息 学 院注意注意(4)输入数据时,遇以下情况认为该数据输入结束:)输入数据时,遇以下情况认为该数据输入结束: 按指定的宽度结束;按指定的宽度结束; 遇空格,或遇空格,或“回车回车”键,或键,或“Tab”键;键; 遇非法输入。遇非法输入。(5)在用)在用“%c”“%c”格式输入字符时,所有输入的字符(包格式输入字符时,所有输入的字符(包括空格字符和括空格字符和“转义字符转义字符
72、”)都作为有效字符。)都作为有效字符。(6)当输入的数据与输出的类型不一样时,虽然编译没)当输入的数据与输出的类型不一样时,虽然编译没有提示出错,但结果将不正确。有提示出错,但结果将不正确。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院/* EX3-8.C */#include main() int a,b,c; scanf(%3d%3d%4d,&a,&b,&c ); /*按长度按长度m进行输入进行输入*/ printf(na=%d,b=%d,c=%dn,a,b,c);【例【例3-8】 分析下面程序分析下面程序 安 庆 师 范 学 院 计 算 机 与 信 息 学 院/* EX3-9.
73、C */#include main() double a,b,c; scanf(%lf,%lf,&a,&b ); /*按双精度进行输入按双精度进行输入*/ c=a*b; printf(na*b=%lf*%lf=%len,a,b,c);【例【例3-9】 分析下面程序分析下面程序 安 庆 师 范 学 院 计 算 机 与 信 息 学 院/* EX3-10.C */#include main() char ch1,ch2; scanf(%c%c,&ch1,&ch2); printf(%c %cn,ch1,ch2); 【例【例3-10】阅读下面程序】阅读下面程序 安 庆 师 范 学 院 计 算 机 与
74、信 息 学 院/* EX3-11.C */#include main() int x,y; scanf(%2d%*3d%4d,&x,&y ); /*注意注意%*3d的作用的作用*/ printf(nx=%d,y=%d n,x,y);【例【例3-11】分析下面程序】分析下面程序 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() int a; scanf(“%d”,&a ); /*输入输出类型不一致输入输出类型不一致*/ printf(na=%ldn,a);【例【例3-12】分析下面程序分析下面程序 安 庆 师 范 学 院 计 算 机 与 信 息 学 院3.3.
75、3 字符数据的输入与输出字符数据的输入与输出C C语言为字符定义了两个最基本的函数:字符输入函语言为字符定义了两个最基本的函数:字符输入函数数getchargetchar和字符输出函数和字符输出函数putcharputchar。在使用这两个。在使用这两个函数时,程序的头部一定要加上文件包含命令:函数时,程序的头部一定要加上文件包含命令: #include 1. .字符输入函数字符输入函数getchar()getchar( )的功能是从标准设备(键盘)上读入一个字的功能是从标准设备(键盘)上读入一个字符。其一般调用形式:符。其一般调用形式: getchar(); 语句语句ch=getchar()
76、 ch=getchar() 和和 scanf(“%c” scanf(“%c”,&ch);&ch);功能相功能相同同 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() char c1,c2;c1=getchar(); /*从键盘上接收一个字符赋给字符变量从键盘上接收一个字符赋给字符变量c1*/c2=getchar(); /*和和scanf(“%c”,&c2)等价等价*/printf(%c,%cn,c1,c2);【例【例3-13】字符输入函数的使用字符输入函数的使用 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2. 2. 字符输出函数字符输出函数put
77、char()putchar() 字符输出函数字符输出函数putchar()putchar()的功能是向标准输出的功能是向标准输出设备(显示器)输出一个字符。其一般调用形式:设备(显示器)输出一个字符。其一般调用形式: putchar(c);其中:其中:c c是参数,它可以是整型或字符型变量,也是参数,它可以是整型或字符型变量,也可以是整型或字符型常量。当是整型量时,输出以可以是整型或字符型常量。当是整型量时,输出以该数值作为该数值作为ASCIIASCII码所对应的字符;当是字符型量码所对应的字符;当是字符型量时,直接输出字符常量。时,直接输出字符常量。 语名语名putchar(c) 和和 pr
78、intf(“%c” printf(“%c”,c)c)功能相同功能相同 安 庆 师 范 学 院 计 算 机 与 信 息 学 院/* EX3-14.C */#include main() char x,y,z;x=a;y=+;z=b;putchar(x);putchar(y);putchar(z);putchar(132); putchar(n);printf(“%c%c%c132n”,x,y,z);【例【例3-14】字符输出函数的使用】字符输出函数的使用 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例3-15】从键盘上输入两个整数放入变量】从键盘上输入两个整数放入变量a,b中,中
79、,编程将这两个变量中的数据交换。编程将这两个变量中的数据交换。【分析分析】两个数据交换,不能直接写成】两个数据交换,不能直接写成a=b;b=a;a=b;b=a;,因为当执,因为当执行行a=b;a=b;后,变量后,变量a a中的原值就被中的原值就被“冲冲”掉了,而与变量掉了,而与变量b b中的中的值相等,因此不能实现交换。正确的做法是另定义一个变量值相等,因此不能实现交换。正确的做法是另定义一个变量(假设是(假设是c c)作为暂存单元,在执行)作为暂存单元,在执行a=b;a=b;之前,先将变量之前,先将变量a a的的值放入值放入c c中保存起来,然后执行中保存起来,然后执行a=b;a=b;,最后
80、再执行,最后再执行b=c;b=c;,由,由于于c c中保存的是中保存的是a a的值,这样就将原来的值,这样就将原来a a的值赋给了的值赋给了b b,从而实,从而实现了两个变量中的数据交换。现了两个变量中的数据交换。3.4 程序举例程序举例 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 程序程序#include main() int a,b,c; a=3;b=5; c=a;a=b;b=c; printf(a=%d,b=%dn,a,b); 35a3cb 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例3-16】 从键盘上输入一个英文小写字母,编程输出该从键盘上输入一个英文小
81、写字母,编程输出该字母所对应的字母所对应的ASCIIASCII码和所对应的大写字母码和所对应的大写字母【分析分析】在】在ASCIIASCII字符集中,大写字母字符集中,大写字母AZAZ是连续的是连续的(ASCIIASCII值从值从65906590),小写字母),小写字母azaz也是连续的也是连续的(ASCIIASCII值从值从9712297122)。因此每对字母的)。因此每对字母的ASCIIASCII码值差码值差是相同的,都是是相同的,都是3232,即,即a-Aa-A、b-Bb-B、c-Cc-C、z-Zz-Z都是都是3232。所以将小写字母的。所以将小写字母的ASCIIASCII码值减码值减去
82、去3232,则得到的是所对应的大写字母,则得到的是所对应的大写字母ASCIIASCII码值。同码值。同理,将大写字母的理,将大写字母的ASCIIASCII码值加上码值加上3232,则得到的是所,则得到的是所对应的小写字母对应的小写字母ASCIIASCII码值。码值。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 程序程序#include main()char c1,c2;c1=getchar(); /*从键盘获得一个小写字母从键盘获得一个小写字母*/c2=c1-32; /*将小写字母转化为大写字母将小写字母转化为大写字母*/printf(%d,%cn,c1,c1); putchar(
83、c2); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include #include main() float a,b,c,s,area; scanf(%f%f%f,&a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); printf(na=%.2f,b=%.2f,c=%.2fn,a,b,c); printf(narea=%.3fn,area);【例【例3-17】输入三角形的三条边,编程求该三角形的面积】输入三角形的三条边,编程求该三角形的面积 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例3-18】编程求解方
84、程】编程求解方程#include #include main() float a,b,c,d,x1,x2; a=3;b=-5;c=-7; d=b*b-4*a*c; x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a); printf(x1=%.4f , x2=%.4fn,x1,x2); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例3-19】分析下面程序的运行结果】分析下面程序的运行结果#include main() int x=1,y=5; printf(x=%d,y=%d,x,y); 【分析】本程序格式控制字符串中,有两个连续的【分析】本程序格
85、式控制字符串中,有两个连续的%。前面。前面已经讲过,两个连续的已经讲过,两个连续的%表示输出一个表示输出一个%,因此变量,因此变量x,y没没有对应的输出格式,只能输出双引号中的字符。有对应的输出格式,只能输出双引号中的字符。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例3-20】分析下面程序的运行结果】分析下面程序的运行结果#include main() int a,b; a=0x41; b=+a; printf(%d,%dn,a-,-b); printf(%c,%cn,+a,b+); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院本本章章介介绍绍了了顺顺序序程程序序
86、结结构构、赋赋值值语语句句、基基本本的的输输入入/ /输输出出函函数。重点讲解了以下几个方面的内容:数。重点讲解了以下几个方面的内容:1 1. .scanfscanf、printfprintf、getchargetchar、putcharputchar四个函数的使用:四个函数的使用:(1) (1) scanfscanf和和getchargetchar都都是是输输入入函函数数,其其功功能能是是接接收收键键盘盘上上输输入入的的数数据据。但但scanfscanf函函数数可可以以按按指指定定的的格格式式输输入入任任何何类类型型的数据,而的数据,而getchargetchar函数只能接收一个字符。函数只
87、能接收一个字符。(2) (2) printfprintf和和putcharputchar都都是是输输出出函函数数,其其功功能能是是向向屏屏幕幕(显显示示器器)输输出出数数据据。但但printfprintf函函数数可可以以按按指指定定的的格格式式输输出出任任何何类型的数据,而类型的数据,而putcharputchar函数只能输出一个字符。函数只能输出一个字符。(3) (3) 使使用用scanfscanf函函数数或或printfprintf函函数数可可以以在在程程序序中中不不包包含含头头文文件件stdio.hstdio.h,而而使使用用getchargetchar函函数数或或putcharputc
88、har函函数数在在程程序序中中必必须包含头文件须包含头文件stdio.hstdio.h。本章小结本章小结2 2. .格式控制字符串中格式符的含义及使用格式控制字符串中格式符的含义及使用 安 庆 师 范 学 院 计 算 机 与 信 息 学 院格式控制串数据对象类型输入数据形式数据输入格式%mdint short unsigned intunsigned short十进制整数无m则按实际位数输入无m则用分隔符或回车键表示数据输入结束,有m则按m位输入。%mo八进制整数%mx十六进制整数%mldlongunsignedlong十进制整数同上%mlo八进制整数%mlxunsignedlong十六进制整
89、数%mffloat十进制小数同上%me十进制指数%mlfdouble十进制小数同上%mle十进制指数%mcchar单个字符无m输入单个字符,有m则输入m个字符,只取第一个字符%ms字符串或字符数组字符串通常给字符数组赋值。无m时取若干个字符直到回车或空格为止,有m则取前m个字符表表3-4输入格式控制符表输入格式控制符表 安 庆 师 范 学 院 计 算 机 与 信 息 学 院格式控制串数据对象类型输入数据形式数据输入格式%-mdintshortunsignedunsigned short char十进制整数无m按实际位数输出,有m输出m位,超过m位,按实际数位输出,不足m位,补空格无号右对齐(左
90、边补空格)有号左对齐(右边补空格)%-mo八进制整数%-mx十六进制整数%-mu无符号整数%-mldlongunsignedlong十进制整数同上%-mlo八进制整数%-mlx十六进制整数%-mlu无符号整数%-m.nffloatdouble十进制小数无m.n则按实际位数输出,保留6位小数,无m有n则输出的数据保留n位小数,有m.n则输出m位,且保留n位小数.其它同上%-m.ne十进制指数%-mcintcharshort 单个字符无m输出单个字符,有m也输出单个字符,补m-1个空格.有无号,含义同上 %-m.ns字符串或字符数组 一串字符无m.n按实际字符串输出全部字符,有m.n则只输出前n个
91、字符,补m-n个空格.有无号,含义同上 表表3-5输出格式控制符表输出格式控制符表 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.1 4.1 4.1 4.1 关系运算符与关系表达式关系运算符与关系表达式关系运算符与关系表达式关系运算符与关系表达式4.2 4.2 4.2 4.2 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式4.3 if4.3 if4.3 if4.3 if语句语句语句语句4.4 switch4.4 switch4.4 switch4.4 switch语句语句语句语句4.5
92、 4.5 4.5 4.5 程序举例程序举例程序举例程序举例第第4章章 选择结构程序设计选择结构程序设计 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.1.1 关系运算符关系运算符 小于小于 = 大于大于 = = 大于或等于大于或等于 = = 等于等于 != != 不不等于等于 优先级:关系运算符中优先级:关系运算符中、=、= a+=-b /*b /*判断判断a+a+的值是否大于或等于的值是否大于或等于-b*/b*/ 注:数值表达式一般是算术表达式,也可以是关系注:数值表达式一般是算术表达式,也可以是关系表达式、逻辑表达式、赋值表达式、字符表达式等。表达式、逻辑表达式、赋值表达式、字
93、符表达式等。关系表达式的一般形式为:关系表达式的一般形式为: 表达式表达式 关系运算符关系运算符 表达式表达式4.1.2 关系表达式关系表达式 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.2.1 4.2.1 逻辑运算符逻辑运算符( (作用于逻辑值,结果也为逻辑值作用于逻辑值,结果也为逻辑值) ) ! ! 逻辑非逻辑非 单目、右结合、优先级最高;单目、右结合、优先级最高; & & 逻辑与逻辑与 双目双目、左、左结合、合、优先先级较低;低; | | 逻辑或逻辑或 双目双目、左、左结合、合、优先先级最低。最低。 其中,其中,&和和|运算符的优先级低于关系运算符。运算符的优先级低于关系运
94、算符。设设a a、b b均为逻辑值,运算结果:均为逻辑值,运算结果:!a 当a为真时,结果为假;当a为假时,结果为真a&b 当且仅当a、b都为真时,结果为真a|b 当且仅当a、b都为假时,结果为假4.2 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式 安 庆 师 范 学 院 计 算 机 与 信 息 学 院逻辑运算的真值表 ab!aa&ba|b真(非0)真(非0)假(0)真(1)真(1)真(非0)假(0)假(0)假(0)真(1)假(0)真(非0)真(1)假(0)真(1)假(0)假(0)真(1)假(0)假(0) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 逻辑表达式类似于关系表达式,是用
95、逻辑运逻辑表达式类似于关系表达式,是用逻辑运算符把两个表达式连接起来的式子。算符把两个表达式连接起来的式子。例如:例如:a+b&aa+b&a; 判断判断a+ba+b和和a a的值是否都为真,若都为真,则的值是否都为真,若都为真,则表达式为真,否则为假。表达式为真,否则为假。 逻辑表达式的一般形式为:逻辑表达式的一般形式为: ! ! 表达式表达式 表达式表达式 &(|) &(|) 表达式表达式4.2.3 逻辑表达式逻辑表达式 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-14-1】分析下面程序段的运行结果分析下面程序段的运行结果 main() int a=123,b=456,
96、x;char c=a;x=(a|b)&(c=60) printf(passn);【例【例4-24-2】从键盘输入学生成绩并判断是否及格,若及从键盘输入学生成绩并判断是否及格,若及格输出格输出“pass”“pass” 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.3.2 双分支双分支ifif语句语句 双分支双分支ifif语句是语句是ifif语句基本形式,语句基本形式,即即if-elseif-else形式,语句的结构为:形式,语句的结构为: if( if(表达式表达式) ) 语句语句1 1; else else 语句语句2 2;语义:当表达式的值为真,则执行语义:当表达式的值为真,则执
97、行语句语句1 1,否则执行语句,否则执行语句2 2。然后执行。然后执行ifif语句后面的语句。语句后面的语句。单分支单分支ifif语句相当于双分支语句相当于双分支ifif语句语句缺省缺省elseelse子句。子句。非非0表达表达式式语句语句1语句语句20 安 庆 师 范 学 院 计 算 机 与 信 息 学 院main()float a, b,max;printf(input the two numbers: );scanf(%f,%f,&a,&b);if(ab) max=a;else max=b;printf(max=%fn,max); 【例【例4-34-3】从键盘输入两个整数,输出其中最大者
98、】从键盘输入两个整数,输出其中最大者 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【注意】(1)(1)ifif语句的条件表达式一般是逻辑表达式或关系表达语句的条件表达式一般是逻辑表达式或关系表达式,但也可以是其它任何类型的表达式,如赋值表达式,但也可以是其它任何类型的表达式,如赋值表达式等,甚至也可以是一个变量、常量或函数调用。只式等,甚至也可以是一个变量、常量或函数调用。只要表达式的值非要表达式的值非0 0,即为,即为“真真”;表达式值为;表达式值为0 0,即为,即为“假假”。 不能将赋值运算符不能将赋值运算符“= =”与关系运算符中的相等运与关系运算符中的相等运算符算符“= =
99、=”混淆。如在混淆。如在ifif(a=5a=5)printf(“%dn”,aprintf(“%dn”,a););中中表达式表达式a=5a=5的值为的值为5 5非非0 0,条件为真。这种情况在程序中,条件为真。这种情况在程序中应避免出现。在循环结构中,若出现这种错误的写法,应避免出现。在循环结构中,若出现这种错误的写法,会造成程序的死循环。会造成程序的死循环。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【注意】(2)(2)在在ifif语语句句中中,条条件件表表达达式式必必须须用用括括号号括括起起来来。在在每每一个子句之后必须加分号。例如:一个子句之后必须加分号。例如:if ( ab
100、) max=a;else max=b; elseelse子子句句是是ifif语语句句的的一一部部分分,和和ifif子子句句配配对对使使用用,不不能单独使用。能单独使用。(3)(3)在在ifif语句的各种形式中,所有的语句应为单个语句,语句的各种形式中,所有的语句应为单个语句,如果想将单个语句换成一组语句,则必须把这一组语句如果想将单个语句换成一组语句,则必须把这一组语句用花括号用花括号“ ”“ ”括起来组成一个复合语句。括起来组成一个复合语句。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.3.3 多分支选择结构多分支选择结构 多分支选择结构的多分支选择结构的if语句语句if(表达
101、式表达式1) 语句语句1; else if (表达式表达式2) 语句语句2; else if (表达式表达式3) 语句语句3; else if (表达式表达式n) 语句语句n; else 语句语句n+1; 语义:依次判断表达式的值,当某个表达式的值为真依次判断表达式的值,当某个表达式的值为真时,时, 则执行其对应的语句。然后跳到整个则执行其对应的语句。然后跳到整个if语句之外语句之外继续执行程序。继续执行程序。 如果所有的表达式均为假,则执行语如果所有的表达式均为假,则执行语句句n+1 。 然后继续执行后续程序。然后继续执行后续程序。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院多分
102、支if语句的控制流程 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例4-4】分段函数 输入任意输入任意x,求,求y值。值。 main() float x,y; printf(input one number: ); scanf(%f,&x); if(x=0|x=2) y=0; else if(x0) y=(x+1)/(x-2); else y=(x-1)/(x-2); printf(y=%fn,y); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-5】判别键盘输入字符的类别:控制字符、数字、】判别键盘输入字符的类别:控制字符、数字、大写字母、小写字母、其他字符。
103、大写字母、小写字母、其他字符。 #includevoidmain(void)charc;printf(Inputacharacter;);c=getchar();if(c=0&c=A&c=a&c=z)printf(Thisisasmalllettern);elseprintf(Thisisanothercharactern); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.3.4 ifif语句的嵌套语句的嵌套 当当if语句中的语句体又是语句中的语句体又是if语句时,这种情况就叫语句时,这种情况就叫if语句的嵌套句的嵌套。C语言对语言对if语句嵌套的层数没有限制。语句嵌套的层数没有限
104、制。在双分支在双分支if语句中语句语句中语句1和语句和语句2均嵌套的形式为:均嵌套的形式为: if (表达式表达式) if (表达式表达式) 语句语句11; else 语句语句12; else if (表达式表达式) 语句语句21; else 语句语句22; 有时可能只有语句有时可能只有语句1或语句或语句2嵌套,也可能有多层嵌嵌套,也可能有多层嵌套套(各层可能单分支或双分支各层可能单分支或双分支),因此就有很多情况。,因此就有很多情况。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院嵌套if语句的层次划分问题 由于嵌套的复杂情况,怎么划分嵌套的层由于嵌套的复杂情况,怎么划分嵌套的层次就
105、成了问题。其方法为:寻找次就成了问题。其方法为:寻找ifelse配对。配对。 C语言语言ifelse配对的规定:配对的规定: 从最前面的从最前面的else开始,使每个开始,使每个else与其前与其前面最近的尚未配对的面最近的尚未配对的if匹配。匹配。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院嵌套if语句的层次划分问题 可能存在的问题:当内层为单分支可能存在的问题:当内层为单分支if语句时,可能产语句时,可能产生生ifelse配对错误配对错误(内层内层if语句为双分支时无此问题语句为双分支时无此问题)。例如内层单分支例如内层单分支if语句嵌套在外层语句嵌套在外层if子句中:子句中:
106、 原意:原意: 按按ifelse配对原则应该写成:配对原则应该写成: if(表达式表达式) if(表达式表达式) if(表达式表达式) 语句语句21; if(表达式表达式) 语句语句21; else 语句语句2; else 语句语句2; 按原意应该写成:按原意应该写成:if(表达式表达式) if(表达式表达式) 语句语句21; else语句语句2; 安 庆 师 范 学 院 计 算 机 与 信 息 学 院嵌套if语句的层次划分问题 然而,单分支内层然而,单分支内层if语句嵌套在外层语句嵌套在外层else子子句中:句中: if(表达式表达式) 语句语句1; else if(表达式表达式) 语句语句
107、21; 这种写法内层这种写法内层if语句不加花括号也不会出现语句不加花括号也不会出现ifelse配对错误。配对错误。多分支多分支if语句其实就是多层嵌套的语句其实就是多层嵌套的if语句,其每语句,其每一层都是嵌套在一层都是嵌套在else子句中子句中 安 庆 师 范 学 院 计 算 机 与 信 息 学 院嵌套if语句的层次划分问题嵌套嵌套if语句避免出错要点:语句避免出错要点:按按ifelse配对原则设计嵌套。配对原则设计嵌套。当内层当内层if语句是单分支时,尽可能嵌套在外层语句是单分支时,尽可能嵌套在外层else子句中;如果一定要嵌套在外层子句中;如果一定要嵌套在外层if子句中,必子句中,必须
108、要加花括号。须要加花括号。按正确的缩进格式书写程序。按正确的缩进格式书写程序。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-6】求符号函数】求符号函数 的值的值 main()intx,y;scanf(”%d”,&x);if(x0)y=-1;elseif(x=0)y=0;elsey=1;printf(”x=%d,y=%dn”,x,y); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.3.5 条件运算符和条件表达式条件运算符和条件表达式 1 1、条件运算符、条件运算符 条件运算符由条件运算符由“?”和和“:”组合而成,是三目运组合而成,是三目运算符,要求有算符,要
109、求有3 3个操作对象,并且三个操作对象都个操作对象,并且三个操作对象都是表达式。是表达式。优先级优先级: :条件运算符的运算优先级低于关系运算符条件运算符的运算优先级低于关系运算符 和算术运算符,高于赋值运算符和算术运算符,高于赋值运算符 结合性结合性: :自右至左自右至左 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2 2、条件表达式、条件表达式条件表达式的一般形式为:条件表达式的一般形式为: 表达式表达式1? 1? 表达式表达式2 2:表达式:表达式3 3 条件运算的求值规则为:条件运算的求值规则为: 计算表达式计算表达式1 1的值,若表达式的值,若表达式1 1的值为真,则以表达
110、式的值为真,则以表达式2 2的的值作为整个条件表达式的值值作为整个条件表达式的值( (不计算表达式不计算表达式3)3),否则以表达式,否则以表达式3 3的值作为整个条件表达式的值的值作为整个条件表达式的值( (不计算表达式不计算表达式2) 2) 。 条件表达式的结果类型:表达式条件表达式的结果类型:表达式2 2和表达式和表达式3 3中的较高者,中的较高者,例如:例如: y3?1.0:1 yb) max=a; else max=b;用条件表达式可以表示为:用条件表达式可以表示为: max=(ab)?a:b; 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例4-7】用用条条件件运运算算符
111、符对对【例例4-34-3】重重新新编编程程,输出两个整数中的最大者输出两个整数中的最大者main()main() float a, b,max; float a, b,max; printf(input the two numbers: ); printf(input the two numbers: ); scanf(%f,%f,&a,&b); scanf(%f,%f,&a,&b); max=ab?a:b; max=ab?a:b; printf(max=%fn,max); printf(max=%fn,max); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院例:用条件表达式求例:用
112、条件表达式求x x的绝对值的绝对值 printf(|%d|=%dn,x,x0?(-1)*x:x); printf(|%d|=%dn,x,x=0?a+b:a-b); printf(n%f+|%f|=%f,a,b,b=0?a+b:a-b); 当当b=0b=0,输出,输出a a、b b、a+ba+b的值的值 当当b0b0 ? 1.0: (x=b+)?a=b+)?-a:b+);a:b+); printf(“,%d,%dn”,a,b); printf(“,%d,%dn”,a,b); 运行时输入运行时输入5 5,44输出输出3 3,3 3,5(:5(:后的后的b+b+没有计算没有计算) )运行时输入运行时
113、输入5 5,55输出输出6 6,4 4,7(:7(:前的前的-a a没有计算没有计算) ) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【问题】【问题】 前面我们所说的前面我们所说的ifif语句通常用于解决两个分支语句通常用于解决两个分支的情况,而日常生活中我们常常要解决多个分支的的情况,而日常生活中我们常常要解决多个分支的问题。例如前面我们所说的,给学生成绩划分问题。例如前面我们所说的,给学生成绩划分A A、B B、C C等等,诸如此类问题。利用嵌套的,诸如此类问题。利用嵌套的ifif语句当然也语句当然也可以解决,但是如果分支太多,可以解决,但是如果分支太多,ifif语句嵌套的层次
114、语句嵌套的层次数太多,势必会造成程序的冗长,可读性差。有没数太多,势必会造成程序的冗长,可读性差。有没有什么更好的方法能解决多分支问题呢?有什么更好的方法能解决多分支问题呢? 4.4 switch语句语句 安 庆 师 范 学 院 计 算 机 与 信 息 学 院switch语句专门用于解决多分支选择问题语句专门用于解决多分支选择问题1、一般形式为:、一般形式为: switch(开关表达式开关表达式) case 常量表达式常量表达式1: 语句语句1; case 常量表达式常量表达式2: 语句语句2; case 常量表达式常量表达式n: 语句语句n; default : 语句语句n+1; 安 庆 师
115、 范 学 院 计 算 机 与 信 息 学 院语义:计算开关表达式的值,并逐个与其后的常语义:计算开关表达式的值,并逐个与其后的常量表达式值相比较:量表达式值相比较: 当开关表达式的值与某个常量表达式的值相当开关表达式的值与某个常量表达式的值相等时,等时, 即执行其后的语句,然后不再进行判断,即执行其后的语句,然后不再进行判断,继续执行下面所有继续执行下面所有casecase后的语句。后的语句。 如开关表达式的值与所有如开关表达式的值与所有casecase后的常量表达后的常量表达式的值均不相同时,则执行式的值均不相同时,则执行defaultdefault后的语句。后的语句。结论:结论:switc
116、hswitch语句是一个具有多处入口单出口的语句是一个具有多处入口单出口的语句结构。语句结构。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院2、switch语句构成多分支选择结构为:语句构成多分支选择结构为: switch(开关表达式开关表达式) case 常量表达式常量表达式1: 语句语句1; break; case 常量表达式常量表达式2: 语句语句2; break; case 常量表达式常量表达式n: 语句语句n; break; default : 语句语句n+1; 安 庆 师 范 学 院 计 算 机 与 信 息 学 院main()int a; scanf(%d,&a); sw
117、itch(a) case 1:printf(Mondayn); break; case 2:printf(Tuesdayn); break; case 3:printf(Wednesdayn); break; case 4:printf(Thursdayn); break; case 5:printf(Fridayn); break; case 6:printf(Saturdayn); break; case 7:printf(Sundayn); break; default: printf(Errorn); 【例【例4-9 4-9 】输入一个十进制数,输出所对应的英文星期单词,若所】输入一个
118、十进制数,输出所对应的英文星期单词,若所输入的数小于输入的数小于1 1或大与或大与7 7,则输出,则输出“Error”“Error” 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【注意注意】(1) switch后的后的“开关表达式开关表达式”允许为任何类型的表达式。允许为任何类型的表达式。(2) 在每一个在每一个case后各常量表达式不能相同,否则会出现错误。后各常量表达式不能相同,否则会出现错误。(3) 在在case后,允许有多个语句,可以不用后,允许有多个语句,可以不用 括起来。括起来。(4) case和和default子句出现的先后顺序可以变动,有子句出现的先后顺序可以变动,有
119、break语句语句时不会影响程序执行结果。时不会影响程序执行结果。default子句也可以省略不用。子句也可以省略不用。(5) 多个多个case可以共用一组执行语句。例如:可以共用一组执行语句。例如: case A: case B: case C:printf(60n);break; (6) break(中断中断)语句语句作用:作用:放在放在switch语句的某语句组之后,跳出语句的某语句组之后,跳出(该层该层)switch语语句。句。放在循环体中,跳出放在循环体中,跳出(该层该层)循环语句。循环语句。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院4.5 4.5 程序举例程序举例【例
120、【例4-104-10】输入一个十进制正整数,判断该数是否是】输入一个十进制正整数,判断该数是否是3 3的倍数,若是输出的倍数,若是输出Yes!Yes!,否则输出,否则输出“No!No!”【分析】输入一个十进制整数,判断是否为【分析】输入一个十进制整数,判断是否为3 3的倍数,的倍数,只需考察这个数对只需考察这个数对3 3取余数结果是否为取余数结果是否为0 0,为,为0 0就是就是3 3的的倍数,否则就不是倍数,否则就不是3 3的倍数。的倍数。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院main() int a; printf(Enter an integer: ); scanf(%
121、d,&a); if(a%3=0) printf(Yes!n); else printf(No!n); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include stdio.hmain ( ) int a, b, c, t ; printf (please input the three number: ); scanf (%d,%d,%d, &a, &b, &c); if (ab) t=a; a=b; b=t; /* a和和b的值交换的值交换 */ if (ac) t=a; a=c; c=t; /* a和和c的值交换的值交换*/ if (b= %d =%dn, a, b, c);
122、【例【例4-114-11】输入】输入3 3个数,按从大到小的顺序输出。个数,按从大到小的顺序输出。 【分析】设【分析】设3 3个数分别是个数分别是a a、b b和和c c,把它们中最大者存放在,把它们中最大者存放在a a中,中,把次大者存放在把次大者存放在b b中,中,c c中存放最小者,然后依次输出中存放最小者,然后依次输出a a、b b和和c c 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例例4-124-12】 将一个百分制的成绩转化成将一个百分制的成绩转化成5 5个等级:个等级:9090分以分以上为上为AA,80808989分为分为BB,70707979分为分为CC,606
123、06969分为分为DD,6060分以下为分以下为EE。例如输入。例如输入7575,则显,则显示示C C。【分析】先判断输入的数据是否在合理的分数范【分析】先判断输入的数据是否在合理的分数范围(围(0 0100100)内,然后再判断是哪个分数段:)内,然后再判断是哪个分数段:9090分以上输出分以上输出A A,80808989分输出分输出B B,70707979分输出分输出C C,60606969分输出分输出D D,否则显示,否则显示E E。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main()int a; printf(input the score: ); s
124、canf(%d,&a); if(a100) printf(data errorn); else if(a=90) printf(An); else if(a=80) printf(Bn); else if(a=70) printf(Cn); else if(a=60) printf(Dn); else printf(En); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-134-13】 用用switchcase语句来实现【例语句来实现【例4-12】【分析】为了使用【分析】为了使用switchswitch语句,必须将分数段和等语句,必须将分数段和等级字母的对应关系转化为某个常
125、量和等级字母的对级字母的对应关系转化为某个常量和等级字母的对应关系。经过分析,我们可以把输入的分数十位上应关系。经过分析,我们可以把输入的分数十位上的数字作为考查对象,只需要将输入的分数除以十,的数字作为考查对象,只需要将输入的分数除以十,得到的数据就是十位上的数值。用这个数据与等级得到的数据就是十位上的数值。用这个数据与等级字母的对应关系来替代某个分数段与等级字母的对字母的对应关系来替代某个分数段与等级字母的对应关系。应关系。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院main()int a; scanf(%d,&a); if(a100) printf(data errorn);
126、 else switch(a/10) case 10: case 9: printf(An);break; case 8: printf(Bn);break; case 7: printf(Cn);break; case 6: printf(Dn);break; default: printf(En); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-144-14】输入输入20082008年的一个月份,输出这个月的天数。年的一个月份,输出这个月的天数。(2008(2008年为年为闰闰年年) )【分析】根据输入的月份数判断,当月份为【分析】根据输入的月份数判断,当月份为1 1、
127、3 3、5 5、7 7、8 8、1010、1212时,天数为时,天数为3131,当月份为,当月份为4 4、6 6、9 9、1111时,天数为时,天数为3030,20082008年是年是闰闰年,所以,当月份为年,所以,当月份为2 2时,天数为时,天数为2929。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院main()int month,days; printf(input the month number: ); scanf(%d,&month); switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case
128、12:days=31;break; case 4: case 6: case 9: case 11:days=30;break; case 2:days=29;break; default:days=-1; if(days=-1) printf(input error! ); else printf(2008years %d month has %d daysn, month, days); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-15】求方程】求方程ax2+bx+c=0的实数解。的实数解。【分析】根据3个系数的不同情况,方程的根有如下几种情况。1.a=0,不是二次方
129、程;2.b2-4ac=0,有两个相等的实根x;3.b2-4ac0,有两个不等实根,x1和x2;4.b2-4ac0,没有实数解。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()floata,b,c,x1,x2,disc;printf(“nInputa,b,c:”);scanf(“%f%f%f”,&a,&b,&c);if(fabs(a)1e-6)printf(“Theequationisnotaquadratic”);elsedisc=b*b-4*a*c;if(fabs(disc)0)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(dis
130、c)/(2*a);printf(“Theequationhasdistinctrealroots:%8.4f,%8.4f”,x1,x2);elseprintf(“Theequationhasnotrealrootsn”); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例【例4-164-16】 输入两个十进制整数,输出这两个数的关系。输入两个十进制整数,输出这两个数的关系。例如,若输入的数据为例如,若输入的数据为2 2,3 3,则输出结果为,则输出结果为232232。若输入数。若输入数据为据为3 3,3 3,则输出结果为,则输出结果为3=33=3。【分析】【分析】两个数的相互关系只有
131、三种:两个数的相互关系只有三种:ababab、a= =ba= =b,因此可以用多分支,因此可以用多分支ifif语句。语句。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院#include main() int a,b; printf(input two numbers: ); scanf(%d,%d,&a,&b); if(ab) printf(%d%dn,a,b); else if(a=b) printf(%d=%dn,a,b); else printf(%d%dn,a,b); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【例例4-174-17】 从键盘输入一个正整数作为年份
132、,编程判断从键盘输入一个正整数作为年份,编程判断该年是不是闰年。若是则输出该年是不是闰年。若是则输出“YES”“YES”,否则输出,否则输出“NO”“NO”。【分析】闰年的条件是:【分析】闰年的条件是:能被能被4 4整除,但不能被整除,但不能被100100整除的年份整除的年份( (例如例如20082008年年) )是闰年;是闰年;能被能被400400整除的年份整除的年份( (例如例如20002000年年) )也是闰年。也是闰年。 ( (而而19001900年不是闰年年不是闰年) ) 安 庆 师 范 学 院 计 算 机 与 信 息 学 院main( ) int year; scanf(%d,&y
133、ear); if(year%4=0 & year%100!=0|year%400=0) printf(YES); else printf(NO); 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【本章小结】【本章小结】 根根据据某某种种条条件件的的成成立立与与否否而而采采用用不不同同的的程程序序段段进进行行处处理理的的程程序序结结构构称称为为选选择择结结构构。选选择择结结构构是是C C语语言言中中一一种种重重要要的的语语句句结结构构,它它体体现现了了程程序序的的逻逻辑辑判判断断能能力力。选选择择结结构构又又可可分分为为简简单单分分支支(两两个个分分支支)和和多多分分支支两两种种情情况况
134、。一一般般采采用用ifif语语句句实实现现简简单单分分支支结结构构程程序序,用用switchswitch和和breakbreak语语句句实实现现多多分分支支结结构构程程序序。本本章章中中我我们们主要给大家介绍了下面内容:主要给大家介绍了下面内容:(1)(1)选选择择结结构构离离不不开开逻逻辑辑判判断断,关关系系运运算算和和逻逻辑辑运运算算正正体体现现了了这这种种逻逻辑辑判判断断能能力力。选选择择结结构构的的控控制制条条件件通通常常用用关关系系表表达达式式或或逻逻辑辑表表达达式式构构造造,也也可可以以用用一一般般表表达达式式表表示示。因因为为表表达达式式的的值值非非0 0即即为为“真真”,0 0
135、即即为为“假假”。所所以具有值的表达式均可作以具有值的表达式均可作ifif语句的控制条件。语句的控制条件。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院【本章小结【本章小结(续续)】(2)C(2)C语语言言利利用用ifif语语句句来来实实现现选选择择结结构构,ifif语语句句主主要要有有四四种种句句式式,分分别别是是:单单分分支支的的ifif语语句句、双双分分支支的的ifif语语句句、多多分分支支的的ifif语语句句和和嵌嵌套套的的ifif语语句句。在在嵌嵌套套ifif语语句句中,一定要搞清楚中,一定要搞清楚elseelse与哪个与哪个ifif结合的问题。结合的问题。(3)switch(3)switch语句专门用于解决多分支选择问题。语句专门用于解决多分支选择问题。switchswitch语句只有与语句只有与breakbreak语句相结合,才能设计出正语句相结合,才能设计出正确的多分支结构的程序。确的多分支结构的程序。breakbreak语句通常出现在语句通常出现在switchswitch语句或循环语句中,它能终止执行它所在的语句或循环语句中,它能终止执行它所在的switchswitch语句或循环语句。语句或循环语句。 安 庆 师 范 学 院 计 算 机 与 信 息 学 院