




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第一章 计算机语言及C语言概述 第二章 基本数据类型、运算符和表达式 第三章 数据的输入和输出 第四章 语句 第五章 指针初步和数组 第六章 函数与程序结构 第七章 编译预处理 第八章 指针 第九章 结构体 第十章 文件,C语言程序设计,2,第一章 计算机语言及C语言概述,1.1 计算机语言 1.2 C语言概述 1.3 C程序的上机步骤,3,1.1计算机语言 1.1.1 计算机语言的发展过程 计算机语言是指计算机能够接受和处理的、具有一定格式的语言。用计算机语言编写的,使计算机能够完成特定任务的代码串称为计算机程序。 计算机语言经历了三个阶段: 1.机器语言:由、代码组成的、能被机器直接理
2、解执行的指令集合。 2.汇编语言:采用一定的助记符来代替机器语言中的指令和数据,又称为符号语言。 3. 高级语言:接近自然语言和数学语言的程序设计语言。 1. 汇编程序:将用汇编语言编制的程序(源程序)翻译加工成机器语言程序(目标程序)的工具。,1.12 语言处理程序,4,. 编译程序:将用高级语言编写的程序(源程序)翻译成机器 语言或汇编语言程序(目标程序)的工具。 特点:一次编译,目标程序可多次使用 从高级语言程序到获得运行结果的一般过程 程序库 数据 源程序 目标程序 可执行程序 结果 3.解释程序:直接对源代码中的语句进行解释执行,产生运行结果,它不产生目标代码。,编译,连接,执行,5
3、,1.2 C语言概述 1.2.1 C语言的发展历史 C语言的发展依次为: ALGOL60 CPL BCPL B C,6,1.2.2 C语言的特点,1.C语言具有结构语言的特点,程序之间很容易实现段的共享. 2.C语言的主要结构成分分为函数,函数可以在程序被定义完成独立的任务,独立的编译成代码,以实现程序的模块化 3.C语言运算符丰富,,运算符包含的范围和广. 4.C语言数据类型丰富。 5.C语言允许直接访问物理地址,即可直接对硬件进行操作,实现汇编语言的大部分功能. 6.C语言语法限制不太严格,程序实际自由度大这样使C语言能够减少对程序员的束缚. 7.用C语言编程,生成的目标代码质量高,程序执
4、行效率高.,7,例1.1 : # include stdio.h main( ) printf(This is a C program.n); 例1.2: main() int a,b,sum; a=123; b=456; sum=a+b; printf(sum is %dn,sum); ,1.2.3 C程序举例,8,例1.3: 求a和b中的大者. main() /*主函数*/ int a,b,c; /* 定义变量 */ scanf(“%d,%d”, /* 将z值返回调用处 */,9,通过对上面三个程序的讨论,可以归纳如下: (1) C程序是由函数构成的. 且至少要包含一个主函数main, 也
5、可以包含若干个其它函数. (2)被调用的函数可以是系统提供的库函数(如printf和scanf函数),也可以是用户自定义的函数(如例1.3中的max函数)。 (3)一个函数由两部分组成: a. 函数头:包括函数名、函数类型、函数形参名、形参类型 一个函数名后面必须跟一对圆括号,但函数参数可以没有。 b. 函数体 函数体是用一对大括号作为开始和结尾的标志. 包括说明和执行两部分: 说明部分用来说明函数、变量和定义变量、指针、数组等, 执行部分则通过语句描述函数的功能。 变量定义和语句都要以分号结尾。 (4) 程序的任何地方都可以加入以“/*”和“*/”包围起来的解释部分, 该 部分的作用是为了增
6、加程序的可读性,它不是程序的可执行部分, 不产生程序代码。,10,(5) C语言书写形式自由 一行内可以写多条语句,一条语句也可以分写在不同行上,当一条 语句分写在几行上时,行尾需加续行符 “” 。C语言中大小写字母 是有区别的,这一点在使用时要特别注意。 1. C语言的基本符号: (1) 大小写英文字母各26个:az,AZ 。 (2) 09共十个数字。 (3) 下划线 _ 。 (4) 特殊符号:包括运算符在内的其他字符。如、等。 2. 标识符:用来标识变量名、符号常量名、函数名、类型名、文件名等。 标识符只能由字母、数字和下划线三种字符组成,且必须以字母或下划线开头;其次,虽然C语言没有对标
7、识符的长度进行统一的规定,但是具体的系统都有长度限制。Turbo C能识别长达31个字符。,1.2.4 C语言的基本语法单位,11,C语言中,标识符有三种类型: a.关键字:系统已定义过的、有特定含义、不能挪作它用的标识符。 C语言共有32个关键字。例如,int、char、break、for等。 b.预定义标识符:系统定义过的,用于编译预处理命令中的标识符。 例如,include、define等。 建议这些标识符也不要作为用户自定义标识符。 c.自定义标识符:依据标识符的命名原则,由用户自己定义的标识符。 若能使用“见名知义”的名字,会使程序的可读性增强。 例如,下面的标识符都是合法的。 A2
8、 student area_of_circlenum _dd 而下面的标识符则是不合法的。 2AA-B(不能有减号) area of circle(一个标识符)M.D(不能有点),12,1. 进入Turbo C集成环境 运行Turbo C的执行程序TC.EXE,就进入了Turbo C集成环境, TC主屏由四部分组成:主菜单、编辑窗口、信息窗口和功能键提示行。 在进行编辑程序之前应设置好包含文件、库文件、输出文件和Turbo C系统所在的目录。 2. 编辑 在编辑窗口中将编写好的程序输入计算机或对已经存在的源程序文件进行修改的过程,就是源程序的编辑过程。 FileLoad命令: 输入一个要编辑的
9、源程序名字,则编辑窗口中的NONAME.C被新输入的名字取代。 若被编辑的是一个新文件,则可以输入编写好的程序到编辑窗口; 若被编辑的是一个旧文件,则可以对其进行修改。 FileSave命令: 保存文件。 FileNew命令: 在清屏后的编辑窗口,输入程序 FileWrite to命令 输入源程序名字保存文件,1.3 C程序的开发及上机步骤,13,选择CompileCompile to OBJ命令,对编辑窗口中的文件进行编译,如果编译成功,按F2键,将文件保存一下后就可进入下一个过程; 否则,若编译失败,则在信息窗口中将发现的错误和警告信息一一列出。 编译后生成的目标文件和库文件连接在一起才能
10、生成可执行文件。当编译成功后,选择CompileLink EXE file命令,进入连接,如果出现错误,则一般要检查库文件和头文件的路径设置是否正确,修改后重新连接。,3. 编译,4. 连接,14,选择RunRun或Ctrl+F9(两个键同时按下)命令,就可以执行程序。 若要察看运行结果,则按ALT+F5。 如果程序在运行过程中需要输入数据,则选择了RunRun命令后,屏幕处于用户屏状态,等待用户输入所需的数据,数据输入结束,运行后重新回到集成环境的主屏。 Turbo C中,编译和连接这两个步骤也可以通过功能键ctrl+F9(建立.EXE可执行文件)附带一并一次完成。简言之,编辑后,可通过ct
11、rl+F9一起完成若有错,则要反复多次 选择FileOS shell命令,可以暂时退出Turbo C,转到DOS提示符下,此时,若再键入EXIT,则又可以返回Turbo C集成环境的主屏。 选择FileQuit命令,彻底退出Turbo C,返回到DOS提示符下。 作业:习题3,5,6 上机知识:编辑、编译、连接、执行全过程,5. 运行,6. 退出Turbo环境,15,第二章 基本数据类型、运算符和表达式,2.1 基本数据类型 2.2 运算符和表达式 2.3 小结,16,C语言可以处理数值型及非数值数据。 大致可分为:,2.1 基本数据类型,17,每一种数据类型又有常量和变量之分,下面分别予以介
12、绍。 1. 值常量和符号常量 常量是指那些在程序运行过程中其值不能改变的量。 (1)值常量: 如: -25、3.0、2e-3、A。 (2)符号常量:是用define命令定义的常量,例如: #define PI 3.14 define是宏定义,定义符号常量的方法为: #define 标识符 常量值 习惯上符号常量名用大写表示,而变量名则用小写表示。 注意:符号常量虽然用标识符来标识,但它本质上是常量,具有常量值不能改变的性质。,2.1.1 常量,18,【例2.1】 #define PI 3.14 main( ) float r = 3.0, s, l; l = 2*PI*r; s = PI*r*
13、r; printf(l=%f, s=%f; l, s); 2. 整型常量 计算机中的整型数是有范围的,一般而言,用一个机器字来存放一个基本整型数据.(若干个字节组成一个存储单元,称为“字”). 在表示方法上,通常在整数后面加上字母“l”或“L”,表示它为一个长整型数据;若在某个整数后面加上字母“u”或“U”,则表示它是一个无符号整数。 例如: 125、26、40000L、37U、0L等等,都是合法的整型常量。 而50000(超值,整型的最大值是32767)、-23u非法.,19,整型常量还有十进制、八进制和十六进制三种表示方法。 1)十进制形式 如125、-21、0。 2)八进制形式 以数字0
14、开头的,由07之间的数字组成的数据。 如: 056。 3)十六进制数 以0 x或0X开头的,由数字09和字母A、B、C、D、 E、F组成的数据.其中6个字母也可以小写. 如: 0X5A、0 x39。 0X5A5*16110*16090 整型常量的类别和进制表示可以结合在一起使用。 如: 0X41L为十六进制长整型数。,20,3. 实型常量 实型常量有两种表示方式: 1)十进制小数形式 由正负号、数字和小数点组成,其中小数点不能缺少,正数符号可省略。 如1.25、34.0(尾数零可以省)、+1.25、17.和.1。 2)指数形式 由尾数开头,加上指数部分共同构成,其中指数部分由指数符号e(或E)
15、,正负号及整数组成。 如1.25e-5、+1e10、-1.25e5、1e-6、3e2。 注意:e前面不能没有数字,e后面的数字必须为整数,也不能加园括号。计算机中e表示10 如1E(-3)、E-5、1e2.1都是错误的。 4. 字符型常量 C语言提供了两类字符型常量。 1)普通的字符常量:用单引号括起来的一个字符.如A、b、0、? 。 2)转义字符常量:是以“”(反斜杠)开头的用单引号括起来的字符序列。 常用的转义字符见p 12.,21,注意: x61表示ASCII码为97的字符,即字符a。 0表示ASCII码为0的字符,它是一个空字符(不是空格字符),常作为 字符串的结束标志。 整型数据和字
16、符型数据可以在一定范围内通用,通过指定不同的格 式,一个字符型数据既可以以字符形式输出,又可以以整数形式输 出其ASCII码值。字符型char的值机内以ASCII码值表示。如: 数字字符09的ASCII码值是连续排列的, 为4857; 大写字母AZ的ASCII码值是连续排列的,为6590; 小写字母az的ASCII码值是连续排列的, 为97122。 A与A不同,前者是字符串,实际上由两个字符组成,即字符 A和字符串结束标志0,而后者是一个字符,仅由一个字符A 组 成,在存储器中存放的是A的ASCII码值65。,22,1. 变量的定义 变量: 在程序运行过程中其值可变的量. 变量的定义方式如下:
17、 存储类别 数据类型 变量名表; 其中“存储类别”是可以省略的,缺省时,在函数内默认为auto型,即自动类型。 例如: int a, b; (定义变量a和b为整型) unsigned c,d; (定义变量c,d为无符号整型变量) long e,f; (定义变量e和f为长整型) float x,y ; (定义变量x和y为单精度实型) double z; (定义变量z为双精度实型) char c1,c2; (定义变量c1,c2为字符型变量) C规定:程序中所有用到的变量都必须在程序中指定其类型,即“定义”.,2.1.2 变量,23,2. 变量的赋值和初始化 变量必须先有确定的值后才能参与各种相应的
18、操作。 (1)赋值语句 例如: int a; a = 3; 使整型变量a的值为3。 (2) 初始化 在定义变量的同时对变量赋初值。如 int a=3; 它等价于上面的赋值语句。 (3) 赋值与初始化的区别 赋值语句是在程序运行阶段将值赋给变量的 初始化是在编译或运行时,系统为变量分配内存单元的同时,将值存放进去的。 赋值语句允许在一条语句中为多个变量同时赋值,初始化则不允许.,24,如 int a, b, c; a = b = c = 0; 是正确的。而 int a = b = c = 0; 则是错误的,应该修改为如下的形式: int a=0, b=0, c=0; 3. 变量的使用原则 变量的
19、使用遵循这样的原则:先定义,后使用。 例如,在程序中有定义 int date; 而程序体中有语句 data=10; 则编译时会检查出data是未经定义. 例如,有定义 float a, b; 若程序中出现表达式“a%b”,则编译系统会检查出变量a和b参与了非法的运算。因为运算符“%”要求的操作数必须是整型。,25,4. 注意事项 (1) 不能把字符串赋给字符型变量。 例如: char ch = You are wrong.; 因为ch是char类型,一个字符型变量只能存放一个字符。 (2) 一般不要将一个负数赋给一个unsigned型变量。 例如: unsigned int a = -26;
20、因为-26不是无符号数。 (3) 给整型变量赋值时,注意要避免超界。 例如: int a = 50000; 超界,因为int类型允许的最大整数是32767。,26,语言提供了十五大类共四十四种运算符。 有三个属性:优先级、结合性和目数 优先级由高到低的次序进行,C语言的优先级别分为15级 结合性则规定了在相同优先级运算符连续出现时的计算顺序,包括自左向右和自右向左两种。 不同的运算符的优先级和结合性见p15表2.4。 表达式:由常量,变量,函数调用和运算符按一定规律组合在一起构成的式子。 其求值的顺序为:根据运算符的优先级与结合方向对表达式加园括号,然后从左到右计算表达式,一面计算一面转换操作
21、数的类型,直到能最终确定表达式的值时终止。,2.2 运算符和表达式,27,1. 算术运算符 +(加法或取正) -(减法或取负) *(乘法) /(除法) %(求余数) +(自增) -(自减) 其中 +、-、*、/、%的结合性是自左向右。而+和-的结合性则是自右向左。 C语言的算术运算符优先级从高到低为 (+、-、+、-) 、 (*、/、%) 、 (+、-)。 2. 说明 (1) 在除法运算中,当两个操作数都是整数时,商也为整数,小数部分一律舍去。 例如,7/3的结果为2,-1/2的结果为0,-5/3的结果为-1 。,2.2.1 算术运算,28,当两个运算数的符号不同时,结果的符号与被除数的符号相
22、同。 例如,5%3的值为2,-5%3的值为-2,5%-3的值为2。 【例2.2】 main( ) int x = 10, y = 3; printf(x/y=%d,y/x=%dn, x/y, y/x); printf(x%y=%d,y%x=%dn, x%y, y%x); /* 字符串中的%输出为% */ (3) 自增、自减运算符 +i , -i (在使用 i之前,先使i的值加减1) i+ , i- (在使用 i之后, 使i的值加减1) 若 i 的值为3,则 j=+i; j的值为4 j=i+; j的值为3,然后变为4.,(2) %(求余运算)要求两个操作数都是整型,结果为整除后余下的整余数。,p
23、rintf(%d,+i); 输出4 printf(%d,i+); 输出3,29,再如,若a的值仍为3 则执行a+*2后,表达式的值为6,a的值为4, 而执行+a*2后,表达式的值为8,a的值为4。 注意: 自增、自减运算符只能用于整型变量,而不能用于表达式. 如 5+ (a+b)+ -d(d为实数) 非法 【例2.3】 main( ) int a = 9, b, c; b = +a; printf(%d,%dn, a, b); a = 9; c = a+; printf(%d,%dn, a, c); ,30,【例2.4】 main() int a,b,c; a=b=c=0; a=+b+ +c;
24、 printf(”n %d %d %d”,a,b,c); a=b+ +c+; printf(”n %d %d %d”,a,b,c); a=+b+c+; printf(”n %d %d %d”,a,b,c); a=b-+-c; printf(”n %d %d %d”,a,b,c); 输出: 2 1 1 2 2 2 5 3 3 5 2 2,31,其形式为: 变量 赋值运算符 表达式 其中赋值运算符可以是 “=”,也可以是复合赋值运算符,如“+=”、“-=”、“*=”、“/=”和“%=”等等 赋值运算其作用: 将一个数据赋给一个变量, 并以变量的值作为赋值运算后整个式子的值。 复合赋值运算符“+=”
25、 一般形式: 变量+=表达式等价于 变量 = 变量表达式 其余的复合赋值运算符可类似的理解。 例如:a += 3等价于a=a+3 b *= a+2等价于b = b*(a+2),而不是b=b*a+2。,2.2.2 赋值运算,32,使用赋值运算符,要注意以下几点: 1. 该运算符的结合性为自右向左。 例如: a = 3+(b = 2) 等价于 a = (3+( b = 2) 运算结束后,a的值为5,b的值为2。 思考题:假设a 的初值为,有表达式a += (b = 4)+2 则运算结束后,a 、b及表达式的值各为多少? 2. 当赋值运算符两端数据类型不一致时,在赋值之前,系统自动对右端的类型进行转
26、换,使其与左端类型一致。 例如,假定a为整型变量,则a = 3.78的结果是将3赋给a。系统自动把赋值号右边的实数3.87转换成整型3,小数部分全部舍去,不遵循四舍五入的原则。,33,3. 赋值运算符的左端只能是变量(或数组元素),不能为表达式 或常量。如: a+b = 3和4 += m等都是错误的。 4. 赋值表达式中的“表达式”,可以是一个赋值表达式,也可以包含复合 的赋值运算符. 如: a=b=c=5 a=5+(c=6) a=(b=10)/(c=2) a+=a-=a*a,34,种类: (大于)、 =(大于等于)、 = =(等于)、!=(不等于) 结合方向从左到右。 关系运算符优先级从高到
27、低为 ( 、 = ) ( = = 、 != ) a= =b的结果为, a0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?,2.2.3 关系运算,n/k+(n%k0),35,C语言提供三个逻辑运算符: x=y=z=1; +x|+y 运行结果: x=2 y=1 z=1 x=2 y=2 z=1 x=2 y=2 z=2 x=0 y=1 z=0 x=0 y=0 z=1 x=0 y=1 z=1,37,【例2.6】 main() int m,n=10; m=2 将和中较大的一个数赋值给变量max 条件运算符的结合性是由右向左。,2.2.5 条件运算,38,思考题:假设初值为,初值为,
28、则执行了表达式 xy?x-:y-之后,、的值各为多少? z= xy? (float)x/-y+:x=y?1:(float)x/-y 和 x 、 y 的值各为多少? 解:上述表达式等价如下形式: z=(xy)?(float)x)/-(y+):(x=y)?1: (float)x/(-y) 由题意知, x0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?(试用条件运算符表达),在使用条件运算符时,要特别注意,在一次判断中,表达式e2和e3有且只有一个被求值。,n%k0?n/k+1:n/k,39,逗号运算符是优先级别最低的运算符,其形式为: e1,e2,e3, 其中e1、e2、e
29、3均为表达式,在逗号表达式中,从左向右依次计算各个表达式的值,而将最后一个表达式的值作为整个表达式的值。 例如: x = (y = 2, z = 3, y+z) x的值为5。 a=3*5,a*4 整个逗号表达式的值为60 (a=3*5,a*4),a+5 整个逗号表达式的值为20 x=(a=3,6*3) x=a=3,6*a 逗号运算符常用于语法上要求一条语句而语义上要求多条语句时,如常用于循环控制中 例:for(i=0,j=n;ij;i+,j-),2.2.6 逗号运算,40,该运算符是用来求某个数据(变量、常量、表达式)或某种数据类型所占的字节数。 形式为: sizeof(类型名) 或者 siz
30、eof 变量名 对类型名和常量一定要加园括号。 例如,sizeof(int)的值为2 sizeof(char)的值为1 sizeof(float)的值为4 sizeof(double)的值为8 sizeof(1)的值为2。 又如: 有 long int m; 则 sizeof m或者sizeof(m)的值均为4。,2.2.7 sizeof运算,41,数据类型的转换分为显式转换和隐式转换。 显式转换:就是将一种数据类型的值强制地转换为另外一种数据类型。 形式为: (类型名)表达式 例如,假设、为float型数据,则(int) (x+y)强行将+的值转换成整型,x和y本身没有改变。 强制类型转换常
31、用于对函数的参数及返回值的操作。 例: main() float x=3.6; int i=5; printf(“%d”,i%(int)x); ,2.2.8 数据类型的转换,42,隐式转换是指在不同类型数据进行混合运算时,系统自动进行的类型转换。 在图2.1中,横向的箭头表示必定的转换, 而纵向的箭头则表示当运算对象类型不同时 转换的方向,其中较低的类型要转换成另外 一种较高的类型。 假设,i为整型变量,f为float型变量, d为double型变量,e为long型 分析下式: 10+a+i*f-d/e 思考题: 有 char c=a; 则 sizeof(4*c) sizeof(4.0*c),
32、值各为多少?,2和8,43,2.2.9 基本函数 C语言提供了许多库函数,用户编程时可直接调用这些函数,只需用文件包含命令指出其出处。 函数模型:double exp(double x) double sin(double x) double sqrt(double x) 如: #include “math.h” main() int a=4; double b; b=sqrt(a); printf(“%f”,b); ,44,2.3小结 一. 主要内容 本章介绍了基本数据类型和运算符。每一种基本数据类型都提供了常量和变量两种数据形式,不同类型的数据在机器中所占用的内存空间不同,每一种数据类型都
33、有其特定的数据范围。常量分为值常量和符号常量,值常量由其数据形式本身即可确定其类型,无需再去定义和说明;符号常量则是用标识符来表示的常量,需要用编译预处理命令来定义。变量的使用遵循先定义、再赋值、后参与运算的步骤。 运算符有三个属性:优先级、结合性和目数 二. 运算符使用的特别说明 (1) 对于除法运算符“/”,若两个操作数都为整数,商也是整数。 (2)在“a%b”中,要求a和b都为整型数据,定义变量类型时要注意这点。,45,(3)“a+”与“+a”都是使变量a的值增加1,但改变的时间不同。 (4)在“a*=b+c”中,复合赋值运算符“*=”右边是一个整体;在一切赋值运算中,赋值号左端只能是变
34、量,而不能是其他;若赋值号两边类型不同,自动转成左端的类型。 (5)当表示某个变量的取值范围时,注意不能等同于数学上的表示。如,要表示a是个三位整数,应该用表达式“a=100 作用: 向终端输出若干个任意类型的数据 “控制字符串”要用双引号括起来,它包含两种信息: a.普通字符:即需要原样输出的字符.这类字符中包括转义字符,如遇到n则输出一换行符,即光标移至下一行行首。 b.格式说明:由%和格式字符组成,如%d,%f. 作用:将输出的数据转换为指定的格式输出. 输出表列是指需要输出的常量,变量或表达式.其个数必须与格式说明串所说明的个数相等,且顺序上一一对应。如: printf(a=%d,b=
35、%d ,a+b=%dn,a,b,a+b);,3.1 格式输入输出函数 3.1.1 printf函数(格式输出函数),49,2. 格式字符 对不同的数据类型,要用不同的格式字符来说明.见p26表3.1和表3.2)。 常用的格式字符: (1) d格式 %d按整型数据的实际长度输出。 %mdm为一整数,代表指定的输出字段的宽度 如果数据的位数大于m,则按实际宽度输出,若小于,则左端 补以空格。 如 printf(%4d,%4d ,a,b); /* a=123,d=12345 */ 输出: _ 123,12345 %-md基本同%md,区别在于当数据实际宽度小于时,负号 “”使得数据输出时向左靠。右端
36、补以若干个空格。 %ld输出长整型数据,当然%mld,%-mld也是允许的格式,含 义同上。 如 long a=135790; printf( %ld ,a); /* 此处不能用%d */,50,(2) c格式符 用来输出一个字符,当一个整数的值介于0255之间时,也可以用 %c形式输出,这时输出的是该整数(ASCII码)对应的字符。同样, 一个字符也可以以%d的形式输出,输出字符相应的码值. main() char c=a; int i=97; printf(%c,%dn,c,c); printf(%3c,%dn,i,i); 输出: a,97 _ _a,97,51,(3) 格式符 格式符用以
37、输出一个字符串 %s按实际长度输出字符串。 % m.ns,皆为整数,该形式输出的数据占列,且仅输出字符串中的前个字符,输出时左端补空,字符串向右靠。 也可以用%ms、% -ms、%-m.ns,其中m和“”的意义同前。 【例3.5】 main() printf(%2s,%6s,%-6.3s,%3.2s,abcd, abcd, abcd, abcd); 运行结果: abcd,_ _abcd,abc_ _ _,_ab,52,(4) f格式符 f格式符以小数形式输出实数。 %f整数部分原样输出,小数部分输出位(不全是有效数字). %m.nfm,n皆为整数,输出数据占列,小数位数为位, 数据向右靠,左端
38、补空,若省略,则整数部分原样输出,小数部分输出列。 %-.nf意义同%m.nf,数据向左靠,右端补空格。 【例3.6】 main() float f=123.456; printf(%f,%10.5f,%-10.2f,%.2f ,f,f,f,f); 运行结果: 123.456001,_123.45600,123.46_ _ _ ,123.46,53,1形式 scanf(控制字符串,地址表列); 其中控制字符串的组成同printf函数中的相应部分。 地址表列 ,即在变量名前加入一个取地址符” 输入:m=12,n=15,3.1.2 scanf(格式输入函数),54,(3) 用%c格式输入字符时,空
39、格字符和转义字符都作为有效字符输入. 如: scanf( %c,%c,%c, ,55,3. 格式说明 同printf函数一样,scanf函数的格式说明也是以“%”开头,以格式字符结束,中间可辅以附加字符. 见p31表3.3和表3.4。 现将格式说明中有别于printf函数的地方说明如下: (1) 输入实型数据时不能指定小数位数,如scanf( %7.2f , 若输入:12_345_67,则将12赋给a, 67赋给b。而%*3d对应的345则被跳过,不作存储。,56,3.2 字符输入输出函数 3.2.1 putchar(字符输出函数),作用:向终端输出一个字符,相当于printf( %c,参量)
40、。 形式为: putchar(参量); 其中参量可以是一个字符型或整型变量,字符常量,或一个转义字符,要注意的是,在调用该函数时,在程序开头要加入一条文件包含命令:#include stdio.h 【例3.10】 #include stdio.h main() int m=65; char a, b; a=O; b=K; putchar(m); putchar(n);putchar( 101 ); putchar(a); putchar(b); ,57,作用:从终端输入一个字符。 1. 形式: getchar() 该函数无参数,函数的值是从输入设备得到的字符。 如: ch=getchar();
41、 2. 说明: getchar函数得到的字符可以赋给一字符变量或整型变量,也可以只作为表达式的一部分,而不再赋给任何变量。如: putchar(getchar(); 该语句的作用是将从输入设备输入的字符在终端输出设备上显示出来。同putchar函数一样,在调用getchar函数时,程序前面也要包含一条预编译处理命令:# include stdio.h 【例3.12】程序: #include stdio.h main() char ch; ch=getchar(); ch=A ,3.2.2 getchar函数(字符输入函数),scanf( %c,58,3.3 小结 一格式输入输出函数printf
42、和scanf 注意事项: 格式输出函数printf 双引号内除“%格式符”以外,皆原样输出。 输出表列中的各个表达式的值若要正确输出,则要求双引号内必须有一个类型一致的格式符与之对应;若类型不对,则输出无定值;若格式符少,则列在后面的输出项不被输出。 多数系统在该输出函数中采用自右向左的顺序求输出表列中各个表达式的值。 使用该函数的输出形式灵活多样。如,可以通过附加控制符“+”、“-”和指定列宽共同控制对齐方式。如:“%-5d”代表数据占5列宽,且左端对齐。 函数的返回值为正常输出的输出的字符个数。,59,格式输入函数scanf: 地址表列中的地址可以是变量的地址、数组名、指针变量。 输入项要
43、与“控制字符串”中的格式符的个数相等、类型一致。 对整数可以指定系统按要求的位数截取所读入的数据,但对实数则不能规定小数位数。 双引号内除“%格式符”以外的部分也要原样输入,因此一般除分隔符外,建议不要增加其他内容,以简化输入形式。若无分隔符,对数值型数据而言,遇空白符(包括空格符、制表符、回车符)、遇指定的宽度、遇非法输入的数据(如:非数值型数据)等结束该数据的输入;对字符型数据而言,所有输入的数据都为有效的字符。 建议双引号内不要象输出函数一样经常使用 n,由于系统方面的原因,经常需要多输入一个数据方能结束。 “%*”表示跳过对应的输入数据项,即该数据项不被读入。 返回值为正常读入数据的个
44、数。,60,字符输入函数getchar() :该函数的作用是从标准输入设备(通常指键盘)输入一个字符。该函数无参数,函数的值是从输入设备得到的字符,可将其赋给一字符变量或整型变量,也可以只作为表达式的一部分,而不赋给任何变量。 如: ch=getchar();是将从输入设备输入的字符赋给字符型变量ch,等价于 scanf( %c, sum=a+b;又称为赋值语句 scanf( %d , ,4.1 基本语句 4.1.1 表达式语句,4.1.2 空语句,63,形式为: 语句组 作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成动作时,需要使用复合语句。 例如:当变量的值
45、比的值大时,交换两变量的值,可用如下语句: if (xy) t = x; x = y; y = t; 通常,把 定义或说明 语句组 这种分程序形式也归为复合语句。,4.1.3 复合语句,64,如: main() int m=2; int m=3; printf( %d ,m); printf( %d ,m); 其中:花括号括起来的部分是一个分程序结构,也归为复合语句。 在分程序结构中也可以定义变量,这些变量只在分程序结构内部有效. 语言提供两类选择控制语句: 种为if语句,实现n分支,要求n-1个表达式; 一种为switch语句,实现多分支;只用1个表达式.,4.2 选择控制语句,65,4.2
46、.1 if语句 if语句的三种形式: 1. if (表达式) 语句 当表达式为真(非0)时,执行表达式后面的语句,否则绕过该语句, 而执行其后面的语句。 如: if(xy) t=x; x=y; y=t; printf(min=%d,max=%d, x, y); 2. if (表达式) 语句1 else 语句2 当表达式为真(非0)时,执行语句1,否则执行语句2。 错例: if (xy) max = x; min = y; else,.,if (x0) printf(%f,x) else printf(%f,-x),66,3.if (表达式1) 语句1 else if (表达式2) 语句2 el
47、se if (表达式n) 语句n else 语句n+1,当表达式1的值为真(非0)时,执行语句1, 否则当表达式2的值为真时执行语句2, 依此类推,若表达式的值都为假,则执行 语句n+1。,【例4.1】将a,b,c三个实数按由小到大的顺序排列。 main( ) float a, b, c, t; scanf(%f %f %f, ,后两个if语句的次序交换,行否?,67,3. if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。 一般形式: if(表达式1) if(表达式11) 语句11 else 语句12 else 语句2 在if语句的嵌套形式中,为了增强程序的可读性,建议
48、采用锯齿型的书写形式。 C语言规定: else始终与它上面的最近的if语句配对。假如有: if ( ) if ( ) 语句1 else if ( ) 语句2 else 语句3,if ( ) if ( ) 语句1 else if ( ) 语句2 else 语句3,68,【例4.2】用if语句实现下面分段函数 程序段: if (x=0) if(x0) y=1; else y=0; else y=-1; 思考题:试对上述分段函数用一个表达式语句实现。,或者: y = -1; if (x=0) if (x0) y = 1; else y = 0;,错例: y=0; if (x=0) if(x0) y=
49、1; else y=-1;,69,C语言还提供了另外一种专门用于描述多分支选择结构的语句switch语句。 1. 形式: switch(表达式) case 常量表达式1: 语句组1 break; case 常量表达式2: 语句组2 break; case 常量表达式n: 语句组n break; default: 语句组n+1 ,4.2.2 switch语句,当表达式的值与某个常量表达式的值相等时,则执行该常量表达式后面相应的语句,若使用了break, 则执行完该语句后便退出switch语句;否则,还要依次执行其后面的各条语句。若找不到相匹配的常量表达式,则执行default后面的语句。,70,
50、如: switch (grade) case A : printf( 85100n ); case B : printf ( 7084n ); case C : printf ( 6069n ); case D : printf ( 60n ); default : printf (errorn ); 2. 说明: (1) switch语句中的常量表达式与表达式的类型要一致,要求为整型或字符型。 (2) 常量表达式的值要互不相同,但不同的常量表达式可以共用同一个语句组。 (3) 该语句通常与break语句联用,以保证多路分支的正确实现,break的作用是强制退出switch语句。 (4) 多个
51、case可以共用一组执行语句,如: case A : case B : case C : printf ( 6069n );,“case常量表达式”只是起语句标号作用,不是进行条件判断。,71,a=1; switch(a%5) case 0: printf(“%dt”,a+); case 1:printf(“%dt”,a+); case 2:printf(“%dt”,+a);break; case 3:printf(“%dt”,+a);break; 又如: switch(int)s/1000) case 0: case 1: case 2: ,错误: switch(s) case s=1000
52、,for (表达式1;表达式2;表达式3) 语句,前两种用于描述循环次数未知的循环, 而后者则用于描述循环次数已知的循环。,73,【例4.4】用上述三种循环语句,求s= main( ) int n,s; n = 1;s = 0; while (n=100) s=s+n; n=n+1; printf(s = %dn,s); ,main() int n,s; n = 1; s = 0; do s = s+n; n = n+1; while(n=100); printf(s=%dn,s); ,/* 花括号不能省 */,main( ) int n, s; for (n = 1,s = 0;n=100;
53、n+) s=s+n; printf(s=%dn,s); ,while语句:,do-while 语句:,for语句:,74,使用while语句和do-while语句应注意: 1.循环体若包含一个以上的语句,应用花括弧括起来,以复合语句出现. 2.若循环体中没有使用break语句强制退出,则循环体中应包含使循环 条件改变的语句. 3.循环语句开始之前,对必要的变量赋初值。 使用for语句几点说明: 1. for语句可理解为:表达式1用来对循环变量赋初值,表达式2代表 循环条件,表达式3对循环变量进行增、减的修正. 2. 表达式1和表达式3可以是逗号表达式. 如: for(sum=0,i=1;i=1
54、00;i+)sum=sum+i; for(i=0,j=10;i=j;i+,j-)k=i+j; 3. 三个表达式都可以省略,但分隔这三部分的分号不能省略. 如: for( ;i=100;i+) sum=sum+i;,75,i=1; while (1) sum=sum+i; i+ ;,for(i=1; ;i+) sum=sum+i;,for (sum,i=1;i=100; ) sum=sum+i; i+;,for ( ; i=100; ) sum=sum+i; i+;,while (i=100) sum=sum+i; i+;,for ( ; ; )语句 while(1) 语句 4. 表达式2也可以
55、是数值表达式或字符表达式,只要其值为非零, 就执行循环体. for (i=0;(c=getchar()!=n;i+=c); /*ex4_1_1 */,76,循环的嵌套:循环体内包含另一个完整的循环结构.三种循环语句 皆可以互为内嵌语句。以下形式的循环被称为二重循环。 例如: while() while() ,for(;) while() ,例: main() /* ex4_1_2 */ int i,j; for (i=1;i10;i+) for (j=1;j10;j+) printf(%dt,i*j); printf(n); ,外循环控制变量每变化一次, 内循环就要被执行若干次。,77,还可以
56、用无条件转移语句goto及if语句来实现循环。 形式: goto 标号; 标号的命名规则同标识符。 goto语句的作用是将程序控制转到标号对应的语句处。 例: main() int n, s = 0; n = 1; loop:if (n=100) /* loop为标号*/ s = s+n; n+; goto loop; printf(%dn, s); ,注意: goto语句只能从循环体内跳到循环体外, 但不能从循环体外转到循环体内。,78,break语句有两个作用: 其一是用于switch语句中,保证多分支情况的正确执行; 其二是用于循环语句中,强制终止本层循环(跳出本层循环)。 Contin
57、ue语句只能用于循环语句中, 不同于break语句的是它并不终止本层循环, 而只是绕过本次循环,强行进入下一次循环, 即它只能跳过循环体中continue后面的语句。 分析下面两个例子:,break语句和 continue语句,例4.5: main( ) int m; for(m = 0; m10; m+) if (m = = 5) break; printf(%dn, m); ,main( ) int m; for (m = 0; m10; m+) if (m = = 5) continue; printf(%dn, m); ,79,4.4 程序举例 例4.5: 求Fibonacci数列的前40项.即: F1=1 (n=1) F2=1 (n=2) (n 3),main() long int f1,f2; int i; f1=1;f2=1; f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 代工外包合同标准文本
- 保利地暖合同标准文本
- 乔木购销合同标准文本
- 二零二五版厂区租赁协议书
- 二零二五公司内部合伙投资协议书
- 个人茶地出租合同样本
- 二零二五版人投资入股协议书
- 个人租房合同样本首
- 保险投保合同标准文本
- “像”-与-“不像”05年度美术教案
- 供应室的质量改进课件
- 机械公司产品销售合同签订评审申请表
- 统信UOS桌面版系统产品白皮书
- 年产1000吨甲壳素项目环评报告书
- 摄影培训教学课件:摄影用光
- 食品从业者工作服清洗消毒记录
- 化妆品经营使用单位现场检查表
- 骨料检测知识培训讲义
- DB33∕T 2387-2021 外贸综合服务企业服务规范
- 农药经营许可管理制度
- 通用精美电子小报模板(35)
评论
0/150
提交评论