2011-05-08 6 views
0

の出力AAごちゃ混ぜバージョンだろう、私はそれは文句を言わないコンパイル何らかの理由で何を間違った私は、文字列を入力することができます関数を作成したいし、それが文字列

を把握するように見える傾けると、それは上のtheresの問題を考えます私のjumbleString機能の問題はループ内で私を変えている

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <istream> 

using namespace std; 

int main() 
{ 
    int lengthofstring, x, countWords(string str), countConsonant(string str, int), consonant, jumbleString(string str); 
    string str, str2, wordone; 

    char options; 
    cout << "Please enter a word, a sentence, or a string of numbers." << endl; 

    getline(cin, str); 

    //cin >> str; 

    lengthofstring = str.length(); 
    str2=str; 

    bool another= true; 

    while (another) 
    { 
     cout << '\n' << "USE THIS MENU TO MANIPULATE YOUR STRING" << endl; 
     cout << "---------------------------------------" << endl; 
     cout << "1) Inverse String" << endl; 
     cout << "2) Reverse String" << endl; 
     cout << "3) To Uppercase" << endl; 
     cout << "4) Jumble String" << endl; 
     cout << "5) Count Number Words" << endl; 
     cout << "6) Count Consonants" << endl; 
     cout << "7) Enter a Different String" << endl; 
     cout << "8) Print the String" << endl; 
     cout << "Q) Quit" << endl; 

     cin >> options; 

     switch (options) 
     { 
     case '1': 
      for (x = 0; x < lengthofstring; x++) 
      { 
       if (islower(str[x])) 
        str[x] = toupper(str[x]); 
       else if (isupper(str[x])) 
        str[x] = tolower(str[x]); 

      } 
      cout<< str; 
      break; 
     case '2': 
      for (x = 0; x < lengthofstring; x++) 
      { 
       str2[x] = str[lengthofstring-1-x]; 
      } 
      cout<< str2; 
      break; 
     case '3': 
      { 
       for (x = 0; x < lengthofstring; x++) 
       { 
        if (islower(str[x])) 
         str[x] = toupper(str[x]); 
       } 
       cout<< str; 
      } 
      break; 
     case '4': 
      jumbleString(str); 
      break; 

     case '5': 
      cout << countWords(str); 
      break; 
     case '6': 
      consonant = 0; 
      cout<< countConsonant(str, consonant); 
      break; 
     case '7': 
      cout << "Please enter another word, a sentence, or a string of numbers." << endl; 
      cin.ignore(); 
      getline(cin, str); 
      cout << str <<endl; 
      break; 
     case '8': 
      cout<< str2; 
      break; 
     case 'q': 
      another = false; 
      break; 
     } 
    } 

    cin.get(); 
    cin.get(); 
    return 0; 
} 

void jumbleString(string str) 
{ 
    int length = str.length(); 
    int j, k; 

    for(int i = 0; i < length; j++) 
    { 
     k = rand() % length; 
     j = rand() % length; 
     char c = str[j]; 
     str[j] = str[k]; 
     str[k] = c; 
    } 

    cout << str<<endl; 
} 

int countWords(string str) 
{ 
    int length = str.length(); 
    int words = 1; 
    for(int size = 1; length > size; size++) 
    { 
     if (str[size] == ' ' && str[size-1] != ' ') 
      words++; 
    } 
    if (str[0] == ' ') 
     words--; 
    return words; 
} 
int countConsonant(string str, int consonant) 
{ 
    int length = str.length(); 
    consonant = 0; 

    for (int i = 0; i < length; i++) 
    { 
     if (str[i] != 'a' && str[i] != 'e' && str[i] != 'i' && 
      str[i] != 'o'&& str[i] != 'u' && str[i] != 'A' && str[i] != 'E' 
      && str[i] != 'I' && str[i] != 'O' && str[i] != 'U' && str[i] != ' '&& str[i] != '1' 
      && str[i] != '2' && str[i] != '3' && str[i] != '4' && str[i] != '5' && str[i] != '6' 
      && str[i] != '7' && str[i] != '8' && str[i] != '9' && str[i] != '0') 
      consonant = consonant + 1; 
    } 
    return consonant; 
} 
+0

'I =ランド()%の長さ;'。たぶんあなたは 'k = rand()%length;'を意味するでしょうか? – beduin

+1

ポール、実際の問題は何ですか?コンパイラエラーが出ますか?それともあなたが期待していることをしないのですか?どの入力?あなたは何を期待していますか? – Howard

+0

それはコンパイラエラー –

答えて

1

は(私はあなたがKを変更するためのもの推測):
あなたはKを設定することを意味しなかった場合、k = rand() % length;
i = rand() % length;を変更、あなたの質問がありますバリアント置換問題のうち、Fisher-Yatesが解ける。私はそれを見ることをお勧めします、あなたはおそらくそれを使用してより良い "ランダム性"を得るでしょう。

0

ループ変数としてiを使用していますが、同時にループ内でランダム値を割り当てます。

可能な解決策は、2つの無作為化を使用するのではなく、代わりに反復変数i自体を[online example]とすることです。

for(int i = 0; i < length; i++) 
{ 
    j = i + (rand() % (length-i)); 
    char c = str[j]; 
    str[j] = str[i]; 
    str[i] = c; 
} 
+0

この解決法もまた偏見があります:http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Implementation_errors – amit

+0

@amit Ups、それは速すぎました。コードを修正しました。 – Howard

+0

p.s.あなたがフィッシャー・イェイツ(あなたの固定アルゴリズム)と比較してナイーブな方法が偏っている方法についてあなたが知っているなら、見てください:http://stackoverflow.com/questions/5131341/what-distribution-do-youget-from-this -broken-random-shuffle私は非常にintrestingそれを見つけた。 – amit

0

あなたは2つのランダムなインデックスにi、jを使用していますが、これらはj、kでなければなりません。

それはする必要があります:あなたが誤って私は二度ここで、ループ変数を使用している

j = rand() % length; 
k = rand() % length; 
+0

iveこれらの変更を加えたにもかかわらずまだ問題がある:/ –

+0

@paul kee問題が何であるか教えていただけますか? – Howard

+0

私はそれが私の主な悪い投稿の問題だと思うそれは –

1

。また、本当に乱数の混乱を望む場合は、乱数ジェネレータをシードすることもできます。 ++あなたは次のようにこれを行うには標準的なアルゴリズムを使用することができ、Cでこれを行うための慣用的な方法については

#include <iostream> 
#include <algorithm> 
#include <ctime> 
#include <cstdlib> 

int main(void){ 
     srand (unsigned (time (NULL)));//seed the random shuffle 

     std::string test = "abcdef"; 
     std::cout << "original string: " << test << std::endl; 
     std::random_shuffle(test.begin(),test.end()); 
     std::cout << "shuffled string: " << test << std::endl; 
     return 0; 
} 
関連する問題