• 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#

VPS Starter Arubacloud
0 głosów
382 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 Ekspert (348,220 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 Ekspert (348,220 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 (255,440 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ź 513 wizyt
0 głosów
0 odpowiedzi 711 wizyt
0 głosów
2 odpowiedzi 888 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)

92,845 zapytań

141,786 odpowiedzi

320,861 komentarzy

62,178 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 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...