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

0 głosów
672 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 (354,880 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 (354,880 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ź 662 wizyt
0 głosów
0 odpowiedzi 952 wizyt
0 głosów
2 odpowiedzi 1,231 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2713p. - rucin93
  6. 2579p. - Łukasz Eckert
  7. 2529p. - Adrian Wieprzkowicz
  8. 2459p. - CC PL
  9. 2184p. - Maurycy W
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...