• 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
363 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 (346,900 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 (346,900 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 (254,880 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ź 507 wizyt
0 głosów
0 odpowiedzi 658 wizyt
0 głosów
2 odpowiedzi 854 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)

92,770 zapytań

141,695 odpowiedzi

320,518 komentarzy

62,107 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...