ro kh Ответов: 4

подсчет встречаемости букв в программе C#


Я написал эту программу на c#, но она не работает, и я не знаю, какую часть я сделал неправильно. Программа должна была возвращать количество раз каждую букву алфавита occurs.it работает, но не с правильным ответом.пожалуйста, помогите мне через это.


namespace letterss
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int count = 0;
            char c = 'A';
            int m = (int)c;
            char[] s = new char[50];
            string t = textBox1.Text;
            for (int j = 0; j < t.Length; j++)
                s[j] = t[j];


            for (int n = 0; n < 25; n++)
            {
                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] == c)
                        count++;


                }
                label1.Text = "Letter" + c + " occured " + count.ToString() + " times";


                int l = (int)c + n;
                c = (char)l;
            }
        }
    }
}


[Правка: код C# ]

4 Ответов

Рейтинг:
29

Wonde Tadesse

Вот рабочее консольное приложение.

class Program
    {
        static void Main(string[] args)
        {
            string inPutString = "CodeProject Quick Answers";
            char letterToBeChecked = 'e';
            var result = GetLetterOccurence(inPutString, letterToBeChecked);
            Console.WriteLine(" The occurence of letter '{0}' from the string {1} is {2}", 
                letterToBeChecked, 
                inPutString, 
                result);
            Console.WriteLine("\nPress any key to exit");
            Console.ReadLine();
        }

        /// <summary>
        /// Get the number of occurence of letter
        /// </summary>
        /// <param name="inPutString">InputString value</param>
        /// <param name="letterToBeChecked">LetterToBeChecked value</param>
        /// <returns></returns>
        private static int GetLetterOccurence(string inPutString, char letterToBeChecked)
        {
            char[] chars = inPutString.ToArray();  // Get the Characters(letters) from string

            var result = (from c in chars
                          where c.Equals(letterToBeChecked)
                          select c).Count();
            return result;
        }
    }


Выход будет таким

The occurence of letter 'e' from the string CodeProject Quick Answers is 3

Удачи.


Andy411

Мне нравится это решение, потому что вы использовали Linq :-)

Wonde Tadesse

Спасибо

gggustafson

Мне не нравится это решение, потому что оно использовало Linq!

Wonde Tadesse

Спасибо.

VJ Reddy

Хороший ответ. 5!

Wonde Tadesse

Спасибо

Рейтинг:
1

lukeer

Вы хотите искать номер каждой буквы, а не одну в частности. Обработайте входные данные только один раз, как это:

void RespondToUserAction()
{
    Dictionary<char, int> histogram = Histogramify(TextBox1.Text);

    foreach (char oneChar in histogram.Keys)
    {
        TextBox2.AppendText(
            Environment.NewLine + oneChar + "\t: " + histogram[oneChar].ToString() + "x"
        );
    }
}

Dictionary<char,int> Histogramify(string input)
{
    Dictionary<char, int> histogram = new Dictionary<char, int>();

    foreach (char oneChar in input)
    {
        if (histogram.Keys.Contains(oneChar))
        {
            histogram[oneChar]++;
        }
        else
        {
            histogram.Add(oneChar, 1);
        }
    }

    return (histogram);
}
(это непроверено)


Richard MacCutchan

Пожалуйста, не тратьте время на публикацию ответов на такие старые вопросы, как этот.

Рейтинг:
0

Andy411

Вы дважды ищете "а"

for (int n = 0; n < 25; n++)
{
    for (int i = 0; i < s.Length; i++)
    {
       if (s[i] == c)
          count++;


    }
    label1.Text = "Letter" + c + " occured " + count.ToString() + " times";


    int l = (int)c + n; // in first round you will add 0, 
                        // so you are searching for 'A' again. And you will 
                        // never search for 'Z'
    c = (char)l;
}



char[] s = new char[50];
string t = textBox1.Text;
for (int j = 0; j < t.Length; j++) // why are you coping here? it will crash if t.Length > 50
   s[j] = t[j];



Попробуйте что-нибудь вроде этого:

static int foo(string source, char charToCount)
{
    int occurences = 0;

    for (int i = 0; i < source.Length; i++)
    {
        if (source[i] == charToCount)
            occurences++;
    }

    return occurences;
}


Это как решение 1 Без Linq
Недостатком обоих решений является то, что вам приходится разбирать всю строку для каждой буквы.


Wonde Tadesse

5+

Andy411

И тебе спасибо :)

Рейтинг:
0

Not Active

"Это работает, но не с правильным ответом" я бы сказал, что функция не работает в этом случае.

Вот вам подсказка. Что делать, если текст написан строчными буквами?

У вас также возникнут проблемы, если текст будет длиннее 50 символов. Также нет необходимости создавать массив символов из строки, так как строка уже является массивом символов.