2013-10-21 1 views
1

Visual C# windows 폼 프로그램으로 프로그램을 개발 중입니다. 텍스트 상자의 문자 수를 알아 내고 각 문자의 빈도를 목록 상자에 표시해야합니다. 우리는하지 않습니다 또한 출력으로, 각 캐릭터와 의 주파수가 반복되는 문자 및 공백, 나는 프로그램이 제공하는 "주파수 확인"버튼을 클릭하여이 코드에서시각적 인 C# 윈도우에서 문자의 빈도가 응용 프로그램을 형성합니다

private void btnCheckFrequency_Click(object sender, EventArgs e) 
{ 
    lstFreqMeter.Items.Clear(); 

    string str; 
    int c = 1; 
    int strlen; 

    str = txtString.Text; 

    strlen = txtString.TextLength; 

    int[] counter = new int[strlen]; 

    for (int i = 0; i < strlen; i++) 
    { 
     for (int j = i + 1; j < strlen; j++) 
     { 
      if (str[i] == str[j]) 
      { 
       c += 1; 

      } 
     } 
     counter[i] = c; 
     c = 1; 
    } 
    for (int k = 0; k < counter.Length; k++) 
    { 
     lstFreqMeter.Items.Add(counter[k]); 
    } 
} 

: 나는 다음과 같은 코드가 있습니다 필요.

+0

당신에게 각 문자가 나타납니다 횟수의 클래스를 반환은 txtString.Text.GroupBy'같은 것을보십시오 (X => – nawfal

답변

1

stringCount을 사용하면 문자열의 문자 수를 얻을 수 있습니다.

각 문자의 빈도를 알아 내면 문자열을 반복하고 정수를 증가시킬 수 있습니다. 사전 (키/값 목록)은이 데이터를 보관하는 데 훌륭한 데이터 형식입니다.

const string textString = "aaabbbcccaaattteeevvvooo"; 
    var numberOfChars = textString.Count(); 

    var dictionary = new Dictionary<char,int>(); 
    foreach (var letter in textString) 
    { 
     if (dictionary.ContainsKey(letter)) 
      dictionary[letter]++; 
     else 
      dictionary[letter] = 1; 
    } 

사전에는 키 (문자)와 값 (개수)이 포함됩니다.

+0

'Dictionary.Add (K, V)'를 잊어 버렸기 때문에 런타임 예외가 생길 수 있습니다. (예 : x => new {chara = x.Key, frequency = x.Count()}) – Charleh

+0

.net 4.5에서 실행했습니다. 그것은 좋을 것입니다. 어느 선에서 예외를 얻고 있습니까? –

+2

@Charleh 사전의 인덱서 작성자는 항목이없는 경우 항목을 추가하고 항목이있는 경우 항목을 대체합니다. 이 대답은 그대로 서 있습니다. – Servy

2

이 작업을 수행하는 데 3 개의 루프가 잘못 처리됩니다. 나는 당신이 너무 복잡하게하려고 노력하고 있다고 생각합니다.

숙제에 대한 질문에 답을 얻지 못했지만, 방향에 관한 몇 가지 힌트가 도움이 될 것입니다.

  • Dictionary<char, int>
  • 만들기 단 하나의 루프를 선언합니다. 문자열에있는 각 문자에 대해.
  • 루프 내부에 결과로 Dictionary<char, int>을 채 웁니다.
  • 사전에 char이 있으면 int를 int ++로 설정하고 그렇지 않으면 int를 1로하여 사전에 char을 추가합니다.
  • lstFreqMeter.Items에 AddRange를 지정합니다.
+0

코드 –

+0

을 제발 내게 주실 수 있습니까? 코드를 제공하면 어떻게하면 더 나은 프로그래머가 될 수 있습니까?그것이 그렇듯이, 나는 당신을 위해 실제적으로 의사 코드를했습니다. – paqogomez

1

일치하는 문자의 사전을 유지하고 일치하는 각 문자 수를 증가시킵니다. 이 같은

Dictionary<char, int> count = new Dictionary<char,int>(); 
string str = textString.Text; 
int len = str.Length; 
for(int i = 0; i < len; i ++) 
{ 
    if (str[i] == ' ') continue; 
    if (count.ContainsKey(str[i])) 
    { 
     count[str[i]] += 1; 
    } else { 
     count.Add(str[i], 1); 
    } 
} 

foreach(char key in count.Keys) 
{ 
    Console.WriteLine("{0} : {1}", key, count[key]); 
} 
+0

답장을 보내 주셔서 감사합니다 .... "kkhank"라는 문자열을 입력하면 출력이 표시됩니다. k = 1, h = 1, a = 1, n = 1 .............. k = 3을 표시하는 대신 –

+0

시도해보십시오. 증분 카운터를 수정했습니다. – Kami

1

시도 뭔가 :

var letters = Enumerable.Range('A', 26).Select(i => (char)i); 
var sourceChars = letters.Concat(myString.ToUpperInvariant()); 
var results = from c in sourceChars 
         group c by c into g 
         where char.IsLetter(g.Key) 
         orderby g.Key 
         select new { Char = g.Key, Count = g.Count() - 1 }; 

foreach (var result in results) 
{ 
    Console.WriteLine("There are {0} {1}'s.", result.Count, result.Char); 
} 

이것은 myString

+0

답변 주셔서 감사 합니다만 컴파일러가 ".ToUpperInvariant()"함수를 감지하지 못합니다. –

+0

@MuzamilAbbas - 합법적 인 함수입니다. 문서는 [여기에 있습니다] (http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant (v = vs.110) .aspx). 철자가 틀리지 않았는지 다시 확인하십시오. 여전히 작동하지 않는다면, ToUpper (CultureInfo.InvariantCulture)로 바꾸십시오. – Icemanind

+0

첫 번째 줄은 무엇입니까? –

관련 문제