1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,1,章,C,语言概述,1.1,程序设计语言及其发展,1.2 C,语言的标准,1.3 C,语言的程序结构,1.1,程序设计语言及其发展,计算机程序设计语言的发展,经历了从机器语言、汇编语言到高级语言的历程。,1、机器语言,写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言,就是机器语言。机器语言,是第一代计算机语言。,2、汇编语言,用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“ADD”代表加法,“MOV”代表数据传递等等,这种程序设计语言就称为汇编语言,即第二代计算机语言
2、3、高级语言,高级语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。,1.2 C,语言的标准,ANSI C/C89标准,C99标准,C11,标准(,C,语言的最新标准),1.3 C,语言的程序结构,例:要求在屏幕上输出Welcome to C world!,#include,/*预处理命令*/,void main(),/*主函数*/,printf(Welcome to C world!n);,/*格式输出函数*/,1.3.1,简单的,C,程序案例,程序说明,(1)在程序的第二行main是C语言程序中的“主函数”的名字。main前面的void 表示此函
3、数是“空类型”,即执行此函数后不产生函数值。C语言中,每个程序都必须有一个main函数,它是每一个C语言程序的执行起始点(入口点)也是程序执行的结束点。,(2)用括起来的是main的函数体。main函数中的所有操作(或:语句)都在这一对之间。也就是说main函数的所有操作都在main函数体中,。,#include,/*预处理命令*/,void main(),/*主函数*/,printf(Welcome to C world!n);,/*格式输出函数*/,程序说明,(3)本例主函数中只有一条语句,printf是C语言库函数中的格式输出函数,功能是把该语句中双撇号内的字符原样输出(显示在屏幕上),
4、n”是换行符,即在输出“Welcome to C world!.”后回车换行。语句最后必须有一个分号。,(4)在C语言中使用标准函数库中的输入输出函数时,编译系统要求程序提供有关信息(即对这些输入输出函数的声明),程序第1行“#include”的作用就是用来提供这些信息的,“stdio.h”是C编译系统提供的一个标准输入输出的库文件。include是文件包含命令。,#include,/*预处理命令*/,void main(),/*主函数*/,printf(Welcome to C world!n);,/*格式输出函数*/,程序说明,(5)“/*/”表示注释部分,注释可以用汉字或英文字符表示,
5、可以出现在语句的后面,也可以单独成为一行。在程序编译和运行过程中,不起作用,只是便于别人读懂程序。,#include,/*预处理命令*/,void main(),/*主函数*/,printf(Welcome to C world!n);,/*格式输出函数*/,例,求两数中的最小值,#include,void main()/*主函数*/,int a,b,c;/*定义变量*/,scanf(%d,%d,/*输入数*/,c=min(a,b);/*调用函数*/,printf(min=%dn,c);/*输出*/,int min(int x,int y)/*定义函数*/,int z;/*定义局部变量*/,i
6、f(xy),z=y;,else,z=x;,return(z);/*返回z值*/,经编译后运行如下:,14,4,min=4,再次运行:,6,29,min=6,程序说明,(1)本程序包括两个函数:主函数main()和子函数min()。min函数的作用是将x,y中较小的数送给变量z,return语句的作用是将z的值返回给主函数main。返回值是通过函数名min带回给main中的调用处。,(2)主函数中的scanf()是系统给出的标准输入函数,通过它输入a和b的值,&a,&b中的“&”是取地址符,在此功能是将输入的值分别送入变量a和b的地址所标志的存储单元中,即输入给变量a和b。“%d,%d”是输入输
7、出的格式字符串,用来指定输入输出数据的类型和格式。,(3)main函数中第4行是调用min函数,在调用时将实际参数a,b的值送给min函数中的形式参数x和 y。在min函数后得到一个返回值(即min函数中的变量z的值),把这个值送给变量c,然后输出变量c的值。,通过上述两个例子我们可以看到:,(1)C程序是由函数构成的。一个程序至少含有一个main主函数。也可以包含一个主函数和若干个子函数。函数是C语言的基本单位。被调用的子函数可以是系统给出的库函数,也可以是用自己定义的函数。,(2)一个函数由两部分组成:函数的首部和函数体。,(3)main函数通常位于程序之首,实际上它位于程序的开头、最后及
8、函数与函数之间均是合法的,但不管在什么位置,一个C程序总是从main函数开始执行的。,(4)C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。,(5)C语言本身没有输入输出语句,输入输出都由函数实现,因此在程序的开始必须有头文件“include”。,(6)可以用/*/对C程序中的任何部分作注释,程序中加入必要的注释可增加程序的可读性。,(7)C语言程序中每一条语句结束后都必须加一个分号。分号是C语言语句的组成部分。,1.3.2 C,程序的基本结构,(1)C语言程序是由函数组成的。,(2)源程序中可以有预处理命令,预处理命令通常放在源文件或源程序的最前面。,(3)每一个语句都必
9、须以分号结尾,但预处理命令、函数头和右花括号“”之后不加分号。,(4)注释不是程序的必须部分,在程序执行时注释不起任何作用。,(5)在C语言中,虽然一行可写多个语句,一个语句也可占多行,但建议一行只写一个语句。,(6)一般采用缩进格式书写程序,以提高程序的可读性和清晰性。,1.3.3,集成开发环境(,IDE,),集成开发环境提供编程时所必需的工具,这些工具有编辑器、编译器和调试器,它们集成在一个软件包内供程序员使用。在早前的DOS环境下主要的C语言集成开发环境有TC2.0、Turbo C3.0和Borland c。在Windows环境下主要使用Visual C 6.0,Visual C 6.0
10、既可以对C进行编译,也可以对C进行编译。本书的示例程序均可在Visual C 6.0集成环境下进行编辑、编译和运行。,第,2,章,C,程序设计的基本知识,2.1,数据类型,2.2,标识符、常量和变量,2.3,运算符和表达式,2.1,数据类型,2.2,标识符、常量和变量,标识符是起标识作用的一类符号。用来标识变量名、符号常量名、函数名、数组名、类型名等实体(程序对象)的有效字符序列。,在C语言中,一个合理的标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。例如:sum,average,_total,Class,day,stu_name,p4050为合法的标识符,M.D.
11、John,$123,#33,3D64,ab为不合法的标识符。,2.2.1,标识符,使用标识符时需要注意:,(1)不能使用C语言中的关键字做为标识符。,(2)标识符定义时不要太长。,(3)大小写敏感。,(4)见名知义。,(5)标识符和关键字之间必须用空格分隔。,2.2.2,常量和变量,(1)整型常量,整型常量也称为整型常数或整数。按进制可分为十进制整数,八进制整数和十六进制整数。,十进制整数十进制数:与数学上的整数表示相同。如123,-456,0等。,八进制整数,八进制数:以0开头,后面跟07的数字。如0123,054等。,十六进制整数,十六进制数:以0 x(或0X)开头,后面跟09和af(或A
12、F)的数字。其中a代表10,b代表11,其余类推。如0 x123,0 x12af,0 xAE2。,1,、常量,整型常量按其值所在的范围可分为短整型(short int)、基本型(int)和长整型(long int)和无符号型(unsigned)。,在整数后加u或U代表无符号整型数,如:56U,13u。加l或L代表长整型数,如23L,45l。,(2)实型常量,小数形式,实数的小数形式是由数字,小数点组成(必须有小数点)。如123.456,-21.37。整数12用实数表示必须写成12.0或12.。,指数形式,实数的指数形式也称为科学计数法。一个实数的指数形式分成尾数部分和指数部分。尾数部分可以是整
13、数形式或小数形式,指数部分是一个字母“e”后跟一个整数。如123e+01,-456.78e-01,0e0等。在书写时“e”与“E”完全等价。“e”前面必须有数字,“e”后面必须是整数。规范化的指数形式。在字母e或E之前的小数部分,小数点左边应当有且只能有一位非0数字。用指数形式输出时,是按规范化的指数形式输出的。例如:2.3478e2、3.0999E5、6.46832e12都属于规范化的指数形式。,(3)字符常量,用单引号直接括起来可显示的字符常量,如a、x、D、?、$等都是字符常量。,用单引号括起来的由反斜杠()引导的转义字符,主要用于控制信息。,(4),字符串常量,字符串常量是一对双引号括
14、起来的字符序列,简称为字符串。字符的个数称为其长度。例如:how are you,C program都是字符串常量。,2,、变量,在程序运行过程中其值可以变化的量我们称之为变量。每一个变量都对应计算机内存中相应的存储单元。在该单元中存放变量的值。在程序运行过程中其值可以变化的量我们称之为变量。每一个变量都对应计算机内存中相应的存储单元。在该单元中存放变量的值。,(1)变量的定义,常量可以直接使用,而变量则必须先定义后使用。,(2)变量的初始化,程序中常需要对一些变量预先设置初值。,(3)基本变量类型,数据长度和取值范围会随机器的CPU类型和C编译器的不同而不同。下表中列出了几种基本数据类型在不
15、同实现环境中的字节长度和取值范围。,基本数据类型、长度、值域对照表,定义整型变量可以有int,long int,sort int三种方法。在定义三种不同整型变量时,都可以加上修饰符unsigned和signed,分别表示无符号数和有符号数。若不的指定则默认为有符号数,这样看,signed是可以省略的。归纳起来,在C语言中可以定义和使用以下6种整型变量。,signed int 有符号基本整型,unsigned int 无符号基本整型,signed short int 有符号短整型,unsigned short int 无符号短整型,signed long int 有符号长整型,unsigned
16、long int 无符号长整型,整型变量,有符号整数对于许多运算都是很重要的。但是它所能表达的最大数的绝对值只是无符号数的一半。因此在实际应用中,为了充分利用变量的数值范围,对于只存入正数的变量(如学号、库存量、存款额等),在需要时可以将变量定义为“无符号”类型。这样比一般整型变量中正数的范围扩大一倍。,计算机中,数据都是以二进制形式存储的,整型变量也不例外,它是以补码方式存储。有符号数据的第一位为符号位,0表示正数,1表示负数,而无符号数据的第一位为数据位。,例如:定义一个整型变量i=10,在内存中的存放方式如图。,计算机不论对正数和负数都按“补码”形式存放到存储单元。对于正数来说,补码就是
17、该数的“原码”(即该数的二进制形式)。如10的原码为0,000000000001010,它的补码为0,000000000001010。负数的补码不是它的原码。而是在“原码”的基础上取反加1。如:-10的原码为1,000000000001010。取反后变为1,111111111110101。最后得到的反码基础上加1即为补码1,111111111110110。,实型变量分为单精度(float)、双精度(double)。单精度数据一般提供7位有效位数,双精度提供1516位有效位数。在内存中的存放形式与整数存储方式不同,实型数据是按照指数形式存储的。系统将实型数据分为小数部分和指数部分,分别存放。,实
18、型变量,由于实型变量是用有限的存储单元存储的,因此提供的有效数字是有限的,在有效位以外的数字将被舍去,由此可能会产生一些误差。,实型数据存放示意图,#include,void main(),float pi=3.141592612;,printf(pi=%fn,pi);,运行结果为:,pi=3.141593,因为pi是单精度浮点型变量,只能提供7位有效数字,因此后面几位被忽略了。若要提高数据的精度,可以将变量定义为双精度类型,得到1516位有效位数,这样就不会使精度损失了。,例:实型数据的舍入误差。,字符型变量是用来存放字符数据,同时只能存放一个字符。所有编译系统都规定以一个字节来存放一个字符
19、或者说,一个字符变量在内存中占一个字节。存储形式以字符的ASCII码存储,例如:字符a,它的ASCII码是97,它在内存中的存储形式为:01100001。可以看出字符数据以ASCII码存储的形式与整数的存储形式类似,这使得字符型数据和整型数据之间可以通用(当作整型量)。,字符型变量,可以将整型量赋值给字符变量,也可以将字符量赋值给整型变量。,可以对字符数据进行算术运算,相当于对它们的ASCII码进行算术运算。,一个字符数据既可以以字符形式输出(ASCII码对应的字符),也可以以整数形式输出(直接输出ASCII码)。,注意:尽管字符型数据和整型数据之间可以通用,但是字符型只占1个字节,因此不能
20、把一个大数存到字符变量中。,具体表现为:,#include,void main(),char c1,c2;,c1=A;,c2=B;,c1=c1-32;,c2=c2-32;,printf(%c=%d n,c1,c1);,printf(%c=%d n,c2,c2);,运行结果为:,A=33,B=34,例:小写字母转换成大写字母。,3,、数据类型转换,显式类型转换也就是采用强制手段进行数据类型转化。强制类型转换是通过类型转换运算来实现的。,其一般形式为:,(类型说明符)(表达式),其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。,(,1,)显式类型转化,说明:在使用强制转换时应注意以下问
21、题:,类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。,无论是强制转换或是隐式转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。,include,void main(),float f=5.75;,printf(int)f=%d,f=%.2fn,(int)f,f);,运行结果为:,(int)f=5,f=5.75,本例表明,f虽强制转为int型,但只在运算中起作用,是临时的,而f本身的类型并不改变。因此,(int)f的值为5(删去了小数)而f的值仍为
22、5.75。,例:强制转换示例。,隐式转换发生在不同数据类型的混合运算时,由编译系统自动完成。自动转换遵循以下规则:,(1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。,(2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。,(3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。,(4)char型和short型参与运算时,必须先转换成int型。,(5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据
23、类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。,(,2,)隐式转换,include,void main(),float pi=3.14159;,int s,r=5;,s=r*r*pi;,printf(s=%dn,s);,运行结果为::,s=78,本例程序中,pi为实型;s,r为整型。在执行s=r*r*pi语句时,r和pi都转换成double型计算,结果也为double型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分。,例:隐式转换示例,2.3,运算符和表达式,1.基本运算符,(1)加法运算符“+”,加法运算符为双目运算符,即应有两个量参与加法运算。如
24、a+b,4+8等。具有右结合性。,(2)减法运算符“-”,减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。,(3)乘法运算符“*”,双目运算,具有左结合性。,(4)除法运算符“/”,双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。,(5)求余运算符(模运算符)“%”双目运算,具有左结合性。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。一般情况,余数的符号与被除数符号相同。,2.3.1,算数运算符和表达式,include,void main(),printf(%d,%d
25、n,20/7,-20/7);,printf(%f,%fn,20.0/7,-20.0/7);,运行结果为:,2,-2,2.857143,-2.857143,本例中,20/7,-20/7的结果均为整型,小数全部舍去。而20.0/7和-20.0/7由于有实数参与运算,因此结果也为实型。,例:除法运算符示例。,include,void main(),printf(%d,%d,%d,%dn,7%4,7%-4,-7%4,-7%-4);,运行结果为:,3,3,-3,-3,本例说明参加求余运算左侧的数据为正则取余结果为正,左侧的数据为负则取余结果为负。,例:求余运算符示例。,*,/,%运算的优先级别相同,高于
26、运算;+,-优先级相同;同一优先级按从左到右顺序计算。要改变运算顺序只要加括号就可以了,括号全部为圆括号,必须注意括号的配对。,例如:3+8%-3-2先计算8%-3结果为2,再计算3+2-2,按从左到右顺序计算结果为3。,2.,运算符优先级,它们的作用是使变量的值增加或减少1,例如:,i+,i-在i参与运算后,i的值再自增(减)1。,+i,-i 在 i参与运算前,i的值自增(减)1。,粗略的看,+i,i+的作用相当于i=i+1。但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值,而i+是先使用i的值后,再执行i=i+1。,3.自增,自减运算符,include,void mai
27、n(),int i=8;,printf(%dn,+i);,printf(%dn,-i);,printf(%dn,i+);,printf(%dn,i-);,printf(%dn,-i+);,printf(%dn,-i-);,printf(%dn,i);,例:自增、自减运算符示例。,运行结果:,9,8,8,9,8,9,8,变量i变化过程为:i的初值为8,第2行i加1后输出故为9;第3行减1后输出故为8;第4行输出i为8之后再加1(为9);第5行输出i为9之后再减1(为8);第6行输出-8之后再加1(为9);第7行输出-9之后再减1(为8);第8行输出i值8.,例:自增、自减运算符示例。,算术表达式
28、是由算术运算符和括号连接起来的、符合C语法规则的式子。运算对象包括常量、变量、函数等。单个的常量、变量、函数可以看做是表达式的特例。,例如:a+b (a*2)c (x+r)*8-(a+b)7 +i sin(x)+sin(y),4算术表达式,1.赋值运算符及表达式,简单赋值运算符即“=”,又称为赋值号。由赋值运算符组成的表达式称为赋值表达式。一般形式:,变量赋值符表达式,赋值表达式的求解过程:将赋值运算符右侧的表达式的值赋给左侧的变量,同时整个赋值表达式的值就是刚才所赋的值。,2.3.2,赋值运算符和表达式,2.复合赋值运算符,在赋值符“=”之前加上某些运算符,可以构成复合赋值运算符,复合赋值运
29、算符可以构成赋值表达式。C语言中许多双目运算符可以与赋值运算符一起构成复合运算符,即:,+=,-=,*=,/=,%=,=,&=,|=,=,复合赋值表达式一般形式:,=,等价于:=,1.关系运算符,C,语言提供,6,种关系运算符:,2.3.3,关系运算符和表达式,关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,=的优先级相同,高于=和!=,=和!=的优先级相同。,例如:,ca+b 等价于 c(a+b);关系运算符的优先级低于算术运算符,ab=c 等价于(ab)=c ;“”优先级高于“=”,a=bc 等价于 a=(bc);“c 等
30、价于 a=(bc);关系运算符的优先级高于赋值运算符。,2.,关系表达式,用关系运算符将两个表达式连接起来的式子,称为关系表达式。,关系表达式的一般形式为:,例如下面者是合法的关系表达式:,a+bc-d,x3/2,a+10的值为“真”,即为1。(a=3)(b=5)由于35不成立,故其值为假,即为0。,1.逻辑运算符,语言中提供了三种逻辑运算符,优先级从高到低为:,!非运算,&与运算,|或运算,运算符&和|均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。,2.3.4,逻辑运算符和表达式,逻辑运算的值也为“真”和“假”两种,用1和0 来表示。其求值规则如下:,(1)与运算&参与
31、运算的两个量都为真时,结果才为真,否则为假。,(2)或运算|参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。,(3)非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。,逻辑运算的真值表,2.逻辑表达式,用逻辑运算符将关系表达式或逻辑量连接起来的式就是是逻辑表达式。,逻辑表达式的一般形式为:,1.条件运算符和表达式,条件运算符是C语言中唯一具有三个操作数的运算符,它的表达式的一般形式是:,?:,其含义是:先求表达式1的值,如果为真(非零),则求表达式2的值,并把它作为整个表达式的值;如表达式1的值为假(零),则求表达式3的值,并把它作为整个表达式的值。,2.3
32、5,其他运算符和表达式,2.逗号运算符和表达式,语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。,其一般形式为:,表达式1,表达式2,表达式n,其求值过程是分别求n个表达式的值,并以表达式n的值作为整个逗号表达式的值。,对于逗号表达式还要说明两点:,(1)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。,(2)并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。,第,3,章,顺序结构,3.1 C,语言的语句,3.2,数据输入、输出函数,
33、3.3,顺序结构,3.1 C,语言的语句,在,C,语言中,根据语句的功能不同,可将语句划分为以下五类:,1.,表达式语句,表达式语句由表达式加上分号,“,;,”,组成。执行表达式语句就是计算表达式的值。,例如:,x=y+z,是赋值表达式,而,x=y+z;,是一个赋值语句。可以看到一个语句最后必须有一个分号,分号是语句不可缺少的一个部分。又例如:,x+y,;是一个语句,作用是完成,x+y,的操作,是合法的,但并不是把,x+y,的和赋给另一个变量,因此它并没有实际意义。,2.,函数调用语句,函数调用语句由一个函数调用加上分号组成。,例如:,printf(C Program);,调用库函数,输出字符
34、串。,3.,控制语句,控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。,4.,复合语句,把多个语句用括号,括起来组成的一个语句称复合语句。在程中应把复合语句看成是单条语句,而不是多条语句,例如,x=y+z;,a=b+c;,printf(%d%d,,,x,,,a),;,是一条复合语句。复合语句内的各条语句都必须以分号,“;”,结尾。,3.2,数据输入、输出函数,1.printf,函数的一般形式为:,printf(“,格式控制字符串,”,,输出表列,),如,:printf(%d,,,%cn,i,c);,3.2.1,格式输出函数,printf,(),括号内包含两部分
35、1)“,格式控制,”,是用双撇号括起来的字符串,用于指定输出格式。它由格式声明和普通字符两种信息组成。,格式声明。格式声明是由,%,和格式字符组成,它的作用是将输出的数据转换为的指定的格式输出。如,%d,、,%c,等。,普通字符。普通字符即需要原样输出的字符,在显示中起提示作用。例如上面,printf,函数中双撇号内的逗号和换行符。,(2,),“,输出表列,”,是需要输出的一些数据,可以是常量、变量或表达式。,下面是,printf,函数的例子:,printf(a=%d b=%d,,,a,,,b);,格式声明,输出表列,在此例中,双撇号内的字符,除有两个,“,d”,以外,还有非格式声明的普
36、通字符(如,a=,,,b=,),它们输出时全部原样输出。或,a,,,b,的值分别是,3,,,6,,则输出结果为:,a=3 b=6,例,3.1,:十进制、八进制、十六进制及无符号数据的输出。,#include,void main(),int a=-1;,printf(%d,%o,%x,%u,a,a,a,a);,分析:,-1,的原码:,1000,0000,0000,0001,。在内存中的补码表示为:,1111,1111,1111,1111,输出为:,-1,177777,ffff,,,65535,-1,是十进制,,177777,是八进制,,ffff,是十六进制,,65535,为无符号整数。,3.2.
37、2,格式输入函数,scanf,(),1.scanf,函数的一般形式为:,scanf(,格式控制字符串,,地址表列,);,“,格式控制字符串,”,的含义与,printf,类似,它指定输入数据项的类型和格式。,“,地址列表,”,是由若干个地址组成的列表,可以是变量的地址(,&,变量名)或字符串的首地址。,例,3.5,:输入、输出三个整数。,#include,void main(),int a,b,c;,scanf(%d%d%d,printf(a=%d,b=%d,c=%d,a,b,c);,在本例中,,&,是地址运算符,,&a,指变量,a,的地址。,scanf,的作用是将键盘输入的数据保存到,&a,,
38、b,,,&c,为地址的存储单元中,即变量,a,,,b,,,c,中。,在,“%d%d%d”,表示要按十进制整数形式输入,3,个数据。输入数据时,在两个数据之间输入一个或多个的空格、制表符(,Tab,)或回车键作为间隔。,如:,7 8 9,或,7 8,9,或,7,(按,Tab,键),8,9,3.2.3 字符输出函数putchar,putchar,函数其一般形式为:,putchar(,字符型数据,),功能:在显示器上输出单个字符。,例如:,putchar(A);,输出大写字母,A,。,putchar(x);,输出字符变量,x,的值,putchar(n);,输出一个换行符,使输出的当前位置移到下一
39、行的开头。,3.2.4,字符输入函数,getchar,getchar,函数的一般形式为:,getchar(),;,功能是从键盘上输入一个字符。如:,c=getchar();,从键盘输入,A,,则将,A,赋值给,c,。,注意:,getchar,函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。,3.2.4,字符输入函数,getchar,例,3.6,:输入输出字符。,#include,void main(),char a,b,c;,a=getchar();,b=getchar();,c=getchar();,putchar(a);,putchar(b);,putch
40、ar(c);,putchar(n);,运行结果:,DOG,(连续输入,DOG,后,按回车键,字符才送到内存中的存储单元),DOG,(输出变量,a,,,b,,,c,的值),3.3,顺序结构,#,有了上面的基础,就可以顺利地编写具有顺序结构的程序了。在顺序结构中,程序的执行是按语句出现的先后顺序进行的,并且每条语句都会被执行到。如图,3-1,所示,其中,A,和,B,两个框是顺序执行的。即先执行,A,框所指的操作,再执行,B,框所指的操作,。,例,3.7,输入三个小写字母,输出其,ASCII,码和对应的大写字母。,分析:前面已经介绍如何把小写字母转换成大写字母(大写字母的,ASCII,码比小写字母的
41、ASCII,码小,32,),利用输入输出函数即可以解决该题。程序代码如下:,#include,void main(),char a,b,c;,scanf(%c%c%c,printf(%d,%d,%dn%c,%c,%cn,a,b,c,a-32,b-32,c-32);,运行情况如下:,a c e,97,99,101,A,C,E,第,4,章,选择结构,4.1,用,if,语句实现选择结构,4.2 switch,语句,4.1.1 if,语句的基本形式,1,简单的,if,语句,例,4.1,:编写程序,用来判断某一年是否为闰年。,分析:前面在讲逻辑表达式时,我们已经给出判断闰年的表达式,即:,(year%
42、4=0&year%100!=0)|year%400=0,如果表达式的值为真,则是闰年,输出,“,年为闰年,”,,否则不输出。,这种程序的执行过程如图,4-1,,对于这种根据条件确定是否执行命令的问题,,C,语言提供了单分支结构解决这一问题。形式如下:,真,表达式,语句,假面具,图,4,1,if(,表达式,),语句,执行过程:当表达式的值为真,则执行其后的语句,否则不执行该语句。,说明:,(,1,),if,语句后的表达式一般为关系表达式或逻辑表达式,但不仅仅局限这两种,也可以是其它类型的表达式。只要表达式的值不为零,则执行下面的语句。,(,2,)语句必须是单个语句,若想执行多条语句时,必须用括起
43、来,变成一条复合语句。,程序如下:,#include,void main(),int year;,printf,(,输入,year,:,),;,scanf(%d,if(year%4=0&year%100!=0)|year%400=0),printf(%d,年是闰年,n,year);,例,4.3,:给定一个五位数,判断它是不是回文数。即,12321,是回文数,个位与万位相同,十位与千位相同。,分析:验证一个数是否是回文数,首先要从,5,位数中将每一位分解出来。根据除号运算符的特点两个整数相除,商为整数。可以用,12321/10000,得到万位数的,“1”,,结合取余运算得到其他位。,a=x/10
44、000;/*,分解出万位,*/,b=x%10000/1000;/*,分解出千位,*/,c=x%1000/100;/*,分解出百位,*/,d=x%100/10;/*,分解出十位,*/,e=x%10;/*,分解出个位,*/,程序如下:,include,void main(),long a,b,c,d,x;,scanf(%ld,a=x/10000;,b=x%10000/1000;,c=x%100/10;,d=x%10;,if(d=a&c=b)/*,个位等于万位并且十位等于千位,*/,printf(%ld,是回文数,n,x);,else,printf(%ld,不是回文数,n,x);,运行结果:,123
45、21,12321,是回文数,再次运行:,12312,12312,不是回文数,4.1.2if,语句的嵌套,例,4.4,:判别键盘输入字符的是哪种字符(控制字符、数字字符、大写字母、小写字母还是数字字符)。,分析:解此题的关键是写出判断字符的选择结构。该选择结构可以用嵌套的形式来实现,见图,4-3,。,C,语言提供的,if,语句中可以包括另一个,if,语句,这就是,if,语句的嵌套,可以用它实现嵌套的选择结构。,其一般形式为:,if(,表达式,1),语句,1,else if(,表达式,2),语句,2,else if(,表达式,3),语句,3,else if(,表达式,4),语句,4,else,语句
46、5,说明:,if,语句嵌套时,必须注意,if,和,else,的配对关系,即,else,总是与它上面最近的未配对的,if,配对。,程序如下:,#include,void main(),char c;,c=getchar();,if(c=0&c=A&c=a&c=z),printf(,这是一个小写字母,n);,else,printf(,这是一个其它字符,n);,运行情况如下:,E,这是一个大写字母,除上面所讲的一种嵌套外,,if,语句嵌套还有很多形式,在嵌套内的,if,语句可能又是,if-else,型的,这将会出现多个,if,和多个,else,重叠的情况,这时要特别注意,if,和,else,的配对
47、问题。,例如:,if(,表达式,1),if(,表达式,2),语句,1,;,else,语句,2,;,程序设计者把,else,写在与第一个,if,(外层,if,)同一列上,希望第一个,else,与第一个,if,对应,那么,else,究竟是与哪一个,if,配对呢?是与,if(,表达式,1),配对,还是应理解为与,if(,表达式,2),配对?,为了避免这种二义性,语言规定,,else,总是与它前面最近的,if,配对,因此对上述例子应按后一种情况理解。即与,if(,表达式,2),配对。,注意若编程要求上述语句,else,与,if(,表达式,1),配对时,可用一对大括号,将,if(,表达式,2),语句,1
48、括起来,则成为如下形式:,if(,表达式,1),if(,表达式,2),语句,1,else,语句,2,此时,else,与,if(,表达式,1),配对。,4.2 switch,语句,多分支可以使用嵌套的,if,语句处理,但如果分支较多,嵌套的,if,语句层数多,程序冗长,降低了程序的可读性,也给程序的书写带来一定的麻烦,因此,经常用多路分支选择来处理。即,switch,语句。其一般形式为:,switch(,表达式,),case,常量表达式,1,:语句,1,case,常量表达式,2,:语句,2,case,常量表达式,n,:语句,n,default :,语句,n+1,执行过程:首先计算,switch
49、后面括号内的表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有,case,后的语句。如表达式的值与所有,case,后的常量表达式均不相同时,则执行,default,后的语句。,说明:,(1)switch,括号后面的表达式,允许为任何类型。,(2),当,“,表达式,”,的值与某个,case,后面的常量表达式的值相等时,就执行此,case,后面的语句。如果表达式的值与所有,case,中的常量表达式都不匹配,就执行,default,后面的语句。,(3),各个,case,的常量表达式的值必须互不相同,否则出现矛盾
50、现象。,(4),各个,case,,,default,出现的顺序不影响执行结果。,(5),执行完一个,case,后面的语句后,流程控制转移到下一个,case,中的语句继续执行。此时,,“case,常量表达式,”,只是起到语句标号的作用,并不在此处进行条件判断。,例,.6,:输入某年某月,输出该月的天数,要求用,switch,结构实现。,分析:每年的,1,、,3,、,5,、,7,、,8,、,10,、,12,七个月的天数是一定的,为,31,天,4,、,6,、,9,、,11,四个月的天数也是固定的,为,30,天;,2,月的天数不固定,闰年为,29,天,平年为,28,天。设整型变量,flag,代表控制信






