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

Object Storage Arubacloud
0 głosów
314 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 (345,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 (345,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 (254,480 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ź 503 wizyt
0 głosów
0 odpowiedzi 616 wizyt
0 głosów
2 odpowiedzi 801 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...