《二级C之数据的输入输出.ppt》由会员分享,可在线阅读,更多相关《二级C之数据的输入输出.ppt(65页珍藏版)》请在三一办公上搜索。
1、第二章 基本数据类型及 数据的输入输出,2.0预备知识2.1标识符、常量与变量2.2数据类型2.3运算符和表达式练习与实践,2.0 预备知识计算机中数的表示及进制转换数码、基与权数码:表示数的符号基:数码的个数权:每一位所具有的值数制,十进制:4956=410+910+510+610,二进制:1011=12+02+12+12,十六进制:81AE=816+116+1016+1416,八进制:4275=48+28+78+58,各种进制之间的转换二进制、八进制、十六进制转换成十进制方法:按权相加,各种进制之间的转换(整数)二进制、八进制、十六进制转换成十进制方法:按权相加,十进制转换成二进制、八进制
2、、十六进制原理:,方法:连续除以基,从低到高记录余数,直至商为0,二进制与八进制之间的转换二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制八进制转换成二进制:用3位二进制数代替每一位八进制数,例(1101001)2=(001,101,001)2=(151)8,例(246)8=(010,100,110)2=(10100110)2,000 0001 1010 2011 3100 4101 5110 6111 7,二进制与十六进制之间的转换二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制十六进制转换成二进制:用4位二进制数代替每一位十六进制数,例(
3、11010101111101)2=(0011,0101,0111,1101)2=(357D)16,例(4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2,0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E1111 F,字节和位内存以字节为单元组成每个字节有一个地址一个字节一般由8个二进制位组成每个二进位的值是0或1,数值的表示方法原码、反码和补码原码:最高位为符号位,其余各位为数值本身的绝对值反码:正数:反码与原码相同
4、负数:符号位为1,其余位对原码取反补码:正数:原码、反码、补码相同负数:最高位为1,其余位为原码取反,再对整个数加1,9-5=49+7=16=(14)12,为什么用补码表示?,25-19=25+(-19)(25)10=(00011001)2(-19)10=(11101101)2 00011001+11101101-100000110,为什么用补码表示?,19-25=19+(-25)(19)10=(00010011)2(-25)10=(11100111)2 00010011+11100111-11111010-(-6)?引入补码之后符号位也进入了运算,不用再单独处理符号位,负数补码转换成十进制数
5、:最高位不动,其余位取反加1,例 补码:11111001 取反:10000110 加1:10000111=-7,2.1 常量与变量标识符定义:用来标识变量、常量、函数等的字符序列组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线大小写敏感不能使用关键字长度:最长32个字符(不同的c语言编译器规定长度不同)命名原则:见名知意不宜混淆 如l与I,o与0,例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$12314)(2005.4)以下不能定义为用户标识符是
6、A)Main B)_0 C)_int D)sizeof,M.D.John,3days,#33,char,$123,ab,32个关键字:(由系统定义,不能重作其它定义)auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort signed sizeof static structswitch typedef unsigned union voidvolatile while,一般用大写字母是宏定义预处理命令,不是C语句直接常
7、量:整型常量 实型常量 字符常量 字符串常量,如#define PRICE 30,常量定义:程序运行时其值不能改变的量(即常数)分类:符号常量:用标识符代表常量定义格式:#define 符号常量 常量,例 符号常量举例#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);,运行结果:total=300,变量-其值可以改变的量 概念:每个变量有一个名字:用标识符表示。每个变量有一个存储空间(存储单元),该单元中的状态所表示的数为此时变量的值。,变量初始化:定义时可以赋初值,合法标识符,变
8、量的使用:必须先定义,后使用。定义可以放在函数体的前部,也可以放在函数的外部或复合语句的开头。,变量定义的一般格式:数据类型 变量1,变量2,变量n;,如:int a,b,c;float x,y;,例:int a=2,b,c=4;float data=3.67;char ch=A;int x=1,y=1,z=1;int x=y=z=1;,例2 float a,b,c;c=a%b;/Illegal use of floating point in function main,变量定义位置:一般放在函数开头,例1 int student;stadent=19;/Undefined symbol s
9、tatent in function main,每一个变量都有一个类型,表明了为它的存储属性:分配空间的大小;表示的数的范围;所能进行的运算。,例2.1main()float length,area,radius;/*length为周长,area为面积,radius半径*/printf(nEnter a radius:);scanf(%f,程序的运行情况为:Enter a radius:2.8 length is:17.584000 area is:24.617599,2.2 数据类型数据类型总表,数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作,2.2.1整数类型 整数
10、类型的标识符是int。整型数据根据其占用的内存字节数不同,可加限定词:short(短整型),int,long(长整型),shortintlong可用sizeof(类型标识符)测量 unsigned short(无符号短整型),unsigned int(无符号整型),unsigned long(无符号长整型),其中short和long的引入是为满足实际要求的不同长度的整数,而经unsigned限定词限定的整数总是正的。,整型常量(整常数)三种形式:十进制整数:由数字09和正负号表示.如 123,-456,0八进制整数:由数字0开头,后跟数字07表示.如0123,011十六进制整数:由0 x开头,
11、后跟09,af,AF表示.如0 x123,0Xff注意:只有十进制数可以是负数,而八进制,十六进制只能是正数。,例 12 与 12L,例 30000 为int型 65536 为long int 型,问题:0123=()100 x123=()100Xff=()10,整型常量的类型根据其值所在范围确定其数据类型:一个整数若值在-3276832767内,则默认为它是int型;一个整数若值在-21474836482147483647之间,可使用长整型常量表示。在整常量后加字母l或L,认为它是long int 型常量无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:358u,0 x
12、38Au,235Lu 均为无符号数;0XA5Lu表示十六进制无符号长整数A5,其十进制为165。一个非负的整数,只要它的值不超过相应变量的取值范围,就可以赋给unsigned型变量。例如,可以将6000赋给一个 unsigned int型变量,但却不可以将66000赋给一个unsigned int型变量(将会出现溢出错误),整型变量 定义方法:int a1,a2;unsigned int b1,b2;一个整型常量只可以赋给能容纳下其值的整型变量。如a1,a2的取值范围为-32768-32767 b1,b2的取值范围为 0-65535如果:a1=65535;或者:b1=-1;在内存中数值将不是所
13、赋的数值。,2.2.2 实数类型 实数类型分为单精度(float)和双精度(double)类型,二者的区别在于所占存储位的多少,从而决定了其取值范围。通常以32位(bits)来存储单精度实数型数据,以64位来存储双精度实型数据。,实型常量(实数或浮点数)表示形式:小数形式:由数字和小数点组成,小数点的左右至少一边要有数字。小数形式表示的实型常量必须要有小数点(必须有小数点)如0.123,.123,123.0,0.0,123.指数形式:由尾数、e或E和指数部分组成,E的两边都至少要有一位数且E的右边只允许是整数形式(e或E之前必须有数字;指数必须为整数)如12.3e3,123E2,1.23e4,
14、e-5,1.2E-3.5,-1.6e-2,-.5e3 1.234e04(表示指数8进制)1.234e+4,实型常量的类型默认double型在实型常量后加字母f或F,认为它是float 型,实型变量 实型变量的说明形式如下:float 变量名1,变量名2,变量名n;double 变量名1,变量名2,变量名n;float:占4字节,提供7位有效数字double:占8字节,提供1516位有效数字,例 float a;a=111111.111;/*a=111111.1*/double b;b=111111.111;/*b=111111.111*/,float a,b,c;double x,y;,【例2
15、.2】实型变量的有效数字。main()double a;a=6.152367864359046178294901;printf(n%25.20f,a);输出结果为:6.15236786435904648000 在这个例子中,a被赋值了一个有效位数为25位的数字。但由于a是double类型的,所以a只能接收1516位有效数字。在printf语句中,我们使用了%20.18f这样的格式符号,这指示printf语句在输出a时总长度应为25位,小数点位数占20位。输出的结果显然显示了25位数,但只有6.152367864359046共16位有效数字被正确显示出来,后面的数字是一些无效的数值。这就表明do
16、uble型的数据只接收1516位有效数字。,2.2.3 字符类型 整型、实型都是数值型,是大家比较熟悉的。除数值型外,还有一类数据是计算机经常处理的数据,这就是字符型。字符型数据包含的是一个字符集。一般用的是ASCII码字符集见附录A(p249)。字符集中的每一个字符都有一个序号,称为ASCII码。ASCII码大的字符比ASCII码小的字符值大。字符类型的标识符是char。,字符常量定义:用单引号括起来的单个普通字符或转义字符.,字符常量的值:该字符的ASCII码值,如 101-A 012-n 376-x61-a 60-0 483-(),例:A-101-x41-65,如 A65,a97,048
17、,n10,如 a A?n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,例 转义字符举例(ch2_001.c,ch2_004.c)main()printf(101 x42 Cn);printf(I say:How are you?n);printf(C Programn);printf(Turbo C);,运行结果:(屏幕显示)A B CIsay:”How are you?”C ProgramTurbo C,例 main()printf(“Yb=n”);,运行结果:屏幕显示:=打印机输出:,字符型变量char 变量名1,变量名2,变量名n;如:char c1,c2;一个字符型变量的值
18、只能是一个单个字符;在内存中占一个字节;字符变量存放的是字符的ASCII码;char与int数据间可进行算术运算;由于字符型变量在内存中是以字符的ASCII码一个无符号整数的形式来存放的,所以在一定范围内,字符型数据和整型数据是可以互相通用的,二者的区别仅在于:字符型常量占一个字节,而整型常量占两个字节。,例 a=D;/*a=68;*/x=A+5;/*x=65+5;*/s=!+G/*s=33+71;*/,【例2.3】将小写字母转化为大写字母。main()char c1,c2;c1=x;c2=y;c1=c132;c2=c232;printf(n%c,%c,x1,x2);程序的输出结果是:X,Y
19、这个例子是将小写字母转化为大写字母的程序。我们在对ASCII码字符表进行观察后会发现,大小写对应的字母,它们之间的ASCII码正好相差32。利用这个特性和上一个特性,我们可以编写出非常简单的大小写字母转换程序。,字符常量与字符串常量不同,字符串常量定义:用双引号(“”)括起来的字符序列存储:每个字符串尾自动加一个 0 作为字符串结束标志,例:char ch;ch=“A”;,没有字符串变量,用字符数组存放,15)(2006.4)以下能正确定义字符串的语句是 A)char str=064;B)char str=x43;C)char str=;D)char str=0;,基本数据类型,整型,字符型,
20、实型,有,无,说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例:,例/*ch2_003.c*/#define PRICE 12.5 main()int num=3;float total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(“total=%f,ch1=%cn”,total,ch1);,运行结果:total=37.500000,ch1=d,2.3运算符和表达式,学习运算符应注意:运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型,2.3.1 算术运算2.3.2 赋值运算2.3.3
21、 自增、自减运算2.3.4 关系运算与逻辑运算2.3.5 条件运算2.3.6 逗号运算2.3.7 位运算2.3.8 类型转换,34种运算符:算术运算符:+-*/%+-关系运算符:=!=逻辑运算符:!&|位运算符:|&赋值运算符:=及其扩展条件运算符:?:逗号运算符:,指针运算符:*&求字节数:sizeof强制类型转换:(类型)分量运算符:.-下标运算符:其它:()-,2.3.1 算术运算2.3.1.1 算术运算符基本算术运算符:+-*/%结合方向:从左向右优先级:-*/%-+-(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据,例 5/2=-5
22、/2.0=,例 5%2=-5%2=1%10=5%1=5.5%2,例 5/2=2-5/2.0=-2.5,例 5%2=1-5%2=-1 1%10=1 5%1=0 5.5%2(),2.3.1.2 算术表达式及其书写特点 算术表达式是用算术运算符、圆括号将运算对象连接起来的符合C语言的语法规则的式子。其中,运算对象可以是常量、变量、表达式、函数等等。书写时注意以下几点:C表达式中的乘号不能省略。例如:数学式b2-4ac 相应的C表达式应写成:b*b-4*a*c C表达式中只能使用系统允许的标识符。例如:数学式r2 相应的C表达式应写成:3.14159*r*r C表达式中的内容必须书写在同一行,不允许有
23、分子分母形式,必要时要利用圆括号保证运算的顺序。例如:c+d相应的C表达式应写成:(a+b)/(c+d)C表达式不允许使用方括号和花括号,只能使用圆括号来帮助限定运算顺序。可以使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值。,2.3.2 赋值运算赋值运算符、赋值表达式简单赋值运算符:=赋值表达式格式:变量标识符=表达式作用:将赋值号右边的表达式计算出来,将其值赋给左边的一个变量。,复合赋值运算符种类:+=-=*=/=%=&=|=含义:exp1 op=exp2 exp1=exp1 op exp2,例 a=3;d=func();c=d+2;,2.3.2.3
24、赋值运算符的优先级和结合性优先级:14结合方向:自右向左左侧必须是变量,不能是常量或表达式,每个表达式都有一个值(当然每个值都有所属的类型):赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y;a+b=3;,例 float f;int i;i=10;f=i;则 f=10.0,例 int i;i=2.56;/结果i=2;,例:a=b=c=5 a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,
25、a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,例:a=12;a+=a-=a*a,例:int a=2;a%=4-1;a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),不同类型数据间的转换隐式转换什么情况下发生运算转换-不同类型数据混合运算时赋值转换-把一个值赋给与其类型不同的变量时输出转换-输出时转换成指定的输出格式函数调用转换-实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型,显式转换(强制转换)一般形式:(类型名)(表达式)例(int)(x+y)(in
26、t)x+y(double)(3/2)(int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例 main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:x=3.600000,i=3,精度损失问题,2.3.3 自增、自减运算自增、自减运算符、表达式、结合性、优先级作用:使变量值加1或减1种类:前置+i,-i(先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1),例 j=3;k=+j;等价于:j+;k=j;j=3;k=j+;等价于:k=j;j+;j=3;printf(“%d”,+j
27、);j=3;printf(“%d”,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,每个表达式都有一个值(当然每个值都有所属的类型):(i+)中表达式(i+)的值是变量i在+之前的值;但i+的值已经增1;(+i)中表达式(+i)的值是变量i在+之后的值;,+-不能用于常量和表达式,如5+,(a+b)+-结合方向:自右向左优先级:-+-*/%-+-(2)(3)(4),例-i+-(i+)i=3;printf(“%d”,-i+);/-3,例-i+i=3;printf(“%d”,-i+
28、);,使用自增、自减运算符的注意事项,对于形如a+b的表达式,C语言的编译系统在处理时尽可能多的自左至右将若干个字符结合成一个运算符。因此,a+b被理解为(a+)+b,而不是a+(+b)。为避免产生误解,建议将此表达式写成(a+)+b的形式。例如,x=i+i+i+;应被理解为z=(i+)+(i+)+(i+);,自增、自减运算符使得C的表达式灵活、简洁,但有时候会使初学者迷惑,若使用不当,会产生意外的后果。这就需要在使用时尤其注意。,当一个表达式中,含有若干个子表达式时,ANSI C没有规定运算符和运算对象的计算次序,因此不同编译系统处理的顺序可能不同。,例如,x=a*b+c%d 无所谓;例如,
29、a=3;y=a*+a;不同的编译系统有两种处理方式,结果不同:,A)按从左到右的顺序处理为:先取a的值3,再计算+a,a的值 自增为4,子表达式+a的值也为4,所以相乘的结果为12;B)按从右到左的顺序处理为:先计算+a,a的值自增为4,子表达式+a的值也为4,再取a的值为4,所以相乘的结果为16。,在一个表达式中,出现对同一个变量的多次自增、自减运算时,有的编译系统按从左到右的次序处理,而有些系统一次性的处理这些运算是从右到左(如TURBO C 2.0系统)。请看下列程序的输出结果。,main()int i=6,k=6,a,b;a=(i+)+(i+)+(i+);b=(+k)+(+k)+(+k
30、);printf(ni=%d,k=%d,i,k);printf(na=%d,b=%d,a,b);,若按从左到右的次序处理,预期的运行结果为:i=9,k=9a=21,b=24,TC 2.0 程序的运行结果如下:i=9,k=9a=18,b=27,在调用函数时,对于实参的求值顺序,ANSI C也没有规定。有的系统按从左到右的顺序求值,有的相同按从右到左的顺序求值。,例3.2】main()int i=5;printf(n%d,%d,i,+i);,若按从左到右的次序处理,预期的运行结果为:5,6,TC 2.0 程序的运行结果如下:6,6,编写程序时,应注意把可读性放在第一位,避免编写晦涩难懂、容易引起误
31、解的程序。尤其在使用自增、自减运算符时,尽量不要使用易于误解的表达方式。为了清晰的表达编程者的意图,可以将一个复杂的语句分解成多个简单的语句。,例如,A)y=a*+a;可改写为 b=+a;y=a*b;,B)printf(n%d,%d,i,+i);可改写为 k=i;printf(n%d,%d,k,+i);,a=(i+)+(i+)+(i+);可改写为:x=i+;y=i+;z=i+;a=x+y+z;,关系运算符和关系表达式关系运算符种类:=!=结合方向:自左向右优先级别:,例 ca+b/c(a+b)ab!=c/(ab)!=c a=bc/a=(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表
32、示,例 int a=3,b=2,c=1,d,f;ab(ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,关系运算注意:,例 若a=0;b=0.5;x=0.3;则 a=x=b的值为,0,例 5278在C中是允许的,值为,0,例 int i=1,j=7,a;a=i+(j%4!=0);则a=,2,例 a0 结果为 A100 结果为,1,0,关系运算注意:,例 注意区分“=”与“=”int a=0,b=1;if(a=b)printf(“a equal to b”);else printf(“a not equal to b”);,逻辑运算符和表达式逻辑运算
33、符种类:!&|逻辑运算真值表,C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,例 ab&xy a=b|x=y!a|ab,优先级:,结合方向:,/(a=x)&(x=b),/(ab)&(xy),/(a=b)|(x=y),/(!a)|(ab),优先级:,结合方向:,例 a=4;b=5;!a a&b a|b!a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/(53)&2|(8(4-(!0)值为1,优先级:,结合方向:,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表
34、达式的解时,才执行该运算符,例 a(m=ab)&(n=cd),/结果m=0,n=1,条件运算符与表达式一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句,例 求 a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);,例(a=b)?Y:N(x%2=1)?1:0(x=0)?x:-x(c=a&c=z)?c-a+A:c,条件运算符可嵌套 如 x0?1:(x0?-1:0)优先级:13,结合方向:自右向左 如 ab?a:cd?c:d ab?a:(cd?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b
35、/x=0,表达式值为b;x0,表达式值为a xy?1:1.5/xy,值为1.0;xy,值为1.5,逗号运算符和表达式形式:表达式1,表达式2,表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例 a=3*5,a*4 a=3*5,a*4,a+5例 x=(a=3,6*3)x=a=3,6*a例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,逗号运算符和表达式形式:表达式1,表达式2,表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例:/*ch2_6.c*/#include main()int x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%dn,x);,运行结果:x=3,位运算1.运算对象只能是整型或字符型数据,不能是实型数据。,本文由http:/小编推荐!,
链接地址:https://www.31ppt.com/p-5602958.html