====== Łańcuchy, czyli napisy ====== ===== ===== Łańcuchy zawierają sekwencję znaków \\ ''"Witaj Świecie"'' Typ ''string'' string tekst = "Witaj Świecie" Łańcuch jest typem referencyjnym (jest aliasem klasy ''[[https://learn.microsoft.com/en-us/dotnet/api/system.string?view=net-6.0|System.String]]'') char [] litery= { 'H', 'e', 'l', 'l','o' }; string tekst = new string(litery); Tablice łańcuchów string [] tekst = {"Ala", "ma", "kota"}; ===== Łączenie łańcuchów ===== "Dodawanie" łańcuchów (konkatenacja) to łączenie napisów string tekst = "Witaj"; tekst = tekst + " Świecie"; tekst += " Hura!"; Uwaga: wynikiem operacji jest nowy łańcuch. ===== Dostęp do znaków ===== Znaki łańcucha dostępne za pomocą operatora ''[index]'' \\ Pierwszy element ma indeks 0 (to jest tablica znaków) \\ string tekst = "kod"; tekst[2] = 't'; ===== Klasa string ===== Zobacz: [[https://learn.microsoft.com/en-us/dotnet/api/system.string?view=netcore-3.1|String]] ^ Metody i własności ^ Opis ^ Przykład ^ | ''Chars[]'' | indeksowane elementy łańcucha | ''tekst[0] '' | | ''Length'' | długość łańcucha | ''tekst.Length '' | | ''Equals()'' | czy napisy takie same? | ''tekst.Equals("Hello")'' | | ''Compare()'' | kolejność alfabetyczna (-1, 0 , 1) | ''tekst.Compare("Hello")'' | ===== ===== | ''Contains()'' | czy zawiera łańcuch? | ''tekst.Contains("kot")'' | | ''StartsWith()'', ''EndsWith()'' | czy zaczyna się/kończy się od? | ''tekst.StartsWith("Ala") '' | | ''IndexOf()'' | indeks początku pasującego wzorca | ''tekst.IndexOf("Ala")'' | | ''PadLeft()'', ''PadRight()'' | uzupełnia napis spacjami do zadanej długości | ''tekst.PadLeft(25) '' | ===== ===== | ''Remove()'' | usuwa ciąg znaków od zadanej pozycji | ''tekst.Remove(2,5) '' | | ''Substring()'' | wyodrębnia ciąg znaków od zadanej pozycji | ''tekst.Substring(2,5) '' | | ''Replace()'' | zamienia fragment łańcucha | ''tekst.Replace("Ala", "Ewa") '' | | ''ToLower()'', ''ToUpper()'' | zamienia litery na małe/wielkie | ''tekst.ToUpper() '' | | ''Trim()'', TrimEnd()'', TrimStart()'' | usuwa znaki (spacje) z łańcucha | ''tekst.TrimEnd()'' | ===== ===== | ''Split()'' | dzieli łańcuch względem separatora | ''tekst.Split(' ') '' | | ''Join()'' | łaczy tablicę napisów | ''String.Join(separator, tablica)'' ===== Ćwiczenie ===== Napisz program, który wczytuje kolejne linie tekstu z konsoli aż do napotkania pustej linii. Każda kolejna linia tekstu wypisywana jest w odwrotnej kolejności a wszystki małe litery zamieniane są na wielkie. Przykład: Ala ma kota ATOK AM ALA ===== Ćwiczenie ===== Napisz program, który wczytuje kolejne linie tekstu z konsoli aż do napotkania pustej linii. Po zakończeniu wczytywania tekstu program wypisuje wszystkie wyrazy podanego tekstu w porządku alfabetycznym. Zakładamy, że wyrazy oddzielone są spacjami. Przykład: Ala ma kota. Ala kota. ma ===== Klasa StringBuilder ===== * używanie łączenia łańcuchów może byc nieefektywne, bo za kazdym razem wynikiem jest kopia łancucha * do budowania dłuższych napisów lepiej użyć ''[[https://learn.microsoft.com/en-us/dotnet/api/system.text.stringbuilder?view=net-6.0|System.StringBuilder()]]'' StringBuilder sb = new StringBuilder(); // Dodaj łańcuch na końcu sb.Append("Witaj"); // Dodaj linię na końcu sb.AppendLine("Świecie !"); // Dodaj formatowany napis sb.AppendFormat("PI = {0:F5}", Math.PI); // Ile znaków ? Console.WriteLine("sb.Length={0}", sb.Length); // Uzyskaj gotowy łańcuch string tekst = sb.ToString(); Console.WriteLine(tekst); ===== Ćwiczenie - Porównanie szybkości StringBuildera ===== Napisz program, który porówna szybkość wykonywania operacji łączenia tekstu pomiędzy operatorem dodawania (''+'') i klasą ''StringBuilder()''. W tym celu zbuduj napis składającyc się w wielu powtórzeń (np. 10 tysiecy) napisu ''"Witaj Świecie"'' i wyznacz czas wykoanania algorytmu dla obu porównywanych metod. Do wyznaczenia casu wykonania programu można wykorzystać własność ''[[https://learn.microsoft.com/en-us/dotnet/api/system.datetime.now?view=net-6.0|System.DateTime.Now]], która zwraca aktualny czas z dokładnością do milisekund. Ta wartość może zostać wywołana do pomiaru czasu przed i po wykonaniu algorytmu. Przedział czasu między dwoma pomiarami czasu jest strukturą typu typu [[https://learn.microsoft.com/en-us/dotnet/api/system.timespan?view=net-6.0|TimeSpan]]. Struktura ta udostepnia własność [[https://learn.microsoft.com/en-us/dotnet/api/system.timespan.totalmilliseconds?view=net-6.0|TimeSpan.TotalMilliseconds]] zwracającą całkowitą liczbę milisekund pomiedzy pomiarami czasu.