Шаг 96.
Язык программирования C#. Начала
Работа с текстом. Операции с текстовыми объектами

    На этом шаге мы рассмотрим некоторые операции с такими объектами.

    При выполнении базовых операций с текстовыми значениями полезно помнить, что на базовом уровне текст реализуется как символьный массив (правда, еще нужно уметь добраться до этого массива). В этом смысле некоторые методы работы с текстовыми объектами неожиданными не станут. Например, узнать количество символов в тексте можно с помощью свойства Length. Скажем, если txt - объектная переменная класса String, то значением выражения txt.Length является количество символов в тексте, содержащемся в объекте, на который ссылается переменная txt. Причем поскольку текстовые литералы реализуются в виде объектов класса String, то свойство Length есть и у текстовых литералов. Поэтому выражение "текст".Length имеет смысл. Значение этого выражения равно 5 - это количество символов в тексте "текст". Если нам нужен отдельный символ из текста, то мы можем проиндексировать текст: после текстовой переменной или текстового литерала в квадратных скобках указывается индекс символа. Как и в случае с одномерным массивом, индексация начинается с нуля. То есть индекс первого символа в тексте равен 0, а индекс последнего символа в тексте на единицу меньше количества символов в тексте. Так, если txt является текстовой переменной, то значением выражения txt[0] является первый символ в тексте, значением выражения txt[1] является второй символ в тексте, а значением выражения txt[txt.Length-1] является последний символ в тексте.


Нужно учесть, что txt.Length - это количество символов в тексте (на который ссылается переменная txt), а индекс последнего символа на единицу меньше количества символов в тексте.

    Индексировать можно и текстовые литералы. Так, значением выражения "текст"[2] является символ 'к' - третья по счету (с индексом 2) буква в тексте "текст". Пример операций, связанных с индексированием текстовых значений и перебором символов в тексте, представлен в программе ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr96_1
{
    class Program
    {
        static void Main()
        {
            // Отображение текстового литерала с помощью 
            // цикла по коллекции: 
            foreach (char s in "Текст")
            {
                Console.Write(s + " ");
            }
            // Переход к новой строке:
            Console.WriteLine();
            // Отображение текстового литерала с помощью 
            // конструкции цикла: 
            for (int k = 0; k < "Текст".Length; k++)
            {
                Console.Write("Текст"[k] + "_");
            }
            // Переход к новой строке:
            Console.WriteLine();
            // Текстовая переменная:
            String A = "Изучаем С#";
            // Отображение текстового значения: 
            for (int k = 0; k < A.Length; k++)
            {
                Console.Write(A[k]);
            }
            // Переход к новой строке:
            Console.WriteLine();
            // Отображение текста в обратном порядке:
            showReversed(A);
            // Проверка значения текстового объекта:
            Console.WriteLine(A);
            // Новый текстовый объект (текст в обратном порядке): 
            String B = getReversed(A);
            // Отображение текстового значения:
            Console.WriteLine(B);
            // Задержка:
            Console.ReadLine();
        }

        // Статический метод для создания текстового объекта,
        // в котором текст записан в обратном порядке: 
        static String getReversed(String txt)
        {
            // Локальная текстовая переменная:
            String str = "";
            // Формирование текстовой строки: 
            foreach (char s in txt)
            {
                // Добавление символа в начало строки: 
                str = s + str;
            }
            // Результат метода: 
            return str;
        }

        // Статический метод для отображения текста
        // в обратном порядке:
        static void showReversed(String txt)
        {
            // Перебор симзолов в тексте (в обратном порядке): 
            for (int k = txt.Length - 1; k >= 0; k--)
            {
                // Отображение в консоли символа:
                Console.Write(txt[k]);
            }
            // Переход к новой строке:
            Console.WriteLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы будет таким.


Рис.1. Результат выполнения программы

    В главном методе программы с помощью конструкции цикла по коллекции foreach посимвольно отображается текстовый литерал "Текст". Переменная s, объявленная в цикле, относится к типу char (символ из текста). При отображении символов из литерала после каждого символа добавляется пробел.

    Еще один пример посимвольного отображения литерала основан на использовании конструкции цикла for. Символы в тексте (речь идет о текстовом литерале "Текст") в этом случае перебираются с использованием индекса. Индексная переменная k пробегает значения от 0 и до верхней границы, которая на единицу меньше количества символов в текстовом литерале. Длину текстового литерала (количество символов) вычисляем с помощью выражения "Текст".Length. Отдельный символ в литерале вычисляется инструкцией "Текст"[k]. В данном случае после текстового литерала мы просто указали в квадратных скобках индекс символа. При отображении символов в консоли после каждого символа добавляется подчеркивание.

    Командой

  String A = "Изучаем С#";
объявляется и инициализируется текстовая переменная А. Мы можем отобразить текст из соответствующего объекта с помощью команды
  Console.WriteLine(A);
(то есть просто передав переменную А аргументом методу WriteLine()). А можем отобразить текст посимвольно, для чего используется цикл for. Индексная переменная k последовательно перебирает индексы символов в тексте. Начальное значение индекса равно 0, а количество символов в тексте вычисляется командой A.Length. Обращение к отдельному символу выполняется в формате А[k].

    В программе описано два статических метода. Метод showReversed() при вызове отображает в консоли в обратном порядке текстовую строку, переданную аргументом методу. Поэтому при выполнении команды

  showReversed (А) 
текст из переменной А (текст из объекта, на который ссылается переменная) отображается в обратном порядке, но сам текстовый объект при этом не меняется.


Индексированием текстовой переменной мы можем прочитать символ в строке, но не можем изменить его значение. Проще говоря, если А - текстовая переменная и k - индекс символа, то мы можем узнать, что это за символ, с помощью инструкции А[k]. В данном случае с символом мы обращаемся как с элементом массива. Но присвоить значение "элементу" А[k] мы не можем.


Аргументом методу showReversed() передается текстовая строка (аргумент обозначен как txt). В теле массива с помощью конструкции цикла перебираются символы из текстового аргумента, но только символы перебираются в обратном порядке. Индексная переменная k принимает начальное значение txt.Length-1. Это индекс последнего символа в тексте. Конструкция цикла выполняется, пока истинно условие k>=0 (индекс неотрицательный). За каждую итерацию цикла значение индексной переменной уменьшается на единицу (команда k--). Символы отображаются по одному, все в одной строке (команда
  Console.Write(txt[k]) 
в теле конструкции цикла). После завершения отображения текста выполняется переход к новой строке.

    При вызове метода getReversed() создается новый текстовый объект. Текст в этом объекте записан в обратном порядке по сравнению с объектом, который передавался аргументом методу при вызове. Следовательно, когда выполняется команда

  String B = getReversed(A);    ,
то в текстовую переменную B записывается ссылка на вновь созданный объект. В нем текст записан в обратном порядке, если сравнивать с текстом из объекта, на который ссылается переменная A.


Статическому методу getReversed() аргументом передается текст, и результатом метода является также текстовое значение. В теле метода объявляется локальная текстовая переменная str с пустой текстовой строкой в качестве начального значения. Затем запускается цикл по коллекции foreach. Символьная (тип char) переменная s в цикле последовательно принимает значения символов из текстового аргумента txt. За каждый цикл командой
  str = s + str;
считанный из аргумента символ записывается в начало текстовой строки str. После завершения конструкции цикла сформированная текстовая строка возвращается как результат метода.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг