最新回文判别程序设计.docx
- 文档编号:8981993
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:20
- 大小:123.38KB
最新回文判别程序设计.docx
《最新回文判别程序设计.docx》由会员分享,可在线阅读,更多相关《最新回文判别程序设计.docx(20页珍藏版)》请在冰豆网上搜索。
最新回文判别程序设计
回文判别程序设计
1设计题目
回文判别的程序设计
2问题描述
1.判断从键盘输入的字符串是否是回文(即字符串正读和反读结果都一样).
2.当输入的是回文时,计算机终端会显示”是回文”,否则显示”不是回文”.
3.程序运行的命令包括:
1).继续测试2).退出程序.
3设计
3.1数据结构设计
1.线性表的抽象数据类型如下:
ADTList{
数据对象:
D={
|
Elemset,i=1,23,…….,n>=0}
数据关系:
R1={<
>|
D,i=2,3,……,n}
基本操作:
InitList(&L)
操作结果:
构造一个空的线性表L.
DestroyList(&L)
初始条件:
线性表L已存在.
操作结果:
销毁线性表L.
ClearList(&L)
初始条件:
线性表L已存在.
操作结果:
将L重置为空表.
ListEmpty(L)
初始条件:
线性表L已存在.
操作结果:
若L为空表,则返回TRUE,否则返回FALSE.
ListLength(L)
初始条件:
线性表L已存在.
操作结果:
返回L中数据元素个数.
GetElem(L,I,&e)
初始条件:
线性表L已存,1<=i<=ListLength(L).
操作结果:
用e返回L中第i个元素的值.
LocateElem(L,e,compare())
初始条件:
线性表L已存在,compare()是数据元素判定函数.
操作结果:
返回L中第1个与e满足关系compare()的数据元素位序.若这样的数据元素不存在,则返回值为0.
PriorElem(L,cur_e,&pre_e)
初始条件:
线性表L已存在.
操作结果:
若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义.
NextElem(L,cur_e,&next_e)
初始条件:
线性表L已存在.
操作结果:
:
若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义.
ListInsert(&L,I,e)
初始条件:
线性表L已存在,1<=i<=ListLength(L)+1.
操作结果:
在L中第i个位置前插入新的数据元素e,L的长度加1.
ListDelete(&L,I,&e)
初始条件:
线性表L已存在且非空,1<=i<=ListLength(L).
操作结果:
删除L的第i个数据元素,并用e返回其值,L的长度减1.
ListTraverse(L,visit())
初始条件:
线性表L已存在.
操作结果:
依次对L的每个数据元素调用函数visit().一旦visit()失败,则操作失败.
}ADTList
3.2主要算法设计
单循环链表的存储类型如下:
classListNode//链表结点类
{
public:
chardata;
ListNode*next;
ListNode(){};
};
classLinkList//单循环链表类
{
private:
ListNode*head,*rear;//定义头指针尾指针
public:
LinkList(){};//构造函数
voidInitList(LinkList&L);//链表初始化函数
voidCreatLinkList(LinkList&L);//创建一个新的链表
intLinkListLengh(LinkList&L);//计算链表长度的函数
voidDestroyLinkList(LinkList&L);//销毁链表
voidPrintLinkList(LinkListL);//打印链表
intPanbie(LinkList&L,int&i);//判定函数
};
顺序表的存储类型如下:
classClistSq//顺序表类
{
public:
~ClistSq();//析构函数
ClistSq();//构造函数
intpanduan(ClistSq&);//判断是否为回文
voidInitList_Sq(ClistSq&);//初始化顺序表
voidFill_SqList(ClistSq&);//向顺序表中添加元素
char*m_pnElem;
intm_nLength;//顺序表元素个数
intm_nListsize;//顺序表长度
private:
staticconstintLIST_INIT_SIZE=100;//初始化表长
staticconstintLISTINCREMENT=10;//表长增量
enummeiju{OVERFLOW=-2,OK=1,ERROR=0};
};
其中顺序表主要的算法实现如下:
voidClistSq:
:
InitList_Sq(ClistSq&L)
{//初始化顺序表构造一个空表
L.m_pnElem=newchar[LIST_INIT_SIZE*sizeof(char)];
if(!
L.m_pnElem)exit(L.ERROR);//内存分配成功判定
L.m_nLength=0;
L.m_nListsize=LIST_INIT_SIZE;
}
voidClistSq:
:
Fill_SqList(ClistSq&L)
{//向表中添加元素
char*p=L.m_pnElem;
chare;
inti=0;
cout<<"请输入一个字符串:
"< scanf("%c",&e); while(e! ='\n')//输入控制条件 {if(i>=LIST_INIT_SIZE) { L.m_pnElem=newchar[(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(char)]; if(! m_pnElem)exit (1); p=L.m_pnElem; } *(p+i)=e; i++; scanf("%c",&e); } L.m_nLength=i; } 单循环链表得主要的算法实现如下: intLinkList: : LinkListLengh(LinkList&L) {//计算单循环链表L的数据元素个数。 inti=0; ListNode*temp=L.head; while(temp->next! =L.head)//是否遍历完毕 { i++; temp=temp->next; } returni; } voidLinkList: : CreatLinkList(LinkList&L) {//建立一个单循环链表L,数据为字符,数据由键盘随机输入。 chari; L.rear=newListNode(); L.rear->next=L.rear; L.head=L.rear; cout<<"请输入一个字符串: "< scanf("%c",&i); while(i! ='\n') { ListNode*p=newListNode(); if(! p) { cout<<"内存分配错误"< exit (1); } p->data=i; L.rear->next=p; p->next=L.head; L.rear=p; scanf("%c",&i); } } intLinkList: : Panbie(LinkList&L,int&i) {//判别是否为回文 ListNode*p; char*elem=newchar[i*sizeof(char)]; if(! elem) { cout<<"内存分配错误"< exit (1); } intj=0; p=L.head->next; while(p! =L.head)//是否遍历完毕 { elem[j]=p->data; p=p->next; j++; } for(intm=0;m { if(elem[m]! =elem[i-m-1])//判定字符是否对称 return0; } return1; } 3.3测试用例设计 由于本次的程序主要目的是实现回文判别的功能,我们关注的是是否可以按照要求实现程序应该具有的功能.所以,我们可以采用”黑盒测试”的方法来设计测试用例. 1.我们测试单个字符是否符合要求. 2.测试一些特殊的字符如空格.水平制表符.控制符等. 3.测试多种字符混合的序列 4.对于顺序表可以对输入字符长度的边界进行测试 5.测试数据 (1)asdfgggh,ghkkhg79ij[l.,/a,abcba,2235322,guuihhj7\][[]\7jhhiuug. (2)a,*,/,’\n’,’‘. (3)#@4%%4@# 主要用来测试函数Panbie(LinkList&L,int&i)和panduan(ClistSq&)的正确性. 4调试报告 1.程序调试: a.采用支持C/C++的编译器,如MicrosoftVisualC++2005速成版来运行程序. b.程序的项目类型 VisualC++以项目的方式创建应用程序,并支持多种不同类型的项目.我们的编程经验还不够,所以尽可能创建Win32控制台程序,便于我们对程序的控制. c.调试方法 我们编写程序时大多是一个一个模块的编写,所以我们调试时最好分模块进行,自底向上,即先调试最底层函数。 必要时可以另写一个调用驱动程序。 这种表面上麻烦的工作,实际上可以大大降低调试所面临的复杂性,提高调试工作效率。 d.测试数据 1.asdfggghghkkhg79ij[l.,/a输出不是回文 2.abcba2235322guuihhj7\][[]\7jhhiuug是回文 3.a,*,/,’\n’,’‘是回文 5结束语 通过本次课程设计我深刻得体会到了设计程序的困难,设计程序是一个全盘思维的过程.在进行源程序的编写前,一定要对程序怎样运行,程序的原理有一个大致的了解,只有这样,在编写时才能做到纵观全局,不会只局限于某一个特定的模块,但是,这正是我们初学者最容易犯的错误. 在这次课程设计中,我也体验到了这种做法的危害性,在编写用单循环链表实现回文判别的功能时,刚开始急于求成,没有仔细考虑就动手编写程序,结果程序变好以后,几乎是在不停的改正错误,并且由于没有一个总的框架,导致自己对各个模快之间的关系很模糊,而这种错误正是编程者醉大的错误.有了第一次的经验,在第二次编写链表时,经过仔细的考虑后,很少出现错误,对程序的调试有很大的帮助. 通过这次课程设计,我也懂得了软件工程导论课程的巨大作用,它教给我们全局策划的思想,这正是我们所缺乏的,对我们来说也是最重要的. 关于单循环链表实现回文判别算法的改进: 我们可以先创建一个链表La,然后一次插入字符.再创建一个链表Lb,然后把La复制给Lb,然后再通过链表逆置算法得到La的逆置链表Lc,最有通过一个比较函数来判定是否Lc中的每个元素都等于Lb中的每个元素.如果等于,则说明是回文,否则,不是回文. 附录 F1源代码 1.顺序表回文判别的源代码 #include usingnamespacestd; classClistSq//顺序表类 { public: ~ClistSq();//析构函数 ClistSq();//构造函数 intpanduan(ClistSq&);//判断是否为回文 voidInitList_Sq(ClistSq&);//初始化顺序表 voidFill_SqList(ClistSq&);//向顺序表中添加元素 char*m_pnElem; intm_nLength;//顺序表元素个数 intm_nListsize;//顺序表长度 private: staticconstintLIST_INIT_SIZE=100;//初始化表长 staticconstintLISTINCREMENT=10;//表长增量 enummeiju{OVERFLOW=-2,OK=1,ERROR=0}; }; ClistSq: : ClistSq() { } ClistSq: : ~ClistSq() {//删除顺序表元素 deletem_pnElem; } voidClistSq: : InitList_Sq(ClistSq&L) {//初始化顺序表构造一个空表 L.m_pnElem=newchar[LIST_INIT_SIZE*sizeof(char)]; if(! L.m_pnElem)exit(L.ERROR);//内存分配成功判定 L.m_nLength=0; L.m_nListsize=LIST_INIT_SIZE; } voidClistSq: : Fill_SqList(ClistSq&L) {//向表中添加元素 char*p=L.m_pnElem; chare; inti=0; cout<<"请输入一个字符串: "< scanf("%c",&e); while(e! ='\n')//输入控制条件 {if(i>=LIST_INIT_SIZE) { L.m_pnElem=newchar[(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(char)]; if(! m_pnElem)exit (1); p=L.m_pnElem; } *(p+i)=e; i++; scanf("%c",&e); } L.m_nLength=i; } intClistSq: : panduan(ClistSq&L) {//回文判别函数 for(inti=0;i { if(*(L.m_pnElem+i)! =*(L.m_pnElem+L.m_nLength-i-1)) return0; } return1; } intmain() { cout<<"************************顺序表回文判别************************"< A: ClistSqla; intmap; la.InitList_Sq(la); la.Fill_SqList(la); inti; cout<<"输入的字符串为: "< for(i=0;i { cout<<*(la.m_pnElem+i)<<""; } cout< map=la.panduan(la); if(map==1) cout<<"是回文"< else cout<<"不是回文"< cout<<"是否继续测试? "< cout<<"继续--按回车"< cout<<"退出--输入其他字符"< charc; scanf("%c",&c); if(c=='\n') gotoA; elsecout<<"结束测试"< system("pause"); return0; } 2.单循环链表回文判别的源代码 #include usingnamespacestd; classListNode//结点类 { public: chardata; ListNode*next; ListNode(){}; }; classLinkList//单循环链表类 { private: ListNode*head,*rear;//定义头指针尾指针 public: LinkList(){};//构造函数 voidInitList(LinkList&L);//链表初始化函数 voidCreatLinkList(LinkList&L);//创建一个新的链表 intLinkListLengh(LinkList&L);//计算链表长度的函数 voidDestroyLinkList(LinkList&L);//销毁链表 voidPrintLinkList(LinkListL);//打印链表 intPanbie(LinkList&L,int&i);//判定函数 }; voidLinkList: : InitList(LinkList&L) {//初始化链表构建一个空链表 L.rear=newListNode(); if(! L.rear) { cout<<"内存分配错误"< exit (1); } L.head=L.rear; L.rear->next=L.head; } intLinkList: : LinkListLengh(LinkList&L) {//计算单循环链表L的数据元素个数。 inti=0; ListNode*temp=L.head; while(temp->next! =L.head)//是否遍历完毕 { i++; temp=temp->next; } returni; } voidLinkList: : DestroyLinkList(LinkList&L) {//销毁单循环链表L。 ListNode*temp=L.head; while(L.rear! =temp)//是否遍历完毕 { L.head=temp->next; free(temp); temp=L.head; } free(L.rear); L.rear=NULL; } voidLinkList: : CreatLinkList(LinkList&L) {//建立一个单循环链表L,数据为字符,数据由键盘随机输入。 chari; L.rear=newListNode(); L.rear->next=L.rear; L.head=L.rear; cout<<"请输入一个字符串: "< scanf("%c",&i); while(i! ='\n') { ListNode*p=newListNode(); if(! p) { cout<<"内存分配错误"< exit (1); } p->data=i; L.rear->next=p; p->next=L.head; L.rear=p; scanf("%c",&i); } } voidLinkList: : PrintLinkList(LinkListL) {//输出单循环链表L的数据元素。 ListNode*temp=L.head; cout<<"输入的字符串为: "< while(temp->next! =L.head) { cout< temp=temp->next; } cout< } intLinkList: : Panbie(LinkList&L,int&i) {//判别是否为回文 ListNode*p; char*elem=newchar[i*sizeof(char)]; if(! elem) { cout<<"内存分配错误"< exit (1); } intj=0; p=L.head->next; while(p! =L.head)//是否遍历完毕 { elem[j]=p->data; p=p->next; j++; } for(intm=0;m { if(elem[m]! =elem[i-m-1])//判定字符是否对称 return0; } return1; } voidmain() { cout<<"*************************单循环链表回文判别************************"< A: LinkListLa; intma,mb; La.InitList(La); La.CreatLinkList(La); La.PrintLinkList(La); mb=La.LinkListLengh(La); ma=La.Panbie(La,mb); if(ma==1)cout<<"是回文"< else cout<<"不是回文"< cout<<"是否继续测试? "< cout<<"继续--按回车"< cout<<"退出--输入其他字符"< charc; scanf("%c",&c); if(c=='\n') gotoA; elsecout<<"结束测试"< La.DestroyLinkList(La); system("pause"); } F2运行结果。 1.顺序表运行结果 2.单循环链表运行结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 回文 判别 程序设计