∪∩deniable Design

个人JAVA版GAE(google app engine),struts2+jpa+jQuery开发,互相交流 http://iunbug.appspot.com/
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

 

 

使用说明

    程序名为 NO3.exe.运行环境为DOS,执行后显示:

在"请输入你的选择后(1.2.3.4.5.6)"后输入数字选择执行的功能.

测试结果:

  1. 选择1.后输入:123456789

  2. 选择2后输入分别输入1,3.

    重复1)操作后选择2,分别输入10,10.

  3.  
  4. 重复1)操作后选择3.分别输入1,abcde

     

    再重复1)操作后选择3.分别输入9,abcde

 

 

 

 

 

 

  1.  
  2. 再重复1)操作后选择4,分别输入1,3

    再重复1)操作后选择4,分别输入0,3

    再重复1)操作后选择4,分别输入10,3

5) 再重复1)操作后选择5,分别输入1,abcde

再重复1)操作后选择5,分别输入9,abcde

再重复1)操作后选择5,分别输入0,abcde

再重复1)操作后选择5,分别输入10,abcde

6)运行No3.exe后选择6或输入非"1,2,3,4,5"的数字

 

调试过程:

  1. 本调试主要针对置换操作功能进行演示:
    1. 将光标移置String:: Replace(String t1,int pos)函数的第一条语句处Ctrl+F10开始调试
    2. 在DOS窗口中选择1后输入"123456789".接着选择5分别输入1,abcde.

      这时Debugger停留在String:: Replace(String t1,int pos)的第一条语句处:

    3. 在Watch窗口的名称栏分别输入: str, t1.str, q, out, pos, (-pos) +1, pos – size,j,i.进行观察.

    4. 按F10开始单步调试.
      1. 按F10三次后Debugger停留在最后一个判断语句处.同时Watch窗口中个名称的值分别为:

      2. 接着单步调试,for()函数完后,Debugger停留在" delete t1.str;"语句处.

        这时Watch窗口中个各名称的值分别为:

        接着两次F10,这时t1.str和out的值已经改变,Debugger停留在String:: Replace(String t1,int pos)的结束处.

      3. 再按一次F10,Debugger停留在main()函数的switch(k)里的case 5的if()语句处:

        F10到调用Display()函数的语句处后F11跟进Display()的内部.

        在Watch窗口的名称中输入str,I,len进行观察.

        单步调试到Display()函数结束,Debugger停留在Display()函结束处.

        在Watch窗口中str,I,len的值分别为:

        同时DOS窗口中显示如下:

    5. 按Shift+F5退出调试.完成调试操作.

     

     参考源码:

  2.  

      1Code:
      2//3.h
      3#include <iostream.h>
      4#include <string.h>
      5#include <stdlib.h>
      6//using namespace std;
      7int out;        // 定义一个全局变量
      8class String
      9
     10    public:
     11         String(){}
     12         ~String(){}
     13         String SubString(int pos,int num);        //取子串函数
     14         void Insert(String t,int pos);            //插入子串函数
     15         void Delete(int pos,int num);            //删除子串函数
     16         void Creat();                            //生成字符串函数
     17         void Display();                        //打印子串函数
     18         Replace(String t1,int pos);            //置换子串函数
     19      private:
     20         char *str;
     21         int size;
     22 }
    ;
     23
     24//3.cpp
     25#include "3.h"
     26 //生成新字符串函数
     27void String:: Creat()
     28 {
     29        char s[100];  
     30        cin>>s;
     31        size=strlen(s);
     32        str=new char[size + 1];
     33        if(str==0
     34            cout<<"没有申请到空间!"<<endl;
     35        strcpy( str, s);
     36        //strcpy_s(str,sizeof(str)/sizeof(str[0]),s);
     37        
     38 }

     39//输出
     40void String::Display()
     41
     42    int len = size;
     43    int i;
     44    for( i=0;i < size;i++ )  
     45      cout<<str[i];
     46    cout<<endl;
     47    cout<<"字符串的总长度为:"<<len<<endl;
     48}

     49//求子串
     50//void String String::SubString(int pos,int num)
     51String String::SubString(int pos,int num)
     52
     53    String temp;
     54    int left=size-pos + 1;//从pos位置开始所有余下的字符串长度
     55    char *p,*q;
     56    if( pos > size ) 
     57    {
     58        cout<<"错误!"<<endl;
     59        cout<<"指定位置超过字符串长度为:"<< pos - size<<endl;//提示所取子串的错误位置
     60        exit (1);//异常退出
     61    }

     62    else if( num > left ) 
     63        num = left;
     64    temp.str=new char[num+1];//重新分配内存空间
     65    if(temp.str==0)   
     66       cout<<"没有申请到空间!"<<endl;
     67    p=temp.str;
     68    for(int i = pos-1;i < pos+num-1;i++)
     69          {  
     70            q = &str[i];    
     71            *= *q;
     72            p++;
     73          }

     74    *p=0;
     75    temp.size = num;
     76    return temp;
     77}

     78
     79//插入运算:在串对象s的pos位置后插入一个串t
     80void String::Insert(String t,int pos)
     81{
     82    //String temp;
     83    int i_len = t.size;
     84    cout<<"插入字符串的长度为:"<<i_len<<endl;
     85
     86    char *q;
     87    q = new char( size + 1);
     88    strcpy(q,str);
     89
     90    delete str;
     91    str = new char( size + t.size + 1);        //字符串长度要在原长上增加插入串的长度
     92
     93
     94    strcpy(str,q);
     95
     96    //依次后移,空出长度为插入字符串的长度的空间
     97
     98    for(int j = size-1;j > pos-1;j--)        
     99    {
    100            int i = j + t.size;
    101            str[ i-- ] = str[ j ];
    102    }

    103
    104    j = pos;
    105    for(int i = 0;i < t.size;)
    106    {    
    107        str[j++= t.str[i++];
    108    }

    109
    110    size+=t.size;
    111    str[size + 1]='\0';
    112
    113}

    114
    115
    116//删除 :删除串中的一个子串
    117void  String:: Delete(int pos,int num)
    118
    119    //用ifelse if语句判断删除的位置是否越界
    120    if(pos <= 0)
    121    {
    122        cout<<"无法完成删除操作!"<<endl<<"删除位置低于字符串长度为:"<< (-pos) +1<<endl;
    123        exit (1);
    124    }

    125    else if( pos > size )
    126    {
    127        cout<<"无法完成删除操作!"<<endl<<"删除位置超过字符串长度为:"<< pos - size <<endl;
    128        exit (1);
    129    }

    130    else if(pos >= 0 && pos <= size )
    131    {
    132            int i = pos - 1;
    133            for(int j = (pos + num -1); j <= size ; j++//从删除到的位置开始前移
    134            {
    135                str[i] = str[j];
    136                i++;
    137            }

    138    }

    139    size = size-num;    //只取删除后余下的字符个数
    140}

    141
    142//置换:置换串中的一个子串
    143 String:: Replace(String t1,int pos)
    144
    145    //用ifelse if语句判断置换的位置是否越界
    146    if(pos <= 0)
    147    {    
    148        cout<<"无法完成转换操作!"<<endl<<"置换位置低于字符串长度为:"<<(-pos) +1 <<endl;
    149        exit (1);
    150    }

    151    else if(pos > size)
    152    {
    153        cout<<"无法完成置换操作!"<<endl<<"置换位置超过字符串长度为:"<< pos - size <<endl;
    154        exit (1);
    155    }

    156    
    157    //当置换的位置加上置换给的子串长度之和超过原字符串的长度时
    158    //在将不被置换的字符串长度的拷后追加新字符串的长度
    159    else if( (t1.size+pos) >size )
    160    {
    161                
    162        char *q;    //定义指针数组q用来转存原先将不被置换的字符串
    163        q = new char[ pos +1] ;    //给q分配足够的空间为将不被置换的字符串的长度
    164        forint i = 0;i < pos-1;i++ )
    165        {
    166            q[i] = str[i];
    167             
    168        }

    169    
    170        q[pos-1= '\0';
    171        delete []str;        //释放原字符串空间
    172        strcat(q,t1.str);    //通过strcat函数将输入的子串与原子串的拷贝
    173        cout<<"置换后的字符串为:   "<<q<<endl;
    174        return out = 0;
    175    }

    176
    177    else if( (t1.size+pos) <= size )
    178    {
    179        int j = pos - 1;
    180        for(int i = 0;i < t1.size;i++)
    181            str[j++= t1.str[i];
    182        delete t1.str;
    183        return out = 1;
    184    }

    185
    186    
    187}

    188//主函数
    189int main(int argc, char* argv[])
    190{  
    191    int pos,num,k; 
    192    String s,s1,s2,t,t1;
    193     do{  
    194        cout<<"\n\n    1.生成字符串"  ;
    195        cout<<"\n\n    2.取子串";
    196        cout<<"\n\n    3.插入子串s1";
    197        cout<<"\n\n    4.删除子串";
    198        cout<<"\n\n    5.置换子串";
    199        cout<<"\n\n    6.结束程序";
    200        cout<<"\n******************************** ";
    201        cout<<"\n    请输入你的选择(1,2,3,4,5,6)";  
    202        cin>>k;
    203    switch(k){
    204       case 1:{
    205               cout<<"请输入一个字符串:";
    206               s.Creat();
    207               cout<<"字符串为:       ";     
    208               s.Display();
    209              }
    break;
    210       case 2:
    211                cout<<"请输入子串的截取位置pos及子串长度num"<<endl;
    212                cin>>pos>>num;
    213                t = s.SubString(pos,num);
    214                cout<<"你所取的子串为:  "
    215                t.Display();
    216               }
    break;
    217       case 3:
    218                cout<<"请输入子串插入位置pos"<<endl;
    219                cin>>pos;
    220                cout<<"请输入要插入的子串:  ";  
    221                s1.Creat();
    222                s.Insert(s1,pos);
    223                cout<<"插入后的字符串为:   ";  
    224                s.Display();
    225              }
    break;
    226       case 4:
    227               cout<<"请输入要删除子串的开始位置pos及子串长度num"<<endl;
    228               cin>>pos>>num;
    229               s.Delete(pos,num);
    230               cout<<"删除后的字符串为:   ";
    231               s.Display();
    232             }
    break;
    233       case 5:
    234               cout<<"请输入子串置换位置pos"<<endl;
    235               cin>>pos;
    236               cout<<"请输入要置换的子串:  ";  
    237               s2.Creat();
    238               s.Replace(s2,pos);
    239               ifout != 0 )
    240               {
    241                   cout<<"置换后的字符串为:   ";  
    242                   s.Display();
    243               }

    244              }
    break;
    245     default:break;
    246  }
     //switch
    247     cout<<"\n--------------------------------- ";
    248}
    while(k>=1&&k<6);
    249  cout<<"\n          再见!";
    250  cout<<"\n     按任意键,返回。";
    251  return 0;
    252}

    253

     


只有注册用户登录后才能发表评论。


网站导航: