2011-05-08 2 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을 사용하고 있지만 동시에 루프 내에서 임의 값을 지정합니다.

가능한 해결책은 임의의 두 무질서를 사용하지 않고 대신에 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 -brroken-random-shuffle 나는 매우 intresting 그것을 발견했다. – amit

0

두 개의 임의 색인에 대해 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; 
} 
관련 문제