Обучение C#

Формула программиста

основатель — Волосатов Евгений Витольдович
Поздравляю с 1 сентября! Система начисления Байтов работает.

Класс Console для работы с консолью

Для ввода-вывода текстовой информации в окно консоли, а также оформления консольного окна используется класс Console, определенный в пространстве имен System и обладающий набором статических свойств и методов.

Заголовок окна консоли

Для задания заголовка окна консоли используется свойство Title класса Console, которому присваивается текстовое значение. По умолчанию заголовок окна консоли представляет собой полный путь до исполняемого файла.
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.ReadKey();
      Console.Title = "Работа с консолью";
      Console.ReadKey();
    }
  }
}
image articles/513/513_1.png
image articles/513/513_2.png


Ввод-вывод

Наиболее часто используемыми являются методы чтения и записи информации.
Для вывода информации в окно консоли используются два основных метода
  • Write() — для вывода информации без перевода строки;
  • WriteLine() — для вывода информации с переводом строки.
В качестве аргумента этим функциям может передаваться текстовая строка для вывода, а также объект других стандартных типов данных, который по умолчанию будет преобразован к строковому представлению.

Для ввода текстовой информации из окна консоли используются методы
  • ReadLine(), который считывает строку текста из входного потока;
  • Read() – считывает следующий символ из входного потока.
Также для ввода информации в консоли может использоваться метод ReadKey(), который очень часто используется в конце программы для задержки окна консоли.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Title = "Работа с консолью";
      string s = Console.ReadLine();
      Console.WriteLine(s);
      Console.ReadKey();
    }
  }
}
image articles/513/513_3.png


Метод ReadKey() возвращает значение символа или нажатой функциональной клавиши, преобразованное к формату структуры ConsoleKeyInfo.
Структура ConsoleKeyInfo, в свою очередь, содержит 3 поля:
  • Key - ключ консоли, представленный текущим ConsoleKeyInfo объекта;
  • KeyChar - знак Юникода, представленный текущим ConsoleKeyInfo объекта;
  • Modifiers - побитовое значение, указывающее на одновременное удержание клавиш Alt, Ctrl, Shift при нажатии клавиши.
По умолчанию нажатая клавиша отображается в окне консоли, но отображение можно отключить, передав функции ReadKey() единственный аргумент с логическим значением true.
Рассмотрим пример вывода в консоль значений считанной клавиши до нажатия клавиши Esc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Title = "Работа с консолью";
      ConsoleKeyInfo key;
      do
      {
        key = Console.ReadKey(true);
        if ((key.Modifiers & ConsoleModifiers.Alt) != 0)
          Console.Write("Alt + ");
        if ((key.Modifiers & ConsoleModifiers.Shift) != 0)
          Console.Write("Shift + ");
        if ((key.Modifiers & ConsoleModifiers.Control) != 0)
          Console.Write("Ctrl + ");
        Console.WriteLine(key.Key.ToString() + " " + key.KeyChar.ToString());
      } while (key.Key != ConsoleKey.Escape);

    }
  }
}
image articles/513/513_4.png


Цветовое оформление консоли

Для изменения цветового оформления консоли используются следующие свойства класса Console:
  • BackgroundColor — для изменения фона под символами;
  • ForegroundColor — для изменения цвета самих символов.
Для того чтобы изменить цвет фона всего консольного окна необходимо установить требуемое значение параметра BackgroundColor и вызвать метод Clear() — очистка окна консоли.
Следующий пример перебирает и выводит на экран названия всех 16 цветов, используемых при работе с консолью.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Title = "Работа с консолью";
      ConsoleColor[] colors = (ConsoleColor[])ConsoleColor.GetValues(typeof(ConsoleColor));
      Console.BackgroundColor = ConsoleColor.Gray;
      Console.Clear();
      Console.ForegroundColor = ConsoleColor.Black;
      int count = 1;
      foreach (var color in colors)
      {
        Console.BackgroundColor = color;
        Console.Write("{0,3} ", count++);
        Console.BackgroundColor = ConsoleColor.Gray;
        Console.WriteLine(" " + color.ToString());
      }
      Console.ReadKey();
    }
  }
}
image articles/513/513_5.png


Размер окна и буфера консоли

По умолчанию размер окна консоли составляет 80 символов в ширину и 25 символов в высоту. Но этот размер можно изменить с помощью методов
  • WindowWidth – ширина окна консоли;
  • WindowHeight – высота окна консоли.
Однако кроме размеров окна консоли существует понятие размеров буфера консоли, который задается с помощью свойств
  • BufferWidth – ширина буфера;
  • BufferHeight – высота буфера.
Чтобы узнать значения этих свойств по умолчанию, выведем их в окно консоли

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Title = "Работа с консолью";
      Console.WriteLine("BufferWidth : " + Console.BufferWidth);
      Console.WriteLine("BufferHeight: " + Console.BufferHeight);
      Console.WriteLine("WindowWidth : " + Console.WindowWidth);
      Console.WriteLine("WindowHeight: " + Console.WindowWidth);
      Console.ReadKey();
    }
  }
}
image articles/513/513_6.png


Изменение видимых размеров окна позволяет увеличить или уменьшить его в процессе выполнения программы. Если размер буфера превышает размер видимого окна, то у окна появляются полосы прокрутки, позволяющие просматривать все содержимое буфера.
Например, вывод 100 символов '*' и вертикальной черты '|' в стандартном окне консоли будет выглядеть так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Title = "Работа с консолью";
      for (int i = 0; i < 100; i++)
        Console.Write("*");
      Console.WriteLine("|");
      Console.ReadKey();
    }
  }
}
image articles/513/513_8.png


Если мы увеличим размер буфера для ширины строки, то появится нижняя полоса прокрутки, и весь текст уместится в одну строку.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Title = "Работа с консолью";
      Console.BufferWidth = 105;
      for (int i = 0; i < 100; i++)
        Console.Write("*");
      Console.WriteLine("|");
      Console.ReadKey();
    }
  }
}
image articles/513/513_9.png


Аналогичным образом при выводе в окно консоли числа строк, превышающего размер буфера, сохранятся только последние выведенные строки в количестве, равном BufferHeight.

Перемещение курсора в окне консоли

Для перемещения курсора в окне консоли могут использоваться свойства
  • CursorLeft – задает или считывает позицию курсора слева в буферном окне;
  • CursorTop – задает или считывает позицию курсора сверху в буферном окне.
Для задания позиции курсора сразу по двум координатам используется метод SetCursorPosition(left, top).
Пример вывода символов в различных позициях курсора. Для наглядности между выводом символов введена задержка 200 мс.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Threading;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int[] x = new int[] { 2, 2, 3, 3, 4, 5, 5, 6, 6,
                 9, 9, 9, 9, 9,
                 12, 12, 12, 12, 12, 13, 13, 14, 14, 14,
                 17, 17, 17, 17, 17, 18, 18, 18, 19, 19,
                 22, 22, 22, 22, 22, 23, 23, 24, 24, 24, 24, 24,
                 27, 27, 28, 28, 28, 29, 29,
                 32, 32, 32, 32, 32, 33, 34, 34, 34, 34, 34,
                 37, 37, 37, 37, 38, 38, 39, 39, 39, 39,
                 42, 42, 42, 42, 42, 43, 43, 44, 44, 44,
                 47, 47, 47, 47, 47, 48, 48, 49};
      int[] y = new int[] { 2, 3, 4, 5, 6, 5, 4, 3, 2,
                 1, 3, 4, 5, 6,
                 2, 3, 4, 5, 6, 2, 6, 3, 4, 5,
                 2, 3, 4, 5, 6, 2, 4, 6, 2, 6,
                 2, 3, 4, 5, 6, 2, 6, 2, 3, 4, 5, 6,
                 3, 6, 2, 4, 6, 2, 5,
                 2, 3, 4, 5, 6, 4, 2, 3, 4, 5, 6,
                 3, 4, 5, 6, 2, 4, 3, 4, 5, 6,
                 2, 3, 4, 5, 6, 2, 4, 3, 5, 6,
                 2, 3, 4, 5, 6, 2, 4, 3};

      Console.BackgroundColor = ConsoleColor.Blue;
      Console.ForegroundColor = ConsoleColor.White;
      for(int i=0; i<x.Length; i++)
      {
        Console.SetCursorPosition(x[i], y[i]);
        Console.Write("*");
        Thread.Sleep(200);
      }
      Console.ReadKey();
    }
  }
}



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

Автор: Вставская Елена Владимировна

 
Написать комментарий:




Начинаем практику по языку C#





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.