Опубликован: 15.09.2010 | Доступ: свободный | Студентов: 5596 / 979 | Оценка: 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 >
Георгий Кузнецов
Георгий Кузнецов

"Сокрытие деталей реализации называется инкапсуляцией (от слова "капсула"). "

Сколько можно объяснять?!

ИНКАПСУЛЯЦИЯ НЕ РАВНА СОКРЫТИЮ!!!

Инкапсуляция это парадигма ООП, которая ОБЕСПЕЧИВАЕТ СОКРЫТИЕ!!!

НО СОКРЫТИЕМ  НЕ ЯВЛЯЕТСЯ!!! 

Если буровая коронка обеспечивает разрушение породы, то является ли она сама разрушением породы? Конечно нет!

Ольга Притоманова
Ольга Притоманова