




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最新资料推荐0 / 23软件综合设计家谱管理系统院系:计算机科学技术学院二系班级:计11 - 2班姓名:刘文秀(15)合作者:姜雪(05)、岳奉宜(33)指导教师:薛曼玲2013年12月01日最新资料推荐/ 23目:家谱管理系统软件综合设计任务书二、设计要求(1)刘文秀(组长)、姜雪和岳奉宜组成课程设计小组。(2)小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要 了解其他组员完成的内容。(3)查阅相关资料,自学具体课题中涉及到的新知识。(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。(5)所设计的系统应有菜单、动画和音乐。(6)按要求写出课程设计报告,并于设计结束
2、后1周内提交。其主要内容包 括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、 总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中 文注释)、参考文献等。报告一律用A4纸打印,正文的中文字体为宋体,西文字体 用Time New Roma, 一律用小四号字,行距采用“固定值” 18磅,首行缩进2字符。 1级标题中文字体为黑体,西文字体为Time New Roma,采用三号字;段落为居中、 段前18磅、段后12磅、行距采用“固定值” 18磅,首行缩进:无,段中不分页, 与下段同页。仅一级标题上目录。三、课程设计工作量由于是设计小组团结协作完成设计任务,一
3、般每人的程序量在400行有效程序 行以上,不得抄袭。四、课程设计工作计划2013年12月2日,指导教师讲课,学生根据题目准备资料,需求分析;2013年12月3日,设计小组进行总体方案设计和任务分工;2013年12月4日2013年12月10 B,每人完成自己承担的程序模块并通过 独立编译;2013年12月11日12日,将各模块集成为一个完整的系统,并录入足够的 数据进行调试运行;2013年12月13 0,验收、开始撰写课程设计报告;2013年12月18日前,提交课程设计报告和软件。指导教师签章:教研室主任签章/ 23頁二”:廳资空世程,,.晋”,,.工頁斗,.二y指导教师评语与成绩指导教师评语:
4、课程设il验收成绩:课程设il报告成绩:课程设计总成绩:指导教师签章年 月 日1 / 23目 录第1章概述01.1课题研究的目的和技术发展现状01.2课题研究的主要内容01. 3课题研究的难点0第2章需求分析02. 1性能需求02.2功能需求0第3章可行性分析13. 1经济可行性分析13. 2技术可行性分析1第4章概要设计14. 1程序设计的基本思想14.2总体功能模块图14. 3相关应用技术2第5章详细设计25.1日期信息的合法性检验25.2添加成员孩子模块45. 3添加成员兄弟模块65.4按照出生日期对家谱排序85. 5由兄弟、孩子二叉树生成家谱文件105.6按照姓名、出生日期查找家谱成员
5、口第6章 调试分析与测试结果126. 1测试方法126. 2测试过程126. 3测试结论13第7章结束语17参考文献17附录170 / 231.1课题研究的目的和技术发展现状本家谱管理系统是以电子家谱的形式记载父系家族世袭、人物为中心。 电子能准确记录家族成员岀生卒年,以及生活地点、家庭成员等信息。一般情况 下是不会出现信息丢失情况。更不需要担心传统家谱随着年代的久远字迹不清 晰,有破损等情况的出现。所以本课题的研究U的是让大家不但能够非常容易的 记录家族情况,而且能清楚的了解本家族信息,使用起来非常方便。现有的计算 机技术足以支撑电子家谱的开发。家谱的科学管理不但有助于民族文化和地方文 化的
6、发展,而且有其自身的积极意义。例如本电子家谱是利用Visval C+ 6.0 开发完成的。电子家谱的出现无疑让家谱焕然一新,但是传统家谱更能凸显出历 史的韵味,文化的内涵。这是电子家谱所不能够替代的,电子家谱不可能成为文 物。开发人员应该清楚的认识到这一点。1.2课题研究的主要内容家谱,又称族谱、祖谱、宗谱等。一种以表谱形式,记载一个以血缘关系为 主题的家族世系繁衍。本课题研究的主要内容是以电子家谱的形式记录、查询父 系家族历史信息为主要内容。1. 3课题研究的难点建立输入文件以存放最初家谱中各成员的信息,以及能够对修改后的家谱存 盘以备以后使用。用户界面的设计不够完美。功能上的设计难度很大。
7、第2章需求分析2.1性能需求系统的核心是利用对话框的连接和文本处理来存储和修改家族管理系统的 信息联系,其中的每一个动作都可能影响到其他的功能。使用方便,易于传播, 数据共享等性能。易于维护。2. 2功能需求建立输入文件以存放最初家谱中各成员的信息。成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加 其它信息、但不是必需的。能对修改后的家谱存盘以备以后使用。能从文件中读出已有的家谱,形成树状关系。家谱建立好之后,以图形方式显示出来。显示第n代所有人的信息。按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。按照出生日期查询成员名单。1 /
8、23输入两人姓名,确定其关系。某人添加孩子。删除某人(若其还有后代,则一并删除)。修改某人信息。按出生日期对家谱中所有人排序。打开一家谱时,若家谱中某人的生日在打开家谱的那一天,应给出提示。第3章可行性分析3.1经济可行性分析对系统开发规模进行估算属此软件项LI属于小规模软件开发。所以开发人员 三到五人即可。开发,维护等成本相对较低。所以从经济可行性分析的角度来看 此家谱管理系统适于开发。3. 2技术可行性分析根据软件系统功能、性能要求的各项约束条件从技术的角度实现系统的可行 性。家谱信息以树的形式一次读入内存,而个人的各种资料虽然LI前条口不多, 但随着程序的升级,以后可能越来越大。我把树形
9、结构和个人信息记录的文档分 为两个文件保存在外存中,一个文件串行化的记录家谱树的结构化信息,保持少 量个人信息作为识别标志;另一个文档保存完整的个人信息。索引时,以树形中 的少量信息为依据在另一个文件中找到全部个人信息资料。第4章概要设计4.1程序设计的基本思想家谱管理系统的总体设计思路是先为程序搭建好一个人结构框架,家庭 成员之间的关系,用树形结构(家族树)表示,这是本家谱管理系统的逻辑 结构。根据MFC的特点,釆用CfamilytreeDlg类实现用户窗口界面指令对于家 谱的各种操作。有文件控制和家谱控制两大模块,按生日查找、删除成员、文件 输入输出、修改成员信息、按名字查找、成员关系显示
10、、按代数显示等各种操作。 然后再根据需求分析逐步增强程序的功能和性能。4. 2总体功能模块图最新资料推荐2 / 23新建家谆保存家普M家跻3 删除该人增加孩齐更改资粗某代信息按融名查搀4 确定关系出生日排辰按生日查按4. 3相关应用技术1.定义“家谱”类型2.用结构Date存储日期3.用结构QuickSortNode存储快速排序数组值(为快速排序而设)4.根据家谱的特点,采用孩子-兄弟的二义树链表表示法(链表的基本单位为 以结构P ersonNode表示的结点),各种操作以COperationFamilytree类来 实现。5.根据MFC的特点,采用CfamilytreeDlg类实现用户窗口界
11、面指令对于家谱 的各种操作。第5章详细设计5.1日期信息的合法性检验家谱管理系统0最新资料推荐3 / 23死亡曰朗卜图5-1日期信息的合法性检査IntCOperationFamilytree:ReadNode(FILE*fp, Person &T, char*parentname)/本函数从文件fp中读取信息到结点T中,并读取结点的父亲名字到字符数组 parentname 中分别读取结点值,为:姓名,出生日期(年,月,日),婚否,地址,健在否,(如过世, 还有死亡日期)fscanf (fp,,z%s%d%d%d%d%s%d,z, T-info. name, &T-info. birthday.
12、 year, &T-in fo. birthday. month,&T-info. birthday. day, &T-info. marry, T-info. addr, &T-info. live);if (T-info. live=O)4 / 23fscanf (fp, z/%d%d%d,z, &T-info. deathday. year, &T-info. deathday. month, &T-info. deathday. day);fscanf (fp, parentname);if (! IsDateValid(T-info. birthday) /出生日期合法性检查 ret
13、urnFILE DATA NOT PRACTICAL;辻(T-info. live-0)/若过世,死亡日期合法性检查if (!IsDateValid(Tinfo. deathday)returnFILE DATA NOT PRACTICAL;return OK;5. 2添加成员孩子模块图5-2添加成员孩子流程图Int COperationFamilytree::CreateFamilytree(CString filename) /本函数建立一新家谱DestroyFamilytree() ;/建立一新家谱之前,清空原有家谱FILE* fp;辻(fp=fopen(f订ename, r)=0)/打
14、开文件 filenamereturn READ FILE ERROR;T二new PersonNode;/定义根结点辻(return NOT ENOUGH MEMORY;T-child=0;T-sibling=O;Tparent=O;5 / 23Person parentT, temp;/定义两个临时结点char parentname MAX_CHARNUM; /定义一个临时字符串数组读取根结点值,(姓名,出生日期(年,月,日),婚否,地址,健在否,(如过世,还有 死亡日期) int result;result二ReadNode(fp, T, parentname);辻(result=FILE
15、_DATA_NOT_PRACTICAL) delete T; 若不合法,删除申请的堆空间T二0;return result;if (strcmp (Tinfo. name, parentname) =0) 根结点名字与其父亲名字相同,说明为空树delete T;T二0;return PEDIGREE_EMPTY;temp二new PersonNode;/申请一结点if (! temp) /申请失败DestroyFami lytree () ;/释放申请空间return NOT ENOUGH MEMORY;result=ReadNode(fp, temp, parentname);while(s
16、trcmp(temp-info. name, parentname)&strcmp(temp-info. name, end )/读取信息结束的条件是两个人的名字同为end辻(result=FILE_DATA_NOT_PRACTICAL) 若数据不合法,释放乙申请空间,然后返回delete temp;DestroyFamilytree();return result;parentT=0;Find (T, parentT, parentname) ;/找到 parentname 所在结点 parentT辻(parentT) /如果parentT存在,说明parentname在家谱中/并且pare
17、ntname为temp的父亲int cmp;cmp=CompareDate(temp-info. birthday, parentT一info. birthday);辻(cmpchild=temp-sibling=O; temp-parent=parentT: /temp 的父扌旨针扌旨向 parentT; if (parentT-child) /parentname 已经有孩子 InsertSibling (parentT-最新资料推荐6 / 23chiId, temp);/ifelse/par entname 无孩子,则 temp 应为 parentT-child=temp:/parent
18、name 的第一个孩子/ifelse/parentT不存在,说明家谱中不存在parentname此人DestroyFami lytree () ; /返回出错信息return FILE DATA ERROR;temp=new PersonNode;/申请一结点if (! temp) /申请失败DestroyFamilytree () ;/释放申请空间return NOT ENOUGH MEMORY;resultReadNode (fp, temp, parentname) ;/继续读取数据 /while if (temp)delete temp;fclose(fp);return OK;5.3
19、添加成员兄弟模块最新资料推荐7 / 23输入的成员出士图5-3添加成员兄弟模块void SaveNode(FILE *fp, Person &pNode)/本函数向文件fp中存取一结点pNodechar ch二rf ;if(pNode)fprintf (fp, z,%s%d%d%d%d%s%d、pNode一info. name, pNode一info. birthday. year,pNode一info. birthday. month, pNode一info. birthday. day, pNode一info. marrypNode一info. addr, pNode-info. live
20、);if (pNodeinfo. liveO)fprintf(fp, %d%d%d、pNode一info. deathday. year, pNode一info. deathday. month,pNode一info. deathday. day); if(pNode-parent)家谱结束fprintf(fp, %s 、pNode-parent-info. name);elsefprintf (fp, %s, T);fprintf(fp, %c, ch);最新资料推荐8 / 23voidint COperationFamilytree::SaveFamilytree(CString file
21、name)/本函数保存家谱到文件filename中FILE* fp;if (fp=fopen(filename, w) )=0)/打开文件 filename return WRITE FILE ERROR:PreOrderTraverse (fp, T, SaveNode) ;/从根结点开始存储家谱数据 /置家谱数据结束标记(一结点的名字与其父结点的名字同为end) fprintf(fp, %s %d %d %d %d %s %d %s, end, 1999, 12,2, 1, end, 1, end);fclose(fp);return OK;void COperationFamilytre
22、e:PreOrderTraverse(FILE* fp, Person &T,(_cdecl *Visit)(FILE* fp, Person &)本函数把所有以T结点为根结点的结点值存到文件fp中 if(T)(*Visit)(fp, T);PreOrderTraverse(fp, T-child, Visit);PreOrderTraverse(fp, T-sibling, Visit);5.4按照出生日期对家谱排序void CFamilytreeDlg:OnFamilytreeSort ()/ TODO: Add your command handler code hereRefreshL
23、ist ();QuickSortNode* order;int totalNums=0;operFamilytree GetPersonNums(operFamilytree GetRoot(), totalNums) order=new QuickSortNode LtotalNums+lZ;if (!order)AfxMessageBox (“ 内存不足!);return;AfxMessageBox (z/排序后结果请见下部列表。); operFamilytree SortByBirthday(order);for(int i=l:itotalNums+l;i+)DisplaylnList
24、Ctrl(orderi oneself);delete LZorder;void COperationFamilytree:SortByBirthday(QuickSortNode *order)9 / 23本函数对顺序表order以出生日期的大小排序int totalNums=0;QuickSortNode* startaddr=order;startaddr+;GetPersonNums(T, totalNums);CopylnfoFromBiTreeToArray(T, startaddr);Quicksort(order, 1, totalNums);int COperationFam
25、ilytree:Partition(QuickSortNode *order, int low, int high)本函数供Quicksort函数调用/交换顺序表order中从low到high的记录,便枢轴记录到位,并返回其所在 位置,此时在它之前(后)的记录均不大(小)于它order 0二order low ; /用子表的第一个记录做枢轴记录Date pivotkey 二 order low:. birthday;/枢轴记录关键字while(1 owhigh) /从表的两端交替地向中间扫描while(lowhigh&(CompareDate(orderhighj birthday, pivo
26、tkey)=1CompareDate(orderhigh birthday, pivotkey)=0)-high;order low =order high ;/将比枢轴记录小的记录移到低端order low. birthday=order high. birthday; /枢轴记录到位orderlow. oneselfLorderhigh oneself;while (lowhigh&(CompareDate (order low. birthday, pivotkey) =TCompareDate(orderlow!. birthday, pivotkey)=0)+low;order hi
27、gh =order low;/将比枢轴记录大的记录移到高端order low =order0 ;/枢轴记录到位return low;/返回枢轴位置void COperat ionFamilytree: : Quicksort (QuickSortNode border, int low, int high)/本函数对顺序表order low. high作快速排序int pivotloc;if (lowchild, personNums) ;/递归调用GetPersonNums(Tsibling, personNums);voidCOperationFdmilytree:CopylnfoFrom
28、BiTreeToArray(Person&T,QuickSortNode *&order)本函数先序遍历以T为根结点的所有结点,并把每一个结点的出生日期信息及 其指针值/依次存入顺序表order中辻(T)(order). birthday=T-info. birthday;(*order). oneself二T;order+;CopylnfoFromBiTreeToArray(T-chiId, order);CopylnfoFromBiTreeToArray(T-sibling, order);5. 5由兄弟、孩子二叉树生成家谱文件void SaveNode(FILE *fp, Person
29、&pNode)/本函数向文件fp中存取一结点pNodechar ch二n,;if(pNode)fprintf (fp, z/%s %d %d %d %d %spNode一info. name, pNode-info. birthday. year,pNode一info. birthday. month, pNode一info. birthday. day, pNode一info. marrypNode一info. addr, pNode一info. live);11 / 23if (pNode-info. live=0)fprintf(fp, %d%d%d”、pNode一info. death
30、day year, pNode一info. deathday month, pNodeinfo. deathday. day);if (pNode-parent)家谱结束fprintf(fp, %s ”,pNode-parent-info, name);elsefprintf (fp, %s,/, T);fprintf(fp, %c, ch);int COperationFamilytree:SaveFamilytree(CString filename)本函数保存家谱到文件filename中FILE* fp;if (fp=fopen(f订ename, w)=0)打开文件 filenamere
31、turn WRITE FILE ERROR:MMPreOrderTraverse (fp, T, SaveNode) ;/从根结点开始存储家谱数据/置家谱数据结束标记(一结点的名字与其父结点的名字同为end) fprintf(fp, %s %d %d %d %d %s %d %s, end, 1999, 12,2, 1, end, 1, end);fclose(fp);return OK;void COperationFamilytree::PreOrderTraverse(FILE* fp, Person &T, void (_cdecl *Visit)(FILE* fp, Person &
32、)本函数把所有以T结点为根结点的结点值存到文件fp中辻(T)(Visit)(fp, T);PreOrderTraverse(fp, T-child, Visit);PreOrderTraverse(fp, T-sibling, Visit);5.6按照姓名、出生日期査找家谱成员void COperationFamilytree:Find(Person& T, Person& Tname, char* name)本函数以T为根结点开始,搜索结点信息中名字等于name的结点辻(T) 如果T存在12 / 23if (strcmp(T-info. name, name) =0)/T 结点姓名和 nam
33、e 相同,把 T 结点指针 传给TnameTname=T;elseFind(T-sibling, Tname, name) ;/对 T 的兄弟递归搜索Find(T-child, Tname, name); 对 T 的孩子递归搜索void COperationFdm订ytree: : Find (Person &T, Person*& Tname, int month, int day)本函数以T为根结点开始,搜索结点信息中生日等于month, day的结点, 并把所有符合条件的结点指针值存入以Tname为起始地址的地址数组中 if(T)如果T存在if(Tinfo. birthday. mont
34、h=month&T-info. birthday, dayday) /T结点生日与所给相同,把T结点指针传给Tname,同时Tname指针前进 *Tname=T;Tname+;else Find(T-sibling, Tname, month, day) ;/对 T 的兄弟递归搜索 Find(T-child, Tname, month, day); 对 T 的孩子递归搜索 第6章调试分析与测试结果6.1测试方法该课程设计只有一个主要类,即对孩子一一兄弟二叉树的操作类。该类主要 包括文件读取函数、创建孩子一一兄弟二叉树函数、在树中查找函数、遍历函数 以及对树中结点进行加入、删除、修改的函数。山于
35、树存储结构的特殊性,故编 制这些算法时大量使用了递归,虽然这样做可能会降低程序的执行效率,但程序 的易读性较强。6.2测试过程在调试时,遇到的儿个问题如下:(1)建立树时,由于新申请结点的孩子指针、兄弟指针、及双亲指针均未 赋空值。而在以后的函数中对树进行递归操作时均以这些指针值中的一 个或儿个是否为空作为递归结束条件。从而导致调用这些函数时出现系 统保护异常(使用了不安全的指针)。(2)刚开始删除结点时,只考虑到删除其本身结点的情况,而删除其孩子 结点的惜况未考虑到,故在删除某些结点时使树出现了 “断链”现象。 13 / 23故在程序代码中对删除某一结点进行操作时,首先要判断此结点是否有 孩
36、子及兄弟,然后进行相应操作。14 / 233M李玲岀生日期1418琏世否 死亡日期摂子数吕19338282弄行(3)刚开始进行程序概要设il时,曾考虑到用控制台下的文本方式作为程 序界面,实际操作后发现并不理想。一方面字符形式的界面友好性较差, 另一方面显示整个家谱树的信息时不方便。故考虑用VC+中MFC类自带 的树型控件显示家谱层次,而用列表控件显示家谱中的信息。用后效果 不错。6.3测试结论讯掰该人就资糾斑代信息扌翅觀名査找确定两人关系出生曰期悴序挨照生日直找(1)按下按钮“打开家谱笃打开一个家谱文件(水ftf)SfipiMenu)文件探作最新资料推荐15 / 23SPfMeru)文件剰乍
37、翱冢谱最新资料推荐(2)按下按钮“新建家谱”,新建一个家谱文件(水ftf)(3)按下按钮“保存家谱”,将修改过的家谱保存(4)按下按钮“另存家谱”,将修改过的家谱另存为一个家谱文件(水.ftf)(5)按下按钮“删除该人”,将树型控件中选中的成员及其后代删除衣洗珈疣L昱rK(gu=李担李佰 习李明田至华出生日期1廻否it!址邮21死亡日期技孑数徘行1妙W免吉柿韬邑医无11另徉魏某代信息懈生曰萱拚弄行独名出打开冢谱漩冢谱保存冢谱杲書信息16 / 23(6)按下按钮“增加孩子S给树型控件中选中的成员增加一个孩子最新资料推荐17 / 23(7)按下按钮“更改资料S更改树型控件中选中的成员的资料(8)按
38、下按钮“按照姓名查找S将家谱中特定名字的成员的信息显示在列表控 件中最新资料推荐18 / 23李强i日卑伟宙李用曲李华出生日期1956-5-4哀件揀作更改资料杲代信息出生日期排序按照生日直找1,划1L I 號衣否 丨死亡曰期 古jfoi邑区是孩子数排行日李强白孚亮1白孚伟李侑7 E李明由李华文件操作打开期家谱腔制躺该人協笺姓盛拱新逮冢谱保存尿谱另存莠語増加孩子更改资料某代信慝确定利人X系业日期排序轉生日查拱1_書疋是養S区区区区区区 宴翼阳產r 序Trw=电rr滋R 市.市市帀市増 吉古亡吉古m裁追耸駆统I 菜单(Menu)(9)按下按钮“确定两人关系S将家谱中某两人的关系显示出来(10)按下
39、按钮“出生日期排序”,将家谱中的所有成员按出生日期排序并 显示在列表控件中出生日期1945-12-91946-9-10 196654I)(11)按下按钮“按照生日查找S将家谱中特定日期出生的成员的信息 显示在列表控件中(12)选择菜单项H “关于”,显示该程序的版权信息(13)选择菜单项H “退出m结束该程序的运行刘文秀姜雪邑奉宣丄Y Y 不叵迢创打开家诺最新资料推荐19 / 23谢朗本胡!曰瑋们对于MFCMFC类的开轴验不足.BUGBUG淮免有之r还请 多多包逐;)确走第7章结束语通过这次大作业,体会很深刻,将一直以来学到的东西都运用到实际上来,学以 致用,对所学知识有了更深刻的理解,同时还发现了许多平时在书本上没有遇见 过的问题,促进了自己对知识的渴望,遇见了问题,就希望能够通过查找课外书 来解决它们。刚接触题目的时候,自己就有了一定的想法,觉得这个程序做起来 是问题不大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 材料能源物理重点基础知识点
- 电子气体 六氟化钨 征求意见稿
- 行政法学多样化试题及答案分析
- 绿色政策在经济建设中的重要性试题及答案
- 遏制通货膨胀政策与经济增长的互动试题及答案
- 2025年用户体验设计试题及答案
- 小学发生大火灾应急预案(3篇)
- 网络监控和维护试题及答案
- 2025年软件考试测试参考试题及答案
- 代码注释的重要性与形式试题及答案
- 天然气安全技术说明书
- 供电公司隐患排查总结报告
- 《揭开货币神秘面纱》课件
- 商业银行业务与经营练习题
- 系统云迁移方案
- 山东省医院护理服务质量评价细则
- HSK六级真题与答案下载(第一套)
- 工程量确认单
- CISP-PTE认证培训考试复习题库(附答案)
- 无机化学之锡铅重要化合物介绍课件
- 分析色觉检查图让色弱色盲不再痛苦
评论
0/150
提交评论