witam. jakiej funkcji powinienem użyć aby zmienić w wyrazie powtarzające się litery na inne? domyślam się ze chodzi o string ale nie wiem jak zadeklarować całość
nie wiem czy dobrze wytłumaczyłem. chodzi o to aby np. w wyrazie OSOBA zamienic litery tak aby z wyrazu OSOBA powstał wyraz OSPBA. chodzi o to aby druga powtarzająca się litera była przesuwana w alfabecie o 1 do przodu
Tablice
For
Char
I ew. to też możesz sobie obejrzeć Rzutowanie żeby łatwo dodawać 1 do znaku i automatycznie uzyskać literę o 1 większą. Uważaj na literę 'z', 'Z' oraz znaki interpunkcje i inne.
Jeżeli mowa o C++ to możemy skorzystać z kilku rzeczy, które ułatwią nam zadanie.
Musimy w jakiś sposób oznaczyć elementy, które wystąpiły przynajmniej raz - i do tego świetnie nadaje nam się struktura set
(bądź od C++11, unordered_set
). Z nią nasz algorytm będzie bardzo prosty. Dla każdego znaku (jeżeli chcemy jedynie zmodyfikować w miejscu nasz string to możemy użyć "nowego" fora, biorąc referencję do znaku) próbujemy umieścić go w secie za pomocą metody insert
. Wynikiem będzie std::pair<..., bool>
, gdzie ten bool
oznacza czy element udało się dodać. Jeżeli nie, czyli element jest już w kolekcji - czyli wystąpił już wcześniej - to modyfikujemy nasz znak.
mogę prosić o cala linijke tego kodu ? dopiero zaczynam prace z c++ i ciężko mi jeszcze zrozumieć jezyk programistyczny
i tak tego nie zajarzysz więc proszę
#include <iostream>
#include <string>
#include <set>
int main()
{
std::string s = "SST";
std::set<char> uniques;
for(auto it = std::begin(s), itend = std::end(s) ; it != itend ; ++it) {
auto& ch = *it;
if(uniques.find(ch) != std::end(uniques)) {
if(ch == 'Z') {
ch = 'A';
} else if(ch == 'z') {
ch = 'a';
} else {
++ch;
}
} else {
uniques.insert(ch);
}
}
std::cout << s;
return 0;
}
w linijce for..... wyrzuca mi błąd. pracuje na c++ 4.9.9.2
cezarx napisał(a):
w linijce for..... wyrzuca mi błąd. pracuje na c++ 4.9.9.2
Wyrzuć ten syf i zainstaluj coś porządnego, najlepiej to http://www.microsoft.com/en-us/download/details.aspx?id=40787
@gośćabc: można to trochę uprościć :).
unordered_set<char> chars;
for (char &c : word) {
if (!chars.insert(c).second) {
// zmodyfikuj c
}
}
w nowszej wersji C++ tez wyrzuca błąd
Dodaj do kompilatora opcję -std=c++11
gdzie to zrobić??
cezarx napisał(a):
gdzie to zrobić??
W wierszu polecenia odpalenia kompilatora lub w opcjach IDE.
Zastanów się nad prostszym rozwiązaniem:
char tb[]="OSOBA";
++(*strchr(tb+1,tb[0]));
cout<<tb<<endl;