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