Урок 6. Последовательности и перечисления в C#

Лабораторные работы си шарп и задания по теме «Язык программирования c sharp: Перечисления и последовательности»

Урок № 6. C# Теория

  • Перечисление — это структура, которая позволяет создать переменную с фиксированным набором возможных значений. Наиболее распространенным примером является использование перечисления для определения дня недели. Есть только семь возможных значений для дней недели, и вы можете быть достаточно уверены, что эти значения никогда не изменятся.
  • Необходимо определять перечисления непосредственно в пространстве имен, чтобы все классы в этом пространстве имен имели к нему доступ, если это необходимо.
  • По умолчанию значения перечисления начинаются с 0, и каждый последующий элемент увеличивается на значение 1.
  • Создание и использование
  • Чтобы создать перечисление, вы объявляете его в файле кода со следующим синтаксисом, который демонстрирует создание перечисления с именем Day, содержащего дни недели:
  • enum Day { Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница,
    Суббота };

    По умолчанию значения перечисления начинаются с 0, и каждый последующий элемент увеличивается на значение 1:

    Воскресенье = 0
    Понедельник = 1
    Вторник = 2
    и т. д.
  • Вы можете изменить значение по умолчанию, указав начальное значение для вашего перечисления, как в следующем примере:
  • День перечисления { Воскресенье = 1, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота };
  • В этом примере воскресенье имеет значение 1 вместо значения по умолчанию 0. Теперь понедельник — 2, вторник — 3 и т.д.
  • Ключевое слово enum используется для указания «типа» переменной Day. В данном случае это тип перечисления.
  • Использование:

    // инициализируем переменную типа enum значением по имени 
    Day favoriteDay = Day.Friday;
    // инициализируем переменную типа enum значением по индексу 
    Day favoriteDay = (Day)4;

Последовательности

Для работы с последовательностями подключите две директивы:

using System.Collections.Generic;
using System.Linq;
Генераторы последовательностей

Пример: Генерация последовательности в указанном итнтервале:

Range (int start, int count);

start — The value of the first integer in the sequence.
count — The number of sequential integers to generate.

IEnumerable<int> seq; // definition
seq = System.Linq.Enumerable.Range(3, 10);
foreach (var x in seq)
    Console.Write($"{x} "); // 3 4 5 6 7 8 9 10 11 12
Генерация последовательностей с лямбда-выражениями:
Запрос Where

Пример: Сгенерировать последовательность целых чисел от 1 до 10, затем выбрать только четные числа данной последовательности:

IEnumerable<int> s;
s = Enumerable.Range(1, 10); // 1 2 3 4 5 6 7 8 9 10
s = s.Where(x => x % 2 == 0); //2 4 6 8 10
foreach (int num in s)
  {
    Console.WriteLine(num);
  }
Запрос Select

Пример: Сгенерировать последовательность целых чисел от 1 до 10 и вычислить квадраты этих чисел:

IEnumerable<int> squares;
squares=Enumerable.Range(1, 10).Select(x => x * x);
foreach (int num in squares)
  {
    Console.WriteLine(num);
  }

Пример: Последовательность чисел в интервале от 1 до 9 с правилом: (a+b)*2 (т.е. для первых двух чисел последовательности имеем (0+1)*2 = 2)

IEnumerable<int> seq;
seq= Enumerable.Range(1, 9).Select((a, b) => (a+b)*2);
foreach (int num in seq)
			{
				Console.Write(num); // 2 6 10 14 18 22 26 30 34
			}

Задания и лабораторные си шарп

Лабораторная работа 1. Перечисления

Выполнить: Попросите пользователя ввести отметку (значения 1, 2, 3, 4, 5). Проверьте введенное число, и распечатайте характеристику отметки (very_bad — 1, bad — 2, satisfactory — 3, good — 4, excellent — 5). А также необходимо вывести отметку соответствующую характеристике удовлетворительно (satisfactory).

Указание: Создайте функцию CheckMark с оператором switch, чтобы проверить введенную отметку.

Пример выполнения:

Введите отметку
2 
Характеристика отметки 2: bad
Отметка для satisfactory: 3

[Название проекта: Lesson_6Lab1, название файла L6Lab1.cs]

✍ Алгоритм:

  1. Создайте консольное приложение с именем Lesson_6Lab1.
  2. В окне Обозреватель решений (Solution Explorer) найдите файл Program.cs и переименуйте его в L6Lab1.cs.
  3. Подключите класс Console, чтобы постоянно не писать его название при обращении к его методам:
  4. ...
    using static System.Console;
    ...
    
  5. После открывающей скобки класса и непосредственно перед методом Main() введите следующий код для создания перечисления Marks, представляющего характеристики отметок:
  6. ...
    enum Marks { very_bad, bad, satisfactory, good, excellent, noSuchMark };
    ...
    
  7. В функцию Main() добавьте следующий код:
  8. ...
    int x = (int)Marks.satisfactory;
    Console.WriteLine($"And also the characteristic satisfactory is for: {x} mark");
    ...
    
  9. Этот код показывает два аспекта использования перечислений. Во-первых, можно исполльзовать предлагаемое автозаполнение и з выпадающего списка Marks.satisfactory. Во-вторых, можно использовать номер необходимого значения перечисления, сконвертировав его в тип int.
  10. Запустите приложение, щелкнув CTRL+F5.
  11. Под этим кодом добавьте код, в котором попросите пользователя ввести отметку (15):
  12. ...
    WriteLine("Please enter a number");
    int mark = int.Parse(ReadLine());
    ...
    
  13. Создайте свою функцию CheckMark с двумя параметрами: параметр mark типа int — вводимый параметр, и параметр characteristic с ключевым словом ref и типом данных Marks.
  14. static void CheckMark(int mark, ref Marks characteristic)
      {
      ...
      }
    
  15. В функцию добавьте оператор switch для проверки введенного числа и присваивания соответствующей характеристики переменной characteristic:
  16. switch (mark)
                {
                      case 1:
                        characteristic = Marks.very_bad;
                        break;
                      case 2:
                        characteristic = Marks.bad;
                        break;
                      case 3:
                        characteristic = Marks.satisfactory;
                        break;
                      case 4:
                        characteristic = Marks.good;
                        break;
                      case 5:
                        characteristic = Marks.excellent;
                        break;
                    default:
                        WriteLine("Invalid selection. Please select 1, 2, 3, 4 or 5.");
                        characteristic = Marks.noSuchMark;
                        break;
                }
    
  17. В функции main инициализируйте переменные, которые будут использоваться в качестве параметров функции:
  18. ...
            WriteLine("Введите отметку"); 
            int mark = int.Parse(ReadLine()); // этот код был
            Marks characteristic = Marks.very_bad; //нужно присвоить какое-то значение, неважно какое
    
  19. Вызовите функцию и посмотрите на результат:
  20. ...
       CheckMark(mark, ref characteristic);
       WriteLine($"The characteristic for {mark} is: {characteristic}");
    
  21. Запустите программу.
Задание 1:

Выполнить: Создайте консольное приложение Lesson_6Task1. Удалите полностью функцию Main из проекта. Скопируйте код из текстового файла и вставьте его в основной класс (class Program) созданного проекта. Следуйте всем тегам TODO и выполняйте то, что там написано. Убедитесь, что проект работает правильно.
  
Пример выполнения:

Введите день недели:
2
Вторник

  
[Название проекта: Lesson_6Task1, название файла L6Task1.cs]

Последовательности

Задание 2:

Выполнить: Создайте последовательность из N целых чисел, начинающихся с a. a и N — это натуральные числа.

 
Пример выполнения:

Введите натуральные числа N и a:
2
5
Результат:
2 3 4 5 6

  
[Название проекта: Lesson_6Task2, название файла L6Task2.cs]

Задание 3:

Выполнить: Дана последовательность целых чисел в диапазоне [-5;5]. Создайте запросы, чтобы отфильтровать элементы последовательности по следующим правилам:
1) положительные элементы последовательности
2) элементы, кратные 5
3) нечетные элементы последовательности.
Указание: Для выполнения заданий потребуется запрос вида:

... .Where(a => ...); 

  
Пример выполнения:

Последовательность:
-5 -4 -3 -2 -1 0 1 2 3 4 5
1) 1 2 3 4 5
2) -5 0 5
3) -5 -3 -1 1 3 5

[Название проекта: Lesson_6Task3, название файла L6Task3.cs]

Задание 4:

Выполнить: Создайте последовательность из 9 целых чисел в диапазоне [1,10]. Измените последовательность, сделав сдвиг элементов в диапазон [3,12].
Указание: Для выполнения задания потребуется запрос вида:

... .Select(a => ...); 

  
Пример выполнения:

1 2 3 4 5 6 7 8 9 10
Результат:
3 4 5 6 7 8 9 10 11 12

[Название проекта: Lesson_6Task4, название файла L6Task4.cs]