数据结构课程设计报告
- 格式:doc
- 大小:641.50 KB
- 文档页数:57
井冈山大学电子与信息工程学院数据结构课程设计报告( 2016——2017年度第一学期)课程名称:数据结构课程设计题目一:4.2串基本操作演示系统P64题目二:6.4.2重言式判别问题P134题目三:8.4.2图书管理系统P194院系:计算机科学系班级:计算机14本2班姓名:李泽龙学号:1409102110指导教师:孙凌宇老师成绩:2016 年12月01日成绩评定一、指导教师评语二、成绩指导教师:日期:年月日目录设计题目<一>:4.2“串基本操作演示系统”的设计与实现P64 (1)一、设计要求 (1)1.问题描述 (1)2.需求分析 (1)二、概要设计 (1)1.主界面设计 (1)2.存储结构设计 (2)3.系统功能设计 (2)三、模块设计 (2)1.模块设计 (2)2.系统子程序及功能设计 (3)3.函数主要调用关系图 (3)四、详细设计 (4)1.数据类型定义 (4)2.系统主要子程序详细设计 (4)五、测试分析 (8)六、用户手册 (9)七、调试报告 (9)八、程序清单 (9)设计题目<二>:6.4.2重言式判别问题P134 (17)一、设计要求 (17)1.问题描述 (17)2.需求分析 (17)二、概要设计 (17)1.主界面设计 (17)2.存储结构设计 (18)3.系统功能设计 (18)三、模块设计 (18)1.模块设计 (18)2.系统子程序及功能设计 (18)3.函数主要调用关系图 (19)四、详细设计 (19)1.数据类型定义 (19)2.系统主要子程序详细设计 (20)五、测试分析 (23)六、用户手册 (24)七、调试报告 (25)八、程序清单 (25)设计题目<三>:8.4.2图书管理系统P194 (31)一、设计要求 (31)1.问题描述 (31)二、概要设计 (31)1.主界面设计 (31)2.存储结构设计 (32)3.系统功能设计 (32)三、模块设计 (33)1.模块设计 (33)2.系统子程序及功能设计 (33)3.函数主要调用关系图 (33)四、详细设计 (34)1.数据类型定义 (34)2.系统主要子程序详细设计 (35)五、测试分析 (39)1.添加图书信息 (39)2.显示图书信息 (39)3.查找图书 (40)4.删除图书 (40)5.借阅图书 (40)6.归回图书 (40)7.保存图书信息 (41)六、用户手册 (41)七、调试报告 (42)八、程序清单 (42)设计题目<一>:4.2“串基本操作演示系统”的设计与实现P64一、设计要求1.问题描述如果计算机语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。
试着实现串类型,并写一个串的基本操作的演示系统。
2.需求分析实现若干串的常用基本操作,如串赋值、求串长、串替换、穿比较、求子串级串的模式匹配等。
二、概要设计1.主界面设计串基本操作演示系统界面设计并不复杂,将各个可以进行的操作写到界面上即,运行界面如图1所示。
图1 串基本操作演示系统的主界面菜单2.存储结构设计使用串的堆分配存储表示,结构描述如下:typedef struct{char *s; //串存放的额数组int a; //串的长度}Str;3.系统功能设计本系统设置了主界面菜单,并在主界面上完成7个功能的结果显示。
7个功能的设计描述如下。
(1)赋值(a)。
由函数int initializer()实现。
当用户选择a功能是,输入待赋值的新串串值,系统完成串赋值并输出新串值。
(2)求长度(l)。
由函数int length()实现,当用户选择l功能时,系统输出串的长度。
(3)求子串(s)。
由函数int Strson()实现,参数p和l分别代表子串sub在原串B上的起始位置和子串长度。
当用户选择s功能时,系统输出子串的串值。
(4)子串定位(i)。
子串定位又称子串的模式匹配,由函数int Index()实现。
当用户选择i 功能时,系统根据用户输入的原串str1于子串str2的值输出子串在原串上的位置。
(5)替换(r)。
由函数void replace()实现,当用户选择r功能时,系统根据用户输入的原串str1、子串str2和插入串str3的值,输出用户插入串替换了原串中所指定子串后的串值。
(6)判相等(c)。
由函数int compare()实现。
当用户选择c功能时,系统根据用户输入的s1与s2的串值进行比较。
若s1<s2则显示"判断结果为:串1<串2\n";若s1=s2则显示"判断结果为:串1=串2\n";若s1>s2则显示"判断结果为:串1>串2\n"。
(7)退出(q)。
当用户选择q时,即退出串基本操作演示系统,由main()函数中的if语句实现。
三、模块设计1.模块设计本程序包含两个模块:主程序模块、串操作模块。
其调用关系如图2所示图2 模块调用示意图2.系统子程序及功能设计本系统共设置8个子程序,各子程序的函数名及各功能说明如下:(1)int String(Str *array) //串类的初始化(2)int initializer(Str *array, char *string) //串赋值函数,调用malloc 函数分配内存空间(3)int length(Str B) //求串长函数(4)int Strson(Str &sub, Str B, int p, int l)//求串B 的子串,p 代表子串sub 的起始位置,//l 代表子串sub 的长度(5)int Index(Str &str1,Str &str2,int p) //从第p 个字符的子串定位函数,调用(3) (6)void replace(Str &str1,Str &str2,Str &str3) //将原串str1的所有子串str2都替换成//插入串str3,调用(3)和(5)(7) int compare(Str s1, Str s2)//串比较函数,调用(3) (8) void main1() //主函数。
设定界面,调用操作模块函数3.函数主要调用关系图“串基本操作演示系统”8个子程序之间的主要调用关系如图3所示,图中数字是个函数的编号。
四、详细设计1.数据类型定义(1)字符串的定义typedef struct{char *s; //串存放的数组int a; //串的长度}Str;(2)全局变量声明#define OK 1 //操作成功#define OVERFLOW 0 //溢出#define ERROR 0 //出错2.系统主要子程序详细设计(1)主程序模块设计主函数。
设定用户操作界面,调用操作模块函数。
void main1(){输出操作菜单;while (1){输入操作序号c;switch (c){调用相应函数执行相应操作;输出操作结果;}}}(2)求子串int Strson(Str &sub, Str B, int p, int l){ //串sub返回串B的第p个字符长度为l的子串int i;if (p<0||p>B.a||l<0||l>B.a-p) //若位置或长度不合法退出{printf("输入不合法!\n");exit(OVERFLOW); //退出}else{if (sub.s) free(sub.s); //释放子串sub原有空间if (!l) //若长度l为0{ //将子串置为空串sub.s = NULL;sub.a = 0;}else //若长度l不为0{sub.s = (char*)malloc(l*sizeof(char));for (i = 0; i < l; i++){ //从串B的第p个字符开始依次复制其后长度为l的字符串到sub中sub.s[i] = B.s[p-1+i];sub.a = l; //修改串sub的串长}}return OK;}}(3)子串定位(串的匹配模式)int Index(Str &str1,Str &str2,int p){ //判断从第p个字符起str2是否为str1的子串//若是返回str2在str1中的起始位置,否则返回-1if (p<0||p>str1.a){ //若输入的数值p不在str1的串长范围内printf("输入有误!\n");exit(ERROR);}for (int i = p-1; i <=length(str1)-length(str2); i++){ //从str1的第p个字符起查找子串str2 int j = 0; //从str2的第一个字符起开始查找while (j<length(str2)) //j控制查找位置,逐个字符查找,//直到超出子串串长{if (str1.s[i+j]==str2.s[j]) //若找到匹配的字符{ //则依次像后查找j++; //一旦失败,则跳出查找,//此时j还未能达到子串串长}else{break;}}if (j==length(str2)) //若j达到子串串长,//即str2的所有字符都能和str1匹配{return i; //返回str2在str1中的起始位置}}return -1; //str2不是str1的子串返回-1 }(4)串替换void replace(Str &str1,Str &str2,Str &str3){ //将原串str1的所有子串str2都替换为插入串str3 printf("原串:");for (int i = 0; i <str1.a; i++){printf("%c", str1.s[i]);}printf("\n子串:");for (int j = 0; j <str2.a; j++){printf("%c", str2.s[j]);}printf("\n插入串:");for (int k = 0; k <str3.a; k++){printf("%c", str3.s[k]);}printf("\n");int l = length(str2); //str2的长度while (Index(str1,str2,0)!=-1) //当str2是str1的子串,替换所有的str2{int l2 = length(str3) + length(str1) - length(str2); //新串的长度int i = Index(str1, str2, 0); //调用子串定位函数char *p = new char[length(str1) - i - l + 1]; //临时数组char *q = new char[l2]; //储存新串的数组for (int j = i+l; j < length(str1); j++){p[j] = str1.s[j]; //将不用替换的后部分分存入数组p }for (int k = 0; k <i; k++){q[k] = str1.s[k]; //将不用替换的前部分分存入数组q }for (int m=i; m<i+length(str3); m++){q[m] = str3.s[m-i]; //替换子串}int b = i + l;for (int n = i+length(str3); n < l2; n++) //将不用替换的后部分分存入数组q{q[n] = p[b];b++; //数组q存储着新串}str1.a = l2;for (int l = 0; l < l2; l++){str1.s[l] = q[l]; //将新串赋值给str1做循环替换}printf("新串:");for (int h = 0; h < str1.a; h++){printf("%c",str1.s[h]);}}}(5)串比较int compare(Str s1, Str s2){ //若s1<s2则返回值<0;若s1=s2 则赶回值=0;若s1>s2则返回>0 int i;for ( i = 0; i < s1.a&&i<s2.a; ++i){if (s1.s[i]!=s2.s[i]){return (s1.s[i] - s2.s[i]);}return (s1.a - s2.a);}}五、测试分析系统运行主界面如图1所示。