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