1、 封 皮(按学校要求手工填写)成 绩 评 定 表学生姓名 史龙云 班级学号 1103060432专 业 通信工程 课程设计题目 静态查找类模板的设计与实现评语组长签字:成绩日期 20 年 月 日课程设计任务书学 院 信息科学与工程 专 业 通信工程学生姓名 史龙云 班级学号 1103060432课程设计题目 静态查找类模板的设计与实现实践教学要求与任务建立一维数组数据结构的模板类,使一维数组中的数据元素可以是 char, int, float 等多种数据类型,并对数组元素进行静态查找。主要完成如下功能:(1) 实现数组数据的输入和输出;(2) 对数组进行顺序查找;(3) 对有序数组进行折半查找
2、(递归算法) ;(4) 对有序数组进行折半查找(非递归算法) ;(5) 将每种查找功能作为类的成员函数实现,编写主函数测试上述查找功能。工作计划与进度安排第 17 周:分析题目,查阅课题相关资料,进行类设计、算法设计;第 18 周:程序的设计、调试与实现;第 19 周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师:201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要建立一维数组数据结构的模板类,使一维数组中的数据元素可以是 char, int, float 等多种数据类型,并对数组元素进行静态查找。本文采用 C+语言实现了,对数组的顺序查找,对数
3、组进行递归折半查找,对数组进行非递归折半查找,设计了数组类模板采用 Visual C+ 6.0 的控制台工程和 MFC 工程分别实现了数组的输入,输出,以及顺序查找,递归查找的程序。通过对两种程序的测试结果表明:只要算法正确,两种程序都能正确的查找到给定元素的正确位置。关键词:顺序查找;折半查找;控制台工程;MFC 工程目 录1 需求分析 .12 算法基本原理 .13 类设计 .24 基于控制台的应用程序 .44.1 类的接口设计 44.2 类的实现 54.3 主函数设计 114.4 基于控制台的应用程序测试 125 基于 MFC 的应用程序 .135.1 基于 MFC 的应用程序设计 145
4、.1.1 MFC 程序界面设计 .145.1.2 MFC 程序代码设计 .155.2 基于 MFC 的应用程序测试 18结 论 .20参考文献 .211 需求分析(1) C+语言具有丰富的数据类型,除了一些基本的数据类型(如整形,实型和字符型等)外,还有数组类型,指针类型,结构体类型,公用体类型和枚举类型。数组就是一些按序排列的相同类型数据元素的集合。(2)顺序查找:对于给定的关键字 k,从数组的第一个元素开始,一次向后与记录的关键字域相比较,如果某个记录的关键字等于 k,则查找成功,否则查找失败。2 算法基本原理有有序的一维数组 Array array,调用函数对初始化的一维数组进行数值输入
5、,并输出这个以为数组,再对这个数组进行查找操作:(1)折半查找又称二分查找。折半查找要求数组是有序的。折半查找的基本思想是:要求线性表是顺序储存的有序表。基本思想,先取表的中间位置的记录关键字和所给的关键字 key 进行比较,若相等,则查找成功:否则,如果给定的关键字比该记录的关键字大,则说明所要查找的记录只可能在表的后半部分;如果给定的关键字比该记录的关键字小,则说明所要查找的记录只可能在表的前半部分。这样,每经过一次比较就可将查找范围缩小一半。如此反复进行,逐步缩小查找范围,直到找到给定关键字 key 的记录或者当前查找范围为空(即找不到给定关键字 key 的记录)为止。(2)折半查找的过
6、程可描述为:low=1;high=n;若 lowhigh,则查找失败mid=(low+high)/2;若 key=L.rmid.key,则查找成功,返回 mid;若 keyL.rmid.key,则 low=mid+1,转 ; 其中 low 和 high 分别指示查找区间的起始位置和终止位置, mid 指示中间元素的位置。举例说明折半查找的过程。若在顺序存储的有序表中各记录的关键字为:14,25,35,40,45,55,62,72,77,92(1)要求查找关键字 number=55 的记录,查找过程如下:low=1 high=10 mid=51 2 3 4 5 6 7 8 9 1014 25 3
7、5 40 45 55 62 72 77 92low mid high由于 L.r5.key=4555,则 low=6 mid=7 high=61 2 3 4 5 6 7 8 9 1014 25 35 40 45 55 62 72 77 92low high mid由于 L.r6.key=55=55,则查找成功。3 类设计从上面的算法分析可以看到,本设计面临的问题的关键是数组的操作。对定义的数组进行静态查找。可以定义一个一维数组类模板类 template Array 类包括公用类型的数据 arraymax_size; size;和输入函数 void Input( ); 输出函数 viod Out
8、put( ); 顺序查找函数 void search( );和返回值为布尔型的递归折半查找 bool rehalfsearch( );和非递归折半查找函数 void halfsearch( ); Array 类的组成关系图 3.1 所示:template Arraypublic: T arraymax_size;int size;public: void Input();viod Output();void search();bool rehalfsearch(); void halfsearch();图 3.1 Array 类的组成关系图在对数组进行查找的过程中,通过声明的 array 数组
9、调用 Array 类中的成员函数,可以实现定义数组的查找过程。4 基于控制台的应用程序整体分为两部分,一部分是类的模板,包括类的数据元素和 arraymax_size; size;类的成员函数 Array(); Array(); Output(); Input(); search(); rehalfsearch(T number,int first,int last); halfsearch(T number,int first,int last);以及类成员函数的具体代码。另一部分是主函数,主函数中定义了一个 array 数组,通过数组调用类的成员函数实现静态查找类模板的设计。4.1 类的接
10、口设计/Array.h 文件,实现类的声明#include using namespace std;template /类模板class Array /Array 类的声明public: /外部接口T arraymax_size;int size; Array(); /构造函数Array(); /析构函数void Input(); /输入数组void Output(); /输出数组void search(); /顺序查找bool rehalfsearch(T number,int first,int last); /递归折半查找void halfsearch(T number,int firs
11、t,int last); /非递归折半查找;声明了类的模板 Array 类,并且类的数据元素和成员函数全部是公有型的,还包括了类的析构和构造函数,这些都可以被主函数中定义的数组调用。各个成员函数的清理工作在析构函数中完成。4.2 类的实现/Array.cpp 文件,类实现template /类模板Array:Array() /初始化 Array 数组for(int i=0;iArray:Array() /定义 Array 的析构函数;templatevoid Array:Input() /定义输入函数 coutarrayi; /数据的输入;templatevoid Array:search()
12、 /顺序查找 T number; /定义 T 型的 numbercoutnumber; /输入 numberint j=0;while(arrayj!=number) j+;if(j=max_size) coutbool Array:rehalfsearch(T number,int first,int last)/定义递归折半查找函数 int mid;if(firstlast)return 0;mid=(first+last)/2;if(arraymid=number) return 1;else if(arraymidnumber) return rehalfsearch(number,f
13、irst,mid-1);/递归调用折半查找函数 elsereturn rehalfsearch(number,mid+1,last);/递归调用折半查找函数 ;templatevoid Array:halfsearch(T number,int first,int last)/定义非递归折半查找函数 while(firstarrayi)first=i+1;else if(numbervoid Array:Output() /定义输出函数 cout array; /定义 int 类型数组int number;array.Input(); /输入array.Output(); /输出array.s
14、earch(); /查找coutnumber;cout array; /定义 float 类型数组float number;array.Input(); /输入array.Output(); /输出array.search(); /查找coutnumber;cout array; /定义 char 类型数组char number;array.Input(); /输入array.Output(); /输出array.search(); /查找coutnumber;cout array ;Array array2 ;Array array3 ;int TypeFlag = 0 ;编写读入数据按钮的
15、消息处理函数,实现对输入的数组进行静态查找的结果刷新到界面上,具体代码如下:BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)float num = 0;int pos = 0;int start = 0,end = 0;switch(uMsg)case WM_INITDIALOG:CHAR temp512;ZeroMemory(temp,sizeof(temp);wsprintfA(temp,“数据与数据间以空格隔开,以#结束。 例如 1 2 3#“);SetDlgItemTextA(
16、hwndDlg,IDC_EDIT_INPUT,temp);return TRUE;case WM_CLOSE:EndDialog(hwndDlg, 0);return TRUE;case WM_COMMAND:switch (LOWORD(wParam)case IDC_RADIO_INT:/ MessageBoxA(NULL,“int“,“,0);TypeFlag = 3 ;SetDlgItemTextA(hwndDlg,IDC_EDIT_INPUT,“);return TRUE;case IDC_RADIO_FLOAT:/ MessageBoxA(NULL,“float“,“,0);Typ
17、eFlag = 1 ;SetDlgItemTextA(hwndDlg,IDC_EDIT_INPUT,“);return TRUE;case IDC_RADIO_CHAR:/ MessageBoxA(NULL,“char“,“,0);TypeFlag = 2 ;SetDlgItemTextA(hwndDlg,IDC_EDIT_INPUT,“);return TRUE ;case IDC_BUTTON_INPUT:if(TypeFlag = 0)MessageBoxA(hwndDlg,“你还没有选择数组类型“,“错误信息“,0);return TRUE ;if(TypeFlag = 3) /int
18、array3.Input(hwndDlg);else if(TypeFlag = 2)/chararray2.Input(hwndDlg);else/floatarray.Input(hwndDlg) ;return TRUE;case IDC_BUTTON_OUT:if(TypeFlag = 3) /intarray3.Output(hwndDlg);else if(TypeFlag = 2)/chararray2.Output(hwndDlg);else/floatarray.Output(hwndDlg) ;return TRUE ;case IDC_BUTTON_ORDER:if(po
19、s = 0)pos = -1 ;case IDC_BUTTON_BINARY_NONREC:if(pos = 0)pos = -2 ;case IDC_BUTTON_BINARY_REC:if(pos = 0)pos = -3 ;if(TypeFlag = 0)MessageBoxA(hwndDlg,“你还没有选择数组类型“,“错误信息“,0);return TRUE ;/MessageBoxA(NULL,temp,“,0);if(-1 != pos)GetDlgItemTextA(hwndDlg,IDC_EDIT_START,temp,sizeof(temp);start = atoi(te
20、mp);GetDlgItemTextA(hwndDlg,IDC_EDIT_END,temp,sizeof(temp);end = atoi(temp);/获取 numCHAR temp128;ZeroMemory(temp,sizeof(temp);GetDlgItemTextA(hwndDlg,IDC_EDIT_NUM,temp,sizeof(temp);num = atof(temp);if(-1 = pos)if(TypeFlag = 3) /intpos = array3.search(int)num);else if(TypeFlag = 2)/charCHAR *ttemp = t
21、emp ;pos = array2.search(*ttemp);else/floatpos = array.search(num) ;else if(-3 = pos)if(TypeFlag = 3) /intpos = array3.rehalfsearch(num,start,end);else if(TypeFlag = 2)/charCHAR *ttemp = temp ;pos = array2.rehalfsearch(*ttemp,start,end);else/floatpos = array.rehalfsearch(num,start,end);elseif(TypeFl
22、ag = 3) /intpos = array3.halfsearch(num,start,end);else if(TypeFlag = 2)/charCHAR *ttemp = temp ;pos = array2.halfsearch(*ttemp,start,end);else/floatpos = array.halfsearch(num,start,end);/ MessageBoxA(NULL,pos+“,“,0);if(-1 != pos)wsprintfA(temp,“您查找的数据在数组中的第%d 个位置“,pos);SetDlgItemTextA(hwndDlg,IDC_E
23、DIT_INPUT,temp);elsewsprintfA(temp,“您查找的数据不存在“);SetDlgItemTextA(hwndDlg,IDC_EDIT_INPUT,temp);return TRUE;break;default:;return FALSE;5.2 基于 MFC 的应用程序测试运行程序后,首先出现的界面如图 5.5 所示:图 5.5 程序初始运行界面选择要输入的数据类型,在编辑框里输入要输入的数据,点击数据输入,就实现了数据的输入,点击数据输出,就可以输出输入数组的数据。如图 5.6 所示:图 5.6 读入数据后的界面然后在待查找的数据的编辑框里输入要查找的数据,点击顺
24、序查找按钮就可以实现对输入数据的查找,如图 5.7 所示:图 5.7 顺序查找的界面然后输入数组的起始位置和终止位置,从 0 开始(输出数据的位置比实际位置小1) ,在待查找的数据编辑框内输入要查找的数据,点击递归折半查找,实现对输入数据的递归折半查找。如图 5.8 所示:图 5.8 递归折半查找的界面然后再次输入要查找的数据,点击非递归折半查找,实现对数据的非递归折半查找的过程,如图 5.9 所示:图 5.9 非递归折半查找的界面float,char 型数组的查找的过程同 int 型数组的查找操作过程。只需要定义不同数据类型的数组,调用类函数即可。结 论本次设计中应用了一维数组的静态查找方法
25、。设计了模板类,在模板类中,包含待定类型的一维数组和数组的长度,以及类的各个成员函数。然后在模板类外,分别定义了类的析构函数,初始化一维数组的函数,输入函数,输出函数,顺序查找函数,递归折半查找函数以及非递归折半查找函数。在主函数中通过声明具体的一维数组,调用具体的数组的成员函数进行数组的静态查找。数组的析构函数调用类的构造函数,共同完成清理任务。实现了对一维数组的静态查找。同时运用 MFC 完成了此功能。通过这次课程设计,我进行了编写 MFC 程序的初步尝试,能够基本实现程序的主要功能,本此编写的 MFC 程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足,主要包括以下几个方面。(1)在数组输入函数后,在编辑框里的数据没有消失,调用输出函数后,不知道显示的是哪个函数显示的数据,应该添加一个清除按钮。(2)界面做的不够美观,可以在程序中添加些皮肤函数,使编写的程序界面更加美观。