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

Skracanie wyrazu od wybranego znaku

Object Storage Arubacloud
0 głosów
907 wizyt
pytanie zadane 4 sierpnia 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

Zrobiłam zadanie z serwisu spoj, pt. "Flamaster". Jednak chciałabym zmienić w nim jedną rzecz. Teraz program skraca wyraz jeśli obok siebie występują min. 3 takie same litery. Natomiast ja chcę zrobić coś takiego, aby podawac do programu ilość znaków, tzn od kiedy ma zacząć skracać. Próbuję coś napisać, ale kompilator cały czas wyrzuca mi błąd. 

Oto kod:

#include <iostream>
#include <sstream>

using namespace std;

int obliczIloscWystapienWybranegoZnaku(string wyrazDoSkrocenia, int iloscZnakow)
{
    int iloscWystapien = 1;

    while (wyrazDoSkrocenia[iloscZnakow] == wyrazDoSkrocenia[iloscZnakow + 1])
    {
        iloscZnakow++;
        iloscWystapien++;
    }
    return iloscWystapien;
}

string konwersjaIntNaString (int liczba)
{
    ostringstream ss;
    ss << liczba;
    string str = ss.str();

    return str;
}

string skracanieWyrazow(string wyrazDoSkrocenia, int iloscZnakow)
{
    int dlugosc = wyrazDoSkrocenia.size();
    int iloscWystapien;
    char powtarzajacySieZnak;

    for(int i = 0; i < dlugosc; i++)
    {
        if(dlugosc > iloscZnakow)
        {
            iloscWystapien = obliczIloscWystapienWybranegoZnaku(wyrazDoSkrocenia, iloscZnakow);
            powtarzajacySieZnak = wyrazDoSkrocenia[iloscZnakow];
            wyrazDoSkrocenia.replace(powtarzajacySieZnak, iloscWystapien, wyrazDoSkrocenia[iloscZnakow] + konwersjaIntNaString(iloscWystapien));
            dlugosc = wyrazDoSkrocenia.size();
        }
    }
    return wyrazDoSkrocenia;

}

int main()
{
    string wyraz = "AAAAAAAAAA";
    int iloscZnakow = 0;
    int dlugosc;


    cin >> iloscZnakow;

     skracanieWyrazow(wyraz, iloscZnakow);

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 4 sierpnia 2019 przez mokrowski Mędrzec (155,460 p.)
Użyj algorytmu std::adjacend_find do znalezienia 1 iteratora elementu powtarzającego się i std::upper_bound do znalezienia pierwszego iteratora innego znaku. Poprzez std::distance(...), policzysz ilość wystąpień i podejmiesz decyzję czy wyprowadzić znaki.
0 głosów
odpowiedź 4 sierpnia 2019 przez j23 Mędrzec (194,920 p.)
edycja 4 sierpnia 2019 przez j23
std::string skracanieWyrazow(const std::string &wyrazDoSkrocenia, unsigned iloscZnakow)
{
	std::string resultString;
	auto i1 = wyrazDoSkrocenia.begin();
	auto i3 = wyrazDoSkrocenia.end();

	while (i1 != i3) {
		auto i2 = i1;
		while(i2 != i3 && *i2 == *i1) ++i2;
		auto n = std::distance(i1, i2);
		if (n < iloscZnakow) {
			resultString.append(i1, i2);
		}
		else {
			resultString += *i1;
			resultString += std::to_string(n);
		}

		i1 = i2;
	}

	return resultString;
}

 

komentarz 4 sierpnia 2019 przez magda_19 Gaduła (3,080 p.)
Czym są te i1, i3?
komentarz 4 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

Iteratorami. i1 wskazuje na początek tekstu, i3 - na koniec.

komentarz 4 sierpnia 2019 przez magda_19 Gaduła (3,080 p.)
Ok, już łapię. Dzięki!
komentarz 4 sierpnia 2019 przez niezalogowany

Expression: cannot dereference string iterator because it is out of range

komentarz 4 sierpnia 2019 przez magda_19 Gaduła (3,080 p.)
Mniej więcej taki błąd mi kompilator pokazuje
komentarz 4 sierpnia 2019 przez j23 Mędrzec (194,920 p.)
Poprawiłem 9 linię.

Podobne pytania

0 głosów
3 odpowiedzi 437 wizyt
pytanie zadane 10 sierpnia 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 270 wizyt
pytanie zadane 6 sierpnia 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 278 wizyt
pytanie zadane 17 stycznia 2021 w C# przez Szyszka Gaduła (3,490 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...