Znaki i teksty w C++ Znaki przechowywane są w pamięci w postaci

Transkrypt

Znaki i teksty w C++ Znaki przechowywane są w pamięci w postaci
Znaki i teksty w C++
Znaki przechowywane są w pamięci w postaci liczb, każdemu znakowi przypisany jest unikatowy kod.
Pierwszym 128 liczbom kodu w standardzie ASCII odpowiadają znaki sterujące, znaki interpunkcyjne
(.,;-?!”), cyfry oraz litery alfabetu angielskiego duże i małe.
Powyższe znaki te zajmują 1 bajt, mając najstarszy bit ustawiony na wartość 0: 0xxx xxxx.
Przykład:
znak A ma kod 65, w zapisie binarnym 0100 0001
Innym znakom niż powyższe standard Unicode przypisuje większe liczby. Są one kodowane na 2, 3 lub
4 bajtach, najczęściej w systemie UTF8. Najstarszy bit w każdym z tych bajtów ma wartość 1.
Przykład:
znak ą ma Unicode 261, w systemie UTF8 będzie on zakodowany na 2 bajtach: 196 133 (w reprezentacji dziesiętnej)
W języku C++ do przechowywania znaków służy typ char: odpowiada mu 1 bajt w systemie ze
znakiem, tzn. najstarszy bit ma wagę -1. Typ char przechowuje liczby o wartościach od -128 do 127.
Znak A będzie zapisany na jednym bajcie o wartości 65.
Znak ą będzie zapisany na 2 bajtach:
• w reprezentacji ósemkowej będą to wartości 304 i 205
• w reprezentacji dziesietnej będzie to: -60 -123 (wartości 196 i 133, ponieważ przekraczają 127,
są wzięte modulo 256: (-60 = 196 - 256, -123 = 133 - 256)
W języku C++ do przechowywania tekstów (łańcuchów znaków) służy typ string. Nie przechowuje on
graficznej postaci znaków, jest jedynie kontenerem na kody znaków.
Będziemy rozważać tylko stringi zbudowane ze znaków kodowanych na 1 bajcie.
Każdy bajt stringa jest dostępny poprzez indeks, czyli kolejny numer bajta w stringu. Indeksy
rozpoczynają się od wartości 0.
string s = ”Kasia”
int n=s.length() zwróci liczbę znaków łąńcucha
s[0] oznacza pierwszy znak łańcucha, czyli literę K
s[i] oznacza i-ty znak łańcucha (licząc od 0)
s[n-1] oznacza ostatni znak łańcucha
Uwaga: w programie CodeBlocks do przetwarzania stringów trzeba: #include <string>
Przykłady
Program który pobierze z klawiatury słowo i wyświetli jego długość w bajtach:
string s;
cout << ”daj słowo ”; cin >> s;
int n = s.length();
cout << s << " zajmuje " << n << " bajtów\n";
Program który wyświetli w kolejnych liniach ekranu znaki łańcucha s i odpowiadające im kody:
for (int i=0; i<s.length(); i++)
cout << s[i] << "\t" << (int)s[i] << endl;
Program który przeliteruje słowo s, oddzielając każdy znak myślnikiem:
for (int i=0; i<s.length()-1; i++)
cout << s[i] << " - ";
cout << s[n-1] << endl;
Program który wyświetli słowo s napisane wielkimi literami
for (int i=0; i<s.length(); i++)
cout << (char)toupper(s[i]);
cout << endl;
Program który wyświetli słowo s odwrócone (wspak)
for (int i=n-1; i>=0; i--)
cout << s[i] ;
cout << endl;
(int)znak - zwraca kod znaku
(char)kod - zwraca graficzną postać znaku
A teraz poćwiczmy programowanie funkcji.
Funkcja która zwróci słowo odwrócone: ————————————————————————string odwroc(string s) {
string t = "";
for (int i=s.length()-1; i>=0; i--)
t += s[i];
return t;
}
i zastosowanie tej funkcji wewnątrz funkcji main():
cout << odwroc(s) << endl;
Funkcja która wygeneruje słowo złożone z N losowo wybranych dużych liter:————————
string generator(int N) {
string t = "";
for (int i=0; i<N; i++) {
int x = 65+rand()%26;
t = t + (char)x;
}
return t;
}
i zastosowanie tej funkcji wewnątrz funkcji main():
srand(time(NULL));
int n;
cout << "ile znaków ? "; cin >> n;
string t = generator(n);
cout << t << endl;
Funkcja która sprawdza czy słowo jest palindomem: ———————————————————
Palindrom - jest to słowo, które wyglada tak samo czytane w przód i wstecz, np. kajak.
bool pali(string s) {
int n = s.length();
for (int i=0; i<n/2; i++)
if (s[i] != s[n-1-i]) return false;
return true;
}
zastosowanie tej funkcji:
string s = "kajak";
if (pali(s)) cout << „palindom\n";
String jest typem złożonym. Każda zmienna typu string ma „wbudowane” różne pożyteczne funkcje,
np. dla zmiennej o nazwie s:
s.find(char lub string, int odIndeksu)
// wyszukuje znak lub tekst od podanego indeksu,
// zwraca indeks znalezionego, lub -1 jeśli nie ma
s.substr(odIndeksu, int ileZnaków)
// zwraca podłańcuch
s.insert(odIndeksu, string t)
// wstawia t w miejsce określone podanym indeksem
s.erase(odIndeksu, ileZnaków)
// usuwa znaki
s.replace(odIndeksu, ileZnaków, string t) // zastepuje podany zakres znaków łańcuchem t
s.append(string t)
// dołącza na końcu łańcuch t

Podobne dokumenty