C语言程序设计课件第10章myself

合集下载

C语言程序设计第四版PPT-谭浩强

C语言程序设计第四版PPT-谭浩强

文件f2的 文件信息区
文件f3的 文件信息区
文件的基本知识——文件的操作 写文件:打开-写-关闭 读文件:打开-读-关闭
文件的打开
功能:为文件建立相应的信息区(存放 文件信息)和文件缓冲区(暂时存放输入 输出的数据) 函数: fopen(文件名,使用文件方式); 例: fopen("a1.dat","r");
第10章 文件
本章内容
10.1 文件的基本知识 10.2 打开与关闭文件 10.3 顺序读写数据文件 10.4 随机读写数据文件 10.5 文件读写的出错检测
文件的基本知识——输入输出
之前各章中处理的数据 ➢输入:键盘->内存 ➢输出:内存->显示器 实际上也可能是 ➢输入:外部设备->内存(读文件) ➢输出:内存->外部设备(写文件) 操作系统把各种设备都统一作为文件处理
文件
顺序文件的读写——读写字符串
例10.3 从键盘输入3个字符串,排序,把排
序后的字符串写入文件(P.342-343) 读上面写好的文件(P.344)
顺序文件的读写——格式化读写
fprintf(文件指针,格式字符串,输出表列); fscanf (文件指针,格式字符串,输入表列);
例: fprintf (fp,"%d,%6.2f",i,f); fscanf (fp,"%d,%f",&i,&f);
用文件扩展名”
文件的基本知识——流式文件
C语言把文件看作是字符(或字 节)的序列。
文件以“流”的形式在程序与操 作系统间流动。
文件的基本知识——数据的形式
根据数据的组织形式,数据文件可分为 ASCII文件:数据逐个字符的ASCII码 输出到外存,也称文本文件 二进制文件:内存中二进制形式的数据 直接输出到外存

《C语言程序设计教程》PPT课件

《C语言程序设计教程》PPT课件
② 标准输出文件,文件指针为stdout,系统指定为 显示器。
③ 标准错误输出文件,文件指针为stderr,系统指 定为显示器,输出错误信息。
10.1 文件的概述
11
10.1.2 文件的打开与关闭
操作文件的一般步骤
打开文件 读写文件 关闭文件 打开量文的件函C:语数建配言,立一的用用个输于户文入完程件输成序缓出对与冲函数文区数据件。库文的中件联提的系供建,了立为大、文件分 读写数文据件的:读是写指、对数文据件的的追读加、等写操、作追。加和定位操作。 关闭文件在:程切序断中文调件用与这程些序函的数联时系,,必释须放先文用件缓冲
}
FFIILLE;E *文件指针变量/名* ;This is the FILE object */
10.1 文件的概述
10
10.1.1 文件和文件指针
4. 标准文件
标准文件是外部设备中的三个特殊的设备文件。它们 的文件指针是系统定义的,并由系统自动打开和关闭。这 三个标准文件分别是:
① 标准输入文件,文件指针为stdin,系统指定为 键盘。
include命区令。包含stdio.h文件。
10.1 文件的概述
12
10.1.2 文件的打开与关闭
1. 文件打开函数fopen( )
常用的调用形式: FILE *fp; fp = fopen(文件名, 文件使用方式); 文件名:需要打开的文件名称(字符串)。 文件使用方式:是具有特定含义的符号。
缓冲区cha地r 址和大小f等d; 。 /* File descriptor
*/
FILE在类usnhCso型语irgt是n言ed系中ch统a,r定无hb义os论li的dz;e对;,磁包//**盘含UBnu文g在fefte件scrtcs还dhiazi是reo.i设fh头n备o 文b文uf件*f件/er中*/

C语言从入门到精通 第10章ppt课件

C语言从入门到精通 第10章ppt课件

•例如,-5|3的值为-5。-5与3相位或后得11111011,
其真值为-0000101,即-5。
精选ppt课件2021
上一页下13 一页
第10章 共用体与枚举类型
(3)^(按位“异或”) •运算规则为:0^0=0,0^1=1,1^0=1,1^1=0 •例如,-5^3的值为-8。 (4)~(按位“取反”) •运算规则为:~0=1,~1=0 •例如,~7的值为-8。 (5)<<(“左移”) 例如,3<<2,将3左移2位,右边(最低位)补0, 结果为12,相当于3×2×2的结果。
1. 共用体类型的定义 ➢共用体类型定义用关键字union标识, 形式为: union 标识符
{ 成员说明列表 };
精选ppt课件2021
上一页下2 一页
第10章 共用体与枚举类型
➢标识符给出共用体名, 是共用体类型名的主体, 定义的共用体类型由“union 标识符”标识。
例如,定义一个共用体类型, 要求包含一个整型 成员,一个字符型成员和一个单精度型成员:
精选ppt课件2021
上一页下9 一页
第10章 共用体与枚举类型
例10.1 写出下列程序的执行结果
main()
{union exx
{int a,b; struct
运行结果:
{int c,d;}lpp; }e={10};
60,3600
e.b=e.a+20;
e.lpp.c=e.a+e.b;
e.lpp.d=e.a*e.b;
union icf {int i; char c; float f; };
精选ppt课件2021
上一页下3 一页
第10章 共用体与枚举类型

C语言程序设计课件第10章myself

C语言程序设计课件第10章myself
注意:此题的函数原型可以有以下三种等效表示: • (1)void Display( int (*pa)[3],int row); • (2)void Display( int pa[][3],int row); • (3)void Display( int pa[4][3],int row); • 后两种本质上就是第一种形式,且后两种形式只能出现在形 参表中,不能作为行指针变量的定义(或声明)形式
2013-9-3
4
二维数组的定义
二维数组的实质分析: • (1)这里,a是二维数组名,也可以理解成是一维数组名a, 它有2个元素,分别为a[0]、a[1] • (2)a的2个元素不是普通的变量,而是都分别是一维数组, 称为行一维数组,每一个都有3个int型元素,例:a[0]的3 个元素为:a[0][0]、a[0][1]、a[0][2] • (3)因此,二维数组a中共有6( 2*3 )个int型的元素: • (4)存放顺序:以行优先方式存放。先顺序存放第0行的元 素再存放第1行的元素,以此类推。


行变列,加*号; 列变行,加&号; 只在0列可变行
2013-9-3
10
二维数组元素的访问
一般要对所有的数组元素执行同样的操作,与一维数
组类似,用循环结构控制,二维数组需用两层循环
• 例:int a[4][3],n=1;
• for(int i=0;i<4;i++) • for(int j=0;j<3;j++) • a[i][j]=n++;

程序10.1 将如下所示的矩阵存入二维数组,然后照 原样输出,最后按转置形式输出。
• 算法提示:转置输出不需要另外定义二维数组,只是在控制循 环时先控制列下标再控制行下标

C语言第10讲PPT课件

C语言第10讲PPT课件
➢结构体中的成员可以和程序中的变量同名, 不同结构体中的成员也可以同名。
09.12.2020
Page 12
Program Design in C Language
9.1.2 结构体类型变量的定义
例如:
struct date {
int year, month, day; }; struct _Student2 {
➢先定义结构体类型,再定义结构体变量。 ➢在定义结构体类型的同时定义结构体变量。 ➢直接定义结构体变量。
09.12.2020
Page 6
Program Design in C Language
9.1.2 结构体类型变量的定义
方式一:
若事先已定义了结构体类型,那么直接用下面的 格式定义结构体变量:
结构体类型名 结构体变量名; 例如:struct _Student stu1, stu2; stu1和stu2的存储形式为:
成员的名称,其命名规则同变量名。多个同 类型的成员彼此间用逗号分隔。
09.12.2020
Page 4
9.1.1 结构体类型的定义
Program Design in C Language
结构体类型定义举例:
struct _Student
{
char id[10]; /*学号*/
char name[10]; /*姓名*/
Program Design in C Language
09.12.2020
Page 9
Program Design in C Language
9.1.2 结构体类型变量的定义
方式三:
在定义结构体类型时可以直接定义结构体变量。 定义格式为:
struct {

c语言程序设计ppt课件

c语言程序设计ppt课件
使用更高效的算法和数据结构,提高程序的性能。
对代码进行重新组织和优化,提高可读性和可维护性。
C语言发展趋势和展望
C语言在计算机科学领域的重要地位
C语言作为计算机科学领域的基础语言,具有广泛的应用和深远的影响。
C语言在操作系统、嵌入式系统等领域的应用
C语言在操作系统、嵌入式系统等领域具有不可替代的作用,其高效、可靠的性能深受开发者的青睐。
循环结构
函数定义
函数调用
函数参数传递
函数返回值
01
02
03
04
指定函数名、返回值类型和参数列表。
通过函数名和参数列表来调用函数。
按值传递和按指针传递。
函数执行完毕后返回一个值。
C语言进阶特性
指针是一种变量,它存储了另一个变量的内存地址。通过指针可以间接访问和修改变量的值。
指针
使用指针可以进行地址操作,如取地址、解引用等。指针在C语言中广泛应用于动态内存分配、函数参数传递和数组操作等场景。
C语言程序设计 PPT 课件
Contents
目录
C语言概述C语言基础语法C语言进阶特性C语言编程实践C语言常见错误和调试C语言发展趋势和展望
C语言概述
C语言起源于20世纪70年代,由美国贝尔实验室的Dennis Ritchie设计开发。
C语言最初是为了开发UNIX操作系统而创建的,后来逐渐发展成为一种通用的编程语言。
C语言提供了多种文件读写函数,如fread()和fwrite()用于二进制文件的读写,fscanf()和fprintf()用于文本文件的读写。通过文件读写函数可以对文件内容进行读取和写入操作。
文件读写
C语言编程实践
冒泡排序:通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

高树芳C语言程序设计--第十章

高树芳C语言程序设计--第十章

[解决方案]定义结构体类型变量存储学生信息,
使用scanf从键盘输入数据,使用fprintf函数按格 式输出数据到文件(生成data3.txt文件)。
程序代码
10
10.2
文件的读写
相关知识:
1.文件的读写 2.格式化读写函数
11
10.2
文件的读写
[课堂训练10-1] 1.使用Windows的记事本建立一个文件,其 中写入15个任意整数,数据之间用逗号分隔。 编程输出该文件所有的奇数。 2.编程以只读方式打开案例10-3中的 data3.txt文件,在屏幕上输出所有学生的数 据。
第10章
文件
知识目标: 1. 理解文件和文件指针的概念 2.掌握文件的打开和关闭方法 3.掌握文件的读写操作 4.掌握文件的定位与随机读写操作
1
第10章 文件 能力目标: 1. 会打开和关闭文件 2.会对文件进行读写和定位等操作
本章内容: 文件的定义,文件型指针,文件的打开与关闭,文件 的读写,文件的定位与随机读写。
2
第10章 10.1 10.2 10.3 10.4
文件
文件的打开与关闭 文件的读写 文件的定位和随机读写 知识拓展
3
10.1 文件的打开与关闭
案例10-1
输出文件中的整数及其和
4
10.1 文件的打开与关闭
案例10-1 [案例任务]
输出文件中的整数及其和
使用Windows的记事本在磁盘上与C程序文件在同一目 录下建立一个文件名为“data1.txt”的文本文件(如 图10-1所示),以空格、制表符或回车为分隔符输入 任意个整数,设计C程序,以只读方式打开此文件,若 该文件不存在,则输出“不能打开文件!”,若打开 成功,则输出所有整数,以及整数的个数和它们之和。

最新C语言课件第10章教学讲义ppt

最新C语言课件第10章教学讲义ppt

➢完成一个学生成绩信息管理系统应用程 序的设计,该程序的操作界面。
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
电脑基础·实例·上机系列丛
“成绩浏览”功能区运行结果
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
实现用户登录认证和用户登出功能
➢对数据库表数据进行添加或删除意味着改变 数据库的内容,在进行添加或删除数据信息 时应慎重,为了避免有人恶意添加或删除信 息,因此,只有具有此操作权限的人才能进 行操作,即在程序中,当用户需要进行添加 或删除数据信息操作时,要进行一个用户登 录认证,只有通过认证的用户才有权限进行 数据库内容的修改。
电脑基础·实例·上机系列丛
清华大学出版社
程序实现
Visual C++程序设计教程
➢(5)实现学生成绩信息浏览功能。 ➢(6)实现用户登录认证和用户登出功
能。 ➢(7)实现学生ห้องสมุดไป่ตู้绩信息添加功能。 ➢(8)实现学生成绩信息删除功能。
电脑基础·实例·上机系列丛
清华大学出版社
程序实现
Visual C++程序设计教程
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程 建立一个带有ODBC数据库支持功能的单文档界面 的工程文件
➢建立一个带有ODBC数据库支持功能的 单文档界面的工程文件的操作步骤如下:

C语言程序设计教程ppt课件

C语言程序设计教程ppt课件

参数传递和返回值问题探讨
参数传递方式
包括值传递和地址传递两 种方式,影响函数内部对 参数的修改是否影响原始 数据。
返回值类型
根据函数功能确定合适的 返回值类型,确保函数返 回正确结果。
返回值处理
对于返回指针或引用类型 的函数,需要注意内存管 理和数据有效性等问题。
局部变量和全局变量作用域问题
局部变量
文件定位
使用fseek()函数实现文件定位,可 随机访问文件任意位置。
错误处理
通过检查文件指针是否为NULL、使用 perror()函数输出错误信息等方式进行 错误处理。
文件操作在实际项目中应用
数据存储
将程序运行过程中的数 据保存到文件中,以便
后续使用或分析。
配置文件
读取配置文件中的参数 设置,使程序更加灵活
C语言特点与优势
高效性
C语言代码执行效率高,适合开发对性能要求 较高的应用。
灵活性
C语言具有高度的灵活性,可以直接操作内存 ,支持多种数据类型和运算符。
可移植性
C语言具有良好的可移植性,可以在多种平台 上运行。
编程环境与工具简介
编程环境
C语言可以在多种操作系统上开 发,如Windows、Linux、 macOS等。
指针赋值与解引用
通过赋值操作,指针可以指向不同的内存地址; 解引用操作可以获取指针所指向的值。
指针运算
指针可以进行加减运算,表示内存地址的偏移。
动态内存分配和释放方法
malloc函数
realloc函数
用于在堆区分配指定大小的 内存空间,返回分配的内存
地址。
01
02
用于调整已分配内存的大小 。
03
04

C语言程序设计PPT

C语言程序设计PPT
p->next=r->next; 点*/ r->next=p; /*将*r的指针域指向*p*/ /*将*p的指针域指向*r的下一个结

说明:在链表中插入新结点并不需要移动链表中的元素,
只需要修改指针的指向即可。
15.2 链表的操作
15.2.5 链表的删除操作

删除链表中元素值为’a’的结点,操作过程如图15.8所示。
15.1 链表的相关概念

函数malloc常常与运算符sizeof配合使用。例如,要分配
一个大小为40的int型的内存空间,代码如下:

int *p; p=(int*)malloc(sizeof(int)*40);
15.1 链表的相关概念

2。free函数──动态内存释放函数
函数free的主要作用是将动态分配的内存空间释放。它的 函数原型如下: void free(void *p);
r->next=p->next; /*删除p指向的结点,使*p脱链*/ free(p); /*释放p指向的结点的内存空间*/
15.2 链表的操作
15.2.6 链表的应用举例——学生信息管理系统 【例15.2】建立一个学生信息管理系统,管理系统有一 个目录菜单,包括6个选项: 1.建立学生信息链表 2.插入一名新的学生 3.从链表中删除学生 4.在链表中查找学生; 5.在链表中浏览信息; 6.退出程序结束操作 根据需要选择其中一项,来实现链表的创建、结点插 入、信息查找、删除结点、浏览信息、退出功能。学 生信息包括学号和姓名。
15.1 链表的相关概念
struct student /*定义结点类型*/ { char data; /*数据域*/ struct student *next; /*next是指针域,指向结 构体类型struct student*/ };
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2013-9-3
15
二维数组与列指针
程序10.6
• 算法思想:用一个 n行m列二维数组a来存储矩阵,一个长 度为n的一维数组min存储每行中的最小元素,一个长度为m 的一维数组max存储每列中的最大元素。 • 寻找马鞍点的具体方法是:用行控制外层循环,在i行其行 中最小元素为min [i],在行固定的情况下,用列控制内层 循环,用每一列的最大元素值max[j]与当前行的min[i]去 比较,如果二者相等,则说明一个二维数组元素a[i][j]就 是马鞍点。 • 显然,一个矩阵中可能不止一个马鞍点,也有可能没有马鞍 点。马鞍点元素加括号输出。
2013-9-3
5
二维数组的定义
二维数组定义中的常量与变量: • 例:int a[2][3]; • (1)二维数组a和行一维数组a[0]~a[3]均为指针常量 • (2)二维数组元素a[0][0]~a[1][2]是int型的变量
2013-9-3
6
二维数组的初始化
二维数组在定义的同时可为其元素赋值,称为初始化, 每行单独用一 共有两层大括号 对大括号括起 原则:行从左到右依次,每行中列从左到右依次 • (1)逐行初始化: • 行数计算出来为4,不初始化时不能缺少行数 int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; • (2)行数可以缺省,列数不能省,自动算行 : 只有一层大括号 • int a[ ][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; • (3)不分行,用类似一维数组的方式初始化: • int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; • (4)初始化数据不足,系统用0补充: • int a[4][3]={{1,2},{4,5},{7,8,9},{10,11,12}}; • (5)最简单的初始化: int a[4][3]={0}; 等效于int a[4][3]={{1,2,0},{4,5,0},{7,8,9},{10,11,12}}; 第1个元素初始化为0,其余未 7 初始化的元素值自动为0 2013-9-3
注意:此题的函数原型可以有以下三种等效表示: • (1)void Display( int (*pa)[3],int row); • (2)void Display( int pa[][3],int row); • (3)void Display( int pa[4][3],int row); • 后两种本质上就是第一种形式,且后两种形式只能出现在形 参表中,不能作为行指针变量的定义(或声明)形式
• 元素地址(a+i),&a[i] • • • • 元素 a[i] •
0≤i 二维数组元素的访问0 ≤j <2 <3
二维int a[2][3];
行地址 (a+i),&a[i] 列地址 *(a+i),a[i] 元素地址 *(a+i)+j a[i]+j a[i][j], *(*(a+i)+j), *(a[i]+j),(*(a+i))[j]


行变列,加*号; 列变行,加&号; 只在0列可变行
2013-9-3
10
二维数组元素的访问
一般要对所有的数组元素执行同样的操作,与一维数
组类似,用循环结构控制,二维数组需用两层循环
• 例:int a[4][3],n=1;
• for(int i=0;i<4;i++) • for(int j=0;j<3;j++) • a[i][j]=n++;
变量c
&b
变量b &b
&a
变量a
&a
5
*c
*b **c
printf(“a=%d,*b=%d,**c=%d\n”,a,*b,**c); *b=10; printf(“a=%d,*b=%d,**c=%d\n”,a,*b,**c); **c=100; printf(“a=%d,*b=%d,**c=%d\n”,a,*b,**c); 18 }2013-9-3
一维指针数组与二级指针


元素均为指针类型数据的数组,称为指针数组 定义形式为: 类型标识符 *数组名[数组长度]; 例:char* a[5];
• a是长度为5的一维字符型指针数组,a是指针常量,一维数 组元素a[0]、a[1]、a[2]、a[3]、a[4]都是一级字符型指 针变量,它们各自可以指向一维字符数组,特别是字符串 • 对每个元素(一级指针变量)都可以赋值:a[0]="File"; a[1]="Edit"; a[2]="Compile"; a[3]="Run"; a[4]="Tools"; • 也可以在定义一维指针数组时进行初始化,如普通一维数组 • char* a[5]={"File","Edit","Compile","Run","Tools"}; • 或char* a[]={"File","Edit","Compile","Run","Tools"};
2013-9-3 16
寻找矩阵中的马鞍点。一个矩阵中的元素, 若在它所在的行中最小,在它所在的列中最大,则称 为马鞍点。求一个n*m阶矩阵的所有马鞍点。
动 过 演示 态 程
一维指针数组与二级指针


如果指针变量中保存的是另一个指针变量的地址,这 样的指针变量就称为指向指针的指针(Point to Pointer),指向指针的指针实际上是一种多级指针, 实质就是多级间接寻址。 指向指针的指针的定义格式:
2013-9-3 19
一维指针数组与二维数组
一维指针数组是元素为一级指针变量的一维数组。每
一个一级指针变量可以分别指向长度不同、且彼此空 间不相邻的一维数组。 二维数组是元素为一级指针常量的一维数组。每一个 指针常量分别指向长度相同、彼此空间相邻的一维数 组,例:
• char cColor[4][7]={“white”,”red”,”orange”,”pink”}; • char *pColor[4]= {“white”,”red”,”orange”,”pink”}; • cColor是二维数组,其元素为cColor[0]~cColor[3],它们 都是长度为7的字符型一维数组,且在内存中连续存放 • pColor是一维指针数组,其元素为pColor[0]~pColor[3], 它们都是一级指针变量,可以指向各独立存放的串首地址
• 类型关键字 **指针变量名; • 以上定义可理解为: 类型关键字 *(*指针变量名);

通过指向指针的指针访问目标值时,必须用双星号**。
2013-9-3
17
一维指针数组与二级指针
#include <stdio.h> void main( ) { int a=5; int *b=&a; int **c=&b;
2013-9-3 3
二维数组的定义
二维数组的定义形式: 类型 数组名[整型常量表达式1][整型常量表达式2];

例:int a[2][3];//定义2行3列的整型二维数组,数组名为 a a[0]--- a[0][0]、a[0][1]、a[0][2]
a
a[1]--- a[1][0]、a[1][1]、a[1][2]
&a[1][0] a[1]+0 &a[1][1] a[1]+1 &a[1][2] a[1]+2
a+1
a[1][1]
a[1][2]
二维数组元素可随机访问,因为每个元素地址可计算 Loc(a[i][j])=a+(i*m+j)*sizeof(二维数组元素类型)
2013-9-3 9

数组元素的几种等价引用形式 一维int a[2]
部分联合表示 此处的括号 因此,接受二维数组指针的指针变量,其基类型也应 对应于二维数 一定要有! 对应于二维 组元素类型 该由两部分联合表示,而且对应的部分完全一致,这 数组的列数 样的指针变量称为行指针变量
•还可以:p=a+i或p=&a[i],保证p 例:int (*p)[3]; //二级指针变量p 得到的是行指针都是正确的 • int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; • p=a; //将二维数组指针赋值给行指针变量 • 此时行指针变量p等价于二维数组指针a,有以下等价式: • p+i= =a+i p[i]= =a[i] p[i][j]= =a[i][j]
2013-9-3 8
二维数组元素的访问

a[0]
a[1]
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
a[0]+0 &a[0][1] a[0]+1 &a[0][2] a[0]+2
&a[0][0]
a
a[0][0] a[0][1] a[0][2] a[1][0]
2013-9-3
4
二维数组的定义
二维数组的实质分析: • (1)这里,a是二维数组名,也可以理解成是一维数组名a, 它有2个元素,分别为a[0]、a[1] • (2)a的2个元素不是普通的变量,而是都分别是一维数组, 称为行一维数组,每一个都有3个int型元素,例:a[0]的3 个元素为:a[0][0]、a[0][1]、a[0][2] • (3)因此,二维数组a中共有6( 2*3 )个int型的元素: • (4)存放顺序:以行优先方式存放。先顺序存放第0行的元 素再存放第1行的元素,以此类推。
相关文档
最新文档