资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,C语言程序设计45999,项目,7,函数,1,项目,8,指针,2,项目,9,结构与联合,3,项目,10,位运算,4,项目,11,文件,5,目 录,项目,1,C,语言概述,1,项目,2,数据类型、运算符与表达式,2,项目,3,顺序结构程序设计,3,项目,4,选择结构程序设计,4,项目,5,循环结构程序设计,5,项目,6,数组,5,附件,5,项目,1 C,语言概论,1,项目导读,项目目标,项目任务,本项目主要对,C,语言的一些基础知识及其字符集和词汇进行介绍,使读者在学习,C,语言之前对其有个全面的认识。,项目导读,安装、配置,TC2.0,和,VC+6.0,,成功启动,TC2.0,和,VC+6.0,。,能编写一个简单的,C,程序的源文件,并编译该源文件,链接目标文件得到可执行文件。,项目目标,任务,1.1 C,语言的发展与特点,C,语言是,1972,年由美国的,Dennis Ritchie,设计发明的,并首次在配备了,UNIX,操作系统的,DEC PDP-11,计算机上实现。它由早期的编程语言,BCPL(Basic Combined Programming Language),发展演变而来。,C,语言的特点,1,、,C,语言是中级语言,2,、,C,语言是结构化语言,3,、,C,语言功能齐全,4,、,C,语言适用范围广,任务,1.2,认识,C,语言,本任务通过几个简单的,C,程序,介绍,C,语言的基本组成和格式。,案例,1.1,main(),printf(“This is a c program.n”);,本程序的功能是输入下列一行信息:,This is a c program.,任务,1.2,认识,C,语言,程序说明,:,main,函数是“主函数”,每一个,C,程序必须有一个,main,函数。,函数体由大括弧,括起来。本例中,主函数内只有一个输出语句,,printf(“This,is a c program.n”);,是,C,语言的输出函数(具体详见项目,3,)。双引号内的字符串将照原样输出。,“n”,是换行符,即在输出“,This is a c program.”,后换行。,分号是,C,语句的基本构成,每一个,C,语句后都应再加上分号,分号是语句的结束标志。,任务,1.2,认识,C,语言,本任务通过几个简单的,C,程序,介绍,C,语言的基本组成和格式。,案例,1.2,main()/*,求两数之和*,/,int a,,,b,,,sum;/*,本行开始的以下,4,条为,C,语句*,/,a=123;b=456;,sum=a+b;,printf(“sum is%dn”,,,sum),;,本程序的功能是求两数之和,。,任务,1.2,认识,C,语言,程序说明,:,/*/,是注释语句,此信息对编译和运行不起作用。,(2),程序第二行的含义是定义,a,、,b,和,sum,为整体变量。,(3)“sum=,a+b,;”,的含义是把变量,a,和,b,的和赋给变量,sum,。,(4),该程序的输出结果是:,sum is 579,。,任务,1.2,认识,C,语言,案例,1.3,main()/*,求一个数的绝对值*,/,int x,,,y;,scanf(“%d”,,,y=abs,(,x,),;,printf(“abs=%d”,,,y);,int abs(int z),int w;,if,(,z=0,),w=z;,else w=-z;,return,(,w,),;,本程序的功能是求,z,的绝对值。,任务,1.2,认识,C,语言,程序说明,:,(,1,)本程序包括两个函数:主函数,main,和被调用函数,abs,。,(,2,)函数,abs,的作用是将,z,的绝对值返回给主调函数,main,(返回值是通过函数名,abs,带回到,main,函数的调用处的)。,(,3,)程序中的,scanf,函数的作用是从键盘上输入,x,的值。,&x,中的“,&”,的含义是“取地址”,此,scanf,函数的作用是将数值输入到变量,x,的地址所标志的单元中去,也就是输入给变量,x,。关于,scanf,函数详见项目,3,。,(,4,),main,函数中的第四行为调用,abs,函数,在调用时将实际参数,x,传给,abs,函数中的形式参数,z,,然后输入,y,的值。,(,5,),printf,函数中双引号内的,abs=%d,,在输出时,其中的,%d,将由,y,值取代,“,abs=”,原样输出。该程序的运行结果是:,假定从键盘上输入,x,的值为,:-6,则,y=6,(,6,)本例用到了函数调用、实际参数和形式参数等概念,只是做了简单的解释,读者若对此不大理解,可先不予深究,在学到函数项目后的相关知识后,问题自会迎刃而解。这里介绍此案例的目的,是想让读者对,C,语言的组成和形式有一个初步了解。,任务,1.2,认识,C,语言,通过以上三个例子,我们可以得到以下几点,:,1,、,C,程序是由函数构成的。一个,C,源程序至少包含一个,main,函数,也可以包含一个,main,函数和若干个其它函数。因此,函数是,C,语言的基本单位。被调用函数可以是系统提供的库函数(例如,printf,函数和,scanf,函数),也可以是用户根据需要自编译的用户函数(例如案例,1.3,中的,abs,函数)。,2,、函数及其结构。一个函数由两部分组成:即函数首部和函数体。函数首部包括函数类型、函数名、函数参数(形参)、形参类型;函数体一般包括说明部分和执行部分。,函数结构如下:,函数类型 函数名 (,形参表,),说明部分:函数体,执行部分;,函数体以左花括号“”开始,以右花括号“”结束,其间可以有说明部分和执行部分。在某些情况下,甚至可以既无说明部分,也无执行部分。如:,dump(),它是一个空函数,表示什么也不做,但它是合法的,任务,1.2,认识,C,语言,3,、一个,C,程序中,不论,main,函数在整个程序中的位置如何,(main,函数可以放在程序最前头,也可以放在程序最后头,或在一些函数之前,或在另一些函数之后,),,但程序执行时,总是从,main,函数开始执行。,4,、,C,程序书写格式自由,一行中可以书写多个语句,一个语句也可以书写在连续的多行上。当一行写不下时,用连字符“,-”,连接,并且每条语句的后面以分号“;”作为结束标记。,5,、,C,语言本身没有输入输出语句。,C,语言的函数库提供了标准输入输出函数。,6,、可以用,/*,对,C,程序中的任何一部分做注释,以增加程序的可读性。,任务,1.3 C,程序的执行过程,C,语言程序是一种编译型的中级语言。用,C,语言编写的源程序必须先进行编译和连接,生成可执行的程序之后才能执行。执行一个,C,语言程序一般经过如下几个步骤。,1,、编辑,2,、编译,3,、连接,4,、运行,C,语言程序的开发是一个由编辑开始,经过编译、连接和运行,程序如果有错误,又回到编辑的反复循环过程,如图所示。,项目,2,数据类型、运算符与表达式,1,项目导读,项目目标,项目任务,C,语言中,为解决具体问题,需要采用多种类型的数据;本项目将主要介绍,C,语言的数据类型、常用运算符和表达式。,项目导读,学会声明整型变量,为声明的变量赋值,交换变量的值,输出变量的值。,学会声明浮点型变量,为声明的浮点型变量赋值,对浮点型变量值进行加法运算,并将运算结果存放到浮点型变量中,输出浮点型变量的值。,学会声明字符型变量,为声明的字符型变量赋值,按,%d,或,%c,格式输出变量的值。,项目目标,任务,2.1,常量、变量和标示符,2.1.1,标识符,在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符(,identifier,)。简单地说,标识符就是一个对象的名字。,C,语言规定标识符只能由字母、数字和下划线组成,且第,1,个字符必须为字母或下划线。下面列出的是合法的标识符,可以作为变量名:,Sum,,,average,,,_total,,,Class,,,day,,,month,,,Student_name,,,lotus_1_2_3,,,BASIC,,,li_ling.,下面是不合法的标识符和变量名:,M.D.John,,¥,123,,,#33,,,3D64,,,ab,注意,:,编译系统将大写字母和小写字母认为是两个不同的字符。因此,,sum,和,SUM,是两个不同的变量名。同样,,Class,和,class,也是两个不同的变量名。通常,变量名用小写字母表示,习惯用对应的英文字母缩写形式,做到见名知意,与人们日常习惯一致,以增加可读性。,任务,2.1,常量、变量和标示符,2.1.2,常量和变量,1,、常量,在程序运行过程中,其值不能被改变的量称为常量。如案例,2.1,程序中的,5,,,9,,,32,和案例,2.2,程序中的,1000,,,0.0036,,,0.0225,,,0.0198,都是常量。数值常量就是数学中的常数。,常用的常量有以下几类:,整型常量。如,1000,,,12345,,,0,,,-345,等都是整型常量。,实型常量。有两种表现形式:,十进制小数形式,由数字和小数点组成。如,122.456,,,0.345,,,-55.79,,,0.0,,,12.0,等。,指数形式,如,12.34e3(,代表,12.34103),,,-345.87e-25,(代表,-345.8710-25,),,0.145E25,(代表,0.14510-25,)等。,由于在计算机输入或输出时,无法表示上标或下标,故规定以字母,e,或,E,代表以,10,为底的指数。但应注意:,e,或,E,之前必须有数字,且,e,或,E,后面必须为整数。如不能写成,e4,,,12e2.5,。,任务,2.1,常量、变量和标示符,字符常量。有两种形式的字符常量:,普通字符,用单撇号括起来的一个字符,如,a,,,Z,,,3,,?,,#,。,注意:,单撇号只是界限符,字符常量只能是一个字符,不包括单撇号。,a,和,A,是不同的字符常量。字符常量存储在计算机存储单元中时,并不是存储字符(如,a,,,z,,,#,等)本身,而是以其代码(一般采用,ASCII,代码)存储的,例如字符,A,的,ASCII,话代码是,97,,因此,在存储单元中存放的是,97,(以二进制形式存放)。,ASCII,字符与代码对照表见附录,。,转义字符,除了以上形式的字符常量外,,C,还允许用一种特殊形式的字符常量,就是以字符,开头的 字符序列。例如,前面已经遇到过的,在,printf,函数中的,n,它代表一个“换行”符。,常用的以“,”,开头的特殊字符见表,2.1,任务,2.1,常量、变量和标示符,表,2.1,任务,2.1,常量、变量和标示符,字符串常量。如“,boy”,,“,123”,等,用双撇号把若干个字符括起来,字符串常量是双撇号中的全部字符(但不包括双撇号本身)。注意不能错写成,CHINA,,,boy,,,123,。单撇号内只能包含一个字符,双撇号内可以包含一个字符串。,符号常量。用,#define,指令,指定用一个符号名称代表一个常量。如:,#define PI 3.1416 ,注意行末没有分号,经过以上的指定后,本文件中从此行开始所有的,PI,都代表,3.1416,。在对程序进行编译前,预处理器先对,PI,进行处理,把所有的,PI,全部置换为,3.1416,。这种用一个符号名代表一个常量的,称为符号常量。在预编译后,符号常量全部变成字面常量(,3.14159,)。,使用符号常量有以下好处。,含义清楚。,在需要改变程序中多处用到的同一个常量时,能做到“一改全改”。,任务,2.1,常量、变量和标示符,2,、变量,变量代表一个有名字的、具有特定属性的存储单元。它用来存放数据,也就是存放变量的值。在程序运行期间,变量的值是可以改变的。,变量必须先定义,后使用。在定义时指定该变量的名字和类型。一个变量应该有一个名字,以便被引用。请注意区分变量名和变量值这两个不同的概念,图,2.1,中,a,是变量名,,3,是变量,a,的值,即存放在变量,a,的内存单元中的数据。变量名的实质是以一个名字代表的一个存储地址。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该储存单元中读取数据。,图,2.1,任务,2.1,常量、变量和标示符,3,、常变量,如,const int a=3,表示,a,被定义为一个整型变量,指定其值为,3,,而且在变量存在期间其值不能改变。,常变量与常量的异同是:常变量具有变量的基本属性,有类型,占存储单元,只是不允许改变其值。可以说,常变量是有名字的不变量,而常量是没有名字的不变量,有名字就便于在程序中被引用。,任务,2.2,数据类型,在定义变量时需要指定变量的类型。,C,语言要求在定义所有的变量时都要指定变量的类型。常量也是区分类型的。,所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。,C,语言允许使用的类型见图,2.2,。,图,2.2,任务,2.2,数据类型,2.2.1,整型数据,1,、,整型数据的分类,基本整型,(int,型,),编译系统为,int,型数据分配,2,个字节或,4,个字节(有具体的,C,编译系统自行决定)。如,TurboC 2.0,为每一个整型数据分配,2,个字节(,16,个二进位),而,Visual C+,为每一个整型数据分配,4,个字节(,32,位)。在存储单元中的存储方式是:用整数的补码(,complement,)形式存放。,5,的补码,-5,的补码,任务,2.2,数据类型,短整型,(short int),类型名为,short int,或,short,。如用,Visual C+5.0,,编译系统分配给,int,数据,4,个字节,短整型,2,个字节。存储方式与,int,型相同。一个短整型变量的值的范围是,32768,32767,。,长整型,(long int),类型名为,long int,或,long,。一个,long int,型变量的值的范围是,231,(,231,1,),即,2147483648,2147483647,(,Visual C+5.0,),编译系统分配给,long,数据,4,个字节。,双长整型(,long long int,)或,long long,,一般分配,8,个字节。,说明:,C,标准没有具体规定各种类型数据所占用存储单元的长度,这是由各编译系统自行决定的。,C,标准只要求,long,型数据长度不短于,int,型,,short,型不长于,int,型。即,Sizeof(short)sizeof(int)sizeof(long long),Sizeof,是测量类型或变量长度的运算符。,任务,2.2,数据类型,2,、,整型变量的符号属性,以上介绍的几种类型,变量值在存储单元中都是以补码形式存储的,存储单元中的第,1,个二进位制代表符号。整型变量的值的范围包括负数到正数(见表,2.2,)。,表,2.2,整型数据常见的存储空间和值的范围,任务,2.2,数据类型,在实际应用中,有的数据的范围常常只有正值(如学号、年龄、库存量、存款额等)。为了充分利用变量的值的范围,可以将变量定义为“无符号”类型。可以在类型符号前面加上修饰符,unsigned,,表示指定该变量是“无符号整数”类型。如果加上修饰符,signed,,则是“有符号”类型。因此,在以上,4,种整型数据的基础上可以扩展为以下,8,种整型数据。即,有符号基本整型,signed int;,无符号基本整型,unsigned int;,有符号短整型,signed short int;,无符号短整型,unsigned short int;,有符号长整型,signed long int;,无符号长整型,unsigned long int;,有符号双长整型,signed long long int;,无符号双长整型,unsigned long long int;,以上方括号表示其中的内容是可选的,既可以有,也可以没有。如果既未指定为,signed,也未指定为,unsigned,的,默认为“有符号类型”。如,signed int a,和,int a,等价。,任务,2.2,数据类型,2.2.2,字符型数据,1.,字符与字符代码,字符与字符代码并不是任意写一个字符,程序都能识别的。例如圆周率,在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用,ASCII,字符集。各种字符集(包括,ASCII,字符集)的基本集都包括了,127,个字符。其中包括,:,字母:大写英文字母,A,Z,,小写英文字母,a,z,。,数字,:0,9,。,专门符号:,29,个:!”,#&,()*,+,,,:;,=,?,-|,空格符:空格、水平制表符(,tab,)、换行、换页(,form feed,)。,不能显示的字符:空(,null,)字符(以,0,表示)、警告(以,a,表示)、退格(以,b,表示)、回车(以,r,表示)等。,任务,2.2,数据类型,2,、字符变量,字符变量使用类型符,char,定义字符变量。,Char,是英文,character(,字符,),的缩写,见名即可知意。如:,char c=;?,定义,c,为字符型变量并使初值为字符,?,。,?,的,ASCII,代码是,63,,系统把整数,63,赋给变量,c,。,c,是字符变量,实质上是一个字节的整形变量,由于它常用来存放字符。所以称为字符变量。可以把,0,127,之间的整数赋给一个字符变量。,在输出字符变量的值时,可以选择以十进制整数形式输出,或以字符形式输出。如:,printf(“%d%cn”,,,c,,,c);,输出结果是:,63,?,用“,%d”,格式输出十进制整数,63,,用,%c,格式用字符形式输出字符,?,。,任务,2.2,数据类型,2.2.3,浮点型数据,浮点型数据是用来表示具有小数点的实数的。,浮点数类型包括,float,(单精度浮点型)、,double(,双精度浮点型,),、,long double,(长双精度浮点型)。,(,1,),float,型(单精度浮点型)。编译系统为每一个,float,型变量分配,4,个字节,数值以规范化的二进制数值形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。小数部分的小数点前面的数为,0.,如,3.14159,在内存中的存放形式可以用图,2.9,表示。,图,2.9,任务,2.2,数据类型,double,型(双精度浮点型)。为了扩大能表示的数值范围,用,8,个字节存储一个,double,型数据,可以得到,15,位有效数字,数值范围为,1.710-308,1.710308,。在,C,语言中进行浮点数的算术运算时,将,float,型数据都自动转换为,double,型,然后进行运算。,long double,型(长双精度)型,不同的编译系统对,long double,型的处理方法不同,,Turbo C,对,long double,型分配,16,个字节。而,Visual C+6.0,则对,long double,型和,double,型一样处理,分配,8,个字节。请读者在使用不同的编译系统时注意其差别。表,2.4,列出实型数据的有关情况,表,2.4,任务,2.3,运算符和表达式,2.3.1,基本的算术运算符,表,2.5,最常用的算术运算符,任务,2.3,运算符和表达式,2.3.2,自增、自减运算符,作用是使变量的值加,1,或减,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,。如果,i,的原值等于,3,,请分析下面的赋值语句:,j=+i,;(,i,的值先变成,4,,再赋给,j,,,j,的值为,4,),j=i+;(,先将,i,的值,3,赋给,j,,,j,的值为,3,,然后,i,变为,4),又例如:,i=3;,printf(“%d”,,,i+),;,输出,4,。若改为,Printf(“%dn”,,,i+);,则输出,3,。,任务,2.3,运算符和表达式,2.3.3,算术表达式和运算符的优先级与结合性,用算术运算符和括号将运算对象(也称操作数)连接起来的、符合,C,语法规则的式子,称为,C,算术表达式。运算对象包括常量、变量、函数等。例如,下面是一个合法的,C,算术表达式:,a*bc,1.5+a,C,语言除了规定了运算符的优先级外,还规定了运算符的结合性。在表达式求值时,先按运算符的优先级别顺序执行,例如先乘除后加减。如表达式,a,b*c,,,b,的左侧为减号,右侧为乘号,而乘号优先级高于减号,因此,相当于,a,(b*c),。,如果在一个运算对象两侧的运算符的优先级别相同,如,a,b+c,,则按规定的“结合方向”处理。,C,语言规定了各种运算符的结合方向(结合性),算术运算符的结合方向都是“自左至右”,及先左后右,因此,b,先与减号结合,执行,a,b,的运算,然后再执行加,c,的运算。“自左至右的结合方向”又称“左结合性”,即运算对象先于左面的运算符结合。以后可以看到有些运算符的结合方向为“自右至左”,即右结合性(例如,赋值运算符,若有,a=b=c,,按从右到左顺序,先把变量,c,的值赋给变量,b,,然后把变量,b,的值赋给变量,a,)。,任务,2.3,运算符和表达式,2.3.4,不同类型数据间的混合运算,在程序中经常会遇到不同类型的数据进行运算,如,5*3.5,。如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此整型、实型、字符型数据间可以进行混合运算。规律为:,(1)+,、*、运算的两个数中有一个数为,float,或,double,型,结果是,double,型,因为系统将所有,float,型数据都先转换为,double,型,然后进行运算。,(2),如果,int,型与,float,或,double,型数据进行运算,先把,int,型和,float,型数据转换为,double,型,然后再进行运算,结果是,double,型。,(3),字符,(char),型数据与整型数据进行运算,就是把字符的,ASCII,代码与整型数据进行运算。如:,12+A,,由于字符,A,的,ASCII,代码是,65,,相当于,12+65,,等于,77,。字符数据可以直接与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的,ASCII,代码转换为,double,型数据,然后进行运算。,任务,2.3,运算符和表达式,示例,2.1,编程:给定一个大写字母,要求用小写字母输出。,编写程序:,#includestdio.h,int main(),char c1,,,c2;,c1=A ,将字符,A,的,ASCII,代码放到,c1,变量中,c2=c1+32;,得到字符,a,的,ASCII,代码,放在,c2,变量中,printf(“%cn”,,,c2);,输出,c2,的值,是一个字符,printf(“%dn”,,,c2);,输出,c2,的值,是字符,a,的,ASCII,代码,reurn 0,运行结果:,a,97,任务,2.3,运算符和表达式,2.3.6 C,运算符,除了算术运算符外,,C,还提供其他运算符,共有以下几类:,关系运算符,(=!=),逻辑运算符 (!,&|,),位运算符 (,|&,),赋值运算符 (,=,及其扩展赋值运算符),条件运算符 (?:),逗号运算符 (,),指针运算符 (*和,&,),求字节数运算符 (,sizeof,),强制类型转换运算符(类型),成员运算符,(,),下标运算符 (,),其他 (如函数调用运算符(),任务,2.3,运算符和表达式,2.3.5,强制类型转换运算符,可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:,(,double,),a (,将,a,转换成,double,类型,),(,int,),(x+y)(,将,x+y,的值转换成,int,型,),(,float,),(5%3)(,将,5%3,的值转换成,float,型,),其一般形式为,(类型名)(表达式),注意,,表达式应该用括号括起来。如果写成,(int)x+y,则只将,x,转换成整型,然后与,y,相加。,需要说明的是,在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化。例如:,a=(int)x,如果已定义,x,为,float,型变量,,a,为整型变量,进行强制类型运算,(int)x,后得到一个,int,类型的临时值,它的值等于,x,的整数部分,把它赋给,a,,注意,x,的值和类型都未变化,仍为,float,型。该临时值在赋值后就不存在了。,任务,2.4,赋值语句,在,C,程序中,最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句。程序中的计算功能大部分是由赋值语句实现的,几乎每一个有实用价值的程序都包括赋值语句。有的程序中的大部分语句都是赋值语句。,先分析一个例子。,给出三角形的三边长,求三角形面积。,解题思路:假设给定的三个边符合构成三角形的条件:任意两边之和大于第三边。解此题的关键是要找到求三角形面积的公式。从数学知识已知求三角形面积的公式为:,其中,s=(a+b+c)2,。,任务,2.4,赋值语句,编写程序:根据上面的公式编写程序如下:,#include stdio.h,#include math.h,int main(),double a,b,c,s,area;,定义各变量,均为,double,型,a=2.67,;对边长,a,赋值,b=4.43,;对边长,b,赋值,c=5.21,;对边长,c,赋值,s=(a+b+c)/2;,计算,s,area=sqrt(s*(,)*(,)*(,);,计算,area,printf(“a=%ftb=%ft%fn”,,,a,,,b,,,c);,输出三边,a,,,b,,,c,的值,printf(“area=%fn”,,,area);,输出面积,area,的值,return 0;,运行结果:,a=2.670000 b=4.430000 5.210000,area=8.903431,任务,2.4,赋值语句,2.4.1,赋值运算符,赋值符号,=,就是赋值运算符,它的作用是将一个数据赋给一个变量。如,a=3,的作用是执行一次赋值操作(或称赋值运算)。把常量,3,赋给变量,a,。也可以将一个表达式的值赋给一个变量。,2.4.2,复合的赋值运算符,在赋值符,=,之前加上其它运算符,可以构成复合的运算符。如果在“,=”,前加一个“,+”,运算符就成了复合运算符“,+=”,。例如可以有以下的复合赋值运算:,a+=3,等价于,a=a+3,x*=y+8,等价于,x=x*(y+8),x%=3,等价于,x=x%3,以“,a+=3”,为例来说明,它相当于使,a,进行一次自加,3,的操作。即:先使,a,加,3,,再赋给,a,。同样,“,x*=y+8”,的作用是使,x,乘以(,y+8,),再赋给,x,。,任务,2.4,赋值语句,2.4.3,赋值表达式,由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为,变量 赋值运算符 表达式,赋值表达式的作用是将一个表达式的值赋给一个变量,因此赋值表达式具有计算和赋值的双重功能。如,a=3*5,是一个赋值表达式。对赋值表达式求解的过程是:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。既然是一个表达式,就应该有一个值。赋值表达式,a=3*5,的值为,15,,对表达式求解后,变量,a,的值和表达式的值都是,15,。,2.4.4,赋值过程中的类型转换,如果赋值运算符两侧的类型一致,则直接进行赋值。如:,i=234,;设已定义,i,为整型变量,此时直接将整数,234,存入变量,i,的存储单元中。,如果赋值运算符两侧的类型不一致,但都是算术类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的。,任务,2.4,赋值语句,2.4.5,赋值表达式和赋值语句,在,C,程序中,赋值语句是用的最多的语句。在任务,1,的,C,语句分类中,并没有看到赋值语句,实际上,,C,语言的赋值语句属于表达式语句,由一个赋值表达式加一个分号组成。,注意:,要区分赋值表达式和赋值语句。,赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号。在一个表达式中可以包含一个或多个赋值表达式,但绝不能包含赋值语句。,2.4.6,变量赋初值,可以用赋值语句对变量赋值,也可以在定义变量时对变量赋以初值。这样可以使程序简练。如:,int a=3;,定义,a,为整型变量,初值为,3,float f=2.56,;定义,f,为浮点型变量初值为,2.56,char c=a ,定义,c,为字符变量,初值为,a,项目,3,顺序结构程序设计,1,项目导读,项目目标,项目任务,在项目,2,中介绍了,C,程序中用到的一些基本要素,如常量、变量、运算符、表达式等。本项目将介绍编写简单的,C,程序所必需的一些内容。,项目导读,使用,scanf,函数从键盘为变量输入值。,使用,printf,函数输出数据。,能编写简单的,C,程序的源文件,并运行程序。,思考,项目目标,任务,3.1,顺序程序设计举例,示例,3.1,用温度计测量出用华氏法表示的温度(如,69F,),今要求把它转换为以摄氏法表示的温度(如,20,)。,解题思路:这个问题的算法很简单,关键在于找到二者之间的转换公式。根据物理学知识,知道以下转换公式:,c=5,9,(,f-32,),其中,f,代表华氏温度,,c,代表摄氏温度。据此可以用,N-S,图表示算法,见图,3.1,。,图,3.1,算法由,3,个步骤组成,这是一个简单的顺序结构。,编写程序:有了,N-S,图,很容易用,C,语言表示,写出求此问题的,C,程序。,任务,3.1,顺序程序设计举例,#includestdio,h,int main,(),float f,,,c,;定义,f,和,c,为单精度浮点型变量,f=63.0,;定义,f,的值,c=(5,9)*,(,f-32,);利用公式计算,c,的值,printf,(“,f=%nc=%n”,,,f,,,c,);输出,c,的值,return 0,;,运行结果:,f=63.000000,c=16.777778,任务,3.1,顺序程序设计举例,示例,3.2,计算存款利息。有,1000,元,想存一年。有三种方法可选:活期,年利率为,r1,;一年期定期,年利率为,r2,;存两次半年定期,年利率为,r3,。请分别计算出一年后按三种方法所得到的本息和。,解题思路:关键是确定计算本息和的公式。从数学知识可知,若存款额为,p0,,则:,活期存款一年后本息和为,p1=p0,(,1+r1,)。,一年期定期存款,一年后本息和为,p2=p0,(,1+r2,)。,两次半年定期存款,一年后本息和为,p3=p0,(,1+r3/2,)(,1+r3/2,)。,画出,N-S,流程图,见图,3.2,。,图,3.2,任务,3.1,顺序程序设计举例,#includestdio.h,int main,(),float p0=1000,,,r1=0.0036,,,r2=0.0225,,,r3=0.0198,,,p1,,,p2,,,p3,;,定义变量,p1=p0*,(,1+r1,);计算活期本息和,p2=p0*,(,1+r2,);计算一年定期本息和,p3=p0*,(,1+r3,2,)*(,1+r3,2,);计算存两次半年定期的本息和,printf,(“,p1=%fnp2=%fnp3=%fn”,,,p1,,,p2,,,p3,);输出结果,return 0;,运行结果:,P1=1002.599976,P2=1022.500000,P3=1018.898010,任务,3.2 C,语句概述,C,程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的,,C,程序主要包含表达式语句、函数调用语句、控制语句、复合语句和空语句,其中控制语句包含多种情况,本任务将分别进行介绍。,C,程序结构可以用图,3.3,表示。即一个,C,程序可以由若干个源程序文件(编译时以文件模块为单位)组成,一个源文件可以由若干个函数和预处理指令以及全局变量声明部分组成(关于“全局变量”见项目,7,)。一个函数由数据声明部分和执行语句组成。,图,3.3,任务,3.2 C,语句概述,C,语句分为以下,5,类:,(1),控制语句。控制语句用于完成一定的控制功能。,C,语句只有,9,种控制语句,它们的形式是:,if()else (,条件语句,),for()(,循环语句,),while()(,循环语句,),dowhile()(,循环语句,),continue (,结束本次循环语句,),break (,中断执行,switch,或循环语句,),switch (,多分支选择语句,),return (,从函数返回语句,),goto (,转向语句,在结构化程序中基本不用,goto,语句,),上面,9,种语句表示形式中的,(),表示括号中是一个“判别条件”,“,”,表示内嵌的语句。例如上面的“,if()else”,的具体语句可以写成,:,if(xy)z=x;else z=y;,任务,3.2 C,语句概述,(2),函数调用语句。函数调用语句由一个函数调用加一个分号构成,例如:,printf(“This is a c statement.”);,其中,printf(“This is a c statement.”),是一个函数调用,加一个分号成为一个语句。,表达式语句。表达式语句由一个表达式加一个分号构成,最典型的是,有赋值表达式构成一个赋值语句。例如:,a=3,是一个赋值表达式,而,a=3,;,是一个赋值语句。,空语句。下面是一个空语句:,;,此语句只有一个分号,它什么也不做。那么它有什么用呢?可以用来作为流程的转向点(流程从程序其他地方转到此语句处),也可以用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做)。,任务,3.2 C,语句概述,复合语句。可以用,把一些语句和声明括起来成为复合语句(又称语句块)。例如下面是一个复合语句:,float pi=2.14159,,,r=2.5,,,area;,定义变量,area=pi*r*r;,printf(“area=%f”,,,area);,可以在复合语句中包含声明部分(如上面的第,2,行),,C99,允许将声明部分放在复合语句中的任何位置,但习惯上把它放在语句块开头位置。复合语句常用在,if,语句或循环中,此时程序需要连续执行一组数据。,注意:,复合语句中最后一个语句中最后的分号不能忽略不写。,C,语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求,任务,3.3,数据的输入,/,输出,3.3.1,输入输出举例,案例,3.3,求,ax2+bx+c=0,方程的根。,a,,,b,,,c,由键盘输入,设,b2,4ac0,。,解题思路:首先要知道求方程式的根的方法。由数学知识已知:如果,b2,4ac0,,则一元二次方程有两个实根,:,,,可以将上面的分式分为两项,:,,,则,x1=p+q,,,x2=p,q,有了这些式子,只要知道,a,,,b,,,c,的值,就能顺利的求出方程的两个根。,任务,3.3,数据的输入,/,输出,#include,#include ,程序重要调用求平方根函数,sqrt,int main(,),double a,,,b,,,c,,,disc,,,x1,,,x2,,,p,,,q;disc,用来存放判别式(,b*b,4ac,)的值,scanf(“%1f%1f%1f”,,,&a,,,&b,,,输入双精度变量型的
展开阅读全文