Шаг 50.
Язык программирования C#. Начала
Массивы. Одномерные массивы (окончание)

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

    Еще один небольшой пример касается создания символьного массива (массива с элементами типа char). Размер массива определяется значением переменной. После создания массив заполняется случайными символами. Содержимое массива отображается в прямом и обратном порядке. Код программы представлен ниже.

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

namespace pr50_1
{
    class Program
    {
        static void Main()
        {
            // Объект для генерирования случайных чисел:
            Random rnd = new Random();
            // Размер массива и индексная переменная: 
            int size = 10,  k;
            // Создание символьного массива: 
            char[] symbs = new char[size];
            // Отображение сообщения:
            Console.WriteLine("Массив случайных символов:");
            // Заполнение массива случайными символами: 
            for(k = 0; k < symbs.Length; k++) {
                // Значение элемента массива: 
                symbs[k] = (char)('A'+rnd.Next(26));
                // Отображение значения элемента массива:
                Console.Write("| " + symbs[k] + " ");
            }
            Console.WriteLine("|");
            // Отображение сообщения:
            Console.WriteLine("Массив в обратном порядке:"); 
            for(k = symbs.Length-1; k >= 0; k--){
                // Отображение значения для элемента массива:
                Console.Write("| " + symbs[k] + " ");
            }
            Console.WriteLine("|");
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

   


Вообще, сгенерировать случайное число - задача очень нетривиальная. Откровенно говоря, случайных чисел не существует вовсе. Есть иллюзия того, что числа случайные. В реальности такие числа генерируются в соответствии с определенным алгоритмом. И они конечно же не случайны. Поэтому более корректный термин - псевдослучайные числа.

    Как отмечалось в начале этого шага, в программе массив заполняется случайными символами. Для генерирования случайных символов нам понадобятся случайные целые числа.

    Генерируются случайные числа с помощью специального объекта rnd, который создается на основе класса Random (из пространства имен System) командой

  Random rnd = new Random();
В результате выполнения этой команды мы получаем объект rnd, у которого есть метод Next(), возвращающий значением случайное целое число.


Классы и объекты, которые создаются на основе классов, обсуждаются позже. Сейчас отметим лишь основные, наиболее важные моменты, связанные с созданием объектов. Объект создается на основе класса. Класс играет роль шаблона, определяющего, какие поля, свойства и методы будет иметь объект. Фактически класс представляет собой специфический "тип данных" (с поправкой на то, что там не только данные). Объекты реализуются подобно массивам: есть собственно объект, а есть переменная, которая на этот объект ссылается. Последняя называется объектной переменной. Например, мы хотим создать объект на основе класса Random. Сам объект создается командой new Random(). У выражения new Random() есть значение - это ссылка на созданный объект. Ссылка записывается в объектную переменную (объект) rnd. Эта переменная объявляется командой вида Random rnd, в которой в качестве типа переменной указывается название класса Random. Если две команды (объявления объектной переменной и создания объекта) объединить в одну, то получим выражение
  Random rnd = new Random();

    Символьный массив создается командой

  char[] symbs = new char[size];
Размер массива определяется значением переменной size. Поскольку предварительно при объявлении переменной size ей было присвоено значение 10, то создается массив из 10 элементов.


Размер массива определяется значением переменной size на момент создания массива. Если бы впоследствии значение переменной size изменилось, размер массива остался бы неизменным.

    Для заполнения массива случайными символами мы используем цикл. Индексная переменная k в конструкции цикла принимает целочисленные значения от 0 и строго меньше symbs.Length (размер массива), увеличиваясь за каждый цикл на единицу. Значение элементу массива symbs с индексом k присваивается командой

  symbs[k] = (char)('A'+rnd.Next(26));
в которой генерируется случайное число. Значением выражения rnd.Next(26) является случайное целое число в диапазоне от 0 до 25 включительно.


Метод Next() вызывается из объекта класса Random (в нашем случае таким объектом является rnd). Есть несколько способов вызова метода Next(). Если метод вызывается с одним целочисленным аргументом, то результатом является неотрицательное случайное целое число, не превышающее то, которое указано аргументом. Например, если использована команда rnd.Next(26), то результатом будет неотрицательное целое число, не большее 26 - это число в диапазоне значений от 0 до 25 включительно.

    Следовательно, к символу 'А' прибавляется целое число (речь о выражении 'A'+rnd.Next(26)). Результат выражения вычисляется так: к коду символа 'А' (значение 65, но в данном случае это не важно) прибавляется целочисленное слагаемое. В итоге получаем целое число. Перед всем выражением указана инструкция приведения к символьному типу (char). Поэтому полученное числовое значение интерпретируется как код символа в кодовой таблице. Поскольку в английском алфавите 26 букв, а в кодовой таблице буквы расположены в соответствии с алфавитом, то результатом выражения

  (char)('A'+rnd.Next(26))
является одна из больших (прописных) букв. Поскольку к коду символа 'А' прибавляется случайное число, то и буква будет случайной. Диапазон возможных значений - от 'А' до 'Z' включительно.

    После того как значение элементу массива присвоено, командой

  Console.Write("| " + symbs[k] + " ");
оно отображается в консольном окне.

    Как и в примере предыдущего шага, мы используем вертикальные разделители и пробелы при отображении значений элементов массива. Последний разделитель отображается командой

  Console.WriteLine("|");
после завершения выполнения оператора цикла.

    Для отображения содержимого массива в обратном порядке мы используем еще одну конструкцию цикла. В нем индексная переменная k (мы используем ту же переменную, что и в первой циклической конструкции) за каждую итерацию уменьшает значение на единицу, начиная с начального значения symbs.Length-1 (значение индекса последнего элемента в массиве symbs) до значения 0 включительно (использовано условие k>=0). За каждый цикл командой

  Console.Write("| " + symbs[k] + " ");
отображается значение элемента с индексом k. Поскольку элементы в массиве перебираются в обратном порядке, то в консольном окне массив тоже отображается в обратном порядке (начиная с последнего элемента и заканчивая первым). При этом сам массив не меняется.


Индексная переменная k объявлена вместе с переменной size - то есть она объявлена не в операторе цикла. Область доступности переменной k - главный метод программы. Поэтому мы можем использовать переменную в двух конструкциях цикла. Если бы мы объявили переменную k в первой конструкции цикла, то во второй ее использовать уже не смогли бы. Но мы могли бы объявить во второй конструкции цикла другую индексную переменную или даже переменную с таким же названием k. Даже если так, то это были бы разные переменные. Область доступности каждой из них ограничивалась бы "своей" конструкции цикла.

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


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

   

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

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




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