2016-10-30 134 views
-3

我有要求我做下面的任務分配: 「有一個用戶輸入一個字符串,然後如下顯示這個字符串搗毀了:在字符串中顯示的第一個字符,那麼最後,那麼第二個,則倒數第二,然後第三個......所以,如果字符串爲「ABCDEF」,它會顯示: afbecd(輸入「ABCDEF」)」 這裏是我的方法,但它並沒有跑。我有段錯誤11字符串醪(遞歸)C++

#include <iostream> 
#include <cmath> 
using namespace std; 

void printLetters(string s); 

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

void printLetters(string s) 
{ 
    int a = floor(s.length()/2.0); 
    // stopping case 
    if(s == "") 
    { 
    return; 
    } 

    // reduce problem 
    printLetters(s.substr(0)); 
    //cout << s[0]; 
    cout << s[a]; 
} 

這裏是一個〔實施例:12345。在我的功能printLetters(字符串s),我打印出字符串從索引0開始,然後我有充分的字符串12345之後,我「cout」索引s.length()/ 2處的內容,它是中間字符「3」。然後回到串並保持打印出的子索引0開始再次但是這一次,它是1245我不斷重複這些步驟,直到我得到1.在講座中,當遞歸到達的結束我的教授解釋過程中,它會從底部返回到頂部。然後當我達到1時,它會回到5,2,3,4。所以我假設我會打印出字符串「15234」,但我沒有。如果您有任何想法,我會很樂意傾聽。非常感謝!

這裏是其用於反轉的字符串另一代碼。我的教授在課堂上解釋說,這是他在代碼背後給出的邏輯。所有的

#include <iostream> 
    using namespace std; 
    void printString(string s); 
    int main() 
    { 
    printString("hello"); 
    return 0; 
    } 
    void printString(string s) 
    { 
     if(s == "") 
     { 
     return; 
     } 
     printString(s.substr(1)); 
     cout << s[0]; 
    } 
+0

'地板(s.length()/ 2.0)'更好寫作's.length()/ 2'。 – melpomene

+0

你是什麼意思,「*這一次,它是1245 *」。 's.substr(0)'又是's',即'12345'。 – melpomene

+0

嘗試先使用調試器... – Jepessen

回答

-1

試試這個

#include <iostream> 
#include <string> 
using namespace std; 

void printLetters(string s); 

int main() 
{ 
string sequence; 
cout << "Enter a sequence: "; 
getline(cin, sequence); 
printLetters(sequence); 
cout << endl; 
system("pause"); 
} 

void printLetters(string s) 
{ 
int a =s.length(); 
if (a == 0) 
{ 
    return; 
} 
cout << s[0]; 
if(a>1) 
cout<< s[a - 1]; 
s.erase(0, 1); 
a = s.length(); 
if(a>1) 
s.erase(a-1); 
printLetters(s); 
} 

太謝謝你了。它完美的作品。你認爲我們需要系統嗎(「暫停」)?因爲我沒有在代碼中包含它,它仍然運行。我完全理解你的代碼背後的邏輯。非常感謝。

+0

不,它不是強制性的。這取決於你使用的編譯器。 – suleman

-1

首先,你必須包含字符串庫

#include <string> 

感謝。對不起,我不能評論。