HUNANUNIVERSITY课程实习报告题目:字符串的倒置输出学生姓名:学生学号:专业班级指导老师:完成日期:一.需求分析1.本程序要求从字符界面输入一串字符串,将其倒置后打印在屏幕上;2.字符串由用户通过键盘输入,同时应考虑空格字符,即用户可能输入的是不连续的字符;3.在DOS界面输出倒置的字符;4.要求用两种算法实现该程序;考虑使用字符串数组顺序第i个字符与倒数第i个字符(0in)循环互换的算法以及将数据存至链表中再将节点依依倒置的算法;5.测试数据输入helloworld输出dlrowolleh;6.由于暂时无法判别用户所输入的字符是中文字符还是英文字符,所以本程序默认用户输入的都是合法字符。二.概要设计抽象数据类型为实现该程序,考虑分别用链表和数组存贮用户输入的字符串,以及要求输出的字符串;算法的基本思想根据题目的要求,采用链表和数组两种方法分别实现字符串的倒置输出;算法原理如下:第一种算法:先将用户输入的字符串依次存贮进一个线性表中,之后分别将a1与an,a2与an-1,a3与an-2……互换,就完成了{an}的倒置,之后中输出{an}即可;第二种算法:先将用户输入的字符串依次存贮进一个线性表中,之后将a1移至a0前面一个位置,再将a2移至a1前面一个位置,再将a3移至a2前一个位置……依次循环直至an排到了an-1前一个位置,最后只需输出{an};程序流程:第一种算法:1.输入模块:程序界面输出提示语;2.利用第一种算法并使用for循环实现数组的倒置;3.输出模块:输出倒置后的字符串。第二种算法:1.输入模块:程序界面输出提示语;2.利用第二种算法实现链表的倒置;3.输出模块:输出倒置后的字符串。第一种程序的流程图:开始输入strn=strlen(str)-1i=0in/2?temp=str[i]str[i]=str[n-i]str[n-i]=tempi++输出a[0]到a[n]结束三.详细设计物理数据类型根据程序要求,第一种算法对应的程序中选用c++中的字符串数组存储输入的字符串,第二种算法中使用链表存储用户输入的字符串算法具体步骤第一种算法:1.定义足够大的数组,并存入用户输入的字符串;2.调用strlen函数求出该字符串数组的长度,利用for循环用第一种算法的原理对数组进行倒置;3.输出字符串数组中的数据。第二种算法:1.构造一个链表,并存入用户所输入的数据;2.利用第二种算法的基本原理对该链表实行倒置;3.依次访问链表并输出该链表中存储的字符串;算法时空分析程序运行所需的时间与用户输入规模成正相关,两种算法的时空开销都为O(n);输入输出格式请输入要倒置的字符串:倒置后的字符串如下:四.调试分析1.由于使用的编译器为vs2013,2013版本执行的是微软新标准函数gets_s()函数,最开始调用gets()函数会直接报错。2.在代码while(1)下的一个输入流cin那部分,刚开始选用cinch直接对ch进行输入,结果程序运行后无反应,后来改用cin.get(ch)后程序才正常运行,后来查资料才知道cin直接跳过换行符,所以程序陷入死循环而无法正常运行五.测试结果程序截图如下:六.用户使用说明1.输入输出格式为:请输入要倒置的字符串:倒置后的字符串如下:2.请不要输入中文字符等非法字符。七.实验心得1.要多注意在该程序是否要处理空格或换行字符,如果问题需要处理换行和空格字符,则不能直接使用cin进行输入,可以选用cin.get()或gets_s()八.附录代码第二个程序的代码:#includeiostream#includemalloc.hstructchain*creat();voidoutput(structchain*head);usingnamespacestd;structchain{chara;structchain*next;};//构造一个链表intmain(){cout请输入要倒置的字符串:endl;structchain*head,*p,*q;head=creat();p=head-next;head-next=NULL;while(p){q=p-next;p-next=head-next;head-next=p;p=q;}//链表的倒置cout倒置后的字符串如下:\n;output(head);system(pauseNUL);return0;}structchain*creat(){structchain*head,*p,*q;charch;head=NULL;if(head==NULL){head=(structchain*)malloc(sizeof(structchain));head-next=NULL;}p=head;while(1){cin.get(ch);//此处使用cin.get()或C中的scanf均可以,但使用cinch后程序运行后无反应;if(ch=='\n')break;q=(structchain*)malloc(sizeof(structchain));q-a=ch;q-next=NULL;p-next=q;p=q;}//录入字符串的函数returnhead;}voidoutput(structchain*head){structchain*p;p=head-next;while(p!=NULL){coutp-a;p=p-next;}}//输出链表中存储的字符串的函数