第2章 数据的存储与运算 2.1 数据在计算机中是怎样存储的 2.2 整型数据的运算与分析 2.3 实型数据的运算与分析 2.4 字符型数据的运算 2.5 符号常量 2.6 算术运算符和算术表达式 2.7 C运算符和C表达式 2.8 提高部分
2.1 数据在计算机中是怎样存储的 P16 2.1.1 数据在计算机中是以二进制形式存储的 2.1.2 位、字节和地址 2.1.3 不同类型数据的存储方式
2.1.1 数据在计算机中是以二进制形式存储的 P16 计算机内部的信息都是用二进制表示 计算机存储器是用半导体集成电路构成的 有两种稳定的工作状态:“导” 与“截止”,即电脉冲的“有”与“无” 分别用“1”和“0”表示
2.1.1 数据在计算机中是以二进制形式存储的 P16 若相邻的8个二极管元件中第1,3,5,7个元件处于“导通”状态,第2,4,6,8个元件处于“截止”状态,用“10101010”表示 导通 截止 导通 截止 导通 截止 导通 截止 1 0 1 0 1 0 1 0
2.1.1 数据在计算机中是以二进制形式存储的 P16 十进制数 二进制数 1 2 10 3 11 4 100 5 101 十进制数 1 2 10 3 11 4 100 5 101 十进制数 二进制数 6 110 7 111 8 1000 9 1001 10 1010
2.1.2 位、字节和地址 P17 位(bit) ,又称“比特” 。每一个二极管元件称为一个“二进制位”,是存储信息的最小单位。它的值是“1”或“0” 字节(byte) ,又称“拜特” 。一般将8个“二进制位”组织成一组,称为“字节”。这是人们最常用的存储单位
2.1.2 位、字节和地址 P17 地址。计算机的存储器包含许多存储单元,操作系统把所有存储单元以字节为单位编号 2001 2002 2003 2004 2005 2006 3 4 5 7 8 9 ┆
2.1.3 不同类型数据的存储方式 P18 整数的存储方式 1 一个十进制整数,先转换为二进制形式 1 如整数10,以二进制形式表示是1010 用一字节存放 1 1 用两字节存放 负数按补码形式存放
2.1.3 不同类型数据的存储方式 P18 实数的存储形式 对于实数,一律采用指数形式存储 123.456标准化指数形式为0.123456103 + .12345 3 数符 数值部分 指数符号 指数
P18 2.1.3 不同类型数据的存储方式 字符的存储方式 对于字符,按ASCII代码存放 A的ASCII代码是65(1000001) 1
2.2 整型数据的运算与分析 P19 2.2.1 整型数据运算程序举例和分析 2.2.2 整型常量与整型变量
P19 2.2.1 整型数据运算程序举例和分析 例2.1 鸡兔同笼。在一个茏子里同时养着一些鸡和兔子,你想了解有多少只鸡和多少只兔,主人对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔?
2.2.1 整型数据运算程序举例和分析 P19 解题思路: 设x代表鸡的数量,y代表兔的数量,总头数为h,总脚数为f 列出下面的方程式: 2x + 4y = f (2) 解方程得到:
2.2.1 整型数据运算程序举例和分析 P19 #include <stdio.h> void main() { int h,f,x,y; h=16; f=40; y=(f-2* h)/2; x=h-y; printf(“%d%d\n”,x,y); } 定义整型变量h,f,x,y 使h的值等于16 使f的值等于40 计算兔的个数 计算鸡的个数
2.2.1 整型数据运算程序举例和分析 P19 #include <stdio.h> void main() { int h,f,x,y; h=16; f=40; y=(f-2* h)/2; x=h-y; printf(“%d%d\n”,x,y); } %d,%d 输出鸡和兔个数 124
2.2.1 整型数据运算程序举例和分析 P19 #include <stdio.h> void main() { int h,f,x,y; h=16; f=40; y=(f-2* h)/2; x=h-y; printf(“%d%d\n”,x,y); } cock=%d, rabbit=%d %d,%d 输出鸡和兔个数 12,4
2.2.1 整型数据运算程序举例和分析 P19 #include <stdio.h> void main() { int h,f,x,y; h=16; f=40; y=(f-2* h)/2; x=h-y; printf(“%d%d\n”,x,y); } cock=%d, rabbit=%d 输出鸡和兔个数 cock=12, rabbit=4 12,4
2.2.1 整型数据运算程序举例和分析 P19 定义变量的一般形式是: 类型名 变量名; 例如:int h,f,x,y; 变量都必须在使用前定义,指定其类型 赋值:h=37; f=88;
2.2.2 整型常量与整型变量 P22 常量和变量 常量是指在程序运行过程中其值不能改变的量 变量是指在程序运行过程中其值可以改变的量
2.2.2 整型常量与整型变量 P22 常量和变量 要注意区别变量名和变量值 变量名 h 16 2000 变量值 变量地址 存储单元
2.2.2 整型常量与整型变量 P22 常量和变量 要注意区别变量名和变量值 h 37 16 2000 执行h=37;
2.2.2 整型常量与整型变量 P22 变量名的取名规则 变量名第一个字符必须是字母或下划线,其后字符必须是字母、数字或下划线 合法:sum,average, _total, Class, day, month, Student_name,tan,li_ling 不合法:Zhang-sun,Student’s,263.com, $123,#33,3D64
2.2.2 整型常量与整型变量 P22 变量名的取名规则 变量名第一个字符必须是字母或下划线,其后字符必须是字母、数字或下划线 大小写字母代表不同的字符,一般,程序中的变量名用小写字母表示 变量名的长度不是无限的 变量名尽量简单易记、见名知意 在同一函数中,不同变量不能取相同名
2.2.2 整型常量与整型变量 P22 变量必须“先定义,后使用” 根据定义变量时指定的类型,编译系统为变量分配相应的存储单元 凡未被事先定义的,系统不把它认作变量名,保证程序中变量名使用得正确 指定了每一变量属于一个类型,就便于在编译时据此检查在程序中要求对该变量进行的运算是否合法
2.2.2 整型常量与整型变量 P22 变量类型相当于建造房屋的图纸,按照同一套图纸可以建造出许多套外形和结构完全相同的房屋,它们具有相同的特征 类型是抽象的,变量是具体的 图纸相当于一系列的规则和要求,依照它进行施工。但光有图纸是不能住人的,只有建成的房屋才能住人 类型不占存储单元,不能用来存储数据,而变量占存储单元,可以用来存储数据
2.2.2 整型常量与整型变量 P22 整型常量的表示形式 整型变量的种类 除了常用的十进制形式外,还允许使用八进制形式和十六进制形式表示的数 整型变量的种类 基本整型,类型名为int 长整型,类型名为long int 短整型,类型名为short int ……
2.3 实型数据的运算与分析 P24 2.3.1 实型数据的运算举例 2.3.2 实型常量的表示形式 2.3.3 实型变量
2.3.1 实型数据的运算举例 P24 例2.2 分期付款的计算。张先生为购房,向银行贷款,贷款额为D元,每月准备还P元,月利率为R,求需要多少个月才能还清。 m是还清贷款所需月数 d=324500,p=3245,r=0.8%
2.3.1 实型数据的运算举例 P24 (1)d和p是整数,r是一个小数,因此程序中要分别定义整型变量和实型变量。 (2)公式中用到对数log,这个对数是以10为底的。对数log的函数log10
2.3.1 实型数据的运算举例 P24 #include <stdio.h> #include <math.h> void main() { int d,p; float r,m; d=324500; p=3245; r=0.008; m=(log10(p)-log10(p-d*r))/log10(1+r); printf(“month=%f\n”,m); printf(“total=%f\n”,m*p); } 用到数学函数时 定义整型变量d,p 定义实型变量r,m 赋值 求m的值
2.3.1 实型数据的运算举例 P24 #include <stdio.h> #include <math.h> void main() { int d,p; float r,m; d=324500; p=3245; r=0.008; m=(log10(p)-log10(p-d*r))/log10(1+r); printf(“month=%f\n”,m); printf(“total=%f\n”,m*p); } month=201.983404 total=655436.127930 输出实数时 输出m的值 计算并输出还款数
2.3.1 实型数据的运算举例 P24 #include <stdio.h> #include <math.h> void main() { int d=324500,p=3245; double r=0.008,m; m=(log10(p)-log10(p-d*r))/log10(1+r); printf(“month=%f\n”,m); printf(“total=%f\n”,m*p); } 定义变量时赋初值 定义double型无警告错
2.3.2 实型常量的表示形式 P26 实数在计算机语言中常称为浮点数 十进制小数形式 如:0.123, 123.23, 0.0 指数形式 如:123e3或123E3
2.3.3 实型变量 P27 实型变量的分类 单精度实型变量(float型) 双精度实型变量(double型) 长双精度实型变量(long double型)
2.3.3 实型变量 P27 实型变量的分类 实型数据的舍入误差 实型变量是由有限的存储单元组成的 能提供的有效数字总是有限的 在有效位以外的数字将被舍去 会产生一些误差
2.3.3 实型变量 P27 实型变量的分类 实型数据的舍入误差 #include <stdio.h> void main() 例2.3 实型数据的舍入误差 #include <stdio.h> void main() { float a; a = 1234.1415926; printf("a=%f\n",a); } 7位有效位 a=1234.141602
2.3.3 实型变量 P27 实型变量的分类 实型数据的舍入误差 把实数按双精度数处理 a = 1234.1415926; 把程序中的实常量处理成双精度型,分配8个字节,以提高精度。 最好:double a; a = 1234.1415926; 编译时有警告 单精度 双精度
2.4 字符型数据的运算 P29 2.4.1 字符数据运算的简单例子 2.4.2 字符常量和字符变量 2.4.3 字符串常量
2.4.1 字符数据运算的简单例子 P29 例2.4 逐个输出英文字母C,H,I,N,A。然后按反序输出,即A,N,I,H,C。 #include <stdio.h> void main() { char a=‘C’,b=‘H’,c=‘I’,d=‘N’,e=‘A’; printf(“%c%c%c%c%c\n”,a,b,c,d,e); printf(“%c%c%c%c%c\n”,e,d,c,b,a); } 定义字符变量
2.4.1 字符数据运算的简单例子 P29 例2.4 逐个输出英文字母C,H,I,N,A。然后按反序输出,即A,N,I,H,C。 #include <stdio.h> void main() { char a=‘C’,b=‘H’,c=‘I’,d=‘N’,e=‘A’; printf(“%c%c%c%c%c\n”,a,b,c,d,e); printf(“%c%c%c%c%c\n”,e,d,c,b,a); } 用单撇号括起来 输出字符 CHINA ANIHC
2.4.2 字符常量和字符变量 P29 字符常量 字符常量是用单撇号括起来的一个字符 英文字母可以作为字符常量 键盘上的字符都可以作为字符常量 小写字母和大写字母是不同的字符常量
2.4.2 字符常量和字符变量 P29 转义字符 转义字符必须以反斜杠“\”开头 “\”后只能有一个字符(或代表字符的8进制或16进制数)
2.4.2 字符常量和字符变量 P29 \t 跳到下一个输出区 \b 消除前一个已输出的字符 \r 将当前的输出位置返回在本行开头 \f 将当前的输出位置移到下页的开头 \0 常用于字符串中,作为串结束标志 \\ 代表一个反斜杠字符“\” \’ 代表一个单撤号字符 \” 代表一个双撤号字符 \ddd 1~3位8进制数所代表的字符 \xhh 1~2位16进制数所代表的字符
2.4.2 字符常量和字符变量 P29 字符变量 用来存放字符常量 只能放一个字符 字符变量的定义形式: char 字符变量列表;
2.4.2 字符常量和字符变量 P29 字符数据与整型数据在一定条件下通用 char c=’a’;与char c=97;等价
2.4.2 字符常量和字符变量 P29 字符数据与整型数据在一定条件下通用 例2.5 将两个整数分别赋给两个字符变量,再将字符数据按字符和整数形式输出。 #include <stdio.h> void main() { char c1=97,c2=98; printf(“%c %c\n”,c1,c2); printf(“%d %d\n”,c1,c2); } char c1=’a’,c2=’b’; a b 97 98
2.4.2 字符常量和字符变量 P29 字符数据与整型数据在一定条件下通用 1 例2.5 将两个整数分别赋给两个字符变量,再将字符数据按字符和整数形式输出。 字符a的存储(用ASCII代码存放) 1 按%c输出:a 按%d输出:97
2.4.2 字符常量和字符变量 P29 字符数据与整型数据在一定条件下通用 例2.5 将两个整数分别赋给两个字符变量,再将字符数据按字符和整数形式输出。 printf(“%c %c\n”,97+1,’a’+1); 输出什么? b b printf(“%d %d\n”,97+1,’a’+1); 输出什么? 98 98
2.4.2 字符常量和字符变量 P29 字符数据与整型数据在一定条件下通用 例2.6 将小写字母转换为大写字母。 #include <stdio.h> void main() { char c1='a',c2='b'; c1=c1-32; c2=c2-32; printf("%c,%c\n",c1,c2); } a—97 A—65 b—98 B—66 c—99 C—67 …… 规律是? A,B
2.4.3 字符串常量 P33 字符串常量是一对双撇号括起来的字符序列 ″How do you do.″ ″CHINA″ ″a″ 2.4.3 字符串常量 P33 字符串常量是一对双撇号括起来的字符序列 ″How do you do.″ ″CHINA″ ″a″ 都是合法的字符串
2.4.3 字符串常量 P33 字符串常量是一对双撇号括起来的字符序列 ′a′是字符常量 ″a″是字符串常量 二者的含义是不同的 2.4.3 字符串常量 P33 字符串常量是一对双撇号括起来的字符序列 ′a′是字符常量 ″a″是字符串常量 二者的含义是不同的 char c; c=’a’; 正确 char c; c=”a”; 错误 存放字符’a’的存储单元 a 存放字符串”a”的存储单元 a \0
2.5 符号常量 P34 2.5.1 符号常量的作用 2.5.2 符号常量的性质和使用方法
2.5.1 符号常量的作用 P35 例2.7求以r为半径的圆周长c和圆面积s,再求以r为半径的圆球体积v。 c=2*3.1415926*r; s=3.1415926*r*r; v=4/3*3.1415926*r*r*r;
c=23.059290 s=42.313797 v=155.291633 #include <stdio.h> 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=%f\ns=%f\nv=%f\n”,c,s,v); } 有错 4.0/3.0
#include <math.h> s=42.313797 v=207.055511 #include <stdio.h> void main() {double r=3.67,c,s,v; c= 2 * 3.1415926 *r; s= 3.1415926 * r*r ; v= 4.0/3.0 * 3.1415926 * r*r*r ; printf(“c=%f\ns=%f\nv=%f\n”,c,s,v); } #include <math.h> pow(r,2) pow(r,3)
#define PI 3.1415926 #include <stdio.h> #include <math.h> void main() {double r=3.67,c,s,v; c= 2 * 3.1415926 *r; s= 3.1415926 * pow(r,2); v= 4.0/3.0 * 3.1415926 *pow(r,3); printf(“c=%f\ns=%f\nv=%f\n”,c,s,v); } c=23.059290 s=42.313797 v=207.055511 PI PI PI
#define PI 3.1415926 #include <stdio.h> #include <math.h> void main() {double r=3.67,c,s,v; c= 2 * PI *r; s= PI * pow(r,2); v= 4.0/3.0 * PI *pow(r,3); printf(“c=%f\ns=%f\nv=%f\n”,c,s,v); } 符号常量 c=23.059290 s=42.313797 v=207.055511
2.5.2 符号常量的性质和使用方法 P36 #define不是C语句,行末没有分号 #define是一个“预编译命令” 符号常量一般用大写,以示与变量区别 好处: 含义清楚 在需要改变一个常量时能做到“一改全改” 用符号常量能保护所代表的数据不被破坏
P38 2.6 算术运算符和算术表达式 2.6.1 算术运算符 2.6.2 算术表达式
2.6.1 算术运算符 P38 1.基本的算术运算符: + :加法运算符 - :减法运算符 * :乘法运算符 / :除法运算符 + :加法运算符 - :减法运算符 * :乘法运算符 / :除法运算符 % :求余运算符(要求两侧均为整数。如19%4,结果为3 )
2.6.1 算术运算符 P38 两个整数相除的结果为整数 如5/3的结果值为1,舍去小数部分 如果除数或被除数中有一个为负值,舍入方向不固定。例如,-5/3,有的系统中得到的结果为-1,在有的系统中则得到结果为-2 VC++采取“向零取整”的方法 如5/3=1,-5/3=-1,取整后向零靠拢
2.6.1 算术运算符 P38 如果参加+、-、*、/ 运算的两个数中有一个数为float或double型,则结果都是double型,因为系统将所有float型数据都先转换为double型,然后进行运算。这是为了提高运算精度。
2.6.1 算术运算符 P38 2. 自增、自减运算符: 作用是使变量的值增1或减1 ++i,--i:在使用i之前,先使i的值加(减)1
2.6.2.算术表达式 P39 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式 运算对象包括常量、变量、函数等
2.6.2.算术表达式 P39 各类数值型数据间的混合运算 char和short型转换为int型 float型一律转换为double型 整型 (包括int,short,long) 数据与double型数据进行运算,先将整型转换为double型
2.6.2.算术表达式 P39 各类数值型数据间的混合运算 10 + ’a’ + i * f - d / e f为float型 d为double型 e为long型
2.6.2.算术表达式 P39 各类数值型数据间的混合运算 10 + ’a’ + i * f - d / e 107 先将i与f转成double型,运算结果为double型 i为整型 f为float型 d为double型 e为long型
2.6.2.算术表达式 P39 各类数值型数据间的混合运算 10 + ’a’ + i * f - d / e 107 double型 f为float型 d为double型 e为long型
2.6.2.算术表达式 P39 各类数值型数据间的混合运算 转换为double型 10 + ’a’ + i * f - d / e 107 f为float型 d为double型 e为long型
2.6.2.算术表达式 P39 强制类型转换 在表达式中也可以利用“强制类型转换”运算符将数据转换成所需的类型 (double)a (将a转换成double类型) (int) (x+y) (将x+y的值转换成int型) (float)(5%3)(将5%3的值转换成float型)
2.6.2.算术表达式 P39 强制类型转换 强制类型转换的一般形式为: (类型名)(表达式) 例2.8 强制类型转换。 #include <stdio.h> void main ( ) { float f=3.6; int i; i=(int)f; printf("f=%f,i=%d\n",f,i); } f=3.600000,i=3 不改变f的值
2.6.2.算术表达式 P39 强制类型转换 强制类型转换的一般形式为: (类型名)(表达式) 有两种类型转换 系统自动进行的类型转换
2.7 C运算符和C表达式 P41 2.7.1 C运算符 2.7.2 C表达式
2.7.1 C运算符 P41 (1) 算术运算符 (+ - * / %) (2) 关系运算符 (> < == >= <= !=) (1) 算术运算符 (+ - * / %) (2) 关系运算符 (> < == >= <= !=) (3) 逻辑运算符 (!&& ||) (4) 位运算符 (<< >> ~ | ∧ &) (5) 赋值运算符 (=及其扩展赋值运算符) (6) 条件运算符 (?:)
2.7.1 C运算符 P41 (7) 逗号运算符 (,) (8) 指针运算符 (* &) (9) 求字节数运算符 (sizeof) (7) 逗号运算符 (,) (8) 指针运算符 (* &) (9) 求字节数运算符 (sizeof) (10) 强制类型转换运算符 ( (类型) ) (11) 成员运算符 (.->) (12) 下标运算符 ([ ]) (13) 其他 (如函数调用运算符())
2.7.2 C表达式 P42 箅术表达式。如2+6.7*3.5+sin(0.5) 关系表达式。如x>0,y<z+6 逻辑表达式。如x>0 && y>0 (表示x>0与y>0同时成立,&&是逻辑运算符,代表“与”) 赋值表达式。如a=5.6 逗号表达式。如a=3,y=4,z=8 用逗号连接若干个表达式,顺序执行这些表达式,整个逗号表达式的值是最后一个表达式的值(今为8)
2.8 提高部分 2.8.1 求补码的方法 2.8.2 整型常量的表示形式 2.8.3 整型变量的类型 2.8.4 整型常量的类型 P42 2.8.1 求补码的方法 2.8.2 整型常量的表示形式 2.8.3 整型变量的类型 2.8.4 整型常量的类型 2.8.5 运算符的优先级与结合性
2.8.1 求补码的方法 P42 计算机不论对正数和负数都按“补码”形式存放到存储单元 对于正数来说,补码就是该数的“原码”(该数的二进制形式) 负数的补码不是它的原码
2.8.1 求补码的方法 P42 求-1的补码的方法是: 原码 1 诸位取反 反码 1 反码加1 补码 1
2.8.1 求补码的方法 P42 求一个负数的补码的方法是: 取该数(不考虑数的符号)的二进制形式,它就是原码 对该原码逐位“取反”(逐位把0变1,把1变0),得到其“反码” 将得到的反码加1
2.8.1 求补码的方法 P42 求-10的补码的方法是? 原码 1 诸位取反 反码 1 反码加1 补码 1
2.8.2 整型常量的表示形式 P43 在C语言中,整常数可用3种形式表示: a=83; /* 10进制数 */ 10进制整数,如123,-456 8进制整数,特点是逢8进1。在程序中凡以0开头的数都认作8进制数 16进制整数。特点是逢16进1。用0~9、a~f分别代替0~15。在程序中凡以0x开头的数都认作16进制数 a=83; /* 10进制数 */ a=0123; /* 8进制数 */ a=0x53; /* 16进制数 */
2.8.3 整型变量的类型 P44 可以定义和使用以下6种整型变量: 有符号基本整型 [signed] int 无符号基本整型 unsigned int 有符号短整型 [signed] short [int] 无符号短整型 unsigned short [int] 有符号长整型 [signed] long [int] 无符号长整型 unsigned long [int]
2.8.4 整型常量的类型 P45 在计算机语言中,常量是有类型的,这也是计算机的特点 数据是要存储的,不同类型的数据所分配的字节和存储方式是不同的 整型变量有类型,因此整型常量也应该有类型,才能在赋值时匹配 根据常量的大小、数后面加的字母l或L、u或U判断其类型
P45 2.8.5 运算符的优先级与结合性 先按运算符的优先级别高低次序执行 如果优先级别相同,则按规定的“结合方向”处理