Урок по C# №11: «Перечисления и многомерные массивы»


Этот урок завершает первую часть изучения C#. Вы должны уже знать базовый синтаксис языка и основные конструкции, чтобы изучать следующий уровень. Я сознательно разбил серию уроков по C# на несколько частей, стремясь идти от простейшего к сложному.

В следующей части мы изучим с вами ООП и приступим к разработке Windows приложений. Там уже будет все значительно интереснее, что скажется на понимании изложенного материала.  Мы также изучим с вами программирование для интернета, базы данных, игрописание с XNA и в качестве бонуса я научу вас писать торговых роботов для фондовых рынков.  Думаю, план вам понятен.

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

Перечисления

Помните, я рассказывал вам о константах? Они хранят постоянное значение в программе все время ее выполнения. Однако в мало-мальски сложных программах (а это почти все, что отлично от «Hello World!») часто возникает потребность в неком наборе таких констант. Причем, желательно, чтобы они были логически объединены в некую структуру данных с одним именем. Вспомните массивы. Ведь как удобно было обращаться к элементу массива по его индексу.

В C# есть подобная структура и называется она перечисления (enum) . Давайте теперь рассмотрим, для чего нужны эти самые перечисления. Аналогию я буду проводить с .Netовской библиотекой.

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

Конечно, нагляднее привести пример с обычными приложениями Windows, ноя решил оставить их на вторую часть. В конце-концов, использование библиотечных контролов просто до безобразия.

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

Поэтому мы можем создать константы с нужным цветом и выбирать уже из них. Например, создать константу Green и задать ей шестнадцатиричное  значение цвета (от 1 до 255).  Таким же образом можно создать константы Blue, Yellow, Red. Purple и т.д. В принципе, с поставленной задачей мы бы справились подобным образом. Однако не кажется ли вам, что гораздо удобнее было бы засунть эти константы в некое множество, из которого можно было бы выбирать нужный нам цвет (или что-то, что взбредет нам в голову). C# позволяет нам это сделать, используя специальную структуру под названием перечисления (enum). Программистам С и С++ перечисления знакомы. В Паскале тоже есть перечисления, только там они называются наборы. В любом случае, сымсл тот же самый.

К сожалению, я выбрал не совсем удачный пример с цветом, так как дотнетовские библиотеки уже включат в себя  перечисления цвета. Например, свойство объекта Console BackgroundColor принимает значение из перечисления ConsoleColor. И таких примеров можно привести массу.

Тем не менее, нам важно научиться создавать свои перечисления. Давайте создадим перечисление цвета. Синтаксис перечисления такой:

enum  Имя_перечисления  {значение 1,значение 2 и т.д.};

Важно понимать, что значение перечисления можно задавать при объявлении (хотя и не обязательно). Например, давайте создадим перечисление ConsColor, в котором одному из значений зададим код цвета:


enum ConsColor

{ Red,

Green=120,

Blue,

Yellow,

Purple

};

Как видите, я задал явно 120 значению Green. Теперь C# будет считать, что этому значению соответствует 120. В остальных же случаях будут просто строковые константы.

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

Для того, чтобы использовать перечисление, нужно объявить переменную его типа:


ConsColor color;

Теперь через точку мы можем  получить значение перечисления:


color.Red;

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

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

Многомерные массивы

В предыдущем уроке я упомянул, что массивы бывают и многомерными. Самым популярным из них является двумерный массив. По сути, это просто таблица, в ячейках которой находится то или иное значение:

3

8

2

1

5

9

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

Объявляется многомерный массив так:

тип_массива [,] имя массива=new тип_массива [размер,размер]; //это двумерный массив

Трехмерный массив создается уже так:

тип_массива [ , ,] имя_массива=new тип_массива [размер1,размер2,размер3];

Ну и так далее. Обращаться к элементам многомерного массива нужно указывая сначала номер строки (это первый размер), а потом уже номер столбца:


Arr [2,5]=25; //присвоили пятому элементу второй строки массива значение 25.

Если вам не понятно, вспомните школьную арифметику. Вы искали там в таблице умножения по перекрестью нужных чисел. Здесь принцип тот же самый. Давайте в качестве закрепления материала напишем программу, которая заполняет двумерный массив числами из таблицы умножения:


int[,] table = new int[9, 9]; //создали массив 9 на 9

for (int i=0; i<9;i++)
for (int j = 0; j < 9; j++) //обходим столбцы

{

table[i, j] = i * j; //перемножаем индексы

}

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

В принципе, на этом можно считать элементарную часть по C# оконченной. В следующем занятии вы выполните небольшой практикум, а потом уже приступим к изучению ООП в C#.

<< Предыдущий урок                                      Следующий урок>>

Рубрика: Уроки по C#

Комментарии

20 комментариев на “Урок по C# №11: «Перечисления и многомерные массивы»”
  1. Safronik:

    Большое спасибо за это краткое изложение языка C#, всё было просто и понятно, жаль, что он не закончен. Не могли бы вы посоветовать, какую книгу по C# стоит читать для продолжения обучения? Но пока что буду ждать продолжения уроков, надеюсь, оно появится достаточно скоро.

    • Вячеслав "VeGA" Головлев:

      Спасибо за проявленный интерес к моим урокам. К сожалению, подобные отзывы крайни редки для подобных уроков. Часто приходилось задумываться над тем — а оно вообще нужно? Ведб только по моей задумке уроков по C# должно быть около 370. Все эти уроки нужно написать в том стиле, который будет максимально понятен читателю. Все это отнимает массу времени. А что на выхлопе? Даже комментарии пусты. Плюс мои уроки беспощадно воруют другие ресурсы.
      Если бы не все эти факторы, я бы уже давно закончил все представленные серии уроков по С++,C#,Ruby, Android, Java< Objective C. В итоге я пишу только тогда, когда либо делать абсолютно нечего, либо же под хорошим настроением. Я давал раньше ссылки на книги еще на первом уроке. Но вот мне начали жаловаться, что там либо заумно все написано, либо же материал идет в совершенно отличном от моего порядка изложения. В итоге мне пришлось убрать эти ссылки. Тем не менее, литературу нужно читать. Заглядывайте время от времени в рубрику "Чтиво". Там я буду приводить рекомендуемые книги.

      • Антон:

        Очень жаль, что уроки не обновляются. Придется искать альтернативные обучалки. Спасибо и на этом)

      • 7lito7:

        Большое спасибо за проделанную Вами работу!!!!

      • b_dlo:

        Огромное спасибо автору уроков, всё очень понятно, в хорошей последовательности! Мне очень понравились! Перелопатил кучу ресурсов по обучению. Нормальных уроков мало. Такое ощущение что все они написаны либо очень умными людьми, либо людьми которые сами ничего не понимают и пишут по текстам книг, либо специально что бы запутать. По крайней мере очень неумело и не с того начиная. Я хоть и могу читать такую литературу, но это очень неверно, неудобно и утомительно. И там многое не объясняется. Сухая терминология просто. И вот я думаю, что нормальных людей, которые могут что то донести, которые хотят этого, очень мало! Надо ценить таких людей. Таких как автор.

  2. Oleg:

    Сэнк ю все очень хороше описанно))) Вот тока коментарии добавить практически невозможно… Выбрать большой кружочек оч трудно, потому что выделить можно только первую колонку, а другие не выделяються!!!

  3. bolev:

    Спасибо за уроки! Представляю, что очень много труда потребовалось. Спасибо! Если настроение появится — пишите еще. Ждем очень

  4. brauny:

    замечательные уроки! изложено именно в том порядке, в котором ученик может усвоить информацию, примеры очень наглядные.
    если часть по ООП будет изложена так же, я может, даже одолею ООП) а то никак не дается

    • admin:

      ООП будет изложена в той же манере, что и предыдущие уроки. Это, так сказать, «фишка» серии этих уроков 🙂

  5. brauny:

    уроки супер! вот бы еще побольше. Может, я ООП наконец одолею

  6. Ololo:

    Подскажите как сделать массив ЦВЕТОВ (не их названий!!!) и как потом запихнуть это в label???

  7. Дмитрий:

    Еще раз Здравствуйте. Отлично исполненные уроки. Но лично у меня все же остаются вопросы… Так — как (может мой мозг так работает…) я начинаю что либо хорошо понимать только тогда, когда
    до меня доходит принципы работы, что от чего, зачем и почему. Наверно мне тяжело это объяснить текстом.
    Я работаю инженером по ремонту пк, ноутов, планшетов. В основном моя стезя в диагностики поломок, а ведь исходя от грамотной диагностики и начинается сам ремонт. Один из многих примеров: я практически досконально знаю как работают hdd и почему они ломаются. Как они устроены и т.д.

    Вот и здесь так же : возьмем N переменную… — как она работает, почему она именно так работает, откуда ее взяли и дали ей такие параметры работы, чтобы в последующем ее использовали программисты. Я основу основ не понимаю. И мои мысли сталкиваются с этим вопросом — получается Я оперирую массивом: переменных, константы, блоки, в общем кодом. А как он работает его принципы работы? Недопонимаю.

    Совет: напишите все свои уроки в приложении под андройд! Поверьте люди будут покупать. 100 — 300 рубликов достаточно. Это будет очень удобно. Запустил приложение и читаешь. Приехал на работу или домой и тут же провел практику.
    Вопрос берете обучать удаленно??? Хотя-бы по тому-же скайпу. Грамотного учителя с подходом к аудиторий крайне тяжело найти. Я в 2007 по java не мог найти. Забросил java после того как провел анализ языков. И выбрал C#. Но только сейчас серьезно начал изучать его.

    • admin:

      В принципе, насчет андроида (а также iOS) дельная мысль. Спасибо за подсказку. Насчет понимания основ попробуйте почитать мои уроки по c++, там я более разжевывал вводную часть.
      Насчет обучения, да, я обучаю удаленно. Все это можно обсудить.

  8. Natalya:

    Запись color.Red выдает ошибку. Обратиться к перечислению через его экземпляр не получается. Зато можно записать color = ConsColor.Green и получить его числовое значение
    Console.WriteLine(«Зеленому соответствует число » + (int)color); //120
    В остальном хорошо все расписано, читать приятно.

  9. Роман:

    Благодарю вас. Очень полезные и интересные занятия. Продолжайте в том же духе.

  10. Роман:

    Еще хочу спросить, в перечислении ConsColor все элементы кроме Green являются строковыми константами?

  11. МоХа:

    Огромное спасибо за понятные уроки!
    Ваши уроки третьи по счету, с которых я изучаю С#, и только в ваших хоть что-то понятно!
    Реально появилась большая тяга программировать, что-то пробовать написать самостоятельно!
    Спасибо за труды, продолжайте, пожалуйста, в том же духе!!!

  12. ученик:

    задание 1 без массивов

    static void Main(string[] args)
    {
    Console.WriteLine(«вывод чисел от 1 до n»);
    Console.WriteLine(«введите n: «);
    int n = Convert.ToInt32(Console.ReadLine());
    for (int i = 1; i < n; i++)
    {
    if (i%2==0) //проверка четности
    {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine(i);
    }

    else
    {
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine(i);
    }

    }
    Console.ResetColor();
    Console.WriteLine("\nнажмите аникей");
    Console.ReadKey(true);

Добавить комментарий

Внимание! Не будут добавляться комментарии в виде откровенного спама или прямого анкора на свои сайты. Все спамеры будут передаваться в базу Akismet

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: