2016-11-01 15 views
0

パートA:ユーザーに文字列を入力させます。次に、文字列の最初の文字を表示し、次に最後の文字を表示し、次に2番目の文字を表示し、3番目の文字を表示します。文字列が "abcdef"の場合は、 afbecd(入力「ABCDEF」) 12345 - > 15243 123456] - > [162534再帰を使用してC++で文字列をアンマウントする

パートB:今、上記の文字列をunmash。 すなわち、162534 - > 123456

私はパートAを稼働させました。

#include <iostream> 
    using namespace std; 
    void mash(string s); 

    int main() 
    { 
    string sequence; 
    cout << "Enter a sequence: "; 
    getline(cin, sequence); 
    mash(sequence); 
    } 

    void mash(string s) 
    { 
    int a = s.length(); 

    if (a == 0) 
    { 
    return; 
    } 
    if (a == 1) 
    { 
    cout << s; 
    return; 
    } 

    cout << s[0]; 

    if(a>1) 
    { 
    cout << s[a - 1]; 
    s = s.substr(1,a-2); 
    mash(s); 
    } 
} 

が、私は、私は、私も位置に文字を印刷しようとすることができます推測部Bにアプローチする方法か見当もつかない、その後、私は私ができると思いますので、私は123を取得します、文字列162534で言います最後のものから最初のもの、すなわち456までの奇数の位置文字を印刷してみてください。これらの2つを組み合わせると元の文字列が得られますが、部分Bを解くために再帰を使う方法はありません。

+0

ヒント:unmash( "2534")とは何ですか、それはどのようにしてunmash( "162534")に関連しますか? – hobbs

+0

私は "2534"の文字列の最後に2番目の文字である5を移動したいと思いますし、6も "162534"で終了しますか? – Hugh

答えて

1

ここにありますヒント。したがって、unmash(string s)は最初に最初の文字s[0]を印刷し、次にunmash(s.substr(2, length - 2))、次にs[1]を出力する必要があります。もちろん、length <= 2がそれを別々に扱う必要があるかどうかを確認する必要もあります。

+0

「unmash(s.substr(2))」であってはなりませんか? – 0x499602D2

+0

@ 0x499602D2はい、私の悪いです。それを訂正した。 – grigor

+0

@grigorありがとうございました。私を助けてくれてありがとう。 n <= 2のケースを気にする必要があると思いますか?私は再帰がその部分を世話すると思うので。 – Hugh

0

私の答えは、私を助けたSOのメンバー全員のおかげです。

#include <iostream> 
using namespace std; 
void unmash(string s); 

int main() 
{ 
string sequence; 
cout << "Enter a sequence: "; 
getline(cin, sequence); 
unmash(sequence); 
} 

void unmash(string s) 
{ 
int a = s.length(); 

if (a == 0) 
{ 
return; 
} 

if (a == 1||a == 2) 
{ 
cout << s; 
return; 
} 

cout << s[0]; 

if(a>1) 
{   
    unmash(s.substr(2)); 
    cout << s[1]; 
} 
} 
関連する問題