《谭浩强C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《谭浩强C语言程序设计.ppt(329页珍藏版)》请在三一办公上搜索。
1、主讲教师:刘 丹,C程序设计,C语言程序设计,第一章第二章第三章第四章,第五章第六章第七章,第一章 C语言概述,C语言 既可作为系统软件的程序设计语言,又可作为应用软件的程序设计语言。,尤其是当今计算机应用极为广泛,软件的设计、编写质量要求高,经常与硬件部分打交道,如:界面设计等,所以用C语言编写是最理想的。因而C语言也是当前计算机语言中用得最广泛的语言之一。,1.1 C语言出现的历史背景,一、操作系统的设计语言,O.S.操作系统,为用户使用计算机提供一个操作环境:系统命令、语言编程等。,如:DOS.UNIX,以前:O.S.软件用汇编指令编写。汇编语言:一种二进制指令代码的符号表示,既繁琐,又
2、易出错,可读性差。,改进:用C语言编写,既提高了程序的可读性,又可与硬件打交道。,二、发展过程,1960年出现了Algol60语言,但该语言主要面向问题,与硬件较远,故英国剑桥大学推出了CPL(Combined Programming Language),1967年,Matin Richards对CPL进行改进、简化、推出了BCPL(Basic Combined Programming Language),1970年,美国贝尔实验室Ken Thomson 以BCPL为基础,再次简化推出了B语言,并写了第一个UNIX系统。,美国贝尔实验室D.M.Ritchie 在B语言基础上设计出了C语言,并用
3、其将UNIX系统全部改写并实现。,经进一步改进,至1977年出现了与具体机器无关的C编译文本,从而使C语言广泛应用,各种机器皆可使用。,1978年,美国Brain W.Kernighan与Dennis.M.Ritchie 联合出版一书The C Programming Language成为 ANSI C之基础。,1983年,美国标准化协会(ANSI)制定了ANSI C。,ANSI C 为基础:,不同机器有不同版本,尤其是函数均应参考相应的机器。,1.2 C语言的特点,只有通过学习,方可理解C之特点,先简叙之:,1.简洁、紧凑、方便、灵活 32个关键字,9种控制语句,主要用小写字母,压缩一切不必
4、要成分,2.运算符丰富 除了最基本的、%等运算外,还将括号、赋值、类型强制转换等均作为运算符,共有34种运算符。,3.数据结构丰富 除基本类型外,有指针,结构体、共同体等类型。,4.具有结构化的控制语句 模块完整,控制中的语句可完整化。,5.语法严格,但有灵活性 如:数据类型可相互通用:整型、字符型通用。,6.可与机器硬件打交道,直接访问内存地址,具有“高”、“低”级语言之功能。,7.生成目标代码质量高,执行效率高。,8.可移植性优于汇编语言。,1.3 简单的C程序介绍,为了更好、更快地掌握C程序,我们先看几个C语言程序:,例1.main()printf(This is a c program
5、n);,例2.main()/*求两个数之和*/int a,b,sum;/*这是定义变量*/a=123;b=456;sum=a+b;printf(sum is%dn,sum);,例3.main()/*主函数*/int a,b,c;/*定义变量*/scanf(%d,%d,)/*输出c的值*/,int max(x,y)int x,y;/*对形参x、y作类型定义*/int z;/*max函用到的变量z,也要加以定义*/z=y;if(xy)z=x;return(z);/*将z的值返回,通过max带回调用处*/,通过分析,初步看到:1.C程序全部由一个一个的函数构成。至少有一个主函数main(),其它函数
6、可被主函数调用或相互调用。其它函数可为C 函数库中函数,也可为自己编的函数。,上述特点称为程序的模块化.,2.函数的构成:函数说明+函数体,函数体:变量定义与执行语句,可允许空函数:dump(),函数说明包括:函数名、类型、属性、参数等,3.函数的执行一定从main()开始。尽管main()函数位置可自由。,4.书写自由,一个语句可多行,一行可多个语句。,5.每一条语句必须有一个分号;,6.C语言的输入/出均以函数形式出现。scanf(),printf().,7.可用/对C语言加注释,主讲教师:刘 丹,第二章 数据类型、运算符与表达式,2.1.数据类型,著名计算机科学家沃思提出:程序数据结构算
7、法,所以,存放数据的方式直接反映了一种语言的数据表达能力。数据的存储方式又称之为:数据类型。,举 一个例子:以考生各科成绩及总分排队问题为列。成绩的存放 以数组形式 排队方法 算法,前面已述.C数据类型丰富,分为:,基本类型,构造类型,指针类型,空类型,整型,字符型,实型,单精度,双精度,数组,结构体,共用体,数据有常量、变量之分,均为其中一种类型。,本章先学习基本类型。,枚举,2.2 常量与变量,2.2.1 常量和符号常量,常量 程序运行过程中不能被改变的量。,一般的数据显式写法均表示常量。如程序中:20 整型常量 15.8 实型常量 a 字符常量,例:#define PRICE 30 ma
8、in()int num,total;num=10;total=num*PRICE;printf(total=%d,total);,还可用一个符号表示一个常量 符号常量,符号常量(一般用大写,以区分变量),再如:=3.1415629#define PAI 3.1415629,#define PRICE 30,2.2.2变量,程序执行中可以改变的量称为变量。变量包括变量名和变量值。,变量名 用标识符命名,对应一定数量的内存存贮单元,其单元数视变量类型而定。,标识符 由字母、数字、下划线组成且由字母或下划线开头的字符串。,标识符可用来命名变量及作为常量名、函数名、类型名、文件名等,一个程序内不得有重
9、复名。如:_sum,sum,student_name,price等,习惯上,变量名、函数名等用小写字母表示。常量名用大写字母表示(以增加可读性)。,另:需注意标识符长度,视不同系统而定。设允许8个字符。则:student_ name student_ number为同一名字。,C语言中,变量须先定义,后使用 如:int student student=30;则若写成student=30,则未定义,编译时指出其错。,一旦变量被定义,即可在编译时为其分配相应数量的单元。,一旦变量被定义,其类型便确定。则可检查其运算的合法性。,如:a%b 表示a整除以b的余,则a,b必须为整型量。,2.3整型数据,
10、2.3.1 整型常量,整型常量 整型常数,C语言提供了三种形式 十进制 如:256,308,120等,八进制 以数字0开头表示的整数 例:0235,0146 012等.0235=28238515710 014618248610210 012(182)1010,十六进制 以0 x开头的整型数 如:0 x16,0 x28,2.3.2 整型变量,一、分类:分为四种:基本型、短整型、长整型、无符号型,2.短整型:用short int或 short定义,3.长整型:用long 或 long int 定义,1.基本型:用int定义,4.无符号型:不存放符号,则不带符号数.,又分无符号整型,无符号短整型,无
11、符号长整型。,上述各种类型所占内存单元数及取值范围视不同机器而不同。详见P13。,二、定义方法 整型变量分别以下列方式定义,2.短整型 short int 或 short a,b,c;,3.长整型 long int 或 long a,b,c;,1.基本整型:int a,b,c;,4.无符号型 unsigned a,b,c;unsigned short a,b,c;unsigned long a,b,c;,例:main()int a,b,c,d;/*指定a,b,c,d为整型变量*/unsignd u;/*指定u为无符号整型变量*/a=12;b=24;u=10;,c=a+u;d=b+u;print
12、f(a+u=%d,b+u=%dn,c,d);,由此看到:不同类型的整型数据可进行算术运算。但有一定规则,见2.7.,运行结果为 a+u=22,b+u=14,三、关于整型常量 程序中出现的整型常数,系统按以下规则分配变量(内存单元)或赋值给相应变量,2.若超越,而在21474836482147483647之间,则可赋给 long int 变量。,1.当常数(量)在 3276832767之间,则可赋给int,long int 变量。,4.一个非负整数32768 则可赋给 unsigned int。,5.一个常数后加 l,或L,表示长整数.如123l.主要用于函数调用时形、实参数传递。,3.若int
13、,short int 长度相同,则二者皆可赋值。,2.4 实型数据,2.4.1 实型常量,有二种表示形式 1.十进制形式 如:0.126,523.64等,2.指数形式 对于较大或较小的数,可用指数形式 0.0000126 1.26E 5 1260000 1.26E+6 或1.26E6 E,e 均可.,分为单精度型与双精度型.分别为 float x,y,z;(单精度)double a,b,c;(双精度),一般地:单精度占4字节内存单元;双精度占8字节内存单元.,2.4.2 实型变量,注意:不同机器对实型变量的有效数字长度的限制 如:pc机,单精度一般为7位,双精度15位,单精度数值:103810
14、38双精度数值:1030810308,于是:float a;a=123456.789 则实际赋值a123456.7,2.5 字符型数据,用一对单引号括起来的单个字符。如 a,A,二者不一样.,此外,以 开头后接一个字符或n个字符代表了一种特殊字符常量。转义字符。如 n 换行,r 回车,2.5.1 字符常量,其它如下表:,字符形式,n,t,v,b,r,f,ddd,xxh,功能,换行,横向跳格(即跳到下一个输出区),竖向跳格,退格,回车,走纸换页,反斜杠字符“”,单引号(撇号)字符,1到3位8进制数所代表的字符,1到2位16进制数所代表的字符,注意:表示ASCII码字符,三位八进制,如 101 表
15、示字母A,又:x 十六进制ASCII 字符 x 41 表示字母A,其定义方式为:char c1,c2;c1=A;c2=B;字符变量只占一个字节单元。,2.5.2 字符变量,用来存放一个字符的变量.,一个字符存入一个字符变量。其对应单元存放的是其ASCII码,即ASCII码的二进制形式。,由此:字符变量中的数据是一整型数据。输出时既可输出字符,亦可输出整数,且字符变量可作整数运算。,2.5.3 字符数据的实际存放形式,例1:main()char c1,c2;c1=97;c2=98;printf(%c%c,c1,c2),运行结果 a b,看如下几个例子:,例2:main()char c1,c2;c
16、1=a;c2=b;c1=c1 32;c2=c2 32;printf(%c%c,c1,c2),运行结果 A B,例3:main()int i;char c;i=a;c=97;printf(%c,%d n,c,c);printf(%c,%d n,i,i);,运行结果:a,97 a,97,有的系统将一个字节的整型变量的最高位,作为符号。这时对0127之间的字符可输出正整数(ASCII)。但128255字符最高位为1,则作为负数输出。,由此最好用unsigned int 存放字符整数(ASCII)。,注:,用双引号括起来的字符串。例:Good Morning!注意A 与A是不同,字符串存放时,在最后加
17、上/0 空字符。于是:,Good Morning!/0,2.5.4 字符串常量,A,A/0,但A,A,注意:1.字符串长度=实际字符个数+1,但最后0不输出.printf(Good Morning!),此处不写/0。自动加上。,2.单个字符的字符串不能赋给字符变量。例:char c;c=a;是错误的。,2.6 变量赋初值,C语言允许定义变量时赋予初值。如:int i=6;float x=8.35;char c=6;,*也可对某个变量赋初值:int a,b,c=6;,*不可能将同初值的变量赋初值时写成:int a=b=c=6;只能:int a=6,b=6,c=6;,定义变量时赋初值实际上是在运行
18、时执行一个赋初值语句:int a=6;相当于:int a;a=6;,2.7 类数值型数据间的 混合运算,C语言允许双精度、单精度、整型及字符数据之间混合运算 10+a+1.58765.1234 b是允许的。,但有一个规则:先转换成同一类型,再计算。,double float,高低,图中“”表示必定转换。如a+b,先转换为int。结果为 int。,转换方法:,long,unsigned,int char,short,即:既使是同一种类型也按 转换。,图中“”:表示低,高型数据运算时,均先转换为高型。,例:10+a+if d/e,其中:i int f float d double e long,1
19、0+a:转为int,结果为int,if:转为double,结果为double,+:转为double,d/e:转为double,转为double,则运算时:,2.8 算术运算符与 算术表达式,运算符:运算的符号表示。C语言有丰富的运算功能,先简述之,2.8.1.C运算符,1.算术运算符+,/,%,等,3.逻辑运算符!,&,2.关系运算符,=,=,!=,4.位运算符,&.,5.赋值运算符=等,6.条件运算符?等,7.逗号运算符,8.指针运算符*,&,11.分量运算符,12.下标运算符,13.其它运算符 如函数的调用(),9.求字节数运算符 size of,10.强制类型转换运算符(类型),2.8.
20、2 算术运算符和算术表达式,一、基本算术运算符,+加法 正值 3+6,+3,减法 负值 6 4,5,乘法 38,/除法 8/5,%求余 7%4 的值为3,注:两个整型数据相除(结果为整,一般向零靠拢)。5/3 1,“/”中,有一个 float,则结果为double型,使用时千万注意 int/int 出现数据丢失。,二、算术表达式及算术运算符的优先级与结合性,运算对象:常量、变量、函数等,优先级:(),/,%,+,结合性:同一优先级,自左向右,为左结合性,反之为右结合性。,例:a b/c 1.5+ad e,当类型不同的数据进行运算时,按2.7介绍的类型转换。,算术表达式:用算术运行运算符和括号将
21、运算对象连接起来,且符合C语法规则的式子。,三、可利用强制类型转换运算符将一个算术表达式转换为所需类型,形式:(类型名)(表达式),例如:(double)a 将a转换为double,(int)(x+y)将x+y转换为int,(float)(5%3)将5%3转换为float,注:1.括号不能省略。如:intx 会理解为变量intx.,2.转换后的类型数据由系统分配一个中间变量存放,而原变量类型不变。float x;,又如:(int)(x+y)若省略:(int)x+y会变成将x转成整型.,(int)x;则x本身仍为实型,而(int)x由一个中间变量(整)存放x的整数部分。,例:main()floa
22、t x;int i;x=3.6;i=(int)x;printf(x=%d,x,i);,则:x=3.600000,i=3.,总结以上类型转换,有二种:1.强制,另:强制类型转换运算优先于算术运算符.,2.系统自动,如:若x为float,则x%3不合法。但可用(int)x%3来解决。(附录III介绍了优先级),四、自增,自减运算符,设有int i=3;,+自增1,自减1,则:+i,i+都会使i变为4,但有区别:,+i:先使i值+1,再使用i值;,i+:先使用i值,再使i值+1.,j=+i;j=4,i=4.(i=i+1;j=i;),j=i+;j=3,i=4.(j=i;i=i+1),同理:i,i,均使
23、i值1,但:,又如:printf(i=%dn,i+);结果:i=3,若:printf(i=%dn,+i);结果:i=4,i:先使i值1,再使用i值;,i:先使用i值,再使i值1,i=3;,几点注意:1.+和 运算法只能用于变量,不得用于常量和表达式.,2.+,的结合性为从右至左,而一般算术运算符为从左至右。如:,如 5+,(a+b)+均为不合法.,i+和+为同一优先级.,i+相当于(i+),若 i=3,则结果为3,i为4.+,主要用于循环变量自增或自减。,1.要慎用+、运算符。,五、有关表达式使用中的问题说明,则:先对i进行3次自加,为6,然后三个i相加为18,而i为6。,如:表达式(i+)+
24、(i+)+(i+)(i=3)一般认为:从左至右:3+4+5=12,i6.,但Turbo C.MSC 都是先取三个原值相加:i+i+i=9 i6,如果表达式数为:k=(+i)+(+i)+(+i),2.在表达式中,有的运算符为一个字符,有的为两个字符。,3.在函数调用时,如:,一般地:自左至右尽可能多地将若干字符组成一个运算符。,例:i+j,究竟理解为(i+)+j还是i+(+j)?,printf(%d,%d,i,i+);,若i=3,若参数计算从左至右,则输出 3,3,若从右至左,则输出4,3,上述问题看似复杂,最好上机实践.,2.9 赋值运算符和 赋值表达式,符号=为赋值运算符。,2.整型数据赋给
25、实型变量,数值不变,但按实数形式存放.,1.将实型数据(无论单,双精度)赋给整型变量时,舍弃小数.,赋值时,两边类型若不一致,则按以下规则转换:,4.将intlong int,进行符号扩展。即:符号扩展,低16位long 的低16位。,5.long int int 则高16位截断。,3.字符型数据赋给整型变量时:,(2)字符带符号整型变量,则字符高位扩展。,(1)字符无符号整型变量,则存入低8位,高8位补零。,6.将unsigned int 型long int高位补0。,原值传送,但数据大小不能超值。如:unsigned int a=65535;int b;b=a;则越界。,而位数相同部分赋值
26、 unsigned int int unsigned long long unsigned short short,7.非unsigned 型长度相同的unsigned型数据,原样传送(包括符号位),一、复合赋值运算符:在 号之前加一个其它运算符。,C语言规定:凡是二目运算符均可构成复合运算符。,例:a+=3;相当于 a=a+3 x=y+8;相当于 x=x(y+8)x%=3;相当于x=x%,一般形式:,二、赋值表达式,例:x=10 为一赋值表达式 其中又可以是一个赋值表达式。,例:x=(y=10)相当于 y=10;x=y 由于赋值号为右结合性,于是()可省略,即为:x=y=10;,例:a+=a
27、=aa(设a12),又:a=5+(c=6)c=6,a=11 a=(b=4)+(c=6)b=4,c=6,a=10 a=(b=10)/(c=2)b=10,c=2,a=5,进一步,还可用复合赋值运算符作下列运算:,步骤:aa144.a=a a a=a a a=12 144=132 a+=132 a=a+(132)=264,2.10 逗号运算符和逗号表达式,一般形式:表达式1,表达式2,其计算规则:先计算表达式1,再计算表达式2,最后值为表达式2的值。,例:a=35,a 4 则:先计算3 5,a15,a 4=60,结果为60。,又如:(a=35,a 4),a+5,扩展形式:表达式1,表达2,表达式n,
28、结果为20(作为逗号表达式的值),a+5a 即 20a.,3 5=15a,a 4=60(此时a值仍未变),结果为表达式n的值,注意:x=(a=3,63)赋值表达式,x18;,x=a=3,6 a 逗号表达式,x3.,逗号表达式主要用于某些语句中需一次计算多个表达式值的情况。如在循环语句中。,函数调用中的实参之间虽然用的是逗号间隔,但不是逗号表达式。如:printf(%d,%d,%d,a,b,c);,主讲教师:刘 丹,C 程序设计,第三章 最简单的C程序设计,3.1 C语句概述,C语句全部为可执行语句,对应若干机器操作指命令,C程序由许多源文件组成。(分别编译,然后连接),每一个源文件由预编译命令
29、和若干函数组成。,每一个函数由说明部分和语句部分组成。,其结构如图,除说明部分外,重要部分为语句部分。,C程序,源程序文件1,源程序文件i,源程序文件n,预编译命令,函数1,函数n,说明部分,执行部分(语句),C 语句分为五类,1.控制语句改变语句的执行顺序,共有9种控制语句:,if()else(条件),for()(循环),while()(循环),do while(循环),continue(结束本次循环),switch(多分支选择),break(中止整个循环),goto(转移),return(函数返回),()表示条件,表示语句,2.函数调用语句,3.表达式语句,printf();,表达式加;如
30、:i=i+1;i+;x+y;其函数调用也可理解为表达式语句.,5.复合语句,4.空语句,;任何事情都不做.,用 括起来的一系列语句。如:z=x+y;t=z/100;printf(%f,t);,3.2 程序的三种基本结构,从结构化程序设计角度出发,程序有三种结构:,顺序结构,选择结构,循环结构,1.顺序结构,表示,先执行A,再执行B.,2.选择结构,表示为,存在某条件P,若P为真,则执行A,否则执行B。,3.循环结构,表示为,(1)当型结构 当P条件成立时(T),反复执行A,直到P为“假”时才停止循环.,有两种结构:当型和直到型,(2)直到型,先执行A,再判断P,若为F,再执行A,如此反复,直到
31、P为T.,另外:由选择结构可以派生出另一种基本结构多分支结构.,已证明:上述三种结构组成的程序可以解决全部的问题,所以任何一种高级语言都具备上述三种结构。,3.3 赋值语句,由赋值表达式加分号;构成,与其它高级语言相比有以下不同点:,“=”为一运算符,由此,构成一赋值表达式,可出现于表达式能出现的任何地方:,if(a=b)0)t=a;,3.4 数据输出,前面已论述:C语言本身无输入/出语句,由函数实现,如printf.等。,一般:C语言提供了一些标准的输入/出函数系统函数。,形式:putchar(c);,功能:向终端(一般为显示器)输出一个字符,其中c为 字符型或整型变量,注意:用该函数时,须
32、用预编译命令:#include stdio.h,3.4.1 putchar 函数 字符输出函数,举例:#include stdio.h main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(C);,结果:BOY,putchar(a);putchar(n);putchar(b);putchar(n);putchar(c);putchar(n);,*利用putchar还可输出其它转义字符,结果:B O Y,putchar(101);输出A,putchar();输出,putchar(015);输出,*若将最后一行改为:,3.4.2 pr
33、intf 函数格式输出函数,一、printf的一般形式,是C语言中使用得最多的一种输出函数,它可一次按格式输出多个不同类型的数据。,printf(格式控制序列,输出表列);,输出表列 用“,”号隔开的变量或表达式序列,其变量的值按对应的格式控制符所指定的格式输出。,格式控制序列用双引号“.”括起来的格式符序列。,格式控制序列由格式说明符和普通字符组成。,2.普通字符 原样输出,1.格式说明符:由%接格式字符组成 如:%f,%d等,例:a=3;b=4;printf(a=%d,b=%d,a,b);,结果:a=3,b=4,无论 a,b中位数多少,均为上述形式:,a=123 b=45,二、格式字符,如
34、直接用%d,则将出错。,不同类型的数据输出,用不同格式字符:,1.d格式符十进制整数输出。,(1)%d:按数据的实际长度输出。,(2)%md:m表示输出字段宽度。若实际位数m,左边补空格。,(3)%ld:输出长整数,如要指定宽度,则用%mld即可。,例:long a=1234567;printf(%ld,a);,2.o格式符 按八进制形式输出.,以1的补码形式,int a=1;printf(%d,%o,a,a);,则输出结果:1,177777,注:连符号位一起组成八进制数输出,特例:1存于int单元,如以长整型输出,在%加l,也可指定宽度m,%mo,3.x格式符以十六进制形式输出整数.,例:i
35、nt a=1;printf(%x,%o,%d”,a,a,a),输出结果:ffff,177777,1,例:main()unsigned int a=65535;int b=2;printf(a=%d,%o,%x,%un,a,a,a,a);printf(b=%d,%o,%x,%un,b,b,b,b);,a=1,177777,ffff,65535,a=65535,b=2,4.u格式符无符号格式输出整数.,b=2,177776,fffe,65534,运行结果为:,5.c格式符输出一个字符.,注:若有一整型变量,其值在0255之间,则可以字符形式输出.,一个字符型变量亦可以一个整型数据输出.,char
36、c=a;printf(%c,c);,例:main()char c=a;int i=97;printf(%c,%dn,c,c);printf(%c,%dn,i,i);,运行结果为:a,97 a,97,也可以指定输出字符宽度,如果有,则输出:a,即c变量输出占3列,前2列补空格.,print(%3c,c),6.s格式符用来输出一个字符串.,(1)%ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若串长小于m,则左补空格。,允许一定的编辑即允许%ms,%ms,%m.ns,%m.ns四种形式,每一形式的意义如下:,例:printf(%s,CHINA);,结果:CHI
37、NA,(3)%m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。,(4)%ms,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果nm,则m自动取n值,即保证n个字符正常输出。,(2)%ms,如果串长小于m,则在m列范围内,字符串向左靠,右补空格。,7.f格式符以小数形式输出单、双精度实数,有以下几种形式:,%m.nf,指定输出的数据共占m列,其中有n位小数。如果值长度小于m,则左端补空格。,%mn.f,与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。,%f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。
38、,%f%m.nf%m.nf,8.e格式符以指数形式输出单,双精度实数基本形式:%e,结果:1.23456,共13列,6例,5例,可有%m.ne和%m.ne的形式,9.g格式符根据实数大小自动选择f格式,或e格式输出单双精度实数。,e+002,例:printf(%e,123.456),表3.1 printf格式字符总结,许多情况与具体机器或系统有关,最好机器上一试。,表3.2 附加格式说明字符,3.5 数据输入,系统提供了若干函数,以提供从标准输入设备(键盘)上输入数据.,3.5.1 getchar 函数,本节先介绍两个输入函数.,形式:getchar(),功能:从标准输入装置(键盘)上输入一个
39、字符,要求:有#include stdio.h预编译命令,例:#include stdio.h main()char c;c=getchar();putchar(c);,3.5.2 scanf函数,功能:在标准输入装置(键盘)上按指定格式 输入各种类型的数据,地址表列变量的地址或字符串首地址。,形式:scanf(格式控制序列,地址表列),格式控制序列同printf(.),例:main()int a,b,c;scanf(%d%d%d,运行,机器等待你输入:3 4 5,结果 3,4,5,注意:1.scanf函数顺用地址量接受数据。,2.输入数据的间隔为,Tab.空格,不能为“,”.,3.允许在格式
40、符中插入附加字符。格式字符及附加字符的定义如下表3.3和表3.4,表3.3 scanf格式字符,表3.4 scanf附加的格式说明字符,4.对于输入unsigned型数据,不用%u,而用%d,%o,%x.,5.指定数据长度时,系统自动截取。,则当输入123456时,scanf(%3d%3d,a12,b34,7.输入数据不能规定精度.,6.在%后加“*”表示跳过相应的数据,则当输入为12 345 67,则a12 b67,scanf(%2d%*3d%2d,scanf(%7.2f,是错误的,8.在格式控制中除格式说明符外若还有其它字符,则应按顺序原样输入。,例:scanf(%d,%d,则必须输入 2
41、1,28,又如:scanf(a=%d,b=%d,c=%d,则输入:a=34,b=58,c=100,3.6 程序举例,例1:输入三角形三边,求三角形面积。,例2:输入一个大写字母,要求系统改为小写字母输出。,例3.当b24ac0时,求ax2+bx+c=0的两个根。,主讲教师:刘 丹,在C程序的三种结构中,分支结构是一重要结构,其中的P为条件,第四章 逻辑运算和判断选取控制,问题:条件如何表达?逻辑运算、关系运算,4.1 关系运算符,关系运算比较运算,如:a3为一比较运算,当a=5,a3成立。结果称为“真”,否则,如:a=1,a3不成立,为假。,上述表达式a3称为关系表达式。,4.1.1 关系运算
42、符及其优先次序,1.,=为同一优先级,=,!=等为同一优先级,但前者高于后者。,2.关系运算符优先级低于算术运算符。,C语言提供了六种关系运算符=!=,优先级为:,3.关系运算符优先级高于赋值运算符。,如下图:,举例:ca+b c(a+b),ab!=c(ab)!=c,a=bc a=(bc),a=bc a=(bc),4.1.2 关系表达式,关系表达式的结果值规定为1或0.,如:ab,a+bb+c,(a=3)(b=5),a b,(ab)(bc),完整的定义:用关系运算符将两个表达式(算术、关系、逻辑、赋值、字符等表达式)连接起来的式子。,1 结果为真(成立),0 结果为假(不成立),如:当a=3,
43、b=2,c=1时,(ab)=c 成立 1,b+ca 不成立 0,d=ab 则ab值为1,所以d=1.,f=abc ab为1,abc为0,所以f=0.,4.2 逻辑运算符和逻辑 表达式,用逻辑运算符将关系表达式、逻辑表达式连接起来的式子逻辑表达式。,4.2.1 逻辑运算符及优先级,三种:&(与),(或)!(非),其意义见真值表,a&b 当a,b均为1时,才为1,a b 当a,b中有一个为1时,才为1,!a 当a为1,!a为0,反之为1.,由此看到:和&为双目运算符.!为单目运算符。,优先级定义:,2.&和低于关系运算符。!高于算术运算符,1.!(非)优先于&(与).&优先于,即:!&,例:!a&
44、b xy&c(!a)&b)(xy)&c),4.2.2 逻辑表达式,1.逻辑表达式的值与关系表达式值一样,真为1,假为0。,例:a=4 则!a 值为0.此处只要a 0,为真.则!a值为0.,a=4,b=5 a&b为1,前面已定义了逻辑表达式,以下看一看逻辑表达式的值及具体的运算。,4&0 2 为1.,总之,在逻辑运算中,非0值参加逻辑运算时被看成1处理.,a=4,b=5 a b为1,a=4,b=5!a b为1,2.一个逻辑表达式中的逻辑运算符并不是一定全部执行.,一个实际的例子:判断年号是否为润年。,如:a&b&c.则当a=0(假)时,b,c不需判断。当a=1,b=0,则不需判c.,又如:a b
45、 c.当a=1时,b,c均不必判别。,润年的定义:,能被4整除且又能被400整除。,年号能被4整除但不能被100整除。,当(year%4!=0)(year%100=0&year%400!=0)为1时,year为非润年。,设用变量year表示年号,当(year%4=0&year%100!=0)year%400=0)为1时,year为润年,否则为非润年。,如果要判别非润年可在上述表达式前加非(!)运算符.,当!(year%4=0&year%100!=0)year%400=0)为1时,year为非润年。,或者:,即:,则:,4.3 if 语句条件判断,4.3.1 if的三种形式,功能:当表达式值非0
46、时,执行语句A,否则不执行语句A.,例如:if(xy)printf(%d,x),形式1 if(表达式)语句A,其流程图:,形式2 if(表达式)语句A else 语句B,功能:表达式为非0,执行语句A 表达式为0,执行语句B,例:if(xy)printf(%d,x);else printf(%d,y);,形式3 if(表达式1)语句1,else if(表达式2)语句2,else if(表达式3)语句3,else if(表达式n)语句n,else 语句n,流程:,表达1,表达2,表达3,表达n,语句1,语句2,语句3,语句n,语句n,语句1,0,=0,=0,0,0,0,如:if(3)prinft
47、(o.k);if(a),1.表达式可以是逻辑、关系,甚至是算术表达式。,2.上述形式中的语句必须以分号结束,3.上述形式中的语句可以是由 括起来的复合语句。此时,在 外可以不用分号.,注意的问题:,main()float a,b,t;scabf(%f,%f,例4.1 输入两个实数,按代数值由小到大次序输出这两个数。,3.6,3.2 3.20,3.60,运行情况如下:,例4.2 输入三个数,按大小顺序输出。,main()float a,b,c,t;scanf(%f,%f,%f,if(bc)t=b;b=c;c=t;printf(%5.2f,%5.2f,%5.2f,a,b,c);,运行情况如下:,3
48、,7,1 1.00,3.00,7.00,4.3.2.if语句的嵌套,if(表达式1),内嵌if,else,内嵌,注意:else与最近的if 配对.,一般形式,在上述形式的if语句中,又可以是if语句称为嵌套。,if(表达式2)语句1,if(表达式3)语句3,else 语句2,else 语句4,例:if(),if()语句2else 语句3,if()if()语句1 else,所以:必要时加.,if()语句1else,例4.3 有一函数,y=,1(x0),编一程序,输入一个x值,输出y值。,有以下几种写法,请判断哪些是正确的?,程序1:main()int x,y;scanf(d,if(x0)y=1;
49、else if(x=0)y=0;else y=1;printf(x=%d,y=%dn,x,y);,程序2:将上面程序的if语句改为:if(x=0)if(x0)y=1;else y=0;else y=1;,程序3:将上述if语句改为:y=1;if(x!=0)if(x0)y=1;else y=0;,程序4:y=0;if(x=0)if(x0)y=1;else y=1;,4.3.3 条件运算符,C语言提供了一个简单的条件赋值语句或条件表达式。,问题:当判断条件不论是“真”是“假”,均给同一变量赋值时,能否简化语句书写?,条件运算符为?:三目运算符。,功能:先判表达式1,若非0,则值为表达式2的值,否则
50、为表达式3的值。,一般形式,表达式1?表达式2:表达式3,max=ab?a:b;当ab.max a.否则maxb,注:1.条件运算符优先于赋值运算符.例:max=(ab?a:b)可去掉(),2.条件运算符低于关系运算符和算术运算符。例:max=ab?a:b+1 max=ab?a:(b+1)并不是 max=(ab?a:b)+1,3.条件运算符结合性为从右至左.如:ab?a:cd?c:d 相当于 ab?a:(cd?c:d),4.条件表达式不能取代一般的if语句,只有当if 的两 个分支为给同一变量赋值时才可替代if.,if(ab)printf(%d,a);else printf(%d,b),由于p