资源描述
Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,C语言程序设计第2版,第一章,C语言概述,本章要点,程序设计语言的根本概念,C程序的概貌,在计算机上运行C程序的方法,主要内容,1.1 计算机与程序、程序设计语言,1.2 语言的出现和开展过程,1.3 简单的C语言程序,1.4 运行程序的步骤和方法,1.1 计算机与程序、程序设计语言,计算机:,是由程序控制的计算工具;,计算机指令:,由0和1所组成的指挥计算机工作的代码;,指令系统,:,指令的集合 ;,机器语言 :,一个型号机器语言的指令集合;,高级语言 :,接近于自然语言和数学语言;,程序:,控制计算机按照人们的愿望工作;,编译系统:,把用高级语言编写的程序翻译成机器语言程序 。,1.2 语言的出现和开展过程,C语言是国际上广泛流行的高级语言。,C语言是在B语言的根底上开展起来的。,B BCPL语言是1970年由美国贝尔实验室设计的, 并用于编写了第一个UNIX操作系统,在PDP 7上实现。优点:精练,接近硬件,缺点:过于简单,数据无类型。,1973年贝尔实验室的 在B语言的根底上设计出了C语言,对B取长补短,并用之改写了原来用汇编编写的UNIX,(即UNIX第5版,但仅在贝尔实验室使用。,1.2 语言的出现和开展过程,1975年UNIX第6版发布,C优点突出引起关注。,1977年出现了?可移植C语言编译程序? ,推动了UNIX在各种机器上实现 ,C语言也得到推广,其开展相辅相成。,1978年影响深远的名著?The C Programming Language?由 Brian W.Kernighan和Dennis M.Ritchie 合著,被称为标准C。,之后,C语言先后移植到大、中、小、微型计算机上,已独立于UNIX和PDP,风行世界,成为最广泛的几种计算机语言之一。,1.2 语言的出现和开展过程,1983年,美国国家标准化协会(ANSI)根据C语言各种版本对C的开展和扩充,制定了新的标准ANSI C ,比标准C有了很大的开展;,1987年,ANSI公布了新标准87 ANSI C;,1990年,国际标准化组织接受了87 ANSI C为ISO C 的标准(ISO98991990);,1995年,ISO对C90作了一些修订,称为C95;,1999年,ISO又对C语言标准进行修订,在根本保存原来的C语言特征的根底上,增加了一些面向对象的特征,命名为ISO/IEC 9899:1999,简称为 C99。,1.2 语言出现的历史背景,说明:,目前的C语言编译系统大多数是以 C89为根底进行开发的,而未实现C99建议的功能。并且厂商提供的不同版本的C编译系统所实现的语言功能和语法规那么又略有差异。本课程根本上以C89 为根底的。,1.3 简单的C语言程序,#include ,void main( ),printf (This is a C program.n);,/*文件包含*/,/*主函数 */,/*函数体开始*/,/*输出语句*/,/*函数体结束*/,说明:,main-主函数名, void-函数类型,每个C程序必须有一个主函数,main, 是函数开始和结束的标志,不可省,每个C语句以分号结束,使用标准库函数时应在程序开头一行写:,#include ,说明:,本程序的作用是输出一行信息:,This is a C program.,例1.2 求两数之和,#include void main( ),/*求两数之和*/, int a,b,sum;,/*声明,定义变量为整型*/,/*以下3行为C语句 */,a=123; b=456; sum=a+b; printf(sum is %dn,sum);,说明:,/*/表示注释。注释只是给人看的,对编译和运行不起作用。所以可以用汉字或英文字符表示,可以出现在一行中的最右侧,也可以单独成为一行。,说明:,输出一行信息:sum is 579,例1.3 求两个整数中的大者。,#include void main( ),/* 主函数*/, int max(int x,int y);,/ 对被调用函数max的声明 */,int a, b, c;,/*定义变量a、b、c */,scanf(d,d,/*输入变量a和b的值*/,c=,max(a,b),;,/*调用max函数,将得到的值赋给c */,printf(max=dn,c);,/*输出c的值*/,程序运行情况如下:,8,5,(输入8和5赋给a和b),max=8 (输出c的值),int,max(int x, int y),int z;,if (xy) z=x;,else z=y;,return (z);,说明:,本程序包括main和被调用函数max两个函数。max函数的作用是将x和y中较大者的值赋给变量z。return语句将z的值返回给主调函数main。,1.3 简单的C语言程序,C程序:,(1) C程序是由函数构成的。 这使得程序容易实现模块化。,(2) 一个函数由两局部组成:,函数的首部:例1.3中的max函数首部,int max(int x,int y ),函数体:花括号内的局部。假设一个函数有多个花括号,那么最外层的一对花括号为函数体的范围。,函数体包括两局部 :,声明局部:int a,b,c; 可缺省,执行局部:由假设干个语句组成。可缺省,1.3 简单的C语言程序,注意:,函数的声明局部和执行局部都可缺省,例如:,void dump ( ),这是一个空函数,什么也不做,但是合法的函数。,1.3 简单的C语言程序,小结:,(3) C程序总是从main函数开始执行的,与main函数的位置无关。,(4) C程序书写格式自由,一行内可以写几个语句, 一个语句可以分写在多行上,C程序没有行号。,(5) 每个语句和数据声明的最后必须有一个分号。,(6) C语言本身没有输入输出语句。输入和输出的操作是由库函数scanf和printf等函数来完成的。C对输入输出实行“函数化。,1.4 运行程序的步骤和方法,1.4.1 运行程序的步骤,上机输入与编辑源程序,对源程序进行编译,与库函数连接,运行目标程序,1.4 运行程序的步骤和方法,上机运行程序的方法,目前使用的大多数,C,编译系统都是集成环境,(IDE),的。可以用不同的编译系统对,C,程序进行操作,常用的有,Turbo C 2.0,、,Turbo C+ 3.0,、,Visual C+,等,Turbo C+ 3.0,:,是一个集成环境,它具有方便、直观和易用的界面,虽然它也是,DOS,环境下的集成环境,但是可以把启动,Turbo C+ 3.0,集成环境的,DOS,执行文件,tc.exe,生成快捷方式,也可以用鼠标操作。,Visual C+,:,也可以用,Visual C+,对,C,程序进行编译。,Turbo C+ 3.0,的使用,将,Turbo C+ 3.0,编译程序装入磁盘某一目录下,例如:,放在,C,盘根目录下一级,TC3.0,子目录下。,进入,Turbo C+ 3.0,集成环境,在,DOS,环境下,C:TC3.0,tc,在Windows环境下,找到可执行文件tc.exe,执行该文件。,主菜单:11个菜单项:,File Edit Search Run Compile Debug Project,Options Window Help,(2) 编辑源文件,新建:单击“File菜单下 的“New,修改:选择“File“Open(即单击“File 的下拉菜单中的“Open项,修改已有的源程序。,在编辑(EDIT) 状态下光标表示当前进行编辑的位置,在此位置可以进行插入、删除或修改,直到自已满意为止。,保存:在编辑(EDIT) 状态下光标表示当前进行编辑的位置,在此位置可以进行插入、删除或修改,直到自已满意为止。,(3) 对源程序进行编译,选择“Compile(或“Alt+F9)对源程序进行编译。,c1.cpp源程序,出现1个错误(error) ,0个警告(warming)。,(4) 将目标程序进行连接,选择菜单“Compile “Link ,如果不出现错误,会得到一个后缀为.exe的可执行文件。,(5) 执行程序。,选菜单“Run “Run( 或按“Ctrl+F9 键)。,(6) 退出Turbo C+ 3.0环境,选择“File“Quit 。,Visual C+ 6.0,的使用,Visual C+ 6.0,是在,Windows,环境中工作的。,进入,Visual C+ 6.0,集成环境,在,Windows,双击图标,几个重要菜单项:,File(文件) , Edit(编辑) ,,Project(工程) , Build(构建),(2) 输入和编辑源程序,新建一个源程序:选择“File菜单下 的“New,单击“OK 按钮后,即可进行输入和编辑源程序,保存之后源程序就以c1-1.c为文件名存放在D盘的cc目录下。,在VC+主窗口的标题栏中显示出D:ccc1-1.c。光标闪烁表示程序编辑窗口已激活,可以输入和编辑源程序了。,别忘了保存!,(2) 对源程序进行编译,编译是对单个文件进行的,源程序文件经编译后将生成目标文件*.obj文件,供链接用。,编译操作的方法为选择BuildCompile菜单命令,也可使用快捷键“Ctrl+F7或直接点击编译按钮。,编译按钮,为程序建立一个工程工作区!,说明:,编译时系统检查源程序中有无语法错误,并在主窗口下部的调试信息窗口输出错误(error)或警告(warming)信息 ,用户需要改正错误并重新编译。,(4) 将目标程序进行连接,连接是将编译生成的目标程序与系统中的库函数连接Link,生成可执行的.exe文件。,链接操作的方法为选择BuildBuild菜单命令,也可使用快捷键“F7或直接点击链接按钮,生成.exe文件,连接按钮,(5) 执行程序,选择BuildExecute菜单命令或者快捷键“Ctrl+F5或直接点击运行按钮来运行程序。,运行按钮,常用的工具按钮,(6) 查看结果,程序执行后,系统将自动切换到输出结果的窗口,显示出运行结果如下:,说明:,按任何一键后,屏幕将自动切换到主窗口。,(7)关闭工作区,如果已完成对一个程序的操作,不再对它进行其他的处理,需要关闭工作区。,应中选择“File“Close Workspace(关闭工作区) ,以结束对该程序的操作。,第二章,数据的存储与运算,本章要点,数据的描述规那么,数据的操作规那么,主要内容,2.1 数据在计算机中是怎样存储的,2.2 整型数据的运算与分析,2.3 实型数据的运算与分析,2.4 字符型数据的运算,2.5 符号常量,2.6 算术运算符和算术表达式,2.7 C运算符和C表达式,2.8 提高局部,2.1 数据在计算机中是怎样存储的,2.1.1 数据在计算机中是以二进制形式存储的,计算机内部的信息都是用二进制来表示的。,二进制数的特点是“逢二进一。每一位的值只有0和1两种可能。,例如:十进制数10,用二进制表示是1010。它的含义是:,每一个二进位代表不同的幂,最右边一位代表2的0次方,最右边第二位代表2的1次方,以此类推。显然一个很大的整数可能需要几十个“二进制位来代表,2.1 数据在计算机中是怎样存储的,2.1.2 位、字节和地址,位:又称“比特(bit)。每一个二极管元件称为一个“二进制位,是存储信息的最小单位。它的值是“1或“0。,字节:又称“拜特(byte)。一般将8个“二进制位组织成一组,称为“字节。,地址:计算机的存储器包含许多存储单元,操作系统把所有存储单元以字节为单位编号 。,2.1 数据在计算机中是怎样存储的,2.1.3 不同类型数据的存储方式,整数的存储方式,十进制整数先转换为二进制形式。例如:整数,10,以二进制形式表示是,1010,,直接把它存放在存储单元中。,实数的存储形式,实数采用指数形式存储,例如:123.456可以写成标准化指数形式0.123456,它包括前后两个局部,前面局部是数值局部,后面局部是指数局部。,0.123456,数值局部 指数局部,说明:标准化指数形式:其数值局部是一个小数,小数点前的数字是零,小数点后的第一位数字不是零。一个实数可以有多种指数表示形式,但只有一种属于标准化指数形式,2.1 数据在计算机中是怎样存储的,3. 字符的存储方式,字符包括字母,(,如,A,,,a,,,X,,,x),、专用字符,(,如,$,,,,,%,,,#),等。,计算机并不是将该字符本身存放到存储单元中,(,存储单元只能存储二进制信息,),,而是将字符的代码存储到相应的存储单元中。,附录,A,是字符与代码的对照表,这是国际通过的,ASCII,代码,.,2.2 整型数据的运算与分析,鸡兔同笼:,在一个笼子里同时养着一些鸡和兔子,你想了解有多少只鸡和多少只兔,主人对你说:我只告诉你鸡和兔的总头数是16,总脚数是40,你能不能自己计算有多少只鸡和多少只兔?,设:x-鸡数量 y-兔数量,,h-总头数 f-总脚数,有方程式:,例题 2.1,解题思路,x+y=h (1),2x+4y=f (2),求x和y的公式:,(2)式-2,x,(1)式:,2y = f,2h,y=,2.2.1,整型数据运算程序举例和分析,2.2 整型数据的运算与分析,#include ,void main(), int h,f,x,y;,/* 定义整型变量h,f,x,y */,h=16;,/* 对整型变量h赋值,使h的值等于16 */,f=40;,/* 对整型变量f赋值,使h的值等于40 */,y=(f-2* h)/2;,/* 对表达式(f-2* h)/2进行运算,把结果赋给y */,x=h-y;,/* 对表达式h-y进行运算,把结果赋给x */,printf(%d%dn,x,y);,/* 输出鸡的个数和兔的个数 */,编写程序,说明: 1、运行时显示:124 ?,2、程序改进:printf(%d,%dn,x,y);,3、再改进:printf(cock=%d,rabbit=%dn,x,y);,2.2 整型数据的运算与分析,1 常量,在程序运行过程中,其值不能被改变的量称为常量,常量区分为不同的类型:,整型 100,125,-100,0,实型 3.14 , 0.125,-3.789,字符型 ,a, b,2,字符串 a, ab,1232,2.2.2 整型常量和整型变量,2.2 整型数据的运算与分析,2 变量,变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。,变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。,2.2 整型数据的运算与分析,3整型常量,整型常量即整常数。在语言中,整常数,可用以下三种形式表示:,十进制整数:123, -456.4。,八进制整数:以0头的数是八进制数。,如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。,十六进制整数:以0x开头的数是16进制数。,如:0x123,代表16进制数123,等于十进制数 291。 -0x12等于十进制数10。,2.2 整型数据的运算与分析,4 整型变量,整型数据在内存中的存放形式,数据在内存中是以二进制形式存放的。,如: int i; /* 定义为整型变量 */,i=10; /* 给i赋以整数10 */,2.2 整型数据的运算与分析,注意:,十进制数10的二进制形式为1010,Turbo C 2.0和Turbo C+ 3.0为一个整型变量在内存中分配2个字节的存储单元(不同的编译系统为整型数据分配的字节数是不相同的,VC+ 6.0那么分配4个字节。,数值是以补码(complement) 表示的。,2.3 实型数据的运算与分析,实型数据的运算举例,例题 2.2,分期付款的计算。张先生为购房,向银行贷款, 贷款额为324500元,每月准备还3245元,月利率为0.8%,求需要多少个月才能还清。,解题思路,m=log10(p)-log10(p-d*r)/log10(1+r);,d贷款额,p每月还款数,r月利率,m还清贷款所需月数。,d=324500元,p=3245元,r=0.8%。,2.3 实型数据的运算与分析,#include /* 用输入输出函数时必须用“stdio.h头文件 */,#include /* 用数学函数时必须用“math.h头文件 */,void main(), int d,p; /* 定义d和p为整型变量 */,float r,m; /* 定义r和m为实型变量 */,d=324500; /* 给整型变量d赋值 */,p=3245; /* 给整型变量p赋值 */,r=0.008; /* 给实型变量r赋值 */,m=(log10(p)-log10(p-d*r)/log10(1+r); /* 通过公式求m的值 */,printf(month=%fn,m); /* 输出m的值 */,printf(total=%fn,m*p); /* 计算并输出总的还款数 */,编写程序,说明: (1) #include 是“包含头文件 的命令,调用系统提供的库函数,见附录E。,2C编译系统把所有实(float)型常量(如0.008)和 log10函数的值都作为双精度数据来处理,在把它们赋给float型变量时可能会丧失一些精度,在编译时出现“警告,不属于致命性错误,可以将r和m改定义为double型,3可以在定义变量时同时赋初值,int d=32450,p=3250,double r=0.008,4运行结果:month=201.983404,total=655436.127930,2.3 实型数据的运算与分析,2.3.2 实型常量的表示形式,两种表,示形式,小数,指数,0.123,3,e-3,注意:,字母e(或E)之前必须有数字,且e后面的指数必须为整数,1e3、1.8e-3、-123e-6、-.1e-3,e3、.e3、e,2.3 实型数据的运算与分析,标准化的指数形式:,在字母e或E之前的小数局部中,小数点左边,应有一位且只能有一位非零的数字.,例如: 123.456可以表示为:,123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e,其中的1.23456e3称为“标准化的指数形式。,类型 位数 数的范围 有效数字,float 32,10,-37,10,38,6,7,位,double型 64,10,-307,10,308,15,16,位,long double 128 10,-4931,10,4932,18,19,位,2.3 实型数据的运算与分析,2.3.3 实型变量,(1) 实型变量的分类,浮点型变量分为单精度float型、双精度double型和长双精度型long double三类形式。,2.3 实型数据的运算与分析,(2)实型数据在内存中的存放形式,一个浮点型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数局部和指数局部,分别存放。指数局部采用标准化的指数形式。,例2.3实型数据的舍入误差#include void main()float a,b; a = 123456.789e5; b = a + 20 ; printf(“%fn,b); ,说明:一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当防止将一个很大的数和一个很小的数直接相加或相减,否那么就会“丧失小的数,运行结果:,123456.789e5,2.3 实型数据的运算与分析,(3) 把实数按双精度数处理,C编译系统将浮点型常量作为双精度来处理。,例如:f = 2.45678 * 4523.65,系统先把2.45678和4523.65作为双精度数进行相乘运算,得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量f。如果在数的后面加字母f或F如1.65f, 654.87F,这样编译系统就会把它们按单精度32位处理。,2.4 字符型数据的运算,逐个输出英文字母C,H,I,N,A。然后按反序输出,即A,N,I,H,C。,可以把5个字母分别放在5个变量中,第1次按正序输出这5个字母,第2次按反序输出这5个字母。C语言提供字符型变量,用来存放字符数据。,例题 2.4,解题思路,2.4.1 字符数据运算的简单例子,2.4 字符型数据的运算,#include ,void main(), char a=C,b=H,c=I,d=N,e=A; /* a,b,c,d,e定义为字符变量 */,printf(%c%c%c%c%cn,a,b,c,d,e); /* 顺序输出CHINA */,printf(%c%c%c%c%cn,e,d,c,b,a); /* 反序输出CHINA */,编写程序,说明:,1、第3行是定义字符变量a,b,c,d,e。字符要用单撇号括起来。一个字符变量放一个字母字符。,2、第4,5行输出5个字母。输出字符所用的格式说明为“%c。,3、运行结果:,CHINA,ANIHC,2.4 字符型数据的运算,2.4.2 字符常量和字符变量,字符常量,(1),用单引号包含的一个字符是字符型常量,(2),只能包含一个字符,a,A, 1,abc、“a,2.4 字符型数据的运算,有些以“开头的特殊字符称为转义字符,n 换行,t,横向跳格,r,回车, 反斜杠,ddd ddd表示1到3位八进制数字,xhh hh表示1到2位十六进制数字,2.4 字符型数据的运算,2. 字符变量,字符型变量用来存放字符常量,注意只能放一个字符。,字符变量的定义形式如下:char c1,c2;,在本函数中可以用下面语句对c1,c2赋值:,c1a;c2 b ;,一个字符变量在内存中占一个字节。,2.4 字符型数据的运算,3.字符数据与整型数据在一定条件下可以通用,一个字符常量存放到一个字符变量中,实际上并不是把该字符的字型放到内存中去,而是将该字符的相应的ASCII代码放到存储单元中。这样使字符型数据和整型数据之间可以通用。,注意:,一个字符数据既可以以字符形式输出,也可以以整数形式输出。,例2.5向字符变量赋以整数。 #include void main() char c1,c2; c1=97; c2=98; printf(“%c %cn,c1,c2); printf(“%d %dn,c1,c2); ,说明:,在第和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:,c1;c2;,因为a和b的ASCII码为97和98,运行结果:, ,97 98,例2.6大小写字母的转换 #include void main() char c1,c2; c1=a; c2=b;c1=c1-32;c2=c2-32; printf(“c c,c1,c2; ,说明:,程序的作用是将两个小写字母a和b转换成大写字母A和B。从代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。语言允许字符数据与整数直接进行算术运算。,运行结果:, ,2.4 字符型数据的运算,说明:,有些系统如Turbo C将字符变量定义为signed char型。其存储单元中的最高位作为符号位,它的取值范围是-128127。如果在字符变量中存放一个ASCII码为0127间的字符,由于字节中最高位为0,因此用%d输出字符变量时,输出的是一个正整数。如果在字符变量中存放一个ASCII码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。,2.4 字符型数据的运算,2.4.3 字符串常量,字符串常量是一对双撇号括起来的字符序列.,合法的字符串常量:,“How do you do., “CHINA, “a , “$123.45,可以输出一个字符串,如,printf(“How do you do.);,2.4 字符型数据的运算,是字符常量,“是字符串常量,二者不,同。,如:假设被指定为字符变量 :char c,c=a;,“a;c“CHINA;,结论:,不能把一个字符串常量赋给一个字符变量。,规定:在每一个字符串常量的结尾加一个 “字符,串结束标志,以便系统据此判断字符串是否结束。,规定以字符作为字符串结束标志。,如:如果有一个字符串常量 ,实际上在内存中是:,C,H,I,N,A,0,它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出。,2.4 字符型数据的运算,2.5 符号常量,2.5.1 为什么要用符号常量,例题 2.7,圆的半径为r,求圆周长c,圆面积s,圆球体积v。,解题思路,圆周长 圆面积,有了以上公式就可以进行计算了,s=,c=2,2.5 符号常量,#include ,void main(),double r=3.67,c,s,v;,c=2*3.1415926*r;,s=3.1415926*r*r;,v=4/3*3.1415926*r*r*r;,printf(c=%fns=%fnv=%fn,c,s,v);,编写程序,说明:,运行结果:,c=23.059290,s=42.313797,v=155.291633,2.5 符号常量,说明:,1C语言规定,两个整型数据相除结果是整型。因此,4/3的值是整数1,而没有小数局部。可以改用实数,写成4.0/3.0。程序第6行改为 v=4.0/3.0*3.1415926*r*r*r;再编译和运行,得到正确的v值。,2可调用pow函数,求 r ,其函数形式是pow(r,3),函数值是double型。,3程序中屡次出现常数3.1415926,降低程序的可读性。可用一个符号来代表一个常量,如可以用一个符号名PI来代表圆周率3.1415926。这样就不必在每处都重复写3.1415926,而用PI来代表,这个PI就叫符号常量。#define PI 3.1415926,2.5 符号常量,2.5.2 符号常量的性质和使用方法,#define不是C语句,该行的末尾没有分号。它是一个“预编译命令。,不要把符号常量与变量混淆, 符号常量只是一个符号,不占存储单元。它只是简单地进行字符置换(如把字符PI置换为字符3.1415926)。不管置换的字符是否有含义都进行置换。,习惯上,符号常量名用大写,变量名用小写,以示区别。,使用符号常量的好处,含义清楚,在需要改变一个常量时能做到“一改全改。,2.6 算术运算符和算术表达式,2.6.1 算术运算符,(1)根本的算术运算符:, 加法运算符,或正值运算符。如:、, 减法运算符,或负值运算符。如:、,* 乘法运算符。如:*, 除法运算符。如:, 模运算符,或称求余运算符,两侧均应为整型数据,如:的值为。,2.6 算术运算符和算术表达式,(2) 运算符的优先级与结合性,语言规定了运算符的优先级,在表达式求值时,先按运算符的优先级别上下次序执行,例如先乘除后加减。,规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右,即先左后右 。,2.6 算术运算符和算术表达式,(3) 自增、自减运算符,作用是使变量的值增或减,如:,,在使用之前,先使的值加,减,,在使用之后,使的值加,减,2.6 算术运算符和算术表达式,i+与+i的区别:,是先执行后,再使用的值;,是先使用的值后,再执行。,例如:,;,i的值先变成4, 再赋给,j的值均为,;,先将 i的值3赋给,的值为,然后变为,2.6 算术运算符和算术表达式,注意:,(1)自增运算符,自减运算符,只能用于变量,而不能用于常量或表达式,,(2)和的结合方向是“自右至左。,自增减运算符常用于循环语句中使循环变量,自动加。也用于指针变量,使指针指向下一个地址,2.6 算术运算符和算术表达式,2.6.1 算术表达式,用算术运算符和括号将运算对象(也称操作数连接起来的、符合语法规那么的式子,称为算术表达式。运算对象包括常量、变量、函数等。,例如: *.5a,是一个合法的表达式,2.6 算术运算符和算术表达式,强制类型转换运算符:,强制类型转换运算符的作用是:将一个表达式转换成所需类型,一般形式:类型名表达式,例如:,(double) 将转换成double类型,(int)(x+y) 将x+y的值转换成整型,(float)5%3 将5%3的值转换成float型,例2.8 强制类型转换。 #include void ; ; ; ; printf(x=%f, i=%dn,x,i);,说明:,有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。,运行结果:,x3.600000, i=3,2.6 算术运算符和算术表达式,各类数值型数据间的混合运算,混合运算:整型包括int,short,long、浮点型包括float,double可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.,说明:,这种类型转换是由系统自动进行的。,2.6 算术运算符和算术表达式,有关表达式使用中的问题说明:,ANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。,例如,:,对表达式 a = f1( )+f2( ),并不是所有的编译系统都先调用f1( ), 然后,调用f2( )。在有的情况下结果可能不同。有时会出,现一些令人容易搞混的问题,因此务必要小心谨慎,。,2.6 算术运算符和算术表达式,语言中有的运算符为一个字符,有的运算符由,两个字符组成 ,为防止误解,最好采取大家都能理,解的写法。,例如:不要写成i+j的形式,而应写成,(i+)+j的形式,2.6 算术运算符和算术表达式,在调用函数时,实参数的求值顺序,标准并无统,一规定。,例如:的初值为,如果有下面的函数调用:,printf,i+) 在有的系统中,从左至右求值,输出“,。在多数系统中对函数参数的求值顺序是自右而左,函数输出的是“,。以上这种写法不宜提倡, 最好改写成,j = i+;,printf(%d, %d, j,i),2.7 C运算符和C表达式,2.7.1 运算符,的运算符有以下几类:,(1)算术运算符 + - * / %,(2)关系运算符 !,(3)逻辑运算符 !|,(4)位运算符 |,(5)赋值运算符 及其扩展赋值运算符,(6)条件运算符 ?:,(7)逗号运算符 (,,2.7 C运算符和C表达式,(8)指针运算符 *和,(9)求字节数运算符,(10)强制类型转换运算符 (类型 ),(11)分量运算符-,(12)下标运算符,(13)其他 如函数调用运算符,2.7 C运算符和C表达式,2.7.2 表达式,C语言有以下几类表达式:,算术表达式。如2+6.7*3.5+sin(0.5),关系表达式。如x0,y0 & y0 (表示x0与y0同时成立,&是逻辑运算符,代表“与),赋值表达式。如a=5.6,逗号表达式。如a=3,y=4,z=8 用逗号连接假设干个表达式,顺序执行这些表达式,整个逗号表达式的值是最后一个表达式的值(今为8)。详见本章提高局部。,2.8 提高局部,计算机不管对正数和负数都按“补码形式存放到,存储单元。,对于正数来说,补码就是该数的“原码(该数的,二进制形式)。负数的补码不是它的原码。,2.8.1 求补码的方法,2.8 提高局部,求一个负数的补码的方法是:,取该数(不考虑数的符号)的二进制形式,它就是原码。,对该原码逐位“取反(逐位把0变1,把1变0),得到其“反码,将得到的反码加1,2.8.1 求补码的方法,求-10的补码步骤如下:,(1)-10的原码是00001010。,(2) 其反码是11110101。,(3)再加1,得补码11110110,。,注意:,负数的补码形式的最高位都是1,从第1位就可以判断该数的正负。,2.8 提高局部,2.8.2 整型常量的表示形式,十进制整数。,如:,123, -456.4。,八进制整数。以0头的数是八进制数。,如:,0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。,十六进制整数。以0x开头的数是16进制数。,如:,0x123,代表16进制数123,等于十进制数,291。 -0x12等于十进制数10。,2.8.3 整型变量的类型,整型变量的分类,共六种,有符号根本整型,有符号短整型,有符号长整型,无符号根本整型,无符号短整型,无符号长整型,(signed)int,(signed)short (int ),(signed) long (int),unsigned int,unsigned short (int),unsigned long (int),注意:,括号表示其中的内容是可选的.,2.8 提高局部,2.8 提高局部,整数类型的有关数据:,类型 类型说明符 长度 数的范围,根本型 int 2字节 -3276832767,短整型 short 2字节 -215215-1,长整型 long 4字节 -231231-1,无符号整型 unsigned 2字节 065535,无符号短整型 unsigned short 2字节 065535,无符号长整型 unsigned long 4字节 0232-1,2.8 提高局部,例如:整数13在内存中实际存放的情况:,2.8 提高局部,整型变量的定义:,规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义。,例如:,int a,b指定变量、为整型,unsigned short c,d;指定变量、为无符号短整型,long e,f;(指定变量、为长整型,2.8 提高局部,整型变量的定义:,规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义。,例如:,int a,b指定变量、为整型,unsigned short c,d;指定变量、为无符号短整型,long e,f;(指定变量、为长整型,2.8 提高局部,2.8.4 整型常量的类型,常量是有类型的,在赋值时匹配。按下面的规那么处理:,(1) 如果整常数的值在-3276832767范围内,认为它是int型,分配2个字节。,(2)如果其值超过了上述范围,而在-21474836482147483647范围内,那么认为它是长整型,分配4个字节。,(3) 在一个整常量后面加一个字母l或L,那么认为是long int型常量,,(4) 一个整常量后面加一个字母u或U,认为是unsigned int型,。,2.8 提高局部,2.8.5 运算符的优先级与结合性,语言规定:运算符的优先级和结合性。在表达式求值时,按运算符的优先级别上下次序执行 。,语言还规定:各种运算符的结合方向结合性,算术运算符的结合方向为“自左至右,在C语言中有些运算符的结合方向是“自左至右,如赋值语句。,第三章,最简单的c程序设计,顺序程序设计,本章要点,算法的概念及表示方法,结构化程序设计方法,C,语句,顺序结构的程序设计语句及方法,主要内容,3.1 算法概述,3.2 程序的三种根本结构,3.3 C语句综述,3.4 赋值表达式和赋值语句,3.5 数据输入输出的概念,3.6 字符数据的输入输出,3.7 简单的格式输入与输出,3.8 顺序结构程序设计举例,一个程序应包括两个方面的内容:,对数据的描述:数据结构(data structure),对操作的描述:算法(algorithm),著名计算机科学家沃思提出一个公式:,数据结构 + 算法 = 程序,数据结构算法程序设计方法语言工具,完整的程序设计应该是:,3.1 算法概述,广义地说,为解决一个问题而采取的方法和步骤,就称为“算法。,方法1:1+2,+3,+4,一直加到100,加99次,方法2:100+(1+99)+(2+98)+(49 +51)+50,= 100 + 49100 +50,加51次,对同一个问题,可有不同的解题方法和步骤,例: 求,3.1.1 算法的概念,3.1.1 算法的概念,为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择适宜的算法。希望方法简单,运算步骤少。,计算机算法可分为两大类别:,数值运算算法:,求数值解,例如求方程的根、求函数的定积分等。,非数值运算:,包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索、人事管理、行车调度管理等。,3,.1,.2 怎样表示算法,算法的四种表示方法:,用自然语言表示算法,用流程图表示算法,用N-S流程图表示算法,用伪代码表示算法,1用自然语言表示算法,自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单的问题外,一般不用自然语言描述算法。,2用流程图表示算法,美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号:,起止框,判断框,处理框,输入/输出框,注释框,流向线,连接点,例,将求5!的算法用流程图表示,如果需要将最后结果打印出来,可在菱形框的下面加一个输出框。,例:,判断一个数是否偶数,其算法用流程图表示:,例:,输出1到100的算法,用流程图表示,说明:,流程图是表示算法的较好的工具。一个流程图包括以下几局部 :,(1)表示相应操作的框;,(2)带箭头的流程线;,(3)框内外必要的文字说明。,(3),用N-S流程图表示算法,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的附属于它的框,或者说,由一些根本的框组成一个大的框。这种流程图又称N-S结构化流程图。,N-S流程图用以下的流程图符号:,(1)顺序结构,(2)选择结构,(3)循环结构,例:,判断一个数是否偶数,其算法改用N-S流程图表示:,输入m,m,能被2整除?,是 否,输出m 输出m,是偶数 不是偶数,例:,输出1到100的算法,改用N-S流程图表示:,n=1,n的值10,输出n的值,n=n+1,N-S图表示算法的优点,比文字描述直观、形象、 易于理解;比传统流程图紧凑易画。尤其是它废除了流程线,整个算法结构是由各个根本结构按顺序组成的,N-S流程图中的上下顺序就是执行时的顺序。用N-S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。,(4),用位代码表示算法,概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。,特点:它如同一篇文章一样 ,自上而下地写下来。每一行(或几行)表示一个根本操作。它不用图形符号,因此书写方便 、格式紧凑,也比较好懂,也便于向计算机语言算法(即程序)过渡。,用处:适用于设计过程中需要反复修改时的流程描述。,if x is positive then,print x,else,print -x,也可以用汉字伪代码表示:,假设 x为正,打印 x,否那么,打印 -x,也可以中英文混用,如:,if x 为正,print x,else,print -x,例: “打印x的绝对值的算法可以用伪代码表示为:,3.2 程序的三种根本结构,传统流程图的弊端,传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以毫不受限制地使流程随意地转向,使流程图变得毫无规律,阅读者要花很大精力去追踪流程,使人难以理解算法的逻辑。如图:,传统流程图的流程可以是:,这种如同乱麻一样的算法称为BS型算法,意为一碗面条(A Bowl of Spaghetti),乱无头绪。,缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证。,解决方法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。,三种根本结构,Bohra和Jacopini提出了以下三种根本结构:,顺序结构、选择结构、循环结构,用这三种根本结构作为表示一个良好算法的根本单元。,三种根本结构的图示:,顺序结构,选择结构,循环,结构的图示:,当型(While型)循环结构,直到型(Until型)循环,三种根本结构的共同特点:,(1)只有一个入口;,(2)只有一个出口;请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。,(3)结构内的每一局部都有时机被执行到;,(4)结构内不存在“死循环(无终止的循环)。,图中没有一条从入口到出口的路径通过A框。,不正确的流程表示:,流程内的死循环,小结:,由三种根本结构顺序组成的算法结构,可以解决任何复杂的问题。由根本结构所构成的算法属于“结构化的算法,它不存在无规律的转向,只在本根本结构内才允许存在分支和向前或向后的跳转。,扩展:,只要具有上述四个特点的都可以作为根本结构。可以自己定义根本结构,并由这些根本结构组成结构化程序。,此图符合根本结构的特点,结构化程序设计方法,一个结构化程序 就是用高级语言表示的结构化算法。用三种根本结构组成的程序必然是结构化的程序,这种程序便于编写、便于阅读、便于修改和维护。,结构化程序设计强调程序设计风格和程序结构的标准化,提倡清晰的结构。,结构化程序设计方法的根本思路是:把一个复杂问题的求解过程 分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。,3.3 C语句综述,C程序,源程序文件1,源程序文件2,源程序文件n,预处理命令,函数n,函数1,数据声明,函数首部,函数体,数据声明,执行语句,C程序的结构:,一个c程序可以有假设干个源程序文件组成,一个源文件可以有假设干个函数和预处理命令以及全局变量声明局部组成,一个函数有函数首部和函数体组成,函数体由数据声明和执行语句组成,C语句分为,5类,控制语句,函数调用语句,表达式语句,空语句,复合语句,1,if() else,条件语句 6 break 间断语句,2,for(),循环语句 7 switch() 开关语句,3,while(),循环语句 8 goto 转向语句,4,do while();,循环语句 9 return 返回语句,5,continue,继续语句,(1) 控制语句(种)。完成一定的控制功能。,if ( )else 条件语句,用来实现选择结构,switch (多分支选择语句), for 循环语句,用来实现循环结构, while 循环语句,用来实现循环结构, do while循环语句,用来实现循环结构, continue 结束本次循环语句, break 中止执行switch或循环语句, return 从函数返回语句, goto 转向语句,根本不用,(2)函数调用语句,有一个函数调用加一个分号构成一个语
展开阅读全文