• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Występowanie poszczególnych znaków w łańcuchu znaków C#

Aruba Cloud - Virtual Private Server VPS
0 głosów
522 wizyt
pytanie zadane 20 grudnia 2022 w C# przez JoannS Początkujący (250 p.)

Cześć,

Mam zadanie:

Napisz program analizujący częstość występowania poszczególnych znaków w łańcuchu znaków wprowadzonym przez użytkownika. Np. dla wprowadzonego tekstu "abrakadabra" program powinien wyświetlić informacje: a-5, b-2, r-2, k-1, d-1.

Poniżej mój kod. Mogłabym prosić o sprawdzenie, gdzie jest błąd, że nie działa?

Z góry dziękuję za pomoc :)

static void Main(string[] args)
        {
            Console.WriteLine("Please write text");
            string text = Console.ReadLine();
            int position, start = 0;
            int count = 0; int sum = 0;
            for  (int i =0; i < text.Length; i++)
            {
                while ((position = text.IndexOf(text[i], start)) >= 0);
                {
                    start = position + 1;
                    count++;
                }
                Console.WriteLine(text[i] + "-{0}", count);
            }
            Console.ReadKey();
        }

 

komentarz 20 grudnia 2022 przez adrian17 Mentor (352,580 p.)

Mogłabym prosić o sprawdzenie, gdzie jest błąd, że nie działa?

Rzuć okiem na ostrzeżenia które VS pokazuje - z tego co widzę, to on już Ciebie ostrzegł co jest nie tak, więc może przypadkiem tego nie przeczytałaś :)

komentarz 20 grudnia 2022 przez JoannS Początkujący (250 p.)
Ok, faktycznie. Usunęłam już niepotrzebny średnik i zmienną, problem w tym, że ciągle nie pokazuje ilości danych liter wprowadzonego wyrazu.
komentarz 20 grudnia 2022 przez adrian17 Mentor (352,580 p.)
Domyślam się że problem w tym, że zmienną `start` i `count` powinnaś ustawiać na 0 od nowa za każdym razem przed rozpoczęciem tej wewnętrznej pętli.

2 odpowiedzi

0 głosów
odpowiedź 20 grudnia 2022 przez BoskiWezyr Nowicjusz (140 p.)

Spróbuj tego, działa wyśmienicie...

static void Main(string[] args)
        {
            Dictionary<char, int> result = new Dictionary<char, int>();
            Console.WriteLine("Please write text");
            string text = Console.ReadLine();
            for (int i = 0; i < text.Length; i++)
            {
                char letter = text[i];
                if (result.ContainsKey(letter))
                    continue;
                else
                {
                    int count = 0;
                    for (int j = i; j < text.Length; j++)
                    {
                        if (text[j] == letter)
                            count++;
                    }
                    result.Add(letter, count);
                }
            }
            if (result.Count > 0)
            {
                KeyValuePair<char, int> lastElement = result.Last();
                foreach (KeyValuePair<char, int> pair in result)
                {
                    if (pair.Equals(lastElement))
                        Console.Write("{0}-{1}.", pair.Key, pair.Value);
                    else
                        Console.Write("{0}-{1}, ", pair.Key, pair.Value);
                }
            }
            Console.ReadKey();
        }

 

0 głosów
odpowiedź 21 grudnia 2022 przez VBService Ekspert (256,600 p.)
edycja 21 grudnia 2022 przez VBService

Proponuję nieco zmodyfikować Twój kod, do sprawdzenia ile razy występuje dany znak użyć Enumerable.Count

int count = Enumerable.Count(text, c => c == text[i]);

a do sprawdzenia czy dany znak już "był liczony", użyć listę np.

List<char> letter_checked = new List<char>();

 

całość

[ on-line ]


using System;
using System.Collections.Generic;
using System.Linq;

class HelloCharCounter {
    static void Main(string[] args) {
        Console.WriteLine("Please write text");
        string text = (Console.ReadLine()).Trim();
        
        List<char> letter_checked = new List<char>();
        for (int i=0; i<text.Length; i++)
            if (! letter_checked.Contains(text[i])) {
                int count = Enumerable.Count(text, c => c == text[i]);
                Console.WriteLine("{0}-{1}", text[i], count);
                letter_checked.Add(text[i]);
            }
        
        Console.ReadKey();
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 584 wizyt
0 głosów
0 odpowiedzi 898 wizyt
0 głosów
2 odpowiedzi 1,069 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)

93,327 zapytań

142,323 odpowiedzi

322,397 komentarzy

62,658 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...