C课设判断回文报告.docx
《C课设判断回文报告.docx》由会员分享,可在线阅读,更多相关《C课设判断回文报告.docx(15页珍藏版)》请在冰豆网上搜索。
![C课设判断回文报告.docx](https://file1.bdocx.com/fileroot1/2023-3/30/44be7357-d31f-4549-ac02-70ee3ad2375b/44be7357-d31f-4549-ac02-70ee3ad2375b1.gif)
C课设判断回文报告
目录
一、需求分析2
二、概要设计2
三、详细设计4
四、调试分析9
五、用户手册9
六、测试数据10
七、附录11
一、需求分析
⒈用栈及队列的基本操作完成对字符串是否为回文的判断,其中栈及队列都是作为单独的子函数存在。
⒉通过创建栈和队列来存放字符串,然后分别取出栈和队列里元素,一个个比较,如果到栈和队列到最后一个元素从两边出来的字符都相同,则能说明用户输入的字符串为回文,否则就不是。
⒊用户要从屏幕上输入一串字符,完成对栈及队列的存储。
⒋程序完成对用户输入的字符串进行存储,然后完成对字符串的输出,比较丛
栈和队列中出来的字符,然后进行判断。
⒌程序执行命令:
⑴接受用户输入字符串;
⑵比较判断从栈和队列中出来的字符;
⑶输出最后判断的结果。
二、概要设计
⒈设计栈和队列的抽象数据类型定义:
基本操作:
操作结果
stinit(s)构造一个空栈,完成对栈的初始化s
quinit(q)构造一个空队列,完成对队列的初始化q
stpush(s,c)完成字符进栈的操作
enqueue(q,c)完成字符进队列的操作
stempty(s),quempty(q)判断栈和队列中是否还有元素
stpop(s),dequeue(q)比较出栈与出队列的字符是否匹配
⒉判断字符
基本操作:
stpop(s)==dequeue(q);
初始条件:
在子函数中已经定义了栈与队列,而且已经将字符分别输入空的栈和队列中,现在的关键就在于判断从栈和队列里出来的元素是否相同。
操作结果:
如果输入到栈和队列元素相同,那么代表输入的字符为回文字符。
3.本程序模块结构
⑴主函数模块
voidmain(){
初始化;
为栈和队列申请空间;
调用栈和队列功能子函数;
判断从栈和队列出来的字符是否相同;
得出最终的结果;
⑵栈模块----实现栈抽象数据类型,完成对栈的初始化,进栈和出栈的操作。
⑶队列模块----实现队列抽象数据类型,完成对队列的初始化,进队列和出队列的操作。
各模块之间的调用关系如下:
主程序模块
栈模块
队列模块
三、详细设计
1基本数据类型操作
1栈模块
1typedefstruct
{
charstack[m];
inttop;
}stackstru;//定义栈
2参数设置:
#definem100
//----------基本操作的算法描述--------------------
intstinit(stackstru*s)
{
s->top=-1;
return1;
}//初始化栈
intstempty(stackstru*s)
{
if(s->top==-1)//栈顶为空
return0;
else
return1;
}//判断栈是否为空
intstpush(stackstru*s,charx)
{
if(s->top==m)//栈满
{
puts("Thestackisoverflow!
");//输出提示信息
return0;
}
else//栈未满
{
s->top=s->top+1;/栈顶后移
s->stack[s->top]=x;//字符入栈
return1;
}
}//入栈操作
charstpop(stackstru*s)
{
chary;
if(s->top==-1)//栈为空
{
puts("Thestackisempty!
");//输出提示信息
return'';//返回空格
}
else//栈不为空
{
y=s->stack[s->top];//取出栈顶元素
s->top=s->top-1;//栈顶指示后移
returny;
}
}//出栈操作
2队列模块:
1typedefstruct
{
charqueue[m];
intfront;
intrear;
}queuestru;//定义队列
2参数设置:
#definem100
//----------基本操作的算法描述--------------------
intquinit(queuestru*q)
{
q->front=0;
q->rear=0;
return1;
}//初始化一个空的循环队列
intquempty(queuestru*q)
{
if(q->front==q->rear)//队头和队尾相等
return0;
else
return1;
}//判断队列是否为空
intenqueue(queuestru*q,chare)
{
if((q->rear+1)%m==q->front)//队列已满
{
puts("Thequeueisoverflow!
");//提示信息
return0;
}
else
{
q->queue[q->rear]=e;//入队
q->rear=(q->rear+1)%m;//移动队尾指针
return1;
}
}//入队操作
chardequeue(queuestru*q)
{
charf;
if(q->front==q->rear)//队列为空
{
puts("Thequeueisempty!
");//提示信息
return0;
}
else
{
f=q->queue[q->front];//取出队首元素
q->front=(q->front+1)%m;//移动对头指针
returnf;
}
}//出队操作
3主函数算法:
voidmain()
{
charc;
intflag=0;
stackstru*s=(stackstru*)malloc(sizeof(stackstru));
queuestru*q=(queuestru*)malloc(sizeof(queuestru));
stinit(s);
quinit(q);
puts("----------huiwenjiance----------");
puts("--102023ban10202331huangyawei--");
putchar('\n');
puts("Welcometocomehere,pleaseinputastring:
");
while((c=getchar())!
='\n')//输入字符串。
输入回车键结束
{
putchar(c);//输出输入的字符
stpush(s,c);//字符进栈
enqueue(q,c);//字符进队列
}
putchar('\n');
puts("Pleasepress'enter'tocontinue!
");//提示信息
getchar();
while(stempty(s))//栈中还有元素
{
if(stpop(s)==dequeue(q))//出战的字符与出队列的字符匹配
{flag=1;continue;}//将标志设置为1,继续从栈和队列中区配字符
else//字符不匹配
{flag=0;break;}//跳出循环,将标志设置为0
}
if(flag==1)
puts("Thisstringispalindrome(weihui)!
");//标志为1,完全匹配,是回文
else
puts("Thisstringisn'tpalindrome(huiwen)!
");//标志为0,不完全匹配,不是回文
puts("Pleasepress'enter'tocontinue!
");//提示信息
getchar();
puts("Ceshiisover,plesaepress'enter'toexit!
\n");//提示信息
getchar();
}
2函数的调用关系反映了本演示程序的层次结构
main
栈设置队列设置
stinitstemptystpushstpopdequeueenqueuequemptyquinit
判断是否相等
四、调试分析
⒈在写整个程序的时候应注意对已栈和队列的操作不能少了一个步骤,否则会出现一些关于栈和队列的常识错误,从而会影响整个程序。
⒉在程序中加了一些栈和队列基本的函数,比如判断栈和队列是否为空及栈和队列是否已满的函数,这样可以使程序更加完善。
⒊在主函数中使用一些实用的提示符及界面的一些提示,这样使使用者更好的使用。
五、用户手册
⒈本程序的运行环境是在tc2.0中,文件名为huiwen.c。
⒉打开文件后,按下Ctrl+F9进入界面。
⒊进入界面后,按照界面的提示输入一串字符。
⒋输入结束后,按Enter键结束输入。
⒌然后继续按Enter键查看结果,看输入的字符是否为回文。
⒍最后再次按Enter键退出判断程序。
六、测试数据
进入界面后出现下面界面
然后输入你想要输入的字符,假如输入abcdcba这一串字符,连续按两下Enter键结果:
然后再次按下Enter键后:
再次按下Enter键就结束了本次测试,再次测试下另一串字符,如:
abcdefg
通过上面两次的测试,分别对字符abcdcba和abcdefg进行测试,结果已经表明字符abcdcba为回文,而字符abcdefg不是回文,满足实际要求。
七、附录
源程序:
#include
#include
#definem100
typedefstruct
{
charstack[m];
inttop;
}stackstru;
typedefstruct
{
charqueue[m];
intfront;
intrear;
}queuestru;
intstinit(stackstru*s)
{
s->top=-1;
return1;
}
intstempty(stackstru*s)
{
if(s->top==-1)
return0;
else
return1;
}
intstpush(stackstru*s,charx)
{
if(s->top==m)
{
puts("Thestackisoverflow!
");
return0;
}
else
{
s->top=s->top+1;
s->stack[s->top]=x;
return1;
}
}
charstpop(stackstru*s)
{
chary;
if(s->top==-1)
{
puts("Thestackisempty!
");
return'';
}
else
{
y=s->stack[s->top];
s->top=s->top-1;
returny;
}
}
intquinit(queuestru*q)
{
q->front=0;
q->rear=0;
return1;
}
intquempty(queuestru*q)
{
if(q->front==q->rear)
return0;
else
return1;
}
intenqueue(queuestru*q,chare)
{
if((q->rear+1)%m==q->front)
{
puts("Thequeueisoverflow!
");
return0;
}
else
{
q->queue[q->rear]=e;
q->rear=(q->rear+1)%m;
return1;
}
}
chardequeue(queuestru*q)
{
charf;
if(q->front==q->rear)
{
puts("Thequeueisempty!
");
return0;
}
else
{
f=q->queue[q->front];
q->front=(q->front+1)%m;
returnf;
}
}
voidmain()
{
charc;
intflag=0;
stackstru*s=(stackstru*)malloc(sizeof(stackstru));
queuestru*q=(queuestru*)malloc(sizeof(queuestru));
stinit(s);
quinit(q);
puts("----------huiwenjiance----------");
puts("--102023ban10202331huangyawei--");
putchar('\n');
puts("Welcometocomehere,pleaseinputastring:
");
while((c=getchar())!
='\n')
{
putchar(c);
stpush(s,c);
enqueue(q,c);
}
putchar('\n');
puts("Pleasepress'enter'tocontinue!
");
getchar();
while(stempty(s))
{
if(stpop(s)==dequeue(q))
{flag=1;continue;}
else
{flag=0;break;}
}
if(flag==1)
puts("Thisstringispalindrome(weihui)!
");
else
puts("Thisstringisn'tpalindrome(huiwen)!
");
puts("Pleasepress'enter'tocontinue!
");
getchar();
puts("Ceshiisover,plesaepress'enter'toexit!
\n");
getchar();
}