2014-04-09 2 views
1

내 문제에서 알 수 있듯이 C#을 처음 접했습니다. 나는 기초를 배우기 위해 "Røverspråk"번역기를 만들고있다. "Røverspråk"은 Pig Latin과 같습니다. 자음 + o + 자음과 모든 자음을 교환하는 규칙이 있습니다. 지금까지 그렇게 좋았고 그 부분은 효과가 있습니다. 내 문제는 내가 다시 번역하려고 할 때 온다.for 루프 복제본 출력

"totimom"은 "tim"을 반환하지만 대신 "ttttttttttttttttttttttttttttttttttttttiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiimmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"을 반환합니다. 그래서 그것은 모든 편지를 38 번 반환합니다 - 나는 konsonant-string (norwegian konsonants)에있는 것과 같은 금액을 사용합니다.

문자열 kons = "BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz";

왜 모든 것이 38 번 반환됩니까? 제가 말할 수있는 한, for 루프는 번역가처럼 분리되어 있습니다. 나에게 문제를 제공하는 코드 : 작동

public void OversettTilbake(string vok, string kons) 
    { 
     string nyText = textBox2.Text.ToString().ToLower(); 

     for (int e = 0; e < nyText.Length; e++) 
     { 
      for (int f = 0; f < kons.Length; f++) 
      { 
       if (nyText[e] == kons[f]) 
       { 
        newText2.Add(nyText[e].ToString()); 
        e = e + 2; 
       } 

      } 
      for (int g = 0; g < kons.Length; g++) 
      { 
       if (nyText[e] != kons[g]) 
       { 
        newText2.Add(nyText[e].ToString()); 
       } 
      } 

     } 
    } 

번역자 :

public int Oversetter(string text, string vok, string kons) 
    { 
     int Count = 0; 
     char tom = ' '; 

     for (int e = 0; e < text.Length; e++) 
     { 
      for (int i = 0; i < kons.Length; i++) 
      { 
       if (text[e] == kons[i]) 
       { 
        newText.Add((text[e]).ToString() + "o" + (text[e]).ToString().ToLower()); 
        Count = Count + 1; 
       } 

      } 
      for (int i = 0; i < vok.Length; i++) 
      { 
       if (text[e] == vok[i]) 
       { 

        newText.Add((text[e]).ToString()); 
        Count = Count + 1; 
       } 
      } 
      if (text[e] == tom) 
      { 
       newText.Add(text[e].ToString() + (text[e].ToString())); 
      } 
      for (int i = 0; i < tegn.Length; i++) 
      { 
       if (text[e] == tegn[i]) 
       { 
        newText.Add((text[e]).ToString()); 
       } 
      } 

     } 

     return Count; 
    } 

편집 : 여기에 모든 환상적인 입력 주셔서 감사합니다. 필자는 정말 많이 배웠습니다. @cahinton에서이 솔루션은 완벽하게 작동하는 것, 그리고 하드에 그런게 나를 이해하고 구현하기 :

for(var e = 0; e < nyText.Length; e += 1) { 
newText2.Add(nyText[e].ToString); 
if(kons.Contains(nyText[e])) { 
    e += 2; 
} 

}

EDIT2을 : 나는 여기에 찬성 투표 할 수있는 nesessary 명성이 없습니다. 하지만 100 만 번 감사드립니다! 나는 다음 주에 한 두 가지 답변을 얻을 것으로 예상했기 때문에 여기에 커뮤니티에 압도당한 메신저를 말해야합니다. 다시 한 번 감사드립니다!

+1

, * 결코 *, ** NEVER * * 'for' 루프 내에서 루프를 변경 가능하게 변경하십시오! 대신 while 루프를 사용하십시오. –

+0

@ThorstenDittmar 결코? 다음 요소를 건너 뛰려면 어떻게해야합니까? 나는 이제 부울을 추가로 필요로한다. – Gusdor

+0

안녕하세요! 빠른 답장을 보내 주셔서 감사합니다. 그래도 그것에 대해 자세히 설명해 주시겠습니까? – DyreVaa

답변

3

을보십시오. 일치하지 않는 모든 자음의 경우 대상 문자열에보고있는 문자를 추가하고 있습니다. 코드는 다음과 같이 간단하게 할 수있다 :

for(var e = 0; e < nyText.Length; e += 1) { 
    newText2.Add(nyText[e].ToString()); 
    if(kons.Contains(nyText[e])) { 
     e += 2; 
    } 
} 

당신은 문자의 HashSetString에서 변경 kons으로 Contains 조회 성능을 향상시킬 수 있습니다 : 절대

HashSet<char> kons = new HashSet<char>() {'B', 'C', 'D', /* etc... */ }; 
+0

이것은 절대적으로 완벽하게 작동합니다! 그리고 이해하기가 복잡하지 않아야합니다. 나는 이것을 일찍 시도했지만 hadnt는 건너 뛰기 2를 아직 깨달았다. 유감스럽게도 나는 upvote에 대한 명성을 얻지 못했지만 내 감사를드립니다! – DyreVaa

1

문제는 "g"루프입니다. 거의 모든 자음에 대해 불일치가 발생합니다.

"f"루프를 수정하여 "found"부울을 "true"(루프 앞에 "false"로 초기화)로 설정하십시오. 자음이 발견되지 않으면 모음 (또는 다른 성격)이므로 추가 할 수 있습니다 (한 번!).

편집

int e = 0; 
while (e < nyText.Length) // changed 'for' into 'while' 
{ 
    bool found = false; 
    for (int f = 0; f < kons.Length; f++) 
    { 
     if (nyText[e] == kons[f]) 
     { 
      newText2.Add(nyText[e].ToString()); 
      e = e + 3; 
      found = true; 
      break; // break out of the 'for' loop: no need to test further after a match 
     } 
    } 

    // no need for an extra 'mismatch-loop' 
    if (!found) 
    { 
     newText2.Add(nyText[e].ToString()); 
     e = e + 1; 
    } 
} 
+0

답장을 보내 주셔서 감사합니다! 여기에 귀하의 의견이 무엇인지에 대한 기본 사항이 있지만, 실제로 제 코드에 구현할 수는 없습니다. 좀 더 힌트를 좀 주시겠습니까? – DyreVaa

0

다음 코드 작품과 당신이 IndexOf을 사용하여 문자열 내에서 검색 할 수 있습니다로도 오직 하나 개의 루프를 필요로한다. 또한 자음 배열에 대문자와 소문자가 모두 포함되어 정의되었으므로 입력을 소문자로 변환 할 이유가 없습니다. 셋째, 메서드 내에서 TextBox을 사용하는 대신 매개 변수로 변환 할 문자열을 전달해야합니다. 규칙이 자음 하나를 3 글자로 대체되는 것을 그대로

static string kons = "BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz"; 

public static string OversettTilbake(string nyText) 
{ 
    int stringIndex = 0; 

    string result = String.Empty; 
    while (stringIndex < nyText.Length) 
    { 
     result += nyText[stringIndex]; 
     if (kons.IndexOf(nyText[stringIndex]) > -1) 
     { 
      stringIndex += 3; 
     } 
     else 
     { 
      stringIndex++; 
     } 
    } 

    return result; 
} 

전화 같은

Console.WriteLine(OversettTilbake("Totimom")); 

사실, 당신의 코드는 하나 개의 루프를 사용에 간단하게 쉬웠다. 자음을 만나고 결과에 추가하고 두 글자를 건너 뛸 때마다해야 할 일은 모두 있습니다. 그게 전부 야.

Text은 이미 문자열이므로 ToStringTextBox.Text으로 전화하면 불필요합니다.

+0

입력 해 주셔서 감사합니다. ToLower를 사용하는 이유는 대문자를 입력 할 때 프로그램이 다운되는 것이었기 때문입니다. 그들이 kons 배열에서 대표 한 이후로, 왜 그런지 알지 못합니다. 모든 조언에 다시 한 번 감사드립니다. 나는 그런 문자열을 세계적으로 만들 수 있는지 몰랐다. – DyreVaa

0
var newText2 = new StringBuilder(); 
string nyText = "totesostot1"; 
const string kons = "BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz"; 

// Loop through each leter 
for (int e = 0; e < nyText.Length; e++) 
{ 
    // Print the letter 
    newText2.Append(nyText[e].ToString(CultureInfo.InvariantCulture)); 

    // If the letter exists in kons, skip the next 2 letters 
    if (kons.Any(t => nyText[e] == t)) 
    { 
     e = e + 2; 
    } 
} 

Console.WriteLine(newText2); 

테스트 결과가 출력됩니다.

+0

대단한 것 같습니다. 고맙습니다. 그 순간에 나의 기술과 지식을 훨씬 넘어서서, 나는 이해할 수있는 것을 구현하려고 노력하고 있습니다. – DyreVaa

+0

@ user3515529 기본적으로'kons.Any (...)'구조는'kons.IndexOf (...)> -1'과 같습니다. "kons"에'nyText [e]'와 같은 문자't'가 있는지 검색합니다. –

+0

아! 내가 참조. 정리 해줘서 고마워! 아쉽게도 내 다음 번역가 프로젝트 전에 이것을 이해하려고 노력하십시오. – DyreVaa

1

때문에 당신의 g 루프의 모든 중복을 받고이

public string OversettTilbake(string kons) 
{ 
    string nyText = textBox2.Text.ToString().ToLower(); 

    for (int f = 0; f < kons.Length; f++) 
    nyText = nyText.Replace((kons[f] + "o" + kons[f]), kons[f].ToString()); 

    return nyText; 
} 
+1

+1 Hehe, 이제 * 우아합니다. 많은 문자열 복사에도 불구하고 :-) –

+0

@ThorstenDittmar 고마워요. 모두 제가 생각하기에, 당신이 번역에서'bob '을'bob'으로 대체 한 이후로, 왜 번역하지 않고'bob '을'b'로 바꾸지 않는 것이 좋았던 것입니다. –

+0

고마워요! 이것은 매우 멋져 보인다. 필자는 List에서 replace를 사용하여 같은 것을 시도했지만 배열 크기 때문에 오류가 발생했습니다. 나는 String으로 대체 할 수 있는지 몰랐다. – DyreVaa