Operacje na tekstach. Część 2
Wybrane metody klasy String
Klasa String zawiera szereg pól i metod służących do udostępniania informacji o tekście z możliwością wykonywania prostych i złożonych operacji na tekście. Jedne z częściej używanych metod to
- Substring()- metoda pobiera fragment tekstu począwszy od podanego indeksu a skończywszy na ilości podanych znaków do pobrania; wywołanie to tekst.Substring(id, ile)
- Compare()- metoda porównuje dwa teksty, jeżeli oba teksty są jednakowe to wynikiem jest 0 (zero), gdy teksty różnią się od siebie zwracana jest liczba różna od zero; wynik mniejszy od zera (-1), oznacza, że tekst pierwszy w porządku alfabetycznym jest mniejszy od drugiego; wynik większy od zera oznacza, że tekst pierwszy w porządku alfabetycznym jest większy od drugiego; metoda może być wywołana w kilku wariantach, proste wywołanie tej metody odpowiada operatorowi równości (czyli: ==); wywołanie to String.Compare(tekst1, tekst2)
- Concat()- metoda łączy dwa teksty w jeden, wywołanie to String.Concat(tekst1, tekst2)
- IndexOf()- metoda sprawdza czy podany fragment tekstu zwiera się w tekście źródłowym, zwracany wynik to indeks znaku, od którego rozpoczyna się pierwsze wystąpienie poszukiwanego tekstu, wynik mniejszy od zera oznacza, że szukany fragment tekstu nie występuje w źródle
- LastIndexOf()- metoda działa jak powyższa (IndexOf) ale sprawdza od końca
- Insert()- metoda wstawia fragment tekstu do tekstu źródłowego począwszy od wskazanego indeksu; wywołanie string nowy=tekst.Insert(id,fragment_tekstu);
- Remove()- metoda usuwa fragment tekstu od wskazanego indeksu poprzez wycięci podanej ilości znaków; wywołanie string nowy=tekst.Remove(id,ile_znakow);
Informacje o pozostałych częściej używanych metod tej klasy, takie jak ToLower(), ToUpper(), Trim(), Join() odszukaj samodzielnie i zapisz w zeszycie.
Zadania
Zad. 1
Używając metody Substring() wytnij z tekstu źródłowego zadaną ilość znaków zaczynając od wskazanego indeksu. Wynik wyświetl na ekranie. Zadanie zrealizuj jako dwie aplikacje- desktopowa oraz konsolowa.
Wynik działania aplikacji desktopowej
Przykładowy kod funkcji realizujący tę część zadania
Wskazówka:
private void button1_Click(object sender, EventArgs e)
{
//wytnij teskt
string tekst_zrodlo = textBox1.Text;
int id = int.Parse(textBox2.Text);
int ile= int.Parse(textBox3.Text);
string tekst_wyciety = tekst_zrodlo.Substring(id, ile);
MessageBox.Show("Wycięty fragment tekstu: " +
Environment.NewLine + tekst_wyciety,
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
Wynik działania aplikacji konsolowej
Przykładowy kod funkcji realizujący tę część zadania w rozwiązaniu konsolowym
Wskazówka:
static void Zadanie1()
{
Console.WriteLine("Wprowadź teskt źródłowy");
string tekst_zrodlo = Console.ReadLine();
Console.WriteLine("Podaj indeks początku wycinania: ");
int id = int.Parse(Console.ReadLine());
Console.WriteLine("Podaj ilość znaków do wycięcia: ");
int ile = int.Parse(Console.ReadLine());
string tekst_wyciety = tekst_zrodlo.Substring(id, ile);
Console.WriteLine("Wyciety fragment tekstu to: ");
Console.WriteLine(tekst_wyciety);
}
Zad. 2
Napisz funkcję, która porówna ze sobą dwa imiona i odpowie na pytanie: które imię w porządku alfabetycznym jest pierwsze. Zadanie rozwiąż jako aplikacja desktopowa i konsolowa.
Przykładowy wynik działania aplikacji desktopowej
W proponowanym rozwiązaniu wykorzystałem odczyt kolejnej linii kontrolki TextBox pracującej w trybie Multiline. Można wykorzystać dwie różne kolejne kontrolki TextBox specjalnie dedykowane do wprowadzania imion.
Przykładowy kod funkcji realizujący tę część zadania
Wskazówka:
private void button2_Click(object sender, EventArgs e)
{
int ileLinii = textBox1.Lines.Length;
if(ileLinii > 1 )
{
string imieA = textBox1.Lines[0];
string imieB = textBox1.Lines[1];
int wynikPorownania = String.Compare(imieA, imieB);
string trescKomunikatu = null;
switch(wynikPorownania)
{
case -1:
trescKomunikatu = "Imię "+
imieA+
" jest w alfabecie przed imieniem "+
imieB;
break;
case 0:
trescKomunikatu = "Imię " +
imieA +
" jest równe imieniu " +
imieB;
break;
case 1:
trescKomunikatu = "Imię " +
imieA +
" jest w alfabecie po imieniu " +
imieB;
break;
}
MessageBox.Show(trescKomunikatu,
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
Wynik działania aplikacji konsolowej
Przykładowy kod funkcji porównujący imiona w porządku alfabetycznym w rozwiązaniu konsolowym
Wskazówka:
static void Zadanie2()
{
Console.WriteLine("Wprowadź pierwsze imię ");
string imieA = Console.ReadLine();
Console.WriteLine("Wprowadź drugie imię ");
string imieB = Console.ReadLine();
int wynikPorownania = String.Compare(imieA, imieB);
string trescKomunikatu = null;
switch (wynikPorownania)
{
case -1:
trescKomunikatu = "Imię " +
imieA +
" jest w alfabecie przed imieniem " +
imieB;
break;
case 0:
trescKomunikatu = "Imię " +
imieA +
" jest równe imieniu " +
imieB;
break;
case 1:
trescKomunikatu = "Imię " +
imieA +
" jest w alfabecie po imieniu " +
imieB;
break;
}
Console.WriteLine(trescKomunikatu);
}
Zad. 3
Sprawdź czy w podanym tekście źródłowym znajduje się dowolny ciąg znaków. Jeśli wystąpi to podaj indeks pierwszego wystąpienia podanego ciągu znaków. Wskazówka, użyj metody IndexOf() klasy String.
Przykład działania aplikacji desktopowej
Kod realizujący to zadanie
Wskazówka:
private void button3_Click(object sender, EventArgs e)
{
string tekstZrodlowy = textBox1.Text;
string szukanyCiag = textBox4.Text;
int pozycja=tekstZrodlowy.IndexOf(szukanyCiag);
string trescKomunikatu = null;
if (pozycja > -1)
{
trescKomunikatu = "Szukany ciag znaków " +
szukanyCiag +
" jest na pozycji " +
pozycja;
}
else trescKomunikatu = "Szukany ciag znaków nie występuje w źródle";
MessageBox.Show(trescKomunikatu,
"Komunikat",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
Rozwiązanie pod konsolę działa jak poniżej
Kod proponowanej metody rozwiązania pod konsolę
Wskazówka:
static void Zadanie3()
{
Console.WriteLine("Wprowadź teskt źródłowy ");
string tekstZrodlowy = Console.ReadLine();
Console.WriteLine("Wprowadź szukany ciąg ");
string szukanyCiag = Console.ReadLine();
int pozycja = tekstZrodlowy.IndexOf(szukanyCiag);
string trescKomunikatu = null;
if (pozycja > -1)
{
trescKomunikatu = "Szukany ciag znaków " +
szukanyCiag +
" jest na pozycji " +
pozycja;
}
else trescKomunikatu = "Szukany ciag znaków nie występuje w źródle";
Console.WriteLine(trescKomunikatu);
}
Zad 4.
Znajdź wszystkie indeksy wystąpienia podanego ciągu znaków we wprowadzonym tekście źródłowym. Rozwiązanie przedstaw jako aplikacja konsolowa wzorując się na proponowanym rozwiązaniu desktopowym.
W poniższym przykładzie szukano ciągu znaków: kot
Przykładowa funkcja realizująca powyższe działanie w rozwiązaniu desktopowym ma kod jak poniżej
Wskazówka:
private void button4_Click(object sender, EventArgs e)
{
int idPoz = -1;
int j = 0;
string tekstZrodlowy = textBox1.Text;
string szukanyCiag = textBox4.Text;
int skok = szukanyCiag.Length;
while ((idPoz = tekstZrodlowy.IndexOf(szukanyCiag, j)) >= 0)
{
textBox1.AppendText(Environment.NewLine+
"kolejna pozycja to: " +
j);
j = idPoz + skok;
}
}
Ilustracja działającej aplikacji konsolowej.