1、西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 1文文 件件西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 2外存上的数据存储在文件中外存上的数据存储在文件中控制器控制器运算器运算器内存储器内存储器外存储器外存储器(硬盘、(硬盘、U盘等)盘等)输入设备输入设备(键盘等键盘等)输出设备输出设备(显示器等)(显示器等)主机主机l在程序运行时,程序本身和数据一般都存放在内存中。当程在程序运行时,程序本身和数据一般都存放在内存中。当程序
2、运行结束后,存放在内存中的数据被释放。序运行结束后,存放在内存中的数据被释放。l如果如果需要长期保存程序运行所需的原始数据,或程序运如果如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。行产生的结果,就必须以文件形式存储到外部存储介质上。西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 3文件由操作系统管理文件由操作系统管理根目录根目录打开的子目录打开的子目录子子目目录录打开的子目录中的文件打开的子目录中的文件西安电子科技大学软件学院 -School of Com
3、puter Software,Xidian University,China 4C C语言中的文件概述语言中的文件概述l文件与文件名文件与文件名q文件文件是指存放在外部存储介质上的数据集合是指存放在外部存储介质上的数据集合q为了标识一个文件,每个文件都必须有一个文件名,其为了标识一个文件,每个文件都必须有一个文件名,其一般结构为:一般结构为:主文件名主文件名.扩展名扩展名 q文件命名规则需遵循操作系统的约定文件命名规则需遵循操作系统的约定l文件分类文件分类q根据文件的内容,可分为程序文件和数据文件,程序文件根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。
4、又可分为源文件、目标文件和可执行文件。q根据文件的组织形式,可分为顺序存取文件和随机存取文根据文件的组织形式,可分为顺序存取文件和随机存取文件件q根据文件的存储形式,可分为根据文件的存储形式,可分为文本文件文本文件和和二进制文件二进制文件。例如:例如:test.c test.cpp stud.dat 考号考号.txt d:tc20fact.c西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 5文本文件和二进制文件文本文件和二进制文件l文本文件文本文件l二进制文件二进制文件q以文本(字符串)格式存储以文本(字符串)
5、格式存储q文本分行,行尾有行结束标志文本分行,行尾有行结束标志q读写时发生数据转换(自动或人工),转换过程可逆读写时发生数据转换(自动或人工),转换过程可逆q程序容易处理,程序员也容易理解,效率较低程序容易处理,程序员也容易理解,效率较低q以二进制格式存储以二进制格式存储q内容不分行,行尾无行结束标志内容不分行,行尾无行结束标志q读写时不发生数据转换,文件中的内容与信息在内存中的读写时不发生数据转换,文件中的内容与信息在内存中的存储布局相同存储布局相同q程序容易处理,程序员不容易理解,效率较高程序容易处理,程序员不容易理解,效率较高西安电子科技大学软件学院 -School of Compute
6、r Software,Xidian University,China 6例如 int型数据10000在文件中的存储方式00000000文本形式文本形式00000000 00100111 0001000010000的内存存储形式(的内存存储形式(32位)位)00110001 00110000 00110000 00110000 0011000000000000 00000000 00100111 00010000二进制形式二进制形式4948484848003916西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 7
7、C C语言中的文件概述语言中的文件概述l读文件与写文件读文件与写文件q所谓读文件是指将外存文件中的数据读取到计算机内存所谓读文件是指将外存文件中的数据读取到计算机内存的操作。(外设也被抽象为文件)的操作。(外设也被抽象为文件)控制器控制器运算器运算器内存储器内存储器外存储器外存储器(硬盘、(硬盘、U盘等)盘等)输入设备输入设备(键盘等键盘等)输出设备输出设备(显示器等)(显示器等)主机主机q所谓写文件是指从计算机内存向外存文件写入数据的操所谓写文件是指从计算机内存向外存文件写入数据的操作。作。读读读读写写写写西安电子科技大学软件学院 -School of Computer Software,X
8、idian University,China 8C C语言中的文件概述语言中的文件概述l构成文件的基本单元与流式文件构成文件的基本单元与流式文件qC语言语言将文件看作是由一个一个的字符(文本文件)或将文件看作是由一个一个的字符(文本文件)或字节(二进制文件)组成的。将这种文件称为流式文件。字节(二进制文件)组成的。将这种文件称为流式文件。控制器控制器运算器运算器内存储器内存储器输入设备、输入设备、外存外存输出设备、输出设备、外存外存主机主机 0 1 0 0 1 1 1 0 1 0 西安电子科技大学软件学院 -School of Computer Software,Xidian Universi
9、ty,China 9文件缓冲区文件缓冲区输出文件缓冲区输入文件缓冲区程序数据区变量a慢速的外设与快速的主机(慢速的外设与快速的主机(CPU、内存)之间需要、内存)之间需要一个缓冲区(一般由系统创建),以暂存需要传输一个缓冲区(一般由系统创建),以暂存需要传输的数据的数据西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 10缓冲文件系统缓冲文件系统慢速的外设与快速的主机(慢速的外设与快速的主机(CPU、内存)之间需要、内存)之间需要一个缓冲区(一般由系统创建),以暂存需要传输一个缓冲区(一般由系统创建),以暂存需要
10、传输的数据的数据外存文件输出文件缓冲区输入文件缓冲区程序数据区a西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 11文件的基本操作文件的基本操作l文件打开操作文件打开操作l文件关闭操作文件关闭操作l读取文件中的数据操作读取文件中的数据操作l在文件中写入数据的操作在文件中写入数据的操作l文件结束检测操作文件结束检测操作l文件错误检测操作文件错误检测操作l文件缓冲区与流刷新操作文件缓冲区与流刷新操作l文件指针定位操作文件指针定位操作l文件指针位置查询操作文件指针位置查询操作l文件指针重定位操作文件指针重定位操作西安
11、电子科技大学软件学院 -School of Computer Software,Xidian University,China 12文件的基本操作文件的基本操作l在在C程序中如何操作文件?程序中如何操作文件?l由由C系统(系统(C语言实现者)提供文件操作函数语言实现者)提供文件操作函数l按照一定的格式和步骤,借助按照一定的格式和步骤,借助文件指针文件指针,调用文,调用文件操作函数,件操作函数,西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 13文件操作的标准库函数文件操作的标准库函数(stdio.h)lfope
12、n lfclose fclosealllfeoflfgetc /fputc lfgets /fputslfscanf /fprintflfread /fwritelrewindlfseeklferrorlfflush西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 14文件操作的标准库函数文件操作的标准库函数lfopen lfcloselfeoflfscanf /fprintfl(其他函数以后再介绍,也可自己看其他函数以后再介绍,也可自己看)西安电子科技大学软件学院 -School of Computer Sof
13、tware,Xidian University,China 15文件指针文件指针l文件指针类型文件指针类型q文件指针类型格式:文件指针类型格式:FILE*q说明:所有对文件的操作都需要使用文件指针类型说明:所有对文件的操作都需要使用文件指针类型l文件指针变量文件指针变量q定义格式:定义格式:FILE*fp;q说明:要访问某个文件,一定需要首先定义文件指针类说明:要访问某个文件,一定需要首先定义文件指针类型的变量,并将该变量与对应文件关联起来,此后才能型的变量,并将该变量与对应文件关联起来,此后才能进行文件操作进行文件操作西安电子科技大学软件学院 -School of Computer Soft
14、ware,Xidian University,China 16文件的打开和关闭文件的打开和关闭l对文件进行操作前,必须先打开该文件;使用结束对文件进行操作前,必须先打开该文件;使用结束后,应立即关闭。后,应立即关闭。l语言规定了标准输入输出函数库,用语言规定了标准输入输出函数库,用fopen()函数函数打开一个文件,用打开一个文件,用fclose()函数关闭一个文件。函数关闭一个文件。l进行文件操作前,首先应定义一个文件指针变量,进行文件操作前,首先应定义一个文件指针变量,格式为:格式为:FILE*fp;其中,变量名其中,变量名fpfp可换成其他名字可换成其他名字西安电子科技大学软件学院 -S
15、chool of Computer Software,Xidian University,China 17若文件打开操作成功,此若文件打开操作成功,此后在程序中,后在程序中,fpfp就代表外就代表外存上的文件存上的文件fact.cfact.c打开文件和关闭文件打开文件和关闭文件l用函数用函数fopen()fopen()打开指定文件打开指定文件l例如,以只读方式打开文件例如,以只读方式打开文件fact.c:fp=fopen(fp=fopen(fact.cfact.c,r r););fp=fopen(fp=fopen(文件名文件名,打开文件方式打开文件方式);l用函数用函数fclose()fclo
16、se()关闭前面打开的文件关闭前面打开的文件fclose(fp);fclose(fp);西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 18打开文件的方式打开文件的方式fp=fopen(fp=fopen(文件名文件名,打开文件方式打开文件方式);文件打开方式 意义 ”r”只读打开一个文本文件,只允许读数据 ”w”只写打开或建立一个文本文件,只允许写数据 ”a”追加打开一个文本文件,并在文件末尾写数据 ”rb”只读打开一个二进制文件,只允许读数据 ”wb”只写打开或建立一个二进制文件,只允许写数据 ”ab”追加打
17、开一个二进制文件,并在文件末尾写数据 ”r+”读写打开一个文本文件,允许读和写 ”w+”读写打开或建立一个文本文件,允许读写 ”a+”读写打开一个文本文件,允许读,或在文件末追加数据 西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 19创建一个数据文件创建一个数据文件(向文件写入数据)(向文件写入数据)西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 20创建数据文件创建数据文件步骤:步骤:1)1)定义文件指针变量和其他变量;定义
18、文件指针变量和其他变量;2)2)以只写方式(或追加方式)打开文件(以只写方式(或追加方式)打开文件(用用fopen函数函数););3)3)是否继续写入:是否继续写入:是,转是,转4);4);否,转否,转5)5);4)4)向文件中写入一个数据(向文件中写入一个数据(用用fprintf函数函数),转),转3 3););5)5)关闭文件(关闭文件(用用fclose函数函数)。)。西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 21格式化读写数据:格式化读写数据:fscanf/fprintfl函数函数fprintf()
19、以指定格式向文件写入数据,返回值以指定格式向文件写入数据,返回值为写入的字符个数为写入的字符个数fprintf(文件指针文件指针,格式串格式串,输出表列输出表列);/除了增加文件指针参数除了增加文件指针参数,与与printf用法相同用法相同例如:例如:fprintf(fp,%d,10000);/将将10000写入文件写入文件F一般不需要使用一般不需要使用fprintf的返回值的返回值F写入整数或浮点数时,数之间应有间隔写入整数或浮点数时,数之间应有间隔l例如,将从键盘输入的例如,将从键盘输入的5个整数写入个整数写入“c.in”文件。文件。西安电子科技大学软件学院 -School of Comp
20、uter Software,Xidian University,China 22#include int main()FILE*fout;int i,a;fout=fopen(c.in,w);if(fout=NULL)printf(open file error!n);return 0;创建文件:格式化读写创建文件:格式化读写l编写程序,将从键盘输入的编写程序,将从键盘输入的5个整数写入个整数写入“c.in”文文件。件。for(i=0;i5;i+)scanf(%d,&a);fprintf(fout,%dt,a);fclose(fout);return 0;西安电子科技大学软件学院 -Schoo
21、l of Computer Software,Xidian University,China 23读取数据文件中的数据读取数据文件中的数据西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 24读取文件中的数据读取文件中的数据步骤:步骤:1)1)定义文件指针变量和其他保存数据的变量;定义文件指针变量和其他保存数据的变量;2)2)以只读方式打开文件(以只读方式打开文件(用用fopen函数函数););3)3)判断文件是否结束判断文件是否结束(用用feof函数函数):是,转是,转5);5);否,转否,转4)4);4)4)
22、从文件中读取一个数据(从文件中读取一个数据(用用fscanf函数函数)并进行需要的处理,)并进行需要的处理,转转3 3););5)5)关闭文件(关闭文件(用用fclose函数函数)。)。西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 25格式化读数据:格式化读数据:fscanffscanffscanf(文件指针文件指针,格式串格式串,输入表列输入表列);/除了增加文件指针参数,与除了增加文件指针参数,与scanf的用法相同的用法相同/函数的返回值为读取到的数据个数函数的返回值为读取到的数据个数例如:例如:fsc
23、anf(fp,%d,&a);/从文件中读取一个整数从文件中读取一个整数l函数函数fscanf()以指定格式从文件中读取数据,返回值以指定格式从文件中读取数据,返回值为读取到的数据个数为读取到的数据个数l例如,已知文本文件例如,已知文本文件“c.in”中有中有若干个若干个整数,读取整数,读取其中的所有整数并通过显示屏输出。其中的所有整数并通过显示屏输出。西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 26#include#include int main()FILE*fin;int a;fin=fopen(c.i
24、n,r);if(fin=NULL)printf(open file error!n);return 0;读取文本文件中的整数:格式化读读取文本文件中的整数:格式化读l编写程序,读取编写程序,读取“c.in”文件中的每个整数并输出至文件中的每个整数并输出至屏幕。屏幕。while(!feof(fin)if(fscanf(fin,%d,&a)!=1)break;printf(%dt,a);fclose(fin);return 0;西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 27#include int main(
25、)FILE*fin,*fout;int a,b;fin=fopen(c.in,r);fout=fopen(csqr.dat,w);if(fin=NULL|fout=NULL)printf(open file error!n);exit(0);创建文件:从一个文件读取,写入另一个文件创建文件:从一个文件读取,写入另一个文件l编写程序,将编写程序,将“c.in”文件中的每个整数取出,求平文件中的每个整数取出,求平方后写入方后写入“csqr.dat”。while(!feof(fin)if(fscanf(fin,%d,&a)!=1)break;b=a*a;fprintf(fout,%12d,b);fc
26、lose(fin);fclose(fout);return 0;西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 28文件操作的标准库函数文件操作的标准库函数lfopen lfcloselfeoflfscanf /fprintflfgtec/fputcch=fgetc(fin)等同于等同于 fscanf(fin,%c,&ch)fputc(fout,ch)等同于等同于 fprintf(fout,%c,ch)(其他文件操作函数以后再介绍其他文件操作函数以后再介绍)End西安电子科技大学软件学院 -School of
27、Computer Software,Xidian University,China 29文本文件和二进制文件文本文件和二进制文件l文本文件文本文件l二进制文件二进制文件q以文本(字符串)格式存储以文本(字符串)格式存储q文本分行,行尾有行结束标志文本分行,行尾有行结束标志q读写时发生数据转换(自动或人工),转换过程可逆读写时发生数据转换(自动或人工),转换过程可逆q程序容易处理,程序员也容易理解,效率较低程序容易处理,程序员也容易理解,效率较低q以二进制格式存储以二进制格式存储q内容不分行,行尾无行结束标志内容不分行,行尾无行结束标志q读写时不发生数据转换,文件中的内容与信息在内存中的读写时不
28、发生数据转换,文件中的内容与信息在内存中的存储布局相同存储布局相同q程序容易处理,程序员不容易理解,效率较高程序容易处理,程序员不容易理解,效率较高西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 30例如 int型数据10000在文件中的存储方式00000000文本形式文本形式00000000 00100111 0001000010000的内存存储形式的内存存储形式00110001 00110000 00110000 00110000 0011000000000000 00000000 00100111 000
29、10000二进制形式二进制形式4948484848003916西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 31例如 int型数据10000在文件中的存储方式 /二进制文件二进制文件 FILE*out;int a=10000;out=fopen(test-1.dat,wb);fwrite(&a,sizeof(int),1,out);fclose(out);/文本文件文本文件 FILE*out;int a=10000;out=fopen(test-2.dat,wb);fprintf(out,%d,a);fclo
30、se(out);西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 32标准文件流(文本文件)标准文件流(文本文件)l什么是标准文件流什么是标准文件流l标准输入流标准输入流l标准输出流标准输出流l标准错误流标准错误流qC C 语言为用户预定义了三个全局文件流数据对象语言为用户预定义了三个全局文件流数据对象q定义于定义于“stdio.h”stdio.h”中中qstdin:代表输入设备(一般为键盘):代表输入设备(一般为键盘)q用户输入均由系统自动放入用户输入均由系统自动放入stdinstdin所代表的存储空间所代表的
31、存储空间qstdout:代表输出设备(一般为屏幕):代表输出设备(一般为屏幕)q程序输出均由系统自动放入程序输出均由系统自动放入stdoutstdout所代表的存储空间所代表的存储空间qstderrstderr:代表错误输出设备(一般为屏幕):代表错误输出设备(一般为屏幕)q程序错误输出均由系统自动放入程序错误输出均由系统自动放入stderrstderr所代表的存储空间所代表的存储空间西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 33其他文件操作函数其他文件操作函数l在在C语言中,对外存上文件的所有操作均是通
32、过系语言中,对外存上文件的所有操作均是通过系统提供的库函数进行的。统提供的库函数进行的。格式化读写数据:格式化读写数据:fscanf/fprintf读写一个字符:读写一个字符:fgetc/fputc读写一个字符串:读写一个字符串:fgets/fputs读写数据块:读写数据块:fread/fwrite其他函数:其他函数:fseekftellrewindferrorfflush结结 束束西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 34读取文件中的字符读取文件中的字符 -fgetcl函数函数fgetc()fget
33、c()从指定的文件读取并返回一个字符从指定的文件读取并返回一个字符l例如,编写程序读取文件例如,编写程序读取文件“fact.c”中的数据并显示中的数据并显示在屏幕上。在屏幕上。ch=fgetc(fp)ch=fgetc(fp);步骤:步骤:1)1)定义文件指针变量和其他变量;定义文件指针变量和其他变量;2)2)以读方式打开文件;以读方式打开文件;3)3)文件是否结束:是,转文件是否结束:是,转5);5);否则,转否则,转4)4);4)4)从文件中读取一个字符并输出,转从文件中读取一个字符并输出,转3 3););5)5)关闭文件。关闭文件。西安电子科技大学软件学院 -School of Compu
34、ter Software,Xidian University,China 35读取文件中的字符(读取文件中的字符(feof)l例如,编写程序读取文件例如,编写程序读取文件“fact.c”中的数据并显示中的数据并显示在屏幕上。在屏幕上。#include int main()FILE*fp;char ch;fp=fopen(fact.c,r);if(fp=NULL)printf(open file error!n);exit(0);while(!feof(fp)ch=fgetc(fp);printf(%c,ch);fclose(fp);return 0;西安电子科技大学软件学院 -School o
35、f Computer Software,Xidian University,China 36创建文件:以写方式打开,再用写入函数创建文件:以写方式打开,再用写入函数l例如,以写入方式打开例如,以写入方式打开(创建创建)文件文件char.dat:fp=fopen(fp=fopen(char.datchar.dat,w w););l函数函数fputc()fputc()将指定字符写入文件将指定字符写入文件fputc(ch,fp)fputc(ch,fp);西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 37创建元素为字
36、符的文件创建元素为字符的文件步骤:步骤:1)1)定义文件指针变量和其他变量;定义文件指针变量和其他变量;2)2)以写入方式打开文件;以写入方式打开文件;3)3)写入是否结束:是,转写入是否结束:是,转5);5);否则,转否则,转4)4);4)4)将一个字符常量或变量写入文件,转将一个字符常量或变量写入文件,转3 3););5)5)关闭文件。关闭文件。l例如,编写程序,将从键盘输入前例如,编写程序,将从键盘输入前20个字符写入文个字符写入文件件“char.dat”西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 3
37、8向文件写入字符数据向文件写入字符数据 -fputcl例如,编写程序,将从键盘输入前例如,编写程序,将从键盘输入前20个字符写入文个字符写入文件件“char.dat”#include int main()FILE*fp;char i=0,ch;fp=fopen(char.dat,w);if(fp=NULL)printf(open file error!n);exit(0);while(i 20)ch=getchar();fputc(ch,fp);i+;fclose(fp);return 0;西安电子科技大学软件学院 -School of Computer Software,Xidian Uni
38、versity,China 39复制文件复制文件:从一个文件读出,向另一个文件写入从一个文件读出,向另一个文件写入l编写程序,将编写程序,将“swap.c”复制一份存放在复制一份存放在“D:testswapbak.c”。步骤:步骤:1)1)定义两个文件指针变量和其他变量;定义两个文件指针变量和其他变量;2)2)以读方式打开文件以读方式打开文件swap.c ;以写方式打开文件;以写方式打开文件swapbak.c;3)3)文件文件swap.c是否结束:是,转是否结束:是,转5);5);否则,转否则,转4)4);4)4)从从swap.c中读取一个字符写入文件中读取一个字符写入文件swapbak.c,
39、转,转3 3););5)5)关闭文件。关闭文件。#include int main()FILE*in,*out;char ch;in=fopen(swap.c,r);out=fopen(d:testswapbak.c,w);if(in=NULL|out=NULL)printf(open file error!n);exit(0);while(!feof(in)ch=fgetc(in);fputc(ch,out);fclose(in);fclose(out);return 0;西安电子科技大学软件学院 -School of Computer Software,Xidian University,
40、China 40l文本行读取函数文本行读取函数 函数原型:函数原型:char*fgets(char*s,int n,FILE*fp);意义:从文件意义:从文件 fp 中读取最多中读取最多 n 个字符,写入个字符,写入 s 所指向所指向的存储空间,函数在遇到换行符或读取了的存储空间,函数在遇到换行符或读取了 n 1 个字符个字符之后结束之后结束 返回值:成功执行时,返回指针返回值:成功执行时,返回指针 s,否则返回,否则返回 NULLl特别说明特别说明 确保确保 s 指向的存储空间在调用此函数时已分配指向的存储空间在调用此函数时已分配 确保空间足够,字符串尾部确保空间足够,字符串尾部0由系统自动
41、添加;建议由系统自动添加;建议使用标准库中的宏使用标准库中的宏BUFSIZ(512 字节)字节)读取过程中如遇到读取过程中如遇到 EOF,函数同样返回,函数同样返回 NULL文本行读写操作文本行读写操作西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 41l文本行写入函数文本行写入函数 函数原型:函数原型:int fputs(const char*s,FILE*fp);意义:将字符串意义:将字符串 s 写入文件写入文件 fp 返回值:成功时为一个非负整数,失败时为返回值:成功时为一个非负整数,失败时为EOF(即即
42、-1)l特别说明特别说明 fputs 函数并不复制字符串尾部的函数并不复制字符串尾部的0 fputs 函数的返回值一般不需要测试函数的返回值一般不需要测试文本行读写操作文本行读写操作西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 42fgetsfgets读取文件内容读取文件内容l编写程序,将编写程序,将“test_time.c”的内容用的内容用fgets读取出来读取出来并显示在屏幕上。并显示在屏幕上。#include int main()FILE*in;char str101;in=fopen(test_time.c,r);if(in=NULL)printf(open file error!n);exit(0);while(!feof(in)fgets(str,100,in);puts(str);fclose(in);system(pause);return 0;西安电子科技大学软件学院 -School of Computer Software,Xidian University,China 43 第 307 页:习题二 第 1、2、4 小题