Operacje na znakach
Transkrypt
Operacje na znakach
Wstawiamy łańcuch s1 na pozycję i-tą w łańcuchu s2 Operacje na znakach 12 lutego 2015 21:44 Pascal Zamiana znaku na pozycji i-tej w łańcuchu s C++ Kod znaku insert(s1,s2,i); s2.insert(i,s1); Pascal C++ s[i] := 'znak'; s[i] := char(kod); s[i] = 'znak'; s[i] = kod Wklejono z <http://edu.i-lo.tarnow.pl/inf/alg/ Pascal C++ ord(znak) (int)znak chr(kod) (char) kod Programy umieszczają w łańcuchu tekstowym zdanie "Rudy lisek", a następnie wstawiają łańcuch ", szybki" po słowie "Rudy". Konkatencja – łączenie łańcuchów #include <iostream> #include <string> using namespace std; int main() { string s; s = "Rudy lisek"; cout << s << endl; s.insert(4,", szybki"); cout << s << endl << endl; return 0; } program lisek; var s : string; begin s := 'Rudy lisek'; writeln(s); insert(', szybki',s,5); writeln(s); writeln; end. Często zdarza się, iż chcemy połączyć dwa lub więcej tekstów w jeden tekst. Operacja łączenia tekstu nosi nazwę konkatencji (ang. concatenation). W przypadku łańcuchów jest to bardzo proste: Pascal Łączymy łańcuch s1 z s2 i wynik połączenia s3 := s1 + s2; umieszczamy w s3 Podmiana znaku w łańcuchu jest operacją prostą. Po prostu odwołujemy się do wybranego elementu w zmiennej łańcuchowej – może nią być również tablica znaków – i zapisujemy go nową zawartością: Zamiana znaku na pozycji i-tej w łańcuchu s C++ s[i] := 'znak'; s[i] := char(kod); s[i] = 'znak'; s[i] = kod program drzewko; var s : ansistring; begin s := 'Zielone, stare drzewko'; writeln(s); delete(s,10,5); insert('wysokie',s,10); writeln(s); writeln; end. s3 = s1 + s2; Wstawienie znaku wymaga przesunięcia części znaków w zmiennej łańcuchowej, aby udostępnić miejsce na wstawiany znak. Operacja wstawiania znaku lub łańcucha znaków jest obsługiwana przez funkcje biblioteczne: Wstawianie znaku/ciągu znaków do łańcucha Pascal C++ Pascal C++ Wstawiamy łańcuch s1 na pozycję i-tą insert(s1,s2,i); s2.insert(i,s1); w łańcuchu s2 Zastępowanie fragmentu łańcucha innym łańcuchem tekstowym Zastępując fragment łańcucha innym łańcuchem możemy wykorzystać funkcje usuwania i wstawiania tekstu – najpierw usuwamy zastępowany fragment z łańcucha, a następnie wstawiamy na jego miejsce nowy fragment. W języku C++ możemy wykorzystać funkcję składową replace() klasy string, która wykonuje dokładnie to samo zadanie. #include <iostream> #include <string> using namespace std; int main(){ string s; s = "Zielone, stare drzewko"; cout << s << endl; s.replace(9,5,"wysokie"); cout << s << endl << endl; return 0; } n znaków od pozycji i-tej w łańcuchu s2 zastępujemy łańcuchem s1 Usuwanie znaku z łańcucha Usunięcie znaku z łańcucha/tablicy polega na przesunięciu wszystkich znaków następujących za znakiem usuwanym o jedną pozycję w lewo. W ten sposób znak zostaje nadpisany znakiem sąsiadującym z prawej strony – w efekcie zniknie on z łańcucha. Dla łańcuchów znakowych mamy w każdym z wybranych języków programowania gotowe funkcje usuwania znaku lub fragmentu łańcucha. Pascal Usuwamy z łańcucha s n znaków począwszy od pozycji i-tej delete(s,i,n); Pascal C++ delete(s2,i,n); insert(s1,s2,i); s2.replace(i,n,s1); program prg; var s : string; begin s := 'Rakieta kosmiczna'; writeln(s); delete(s,11,1); writeln(s); writeln; end. C++ s.erase(i,n); Programy umieszczają w łańcuchu tekstowym zdanie "Rakieta kosmiczna", a następnie usuwają z wyrazu "kosmiczna" literkę 's'. Porównywanie łańcuchów Łańcuchy tekstowe możemy porównywać przy pomocy typowych operatorów porównań. Jednakże obowiązuje tutaj kilka zasad. Dwa łańcuchy są równe, jeśli składają się z takiej samej liczby znaków oraz zgadzają się ze sobą na każdej pozycji znakowej. Jeśli dwa łańcuchy mają różną długość, lecz krótszy łańcuch zawiera te same początkowe znaki c łańcuch dłuższy, to krótszy jest mniejszy, a dłuższy jest większy. W dwóch łańcuchach porównywane są znaki na odpowiadających sobie pozycjach znakowych aż do napotkania niezgodności kodów. Wtedy mniejszy łańcuch jest tym, który posiada na porównywanej pozycji znak o mniejszym kodzie. Na przykład: "ALA" > "AKACJA" – kod literki L jest większy od kodu literki K. Taki sposób porównywania nosi nazwę leksykograficznego. Zwróć uwagę, iż w ten sposób nie można porównywać łańcuchów zawierających polskie litery – poprawny będzie jedynie test na równość łańcuchów. Pozostałe operacje tekstowe W poniższej tabelce zebraliśmy często wykonywane, typowe operacje na tekstach. Z operacji tych będziemy intensywnie korzystać w przykładach programowych do omawianych algorytmów tekstowych. 1Ga i1Gb Strona 1 #include <iostream> #include <string> using namespace std; int main() { string s; s = "Rakieta kosmiczna"; cout << s << endl; s.erase(10,1); cout << s << endl << endl; return 0; } Pascal C++ Odczyt wiersza znaków ze standardowego wejścia readln(s); write('opis'); readln(s) getline(cin,s); cout << "opis"; getline(cin,s) Zapis łańcucha znaków na standardowe wyjście writeln(s); write(s); cout << s << endl; cout << s; Sprawdzenie, czy łańcuch jest pusty if s = '' then ... if length(s) = 0 then ... if(s == "") ... if(!s.length())... if(!s.size())... Kopiowanie n znaków łańcucha s1 od pozycji i-tej do łańcucha s2 s2 = copy(s1,i,n); s2 = s1.substr(i,n); Kopiowanie n początkowych znaków łańcucha s1 do łańcucha s2 s2 = copy(s1,1,n); s2 = s1.substr(0,n); s2 = copy(s1,length(s1)-n+ 1,n); s2 = s1.substr(s1.length()-n); Kopiowanie n końcowych znaków łańcucha s1 do łańcucha s2