哈尔滨工业大学课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
H a r b i n I n s t i t u t e o f T e c h n o l o g y
课程设计报告
课程名称:数据结构与算法课程设计
设计题目:一个基于XML的网站生成器院系:计算机科学与技术学院
班级:*******
设计者:* *
学号:* * * * * * * * * *
指导教师:王春宇
设计时间:2008年9月1日
哈尔滨工业大学
哈尔滨工业大学课程设计任务书
一、题目分析
XML代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。基于XML的网站生成器是将一个形如题目中XML文件生成一个网站。HTML英文名字是HyperText MarkupLanguage的缩写,中文名为超文本标记语言。所谓超文本标记语言,就是该类文档中提供的超级链接能够让浏览者在不同的页面之间进行跳转。标记语言是基于源代码解释的访问方式,它的原文件由一个纯文本文件组成,代码中由许多元素组成,而前台浏览器通过解释这些元素显示各种样式的文档。浏览器通读HTML 文档,处理遇到的文本标签,将相关的内容显示在网页上。
综上了解,题目要求根据一个已知XML文件自动生成一个新闻网站,即要建立新的HTML 文件,并且根据XML文件中的各种标记来满足题目要求,在自动生成的新闻网站中,每个article在主页中都要有链接,并且根据article所属的section都文章进行分类。
二、总体设计
基于上述分析,网站生成器程序是通过分析一个XML 文件建立多个HTML 文件,即网页。因此程序设计主要是对文件进行的操作。要完成这个设计必须实现文件、字符串的操作和栈的应用。应用栈解决实际复杂的特殊问题。栈是一种特殊的线性表,所有的插入删除操作都只在栈的一端进行。因此利用栈的这种特殊性质实现本试验的部分操作。这个设计最关键的部分即运用栈进行括号匹配的检验实现判断XML 文件中的各种标签。判断出相应标签即可进行相应的操作。因此标签读取及识别是整个设计的基础。因此这个设计主要有以下几个模块组成:主程序模块、判断标签模块、建立链接并制作链接网页模块、制作网站首页并将文章分类模块。
三、数据结构设计
根据这一网站生成器的原理,需要的管理数据主要有:存放标签的链表,临时存放文章名、作者、日期以及所属分类的多个一维和二维数组,下面就给出每种数据的详细分析。
(一)在括号匹配的算法中设置一个栈,每读入一个括号,若是左括号或除右括号外的其他字符则直接存入堆栈,若是右括号则弹出堆栈中所有元素。
抽象数据类型栈的形式定义:
ADT Stack
{
数据对象:D={Ai | Ai 属于ElenmSet, i=1,2,......,n}
数据关系:Rl={
约定An 为堆栈顶,An 为堆栈底.
}
ADT typedef struct S_Node // 定义链表节点元素
{
char ch;//堆栈节点类型为字符型
struct S_Node * next; //下一个节点的指针
}S_Node, * Stack; // 定义链表
(二)在存储文件的某些信息时需要用到多个一维数组和二维数组。
抽象数据类型数组可形式的定义如下:
ADT Array
{
数据对象:Ji=0,......,Bi-1, i=0,1,2,.......,n
数据关系:R={R1,R2,.......,Rn};
}ADT Array
抽象数据类型数组的具体定义如下:
char section[LEN][LEN] = {'\0'}; // 存储section分类的临时数组,含重复项char section_true[LEN][LEN] = {'\0'}; // 存储section分类的数组,无含重复项
四、算法设计
五、物理实现及结果
从上述流程图可以看出基本算法主要包括标签判定、文章分类,建立网站首页和建立链接页面四个流程。下面我们依次进行分析:
1. 主要数据结构的物理设计
1.XML
文件标签的判定这一部分用到了栈的抽象数据类型,也是整个程序设计的基础。其基本思想就是如果读到的字符是'<'则压入堆栈,直到读到'>'时弹出堆栈中的全部内容,即是读入标签的倒置,可以判断并根据定义将标签序号返回主函数了。这个模块的伪码实现如下:
int Judgement (ifstream & fin)// 判断标签
{
建立栈;
初始化栈;
先将'<'压入栈;
while(直至遇到'>'停止压栈)
{
从文件顺次读出字符;
将读入字符压栈;
}
将标签弹出栈并存放到一个数组中;
判断是那个标签并返回到主函数
{
If (调用Strcmp()比较函数,数组中内容依次与各个标签进行比较是否相同) 则待判断标签即为此时比较的标签;
}
将相应标签值返回主函数;
}
2.文章分类的实现
这一部分也许要用到Strcmp()比较函数。现将所有的分类列出,再根据每篇文章的
类别将所有的文章分类,其具体实现函数的伪码如下:
void Sort(ofstream & fout, int n) // 对article文档进行分类
{
从XML 文件开始处一次找出每个article 的section;
将第一篇article 的section 存入二维数组section_true;
调用Strcmp()比较函数,依次读取临时section中的字符串;
判断其是否与section_true中元素相同;
相同则跳过比较下一个article 的section;
不同则将其写入section_true数组;
将所有section 标题写入文件中;
}
3.建立链接页面的实现
在这部分的实现中,将重新从XML 文件的起始处读起,遇到
一个article 的单独处理。具体实现过程的伪码如下所示:
void Create (ifstream & fin, ofstream & fout1, int k)
// 对各个article建立子页面