C语言课程设计--_通讯录管理系统

合集下载

通讯录管理系统课程设计c语言

通讯录管理系统课程设计c语言

通讯录管理系统课程设计c语言一、课程目标知识目标:1. 理解通讯录管理系统的基础概念,掌握C语言实现通讯录管理的核心功能;2. 学会使用结构体、数组、文件操作等C语言基础知识,实现数据的存储与读取;3. 掌握函数的定义与调用,能运用模块化编程思想设计通讯录管理系统。

技能目标:1. 能够运用所学知识独立设计并实现一个简单的通讯录管理系统;2. 培养良好的编程习惯,编写规范、可读性强的代码;3. 提高问题分析能力,通过编写程序解决实际问题。

情感态度价值观目标:1. 培养学生对C语言的兴趣,激发学习热情,树立编程自信心;2. 培养学生的团队协作意识,学会在团队中发挥个人优势,共同解决问题;3. 培养学生严谨、踏实的学术态度,养成勤奋思考、乐于探究的良好习惯。

课程性质:本课程为实践性较强的课程,旨在让学生通过实际操作,掌握C语言在通讯录管理系统中的应用。

学生特点:学生具备一定的C语言基础,对编程有一定了解,但实际操作能力有待提高。

教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,培养学生实际编程能力。

通过分解课程目标为具体学习成果,使学生在完成课程学习后,能独立设计并实现一个简单的通讯录管理系统。

二、教学内容1. 通讯录管理系统概述- 了解通讯录管理系统的基本功能与需求;- 掌握系统设计的基本流程与模块划分。

2. C语言基础知识回顾- 结构体、数组的使用;- 文件操作(读写、打开、关闭文件);- 函数的定义与调用。

3. 通讯录管理系统核心功能实现- 设计并实现数据结构存储通讯录信息;- 编写功能函数,包括增加、删除、修改和查询联系人;- 实现数据的持久化存储。

4. 系统测试与优化- 学习测试方法,对系统进行功能测试;- 分析测试结果,优化代码与算法。

5. 编程规范与团队协作- 学习编程规范,编写高质量的代码;- 了解团队协作的重要性,培养团队协作能力。

教学内容安排与进度:第1周:通讯录管理系统概述与需求分析;第2周:C语言基础知识回顾;第3周:设计数据结构与功能函数;第4周:实现通讯录管理系统核心功能;第5周:系统测试与优化;第6周:总结与团队协作。

通讯录管理系统c语言课程设计报告课题简介

通讯录管理系统c语言课程设计报告课题简介

通讯录管理系统C语言课程设计报告
一、课题简介
通讯录管理系统是一种常见的应用程序,旨在帮助用户组织和管理他们的联系人信息。

本课程设计将利用C语言来实现一个基本的通讯录管理系统,旨在帮助学生掌握C语言编程的基本知识和技能。

二、设计目的
1.帮助学生熟悉C语言的基本语法和编程逻辑;
2.提高学生对数据结构的理解和运用能力;
3.培养学生的编程能力和软件开发思维;
4.提高学生的团队合作和项目管理能力。

三、设计内容
本课程设计将围绕以下几个方面展开:
1.用户界面设计:设计一个简洁直观的用户界面,包括菜单选项、输
入输出界面等;
2.数据结构设计:设计通讯录数据结构,包括联系人姓名、电话号码
等信息的存储方式;
3.功能实现:实现通讯录管理系统的基本功能,包括添加联系人、删
除联系人、查找联系人等操作;
4.文件操作:实现通讯录数据的读写操作,将联系人信息保存到文件
中,以便下次运行时读取;
5.错误处理:处理用户输入错误等异常情况,保证程序的稳定性和可
靠性。

四、预期效果
通过本课程设计,学生将能够掌握以下技能:
1.掌握C语言基本语法和编程逻辑;
2.熟悉数据结构的设计和运用;
3.提高编程能力和软件开发思维;
4.培养团队合作和项目管理能力。

五、总结
通过设计一个通讯录管理系统的C语言课程项目,学生将在实践中加深对C语言的理解和应用,提高编程技能和解决问题的能力。

希望本课程设计能够为学生的编程学习提供一定的帮助和指导。

以上为《通讯录管理系统C语言课程设计报告》的简要介绋,希望能够为课程设计的顺利进行提供一定的参考和指引。

c语言课程设计报告---通讯录管理系统

c语言课程设计报告---通讯录管理系统

一、实习题目通讯录管理系统二、需求分析问题描述:本程序属于非数值计算型算法设计,学生需要设计出图书馆模拟系统所需要的基本功能,并设计简单的界面(无需图形化)。

实现功能:1、通过提示菜单选择可以进行的操作2、将图书的信息存入文件中,并命名为BookInfo.txt3、将图书借阅情况信息存入文件中,并命名为SendInfo.txt4、在本系统中可以进行管理系统包含的基本操作,其中包括:a)查看所有图书的信息;b)输入一本图书的图书编号,从当前图书中进行查找,如果找到则显示该图书的相关信息,如果没有找到则给出提示信息;c)添加一本图书的基本信息,通过输入图书编号,首先查找是否存在该图书编号的图书,如果存在则提示重新输入,否则将该图书按照顺序插入到相应位置;d)删除一本图书的基本信息,通过输入图书编号,首先查找是否存在该图书编号的图书,如果存在则将该图书删除,否则给出提示信息,提示该图书不存在;e)借阅一本图书,需要给出学号和图书编号,如果图书编号不存在则重新输入,直到输入正确为止,并将学号和相应的图书编号存入SendInfo.txt文件中。

5、图书基本信息包括图书编号、书名、作者、出版社和价钱这些简单信息。

6、图书信息文件中每一行存放一本图书的信息。

7、借阅信息文件中每一行存放一本书的借阅情况。

知识点:本程序主要考察对自定义函数的熟悉程度,本程序中主要使用到的是数组的相关操作,包括数组的输入、输出、查找、插入、删除等操作,需要对数组有比较深入的掌握。

说明:(1)当程序执行的时候所读取的图书信息文件必须存在,否则可能会出现错误。

(2)图书信息文件中存放图书信息的时候是按照行来存放的,即一行一本书。

(3)借阅信息文件中存放学生借阅情况是按照行来存放的,即一行存放一个学号和一个图书编号。

(4)程序执行的基本过程为:a)在所有操作之前,也就是加载操作菜单之前,先从文件中读取所有图书的信息,并存入一个数组中,此时数组可以定义为包含100个元素;b)然后根据菜单所进行的所有操作都是对当前数组进行操作,此时也就是对数组的查找、定位、添加、修改、删除操作;c)当退出系统的时候再将当前数组中的所有元素按照一本图书一行的方式写回图书信息文件中,此时注意选择覆盖方式,这样就可以将原来的所有数据覆盖,只保留最新的数据;当按行读取图书信息文件的时候,有可能最后一行只有一个回车,这时候实际上所读取的数据为空字符串,需要对此作判断,如果是空字符串,则说明已经没有人员,就必须将当前读入的空字符串写入数组中。

c语言通讯录管理系统课程设计

c语言通讯录管理系统课程设计

c语言通讯录管理系统课程设计一、课程目标知识目标:1. 理解C语言中数据结构的基本概念,掌握通讯录管理系统中链表的应用;2. 掌握C语言中文件操作的基本方法,实现对通讯录信息的存储和读取;3. 学会使用C语言编程解决实际问题,具备分析和设计简单通讯录管理系统的能力。

技能目标:1. 能够运用所学知识,设计并实现一个具备增加、删除、修改和查询功能的通讯录管理系统;2. 能够运用链表数据结构,实现通讯录信息的动态管理;3. 能够编写清晰的C语言代码,养成良好的编程习惯。

情感态度价值观目标:1. 培养学生的团队合作精神,提高沟通与协作能力;2. 激发学生对计算机编程的兴趣,培养自主学习和解决问题的能力;3. 引导学生认识到编程在解决实际问题中的应用价值,增强其学习责任感。

课程性质:本课程为实践性较强的课程,结合C语言编程知识,让学生通过实际操作,掌握通讯录管理系统的设计与实现。

学生特点:学生在本年级已具备一定的C语言基础,对数据结构有一定了解,但实际编程能力有待提高。

教学要求:教师需结合学生特点,采用任务驱动法,引导学生主动参与课堂,通过实践操作,提高学生的编程能力和解决实际问题的能力。

同时,注重培养学生的团队合作精神和自主学习能力。

在教学过程中,关注学生的情感态度价值观的培养,使其在学习过程中形成积极向上的心态。

二、教学内容1. 数据结构基础:复习C语言中的结构体和指针,引入链表的概念及其在通讯录管理系统中的应用。

- 教材章节:第三章 数据结构,第5节 链表。

- 内容安排:讲解链表的创建、插入、删除等基本操作。

2. 文件操作:介绍C语言中文件读写的基本方法,使学生能够将通讯录信息保存在文件中。

- 教材章节:第五章 文件,第2节 文件的读写。

- 内容安排:讲解fopen、fprintf、fscanf、fclose等文件操作函数的使用。

3. 通讯录管理系统功能设计:- 教材章节:实践项目——通讯录管理系统。

c语言课程设计通讯录管理系统

c语言课程设计通讯录管理系统

c语言课程设计 通讯录管理系统一、课程目标知识目标:1. 理解C语言中结构体的概念和使用方法,掌握利用结构体创建复杂数据结构的能力;2. 学会使用数组存储结构体数据,实现对通讯录信息的有效管理;3. 掌握基本的文件操作,能够实现通讯录数据的存储和读取。

技能目标:1. 能够运用结构体和数组设计并实现一个简单的通讯录管理系统;2. 掌握在C语言中进行简单的输入输出操作,实现用户界面的友好交互;3. 学会使用调试工具进行程序调试,提高解决问题的能力。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发其主动探索和创新的欲望;2. 培养学生的团队协作意识,学会在项目开发中与他人合作;3. 引导学生关注信息技术在生活中的应用,认识到编程对解决实际问题的重要性。

课程性质:本课程为实践性较强的课程,要求学生在掌握C语言基础知识的基础上,运用所学知识设计并实现一个通讯录管理系统。

学生特点:学生具备一定的C语言基础,对编程有一定的兴趣,但可能缺乏实际项目经验。

教学要求:通过本课程的学习,使学生能够将所学知识应用于实际项目中,提高其编程能力和解决实际问题的能力。

将课程目标分解为具体的学习成果,以便在教学过程中进行有效指导和评估。

二、教学内容1. 结构体和结构体数组的概念及应用- 课本章节:第五章 结构体与共用体- 内容:结构体的定义、结构体成员的访问、结构体数组的创建与使用。

2. 文件操作基础- 课本章节:第六章 文件- 内容:文件的打开与关闭、文件的读写操作、文件的定位。

3. 通讯录管理系统设计- 内容:系统需求分析、功能模块划分、系统设计、实现与测试。

4. 用户界面设计- 内容:菜单设计、命令行用户输入输出、简单的人机交互流程。

5. 项目实践与团队协作- 内容:项目分组、任务分配、代码共享与协作、项目评审。

教学进度安排:第一周:复习结构体和结构体数组相关知识,讲解通讯录管理系统需求。

第二周:学习文件操作基础,设计通讯录数据存储与读取功能。

c语言课程设计通讯录管理系统

c语言课程设计通讯录管理系统

c语言课程设计通讯录管理系统一、教学目标本课程旨在通过学习C语言,使学生掌握通讯录管理系统的基本概念、原理和方法,培养学生运用C语言进行程序设计的能力。

具体目标如下:1.理解C语言的基本语法和数据结构。

2.掌握函数的定义和调用方法。

3.了解通讯录管理系统的基本需求和设计思路。

4.能够使用C语言编写简单的程序。

5.能够独立完成通讯录管理系统的功能模块设计。

6.具备调试和优化程序的能力。

情感态度价值观目标:1.培养学生的团队合作意识和沟通能力。

2.培养学生的创新思维和解决问题的能力。

3.培养学生对编程事业的热爱和敬业精神。

二、教学内容本课程的教学内容主要包括C语言基础知识、通讯录管理系统的设计和实现。

具体安排如下:1.C语言基础知识:–数据类型和变量–运算符和表达式–数组和字符串2.通讯录管理系统的设计和实现:–系统需求分析–功能模块划分–程序编写和调试三、教学方法本课程采用讲授法、案例分析法、实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:通过讲解C语言的基本语法和概念,使学生掌握基础知识。

2.案例分析法:分析实际案例,让学生了解通讯录管理系统的设计过程和思路。

3.实验法:让学生动手编写程序,培养实际操作能力和解决问题的能力。

四、教学资源本课程的教学资源包括教材、多媒体资料和实验设备。

1.教材:选用权威、实用的C语言教材,为学生提供系统的学习资料。

2.多媒体资料:制作课件、教学视频等,丰富教学手段,提高教学质量。

3.实验设备:提供计算机、编程环境等,让学生进行实际操作,锻炼编程能力。

五、教学评估本课程的评估方式包括平时表现、作业、考试等,以全面、客观、公正地评价学生的学习成果。

1.平时表现:通过课堂参与、讨论、提问等环节,评估学生的学习态度和积极性。

2.作业:布置适量作业,评估学生的理解和应用能力。

3.考试:进行期中和期末考试,评估学生的知识掌握和编程能力。

六、教学安排本课程的教学安排如下:1.教学进度:按照教材和教学大纲,合理安排每个章节的教学内容。

c语言通讯录管理系统课程设计报告

c语言通讯录管理系统课程设计报告

C语言通讯录管理系统课程设计报告一、引言通讯录管理系统是一种常见的实用性软件,用于记录和管理个人或组织的联系人信息。

本文档旨在介绍一种基于C语言开发的通讯录管理系统的设计与实现。

通过本系统,用户可以方便地添加、删除、搜索和编辑联系人信息,实现了通讯录的基本功能。

二、系统需求分析本通讯录管理系统的主要功能包括: 1. 添加联系人:用户可以添加联系人的姓名、电话号码、邮箱等信息。

2. 删除联系人:用户可以根据联系人的姓名或电话号码删除对应的联系人信息。

3. 查找联系人:用户可以根据联系人的姓名或电话号码查找对应的联系人信息。

4. 修改联系人:用户可以修改已存在联系人的信息。

5. 显示所有联系人:用户可以查看通讯录中所有的联系人信息。

三、系统设计1. 数据结构设计为了实现通讯录管理系统,我们需要设计适当的数据结构来存储联系人信息。

在本设计中,使用结构体数组来表示每个联系人的信息,其中每个结构体包含姓名、电话号码、邮箱等成员变量。

struct Contact {char name[50];char phoneNumber[20];char email[50];};2. 功能模块设计本系统主要包含以下几个功能模块:a. 添加联系人模块用户可以选择添加新的联系人,输入姓名、电话号码和邮箱等信息后,系统将在通讯录中添加新的联系人。

b. 删除联系人模块用户可以根据输入的姓名或电话号码查找对应的联系人信息,并选择删除对应的联系人。

c. 查找联系人模块用户可以根据输入的姓名或电话号码查找对应的联系人信息,并在界面上显示查询结果。

d. 修改联系人模块用户可以根据输入的姓名或电话号码查找对应的联系人信息,并选择修改对应的联系人。

e. 显示所有联系人模块用户可以选择显示通讯录中所有的联系人信息,在界面上进行展示。

3. 系统框架设计本系统的整体框架如下:1. 主菜单显示2. 根据用户的选择,进入对应的功能模块四、系统流程图下图展示了通讯录管理系统的整体流程:主菜单 -> 用户选择功能模块 -> 执行对应模块功能五、代码实现以下为通讯录管理系统的部分核心代码实现,完整代码可参考附录部分。

c通讯录管理系统课程设计

c通讯录管理系统课程设计

c 通讯录管理系统课程设计一、课程目标本课程为“通讯录管理系统课程设计”,针对初中年级信息技术学科,旨在通过实践操作,使学生能够:知识目标:1. 理解通讯录管理系统的基本功能与需求;2. 掌握使用编程语言(如Python)实现简单数据结构,如列表、字典;3. 学会使用文件操作保存和读取通讯录信息。

技能目标:1. 能够运用所学知识设计并实现一个基本的通讯录管理系统;2. 掌握基本的程序调试技巧,提高解决问题的能力;3. 学会对程序进行优化,提高代码的可读性和可维护性。

情感态度价值观目标:1. 培养学生的团队协作精神,提高沟通与表达能力;2. 激发学生对编程的兴趣,鼓励创新思维和动手实践能力;3. 增强学生对信息技术的认识,培养其信息安全意识。

课程性质:本课程为实践性课程,注重培养学生的动手能力和实际操作技能。

学生特点:初中年级学生具有一定的信息技术基础,对新事物充满好奇,但编程经验有限。

教学要求:结合学生特点,以实际操作为主,注重引导和激发学生的学习兴趣,培养其解决问题的能力。

通过课程学习,使学生能够将所学知识运用到实际项目中,提高其信息技术素养。

教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。

二、教学内容本章节教学内容依据课程目标,紧密结合教材,确保科学性和系统性。

具体安排如下:1. 理论知识学习:- 简介通讯录管理系统的作用和功能;- 数据结构基本概念:列表、字典的使用;- 文件操作:读写文件,保存和加载通讯录信息。

2. 实践操作:- 设计通讯录管理系统需求分析;- 编程实现通讯录管理系统功能模块:添加、删除、查询、修改联系人信息;- 调试与优化程序,提高系统稳定性。

3. 教学大纲:- 第一周:通讯录管理系统概述,学习数据结构基本概念;- 第二周:文件操作,编写通讯录管理系统的基础代码;- 第三周:完善通讯录管理系统,增加功能模块;- 第四周:调试与优化程序,进行项目展示与评价。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国地质大学本科生课程论文封面课程名称C语言程序设计教师姓名本科生姓名本科生学号本科生专业所在院系类别:日期:课程设计评语注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。

目录课程设计评语 (2)目录 (3)1.课程论文题目 (4)2.程序设计思路 (4)3.功能模块图 (5)4.数据结构设计 (5)5.算法设计 (5)6.程序代码 (14)7.程序运行结果 (14)8.编程中遇到的困难及解决方法 (27)9.总结心得及良好建议 (28)10.致谢 (28)1.课程论文题目通讯录管理系统要求:设计具有数据插入、修改、删除、显示和查询功能的电话簿管理系统。

⑴数据包括:人名、工作单位、电话号码和E-mail地址。

⑵可对记录中的姓名和电话号码进行修改。

⑶可增加或删除记录。

⑷可显示所有保存的记录。

⑸可按人名或电话号码进行查询。

2.程序设计思路根据题目的要求,程序应该采用结构体数组和文件系统实现。

应该有动态的存储空间和文件输入、输出等操作功能;在程序中应该包括添加、显示、删除、查询和修改以及保存和退出的功能;另外还应提供键盘式选择菜单实现功能选择。

3.功能模块图4.数据结构设计整个程序中用到的数据主要是全局变量MAX 100和字符变量name[10]、addr[20]、phnum[20]、email[20]。

5.算法设计1.主函数主函数的设计一般比较的简单,只提供输入,功能处理和输出部分的函数调用。

其中个功能模块用菜单方式选择。

菜单部分也可以写成函数。

[流程图][程序]main() /*****************主函数*****************/{int n; /**********变量保存选择菜单数子***************/creat();do{printf("\n\t***********************************************\n");printf("\n\n\t*************WELCOME TO USE!***************\n");printf("\n\t**********************************************\n");printf("\n\n\t\t*****Please make a choice below*****\n");printf("\n\t\t1.Add a piece of meg");printf("\n\t\t2.List all the meg");printf("\n\t\t3.Delete a piece of meg");printf("\n\t\t4.Find a piece of meg");printf("\n\t\t5.Alter a piece of meg");printf("\n\t\t6.Save and Quit");printf("\n\t\t7.Create an address book");printf("\n\n\n");printf("\t********Input Your Choice:****************\n");scanf("%d",&n);switch(n) /*****************输入n的在1-6之间执行switch ************/{ case 1: Add(); /*添加模块*/break;case 2: List(); /*显示模块*/break;case 3: Delete(); /*删除模块*/break;case 4: Find(); /*查询模块:分为名字查询(0)和电话号码查询(1)*/break;case 5: Alter(); /*修改模块:分为修改名字(0)和修改电话号码(1)*/break;case 6: exit(0); /*退出模块*/break;case 7: creat(); /*带回链表起始地址*/fclose(fp);default: /**********输入的n不在1-6之间执行default ************/ printf("\n\t********************************************\n");printf("\n\t The num should be 1-6 \n");printf("\n\t********************************************\n");break;}}while(1);}2.各功能模块设计[数据结构]通讯录的数据信息:人名、工作单位、电话号码、E-mail地址均可以采用字符型数组;可以采用结构体的形式,把各信息作为结构的成员,由于通讯录要具有添加、查找、和删除的功能,所以整个通讯录采用链表比较容易的实现以上功能。

用结构体变量作为链表中的接点是最合适的。

结构体变量可以是指针类型,我们可以用这个指针类型的成员来存放下一个结点的地址。

结构体的类型如下:struct persons{ typedef struct p{char name[10] char name[10];char addr[20]; char addr[20];char phnum[20]; char phnum[20];char email[20]; char email[20];}persons[MAX]; struct p *next;}p,*linkl ist;struct persons类型为每个链表成员;typedef struct p为一个动态的结点,它的成员next存放下一个结点的地址。

以下为各模块分析时要用的指针:linklist head=NULL,t=NULL; /**************定义头指针和尾指针*************/p *s,*p0,*p1,*p2,*p3,*p4,*p5;int i;char name1[10],ch;char str1[20 ];FILE *fp; /********************定义文件指针***********************/(1)输入模块[程序]void creat() /*将文件的信息读入结构体数组在转存入链表中*/ {int j;long k;fp=fopen("people.txt","r+");/****************打开文件**********************/if(fp!=NULL){for(i=1;i<MAX;i++){j=fgetc(fp);if(j==EOF)return;k=i-1;fseek(fp,k*sizeof(struct persons),0); /************读取一个人的信息***************/fread(&persons[i],sizeof(struct persons),1,fp);s=(linklist)malloc(sizeof(p)); /**************装存入链表中***********/ strcpy(s->name,persons[i].name);strcpy(s->addr,persons[i].addr);strcpy(s->phnum,persons[i].phnum);strcpy(s->email,persons[i].email);if(head==NULL) /***********用尾插法将其插入链表中**********/head=s;else{t->next=s;t=s;}}}else{fp=fopen("people.txt","w"); i=1; /*****不能打开另开辟一个文件*****/ }}⑵添加模块由于运用的是链表的形式,且通讯录只是按照输入的先后循序排序,所以对添加的信息采用插入末端的方式,同时添加也使用于空通讯录的信息输入。

[程序]void Add() /*******向通讯录中添加(或输入)一个人的信息*********/ {s=(linklist)malloc(sizeof(p));s->next=NULL;printf("\n\n\t*********Please input the sb's message:**********");printf("\n\n\t\tname:");scanf("%s",s->name);printf("\n\n\t\tAddr:");scanf("%s",s->addr);printf("\n\n\t\tphnum:");scanf("%s",s->phnum);printf("\n\n\t\temai:");scanf("%s",s->email);if(head==NULL)head=s; /*******若通讯录为空则添加在头指针之后相当于输入信息*********/else{t->next=s; /***********添加到链表的末尾************/t=s; }}⑶显示模块链表的一大好处是只要定义了头指针,则所有的信息就很容易的找到,指针会一环扣一环的找到每个信息,显示出每个信息,直到最后到位指针结束。

[程序]void List() /*****************显示所有的信息*******************/{p0=head; /************** p0指向头指针*******************/ while(p0!=NULL) /****************通讯录不为空******************/{printf("\tname:%s",p0->name);printf("\taddr:%s",p0->addr);printf("\tphnum:%s",p0->phnum);printf("\temail:%s\n",p0->email);p0=p0->next; /************** p0向后移一个位置*****************/ }}⑷删除模块删除一个人的信息相当于是删除链表中的一个结点。

相关文档
最新文档