Опубликован: 15.09.2010 | Доступ: свободный | Студентов: 4807 / 630 | Оценка: 3.97 / 3.80 | Длительность: 14:45:00
Лекция 6:

Массивы, символы и строки

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Массивы объектов

При создании массива, состоящего из элементов ссылочного типа, память выделяется только под ссылки на элементы, а сами элементы необходимо разместить в хипе явным образом. В качестве примера создадим массив из объектов некоторого класса Monster:

using System;
namespace ConsoleApplication1
{
    class Monster { ... }
    
    class Class1
    {   static void Main()
        {
            Random rnd = new Random();
            const int n = 5;
            Monster[] stado = new Monster[n];                   // 1
            for ( int i = 0; i < n; ++i )                       // 2
            {
                stado[i] = new Monster( rnd.Next( 1, 100 ), 
                                        rnd.Next( 1, 200 ), 
                                       "Crazy" + i.ToString() );
            }
            foreach ( Monster x in stado ) x.Passport();        // 3
        }
    }
}

Результат работы программы:

Monster Crazy0   health = 18 ammo = 94
Monster Crazy1   health = 85 ammo = 75
Monster Crazy2   health = 13 ammo = 6
Monster Crazy3   health = 51 ammo = 104
Monster Crazy4   health = 68 ammo = 114

Пример поиска в массиве объектов приведен в конце следующей лекции.

Символы и строки

Обработка текстовой информации является, вероятно, одной из самых распространенных задач в современном программировании, и C# предоставляет для ее решения широкий набор средств: отдельные символы, массивы символов, изменяемые и неизменяемые строки и регулярные выражения.

Символы

Символьный тип char предназначен для хранения символов в кодировке Unicode. Символьный тип относится к встроенным типам данных C# и соответствует стандартному классу Char библиотеки .NET из пространства имен System. В этом классе определены статические методы, позволяющие задать вид и категорию символа, а также преобразовать символ в верхний или нижний регистр и в число. Некоторые методы приведены в таблилце 6.2, с остальными можно ознакомиться по учебнику [4].

Таблица 6.2. Некоторые методы класса System.Char
Метод Описание
GetNumericValue Возвращает числовое значение символа, если он является цифрой, и –1 в противном случае
IsControl Возвращает true, если символ является управляющим
IsDigit Возвращает true, если символ является десятичной цифрой
IsLetter Возвращает true, если символ является буквой
IsLower Возвращает true, если символ задан в нижнем регистре
IsUpper Возвращает true, если символ записан в верхнем регистре
IsWhiteSpace Возвращает true, если символ является пробельным (пробел, перевод строки и возврат каретки)
Parse Преобразует строку в символ (строка должна состоять из одного символа)
ToLower Преобразует символ в нижний регистр
MaxValue, MinValue Возвращают символы с максимальным и минимальным кодами (эти символы не имеют видимого представления)

В листинге 6.6 продемонстрировано использование этих методов.

using System;
namespace ConsoleApplication1
{  class Class1
   {  static void Main()
     {
        try
        {
           char b = 'B', c = '\x63', d = '\u0032';                      // 1
           Console.WriteLine( "{0}  {1}  {2}", b, c, d );
           Console.WriteLine( "{0}  {1}  {2}",
                char.ToLower(b), char.ToUpper(c), char.GetNumericValue(d) );

           char a;
           do                                                           // 2
           {
               Console.Write( "Введите символ: " );
               a = char.Parse( Console.ReadLine() );
               Console.WriteLine( "Введен символ {0}, его код – {1}",
                                   a, (int)a );
               if (char.IsLetter(a))      Console.WriteLine("Буква");
               if (char.IsUpper(a))       Console.WriteLine("Верхний рег.");
               if (char.IsLower(a))       Console.WriteLine("Нижний рег.");
               if (char.IsControl(a))     Console.WriteLine("Управляющий");
               if (char.IsNumber(a))      Console.WriteLine("Число");
               if (char.IsPunctuation(a)) Console.WriteLine("Разделитель");
           } while (a != 'q');
       }
       catch
       {
           Console.WriteLine( "Возникло исключение" );
           return;
       }
    }
  }
}
Листинг 6.6. Использование методов класса System.Char

Массивы символов

Массив символов, как и массив любого иного типа, построен на основе базового класса Array. Применение этих методов позволяет эффективно решать некоторые задачи. Простой пример приведен в листинге 6.7.

using System;
namespace ConsoleApplication1
{   class Class1
    {   static void Main()
        {
            char[] a = { 'm', 'a', 's', 's', 'i', 'v' };                // 1
            char[] b = "а роза упала на лапу азора".ToCharArray();      // 2
                
            PrintArray( "Исходный массив а:", a );

            int pos = Array.IndexOf( a, 'm' );
            a[pos] = 'M';
            PrintArray( "Измененный массив а:", a );

            PrintArray( "Исходный массив b:", b );
            Array.Reverse( b );
            PrintArray( "Измененный массив b:", b );
        }

        public static void PrintArray( string header, Array a )
        {
            Console.WriteLine( header );
            foreach ( object x in a ) Console.Write( x );
            Console.WriteLine( "\n" );
        }
    }
}
Листинг 6.7. Работа с массивом символов

Результат работы программы:

Исходный массив а:
massiv

Измененный массив а:
Massiv

Исходный массив b:
а роза упала на лапу азора

Измененный массив b:
ароза упал ан алапу азор а
< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Stefan Berzan
Stefan Berzan
Молдова, Кишинев
Дмитрий Казимиров
Дмитрий Казимиров
Россия, Омск