实验4 文件操作
文件操作的实验报告

文件操作的实验报告1. 实验背景文件是计算机中存储数据的一种重要方式,在实际应用中,经常需要对文件进行读写与操作。
本实验旨在通过实际操作,掌握文件的打开、读写、复制和关闭等基本操作。
2. 实验内容本实验分为四个部分,分别是文件的打开、读写、复制和关闭操作。
2.1 文件的打开文件的打开是文件操作的第一步,通过打开文件可以获得对文件的访问权限。
在本实验中,我们使用Python语言进行文件操作。
下面是打开文件的示例代码:pythonfile = open("test.txt", "r")在上述代码中,"test.txt"是指要打开的文件名,"r"表示以只读方式打开文件。
如果需要以写入方式打开文件,可以使用"w"作为参数。
2.2 文件的读写文件的读写是文件操作的核心内容之一。
通过读取文件,可以获得文件中的内容;而通过写入文件,可以向文件中写入内容。
下面是读取文件内容和写入文件内容的示例代码:python读取文件内容content = file.read()写入文件内容file.write("Hello, World!")在上述代码中,`read()`函数用于从文件中读取所有内容,`write()`函数用于向文件中写入指定的内容。
2.3 文件的复制文件的复制是文件操作中常见的需求之一。
通过文件的复制,可以将一个文件的内容复制到另一个文件中。
下面是文件复制的示例代码:python打开源文件和目标文件source_file = open("source.txt", "r")target_file = open("target.txt", "w")读取源文件内容content = source_file.read()写入目标文件target_file.write(content)关闭文件source_file.close()target_file.close()在上述代码中,我们首先打开源文件和目标文件,然后读取源文件的内容并写入目标文件,最后关闭文件。
c语言实验心得体会

c语言实验心得体会在学习C语言的过程中,我参与了多个实验项目,通过实际操作和实验结果的分析,我对C语言的特点、应用和一些常见问题有了更深入的理解和体会。
以下是我对这些实验项目的心得体会:1. 实验项目一:基本语法和数据类型在这个实验中,我学习了C语言的基本语法和数据类型。
通过编写简单的程序,我掌握了变量的定义和使用、常量的使用、运算符的使用以及输入输出函数的应用。
我发现C语言的语法相对简洁明了,易于理解和学习。
同时,我也了解到不同的数据类型在内存中所占用的空间大小以及其取值范围的限制。
2. 实验项目二:控制语句和循环结构在这个实验中,我学习了C语言中的控制语句和循环结构。
通过编写程序,我掌握了条件语句(if-else语句、switch语句)和循环语句(for循环、while循环、do-while循环)的使用。
我发现控制语句和循环结构可以帮助我们实现程序的灵活控制和流程控制,提高程序的效率和可读性。
3. 实验项目三:数组和字符串在这个实验中,我学习了C语言中数组和字符串的使用。
通过编写程序,我掌握了数组的定义和初始化、数组元素的访问和修改、多维数组的使用以及字符串的输入输出和处理。
我发现数组和字符串在实际编程中非常常见,掌握了它们的使用可以提高程序的处理能力和效率。
4. 实验项目四:函数和指针在这个实验中,我学习了C语言中函数和指针的使用。
通过编写程序,我掌握了函数的定义和调用、函数的参数传递和返回值、递归函数的编写以及指针的定义和使用。
我发现函数和指针是C语言中非常重要的概念,掌握了它们可以提高程序的模块化和灵活性。
5. 实验项目五:文件操作在这个实验中,我学习了C语言中的文件操作。
通过编写程序,我掌握了文件的打开和关闭、文件的读写操作以及文件指针的使用。
我发现文件操作在实际应用中非常常见,掌握了文件操作可以实现程序与外部文件的数据交互,提高程序的扩展性和灵活性。
通过这些实验项目,我不仅学会了C语言的基本语法和常用功能,还培养了自己的编程思维和解决问题的能力。
文件管理实验报告

文件管理实验报告一、实验目的文件管理是操作系统的重要组成部分,本次实验的目的在于深入理解文件管理的基本概念和原理,掌握文件的存储、组织、检索和访问等操作,熟悉常见的文件系统结构和功能,提高对文件管理系统的实际操作能力和问题解决能力。
二、实验环境1、操作系统:Windows 102、开发工具:Microsoft Visual Studio 2019三、实验内容1、文件的创建、删除和重命名使用 C++或 Python 编程语言,通过系统调用或相关库函数实现文件的创建、删除和重命名操作。
观察文件在操作系统中的实际表现,如文件的出现和消失,文件名的更改等。
2、文件的读写操作实现对文本文件和二进制文件的读写操作,包括读取文件的全部内容、按行读取文件、向文件写入数据等。
分析不同读写模式(如只读、只写、读写等)对文件操作的影响。
3、文件属性的获取和修改获取文件的基本属性,如文件大小、创建时间、修改时间、访问权限等。
尝试修改文件的部分属性,如只读属性、隐藏属性等,观察修改后的效果。
4、文件目录的操作创建、删除和遍历目录。
实现文件在不同目录之间的移动和复制操作。
四、实验步骤1、文件的创建、删除和重命名以下是使用 Python 实现文件创建、删除和重命名的示例代码:```pythonimport os创建文件file_path ="exampletxt"with open(file_path, 'w') as f:fwrite("This is a test file")删除文件osremove(file_path)重命名文件new_file_path ="renamed_exampletxt"osrename(file_path, new_file_path)```运行代码后,可以在指定的目录中观察到文件的创建、删除和重命名操作的结果。
2、文件的读写操作读取文本文件的示例代码:```pythonfile_path ="text_filetxt"with open(file_path, 'r') as f:content = fread()print(content)```按行读取文本文件的示例代码:```pythonfile_path ="text_filetxt"with open(file_path, 'r') as f:for line in f:print(linestrip())```写入数据到文件的示例代码:```pythonfile_path ="outputtxt"with open(file_path, 'w') as f:fwrite("New data written to file")```分别运行上述代码,观察文件的读写结果。
《数据库与信息系统》实验4指导解析_9-10

实验四数据库操作语言SQL一.实验目的⚫了解使用SQL中DDL语句创建数据库和表的方法⚫熟练掌握使用SQL中DML语句对数据库进行查询、插入、修改和删除等操作的方法⚫掌握可编程对象视图和存储过程的创建与使用方法,了解触发器的创建方法二.实验环境及素材⚫MySQL和Navicat for MySQL⚫bookstore数据库的脚本文件bookstore.sql三.实验内容首先创建一个bookstore数据库,执行bookstore.sql脚本文件实现表的创建及数据记录的添加。
然后在bookstore数据库中完成以下题目(bookstore数据库设计说明参见10.1节)。
①在Navicat for MySQL中,创建数据库bookstore。
②右击数据库bookstore,选择“运行SQL文件…”,在对话框中浏览选择“bookstore.sql”文件,点击“开始”即可完成数据表定义及添加数据记录。
③在左栏连接窗口展开数据库“bookstore”/表,右击“表”选“刷新”菜单,即可看到恢复的各数据表。
9.创建和使用存储过程。
解析:存储过程是经过编译的SQL语句的集合。
用户首先创建存储过程,然后在程序中调用该存储过程执行。
创建存储过程可以在Navicat for MySQL中使用向导建立,也可以使用SQL的CREATE PROCDURE语句。
存储过程可以接受参数、也可将查询信息通过输出参数返回调用者。
常用存储过程的语法格式:CREATE PROCDURE 存储过程名( [形式参数列表])SQL语句段“形式参数列表”中多个参数之间用逗号分隔,如果没有参数,则()中为空。
每个参数由输入输出类型、参数名和参数类型三部分组成,定义规则如下:[IN|OUT|INOUT 参数名类型输入输出类型中:IN是输入参数,即把数据传递给存储过程;OUT是输出参数,即从存储过程返回值;INOUT表示输入输出,即传入也能返回值。
Python实验报告

目录备注:实验考核要求及成绩评定本课程共有10个上机实验(16次),均为必做。
实验考核由出勤与纪律情况、实验任务完成情况、实验报告质量三个环节组成,成绩以百分计,满分 100 分。
各考核环节所占分值比例及考核要求如下。
每次实验按百分制单独评分,取各次成绩的平均值作为此环节的最终成绩并按比例计入课程总评成绩。
sy1_7.py 并保存至已建好的文件夹中。
4. 检查已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。
5. 运行程序并分析运行结果是否合理。
在运行时要注意当输入不同的数据时所得结果是否正确,应测试两组以上数据,分别检查在不同情况下结果是否正确。
列出1-7题源程序清单并记录上机运行结果。
1.编写Python程序,进行摄氏度和华氏度之间的温度转换。
源程序:运行结果:2. 天天向上的力量计算。
一年365天,以第1天的能力值为基数,记为1.0,当好好学习时能力值相比前一天提高1‰,当没有学习时由于遗忘等原因能力值相比前一天下降1‰。
每天努力和每天放任,一年下来的能力值相差多少呢?源程序:运行结果:思考:如果好好学习时能力值相比前一天提高5‰,当放任时相比前一天下降5‰。
效果相差多少呢?源程序:运行结果:如果好好学习时能力值相比前一天提高1%,当放任时相比前一天下降1%。
效果相差多少呢?源程序:运行结果:3. 一年365天,一周5个工作日,如果每个工作日都很努力,可以提高1%,仅在周末放任一下,能力值每天下降1%,效果如何呢?源程序:运行结果:4. 每周工作5天,休息2天,休息日水平下降0.01,工作日要努力到什么程度一年后的水平才与每天努力1%所取得的效果一样呢?(选作)源程序:运行结果:5. 输入一个星期数字,返回对应星期名称。
源程序:运行结果:6. 利用print()函数实现简单的非刷新文本进度条及单行动态刷新文本进度条。
(1) 简单的非刷新文本进度条源程序:运行结果:(2) 单行动态刷新文本进度条源程序:运行结果:实验成绩评定表sy2_1.py-sy2_9.py并保存至已建好的文件夹中。
文件实验报告

文件实验报告实验目的:本实验旨在探究文件的创建、编辑、保存和删除等基本操作,并通过实际操作,掌握文件管理的方法和技能。
实验步骤:1. 创建文件首先,在计算机桌面或指定的文件夹中,右键点击空白处,选择“新建”->“文本文档”。
此时会生成一个默认名称为“新建文本文档.txt”的文件。
2. 编辑文件双击打开“新建文本文档.txt”,进入编辑模式。
在文件中输入内容,可以是文字、数字或其他字符。
实验中,我们可以输入如下内容:```这是一个文件实验报告。
文件管理是计算机操作的基本技能之一。
通过本实验,我们将学习如何创建、编辑、保存和删除文件。
```3. 保存文件在文件编辑完成后,点击菜单栏上的“文件”选项,选择“保存”或使用快捷键“Ctrl + S”来保存文件。
此时,选择好文件保存的路径,并为文件命名。
比如,我们可以将文件保存到桌面,命名为“实验报告.txt”。
4. 关闭文件保存文件后,点击菜单栏上的“文件”选项,选择“关闭”,或者直接点击右上角的关闭按钮,关闭文件。
5. 删除文件在文件所在的路径中,右键点击该文件,选择“删除”。
系统将弹出确认删除的对话框,点击确认,即可删除文件。
需要注意的是,删除后文件将无法恢复,所以在执行删除操作前,请确保没有重要文件被误删。
实验结果:经过本次实验,我们成功地进行了文件的创建、编辑、保存和删除操作。
我们可以在所选择的路径中找到保存的文件,并可以通过打开相应的应用程序来查看和编辑文件内容。
同时,我们也验证了删除文件的操作,确保了文件在删除后无法被恢复。
实验总结:通过本次实验,我们加深了对文件管理的理解和熟练掌握文件操作的方法和技巧。
文件管理是计算机基础知识中不可或缺的一部分,它使我们能够方便地存储和管理各种类型的文件。
为了提高文件管理的效率和准确性,我们应当遵循以下原则:1. 规范命名:给文件起一个简洁明确、有意义的名称,以便于快速识别和查找。
2. 分类存储:根据文件的性质和用途,将其分类存放在相应的文件夹中,便于管理和检索。
计算机实验报告_范文

实验题目:Python编程基础实践实验时间:2023年3月15日实验地点:计算机实验室实验目的:1. 掌握Python编程的基本语法和常用数据类型。
2. 熟悉Python中的控制流语句,包括条件语句和循环语句。
3. 学习Python中的函数定义和调用。
4. 了解Python中的文件操作和异常处理。
实验内容:一、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm二、实验步骤1. Python基础语法(1)创建一个Python文件,命名为“实验1.py”。
(2)编写Python代码,实现以下功能:- 输出“Hello, World!”;- 定义变量并赋值;- 输出变量的值;- 使用print()函数输出多个字符串,并使用占位符。
代码如下:```python# 输出Hello, World!print("Hello, World!")# 定义变量并赋值a = 10b = "Python"c = a + b# 输出变量的值print(a)print(b)print(c)# 使用print()函数输出多个字符串,并使用占位符print("My name is %s, I am %d years old." % (b, a)) ```2. 控制流语句(1)编写Python代码,实现以下功能:- 输出1到10的整数;- 判断一个数是否为偶数;- 输出1到100之间的偶数。
代码如下:```python# 输出1到10的整数for i in range(1, 11):print(i)# 判断一个数是否为偶数num = 12if num % 2 == 0:print("%d is an even number." % num)else:print("%d is an odd number." % num)# 输出1到100之间的偶数for i in range(1, 101):if i % 2 == 0:print(i)```3. 函数定义和调用(1)编写Python代码,定义一个函数,实现以下功能:- 计算两个数的和;- 计算两个数的乘积;- 计算两个数的差;- 计算两个数的商。
电大在线编程实验报告(3篇)

第1篇一、实验目的通过本次在线编程实验,旨在提高我的编程能力,加深对编程语言的理解,熟悉编程环境的使用,并培养良好的编程习惯。
同时,通过实际编程练习,解决实际问题,提升我的逻辑思维和问题解决能力。
二、实验内容本次实验选择了电大在线编程平台提供的C语言编程课程,主要包括以下内容:1. C语言基本语法;2. 数据类型、变量和运算符;3. 控制结构(分支和循环);4. 函数的定义和调用;5. 数组、指针和字符串操作;6. 文件操作。
三、实验步骤1. 准备工作:登录电大在线编程平台,选择C语言编程课程,熟悉编程环境和操作界面。
2. 编写代码:根据实验指导书,逐个完成实验任务,编写相应的C语言程序。
3. 调试程序:使用调试工具,检查代码中的错误,修正语法错误和逻辑错误。
4. 运行程序:成功编译并运行程序,观察输出结果,确保程序功能符合预期。
5. 总结与反思:对实验过程中遇到的问题进行总结,分析原因,提出改进措施。
四、实验结果与分析1. C语言基本语法:通过实验,我掌握了C语言的基本语法,包括数据类型、变量、运算符等。
2. 控制结构:实验中,我学会了使用if语句、switch语句进行分支控制,以及for循环、while循环进行循环控制。
3. 函数:通过编写和调用函数,我了解了函数的定义、参数传递和返回值等概念。
4. 数组、指针和字符串操作:实验中,我掌握了数组的定义、初始化、访问和操作方法,了解了指针的概念和用法,以及字符串操作函数。
5. 文件操作:通过实验,我学会了使用文件操作函数,实现文件的读写操作。
五、实验总结通过本次在线编程实验,我收获颇丰。
以下是我对本次实验的总结:1. 编程能力得到提高:通过实际编程练习,我对C语言有了更深入的了解,编程能力得到提升。
2. 问题解决能力增强:在实验过程中,我遇到了各种问题,通过查阅资料、请教同学和老师,我学会了如何分析和解决实际问题。
3. 良好的编程习惯:在实验过程中,我养成了良好的编程习惯,如规范命名、注释代码、代码复用等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学生姓名:李亚军学号: 96专业班级:卓越计科121班1.实验目的通过编写文件读写及上锁的程序,进一步熟悉 Linux 中文件 I/O 相关的应用开发,并且熟练掌握 open()、read()、write()、fcntl()等函数的使用。
2.实验内容在 Linux 中 FIFO 是一种进程之间的管道通信机制。
Linux 支持完整的 FIFO通信机制。
本实验内容,通过使用文件操作,仿真 FIFO(先进先出)结构以及生产者-消费者运行模型。
本实验中需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。
此时两个进程同时对同一个文件进行读写操作。
因为这个文件是临界资源,所以可以使用文件锁机制来保证两个进程对文件的访问都是原子操作。
先启动生产者进程,它负责创建仿真 FIFO 结构的文件(其实是一个普通文件)并投入生产,就是按照给定的时间间隔,向 FIFO 文件写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以及要生产的资源数通过参数传递给进程(默认生产周期为 1s,要生产的资源数为 10 个字符)。
后启动的消费者进程按照给定的数目进行消费,首先从文件中读取相应数目的字符并在屏幕上显示,然后从文件中删除刚才消费过的数据。
为了仿真 FIFO 结构,此时需要使用两次复制来实现文件内容的偏移。
每次消费的资源数通过参数传递给进程,默认值为10 个字符。
3.实验步骤(1)实验流程图本实验的两个程序的流程图如图:开始开始(producer)(customer)消费资源创建FIFO结构文件(打印字符)否消费够了吗生产一个资源是上锁上锁将剩下的数据拷贝到等待临时文件tmp中一秒将“生产”的字符写入到FIFO结构文件用临时文件tmp覆盖原数据文件,这样模拟FIFO结构解锁解锁生产完了吗删除临时文件结束结束图节流程图(2)代码头部文件代码:struct myflock{short l_type; /*文件锁类型: F_RDLOCK 读取锁;F_WRLCK 写入锁;F_UNLCK 解锁 */ off_t l_start; /*相对位移量*/short l_whence; /*相对位移量的起点SEEK_SET;SEEK_CUR; SEEK_END: */off_t l_len; /* 加锁区域长度 */pid_t l_pid; /* */} ;/* lock_set */int lock_set(int fd, int type){struct myflock old_lock, lock;= SEEK_SET;= 0;= 0;= type;= -1;/* 判断文件是否可以上锁 */fcntl(fd, F_GETLK, &lock);if != F_UNLCK){/* 判断文件不能上锁的原因 */if == F_RDLCK) /* 该文件已有读取锁 */{printf("Read lock already set by %d\n", ;}else if == F_WRLCK) /* 该文件已有写入锁 */{printf("Write lock already set by %d\n", ;}}/* l_type 可能已被 F_GETLK 修改过 */= type;/* 根据不同的 type 值进行阻塞式上锁或解锁 */if ((fcntl(fd, F_SETLKW, &lock)) < 0){printf("Lock failed:type = %d\n", ; return 1;}switch{case F_RDLCK: printf("Read lock set by %d\n", getpid());break;case F_WRLCK: printf("Write lock set by %d\n", getpid());break;case F_UNLCK: printf("Release lock by %d\n", getpid()); return 1; break;default:break;} /* end of switch */return 0;}生产者程序的源代码:/* */#include <>#include <>#include <>#include <>#include <>#include ""#define MAXLEN 10 /* 缓冲区大小最大值*/#define ALPHABET 1 /* 表示使用英文字符 */#define ALPHABET_START 'a' /* 头一个字符,可以用 'A'*/#define COUNT_OF_ALPHABET 26 /* 字母字符的个数 */#define DIGIT 2 /* 表示使用数字字符 */#define DIGIT_START '0' /* 头一个数字字符 */#define COUNT_OF_DIGIT 10 /* 数字字符的个数 */#define SIGN_TYPE ALPHABET /* 本实例用英文字符 */const char *fifo_file = "./myfifo"; /* !" FIFO 文件名 */char buff[MAXLEN]; /* 缓冲区 *//* 函数product() 产生一个字符并写入仿真 FIFO 文件中 */int roduct(void){int fd;unsigned int sign_type, sign_start, sign_count, size;static unsigned int counter = 0;/* 打开!" FIFO 文件 */if ((fd = open(fifo_file, O_CREAT|O_RDWR|O_APPEND, 0644)) < 0) {printf("Open fifo file error\n"); exit(1);}sign_type = SIGN_TYPE;switch(sign_type){case ALPHABET: /* 英文字符 */{sign_start = ALPHABET_START;sign_count = COUNT_OF_ALPHABET;}break;case DIGIT: /* 数字字符 */{sign_start = DIGIT_START;sign_count = COUNT_OF_DIGIT;}break;default:{return -1;}} /*end of switch*/sprintf(buff, "%c", (sign_start + counter)); counter = (counter + 1) % sign_count; lock_set(fd, F_WRLCK); /* 上写锁*/if ((size = write(fd, buff, strlen(buff))) < 0){printf("Producer: write error\n"); return -1;}lock_set(fd, F_UNLCK); /* 解锁 */close(fd);return 0;}int main(int argc ,char *argv[]){int time_step = 1; /* 生产周期 */int time_life = 10; /* 需要生产的资源数 */if (argc > 1){/* 第一个参数表示生产周期 */sscanf(argv[1], "%d", &time_step);}if (argc > 2){/* 第二个参数表示需要生产的资源数 */sscanf(argv[2], "%d", &time_life);}while (time_life--){if (product() < 0){break;}sleep(time_step);}exit(EXIT_SUCCESS);}消费者程序的源代码:/* */#include <>#include <>#include <>#include <>#include <>#include ""#define MAX_FILE_SIZE 100 * 1024 * 1024 /* 100M*/const char *fifo_file = "./myfifo"; /* 仿真 FIFO 文件名 */ const char *tmp_file = "./tmp"; /* 临时文件名 *//* 资源消费函数customing */int customing(const char *myfifo, int need){int fd;char buff;int counter = 0;if ((fd = open(myfifo, O_RDONLY)) < 0){printf("Function customing error\n");return -1;}printf("Enjoy:");lseek(fd, SEEK_SET, 0);while (counter < need){while ((read(fd, &buff, 1) == 1) && (counter < need)){fputc(buff, stdout); /* -.就是在屏幕上/0的显示 */counter++;}}fputs("\n", stdout);close(fd);return 0;}/* myfilecopy()函数: 实现从 sour_file 文件的 offset 偏移处开始将 count 个字节数据复制到dest_file 文件 */int myfilecopy(const char *sour_file,const char *dest_file, int offset, int count, int copy_mode) {int in_file, out_file;int counter = 0;char buff_unit;if ((in_file = open(sour_file, O_RDONLY|O_NONBLOCK)) < 0){printf("Function myfilecopy error in source file\n"); return -1;}if ((out_file = open(dest_file, O_CREAT|O_RDWR|O_TRUNC|O_NONBLOCK, 0644)) < 0){printf("Function myfilecopy error in destination file:"); return -1;}lseek(in_file, offset, SEEK_SET);while ((read(in_file, &buff_unit, 1) == 1) && (counter < count)) {write(out_file, &buff_unit, 1); counter++;}close(in_file);close(out_file);return 0;}/* custom()函数:实现 FIFO 消费者 */int custom(int need){int fd;/* 对资源进行消费,need 表示该消费的资源数目 */customing(fifo_file, need);if ((fd = open(fifo_file, O_RDWR)) < 0){printf("Function myfilecopy error in source_file:");return -1;}/* 为了模拟FIFO 结构,对整个文件进平行行移动 */lock_set(fd, F_WRLCK);myfilecopy(fifo_file, tmp_file, need, MAX_FILE_SIZE, 0);myfilecopy(tmp_file, fifo_file, 0, MAX_FILE_SIZE, 0);lock_set(fd, F_UNLCK);unlink(tmp_file);close(fd);return 0;}int main(int argc ,char *argv[]){int customer_capacity = 10;if (argc > 1) /* 第一个参数指定需要消费的资源数目,默认值为 10 */{sscanf(argv[1], "%d", &customer_capacity);}if (customer_capacity > 0){custom(customer_capacity);}exit(EXIT_SUCCESS);}(3) 分别编译生产者程序和消费者程序(4) 确保编译没有错误后,先在控制台终端1上运行生产者程序:./producer 1 20再在控制台终端2上运行消费者程序:./customer 54.完成实验报告(1)将实验过程和实验结果截图(2)认真阅读程序代码,参考代码并根据实验结果,完成实验总结。