C之数据的输入输出.ppt_第1页
C之数据的输入输出.ppt_第2页
C之数据的输入输出.ppt_第3页
C之数据的输入输出.ppt_第4页
C之数据的输入输出.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章 基本数据类型及 数据的输入输出,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,各种进制之间的转换 二进制、八进制、十六进制转换成十进制 方法:按权相加,各种进制之间的转换(整数) 二进制、八进制、十六进制转换成十进制 方法:按权相加,十进制转换成二进制、八进制、十六进制 原理:,方法:连续除以基,从低到高记录余数,直至商为0,二进制与八进制之间的转换 二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制 八进制转换成二进制:用3位二进制数代替每一位八进制数,例 (1101001)2=(001,101,001)2=(151)8,例 (246)8=(010,100,110)2=(10100110)2,000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7,二进制与十六进制之间的转换 二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制 十六进制转换成二进制:用4位二进制数代替每一位十六进制数,例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16,例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2,0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F,字节和位 内存以字节为单元组成 每个字节有一个地址 一个字节一般由8个二进制位组成 每个二进位的值是0或1,数值的表示方法原码、反码和补码 原码:最高位为符号位,其余各位为数值本身的绝对值 反码: 正数:反码与原码相同 负数:符号位为1,其余位对原码取反 补码: 正数:原码、反码、补码相同 负数:最高位为1,其余位为原码取反,再对整个数加1,9-5=4 9+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)? 引入补码之后符号位也进入了运算,不用再单独处理符号位,负数补码转换成十进制数:最高位不动,其余位取反加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 $123 14) (2005.4)以下不能定义为用户标识符是 A)Main B)_0 C)_int D)sizeof,M.D.John,3days,#33,char,$123,ab,32个关键字:(由系统定义,不能重作其它定义) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigned union void volatile while,一般用大写字母 是宏定义预处理命令,不是C语句 直接常量: 整型常量 实型常量 字符常量 字符串常量,如 #define PRICE 30,常量 定义:程序运行时其值不能改变的量(即常数) 分类: 符号常量:用标识符代表常量 定义格式: #define 符号常量 常量,例 符号常量举例 #define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf(“total=%d“,total); ,运行结果:total=300,变量-其值可以改变的量 概念: 每个变量有一个名字:用标识符表示。 每个变量有一个存储空间(存储单元),该单元中的状态所表示的数为此时变量的值。,变量初始化:定义时可以赋初值,合法标识符,变量的使用:必须先定义,后使用。定义可以放在函数体的前部,也可以放在函数的外部或复合语句的开头。,变量定义的一般格式: 数据类型 变量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 statent in function main,每一个变量都有一个类型,表明了为它的存储属性: 分配空间的大小; 表示的数的范围; 所能进行的运算。,例2.1 main() 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整数类型 整数类型的标识符是int。整型数据根据其占用的内存字节数不同,可加限定词: short(短整型),int ,long(长整型), shortintlong 可用sizeof(类型标识符)测量 unsigned short (无符号短整型), unsigned int (无符号整型), unsigned long (无符号长整型), 其中short和long的引入是为满足实际要求的不同长度的整数,而经unsigned限定词限定的整数总是正的。,整型常量(整常数) 三种形式: 十进制整数:由数字09和正负号表示.如 123,-456,0 八进制整数:由数字0开头,后跟数字07表示.如0123,011 十六进制整数:由0x开头,后跟09,af,AF表示. 如0x123,0Xff 注意:只有十进制数可以是负数,而八进制,十六进制只能是正数。,例 12 与 12L,例 30000 为int型 65536 为long int 型,问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10,整型常量的类型 根据其值所在范围确定其数据类型: 一个整数若值在-3276832767内,则默认为它是int型;一个整数若值在-21474836482147483647之间,可使用长整型常量表示。 在整常量后加字母l或L,认为它是long int 型常量 无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。 例如: 358u,0x38Au,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; 在内存中数值将不是所赋的数值。,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 , 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.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位有效数字被正确显示出来,后面的数字是一些无效的数值。这就表明double型的数据只接收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 , 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 C Isay:”How are you?” C Program Turbo C,例 main() printf(“Yb=n”); ,运行结果: 屏幕显示:= 打印机输出:,字符型变量 char 变量名1,变量名2,变量名n; 如:char c1,c2 ; 一个字符型变量的值只能是一个单个字符;在内存中占一个字节; 字符变量存放的是字符的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 这个例子是将小写字母转化为大写字母的程序。我们在对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“;,基本数据类型,整型,字符型,实型,有,无,说明:数据类型所占字节数随机器硬件不同而不同,上表以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 自增、自减运算 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/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表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序。 例如: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 赋值运算符的优先级和结合性 优先级: 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,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) (int)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); 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+);,使用自增、自减运算符的注意事项, 对于形如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 无所谓; 例如,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); printf(“ni=%d,k=%d“,i,k); printf(“na=%d,b=%d“,a,b); ,若按从左到右的次序处理,预期的运行结果为: i=9,k=9 a=21,b=24,TC 2.0 程序的运行结果如下: i=9,k=9 a=18,b=27, 在调用函数时,对于实参的求值顺序,ANSI C也没有规定。有的系统按从左到右的顺序求值,有的相同按从右到左的顺序求值。,例3.2】 main( ) int i=5; printf(“n%d,%d“,i, +i); ,若按从左到右的次序处理,预期的运行结果为: 5, 6,TC 2.0 程序的运行结果如下: 6, 6, 编写程序时,应注意把可读性放在第一位,避免编写晦涩难懂、容易引起误解的程序。尤其在使用自增、自减运算符时,尽量不要使用易于误解的表达方式。 为了清晰的表达编程者的意图,可以将一个复杂的语句分解成多个简单的语句。,例如,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表示,例 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”);,逻辑运算符和表达式 逻辑运算符 种类: ! & | 逻辑运算真值表,C语言中,运算量: 0表示“假”, 非0表示“真”, 运算结果: 0表示“假”,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论