💀
Второй курс РПО
C#
C#
  • Типы данных и переменные
  • Массивы и списки
  • Управляющие конструкции
  • Методы
  • Классы и объекты
  • Инкапсуляция, наследование и полиморфизм
  • Интерфейсы
  • Обработка исключений
  • Работа с файлами
  • Делегаты и события
  • Краткие определения основных понятий
  • Вопросы с контрольной
  • Тестовые вопросы по темам
Powered by GitBook
On this page
  • Типы данных и переменные
  • Вопрос 1 (Новичок): Проверка типа переменной
  • Вопрос 2 (Средний): Использование const и readonly
  • Вопрос 3 (Продвинутый): Nullable типы
  • Массивы и списки
  • Вопрос 4 (Новичок): Создание массива
  • Вопрос 5 (Средний): Работа со списком
  • Вопрос 6 (Продвинутый): Многомерный массив
  • Управляющие конструкции
  • Вопрос 7 (Новичок): Проверка числа
  • Вопрос 8 (Средний): Цикл с шагом
  • Вопрос 9 (Продвинутый): Вложенные циклы
  • Методы
  • Вопрос 10 (Новичок): Простой метод
  • Вопрос 11 (Средний): Параметры out
  • Вопрос 12 (Продвинутый): Перегрузка методов
  • Классы и объекты
  • Вопрос 13 (Новичок): Простой класс
  • Вопрос 14 (Средний): Модификаторы доступа
  • Вопрос 15 (Продвинутый): Статический член
  • Инкапсуляция, наследование, полиморфизм
  • Вопрос 16 (Новичок): Инкапсуляция
  • Вопрос 17 (Средний): Наследование
  • Вопрос 18 (Продвинутый): Полиморфизм
  • Интерфейсы
  • Вопрос 19 (Новичок): Простой интерфейс
  • Вопрос 20 (Средний): Множественная реализация интерфейсов
  • Вопрос 21 (Продвинутый): Интерфейс и абстрактный класс
  • Обработка исключений
  • Вопрос 22 (Новичок): Простое исключение
  • Вопрос 23 (Средний): Пользовательское исключение
  • Вопрос 24 (Продвинутый): Блок finally
  • Работа с файлами
  • Вопрос 25 (Новичок): Чтение файла
  • Вопрос 26 (Средний): Запись строк
  • Вопрос 27 (Продвинутый): Подсчёт строк
  • Делегаты и события
  • Вопрос 28 (Новичок): Простой делегат
  • Вопрос 29 (Средний): Лямбда-выражение
  • Вопрос 30 (Продвинутый): Событие

Тестовые вопросы по темам

Данные вопросы предназначены для САМОСТОЯТЕЛЬНОГО обучения.

Типы данных и переменные

Вопрос 1 (Новичок): Проверка типа переменной

Условие: Напишите программу, которая запрашивает число с плавающей точкой и выводит его как double.

Подсказка: Используйте double.Parse для преобразования строки в double и Console.ReadLine для ввода.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        Write("Введите число: ");
        double number = double.Parse(ReadLine());
        WriteLine($"Введено: {number}"); // Например, Вывод: Введено: 3.14
    }
}

Пояснение: Программа запрашивает ввод строки, преобразует её в double с помощью double.Parse и выводит результат. double подходит для чисел с плавающей точкой.

Вопрос 2 (Средний): Использование const и readonly

Условие: Создайте класс с константой MaxScore и полем MinScore, которое можно задать только при создании объекта. Выведите оба значения.

Подсказка: Используйте const для неизменяемой константы и readonly для поля, задаваемого в конструкторе.

Ответ
using static System.Console;

class Game
{
    public const int MaxScore = 100;
    public readonly int MinScore;

    public Game(int minScore)
    {
        MinScore = minScore;
    }

    public void DisplayScores()
    {
        WriteLine($"Максимум: {MaxScore}, Минимум: {MinScore}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Game game = new Game(50);
        game.DisplayScores(); // Вывод: Максимум: 100, Минимум: 50
    }
}

Пояснение: const MaxScore задаёт неизменяемую константу, а readonly MinScore инициализируется в конструкторе. Метод DisplayScores выводит оба значения.

Вопрос 3 (Продвинутый): Nullable типы

Условие: Напишите программу, которая принимает nullable int? и выводит его квадрат, если значение задано, или "Не задано", если null.

Подсказка: Используйте ?. и ?? для обработки null, а также свойство HasValue.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        int? number = null;
        string result = number.HasValue ? (number.Value * number.Value).ToString() : "Не задано";
        WriteLine(result); // Вывод: Не задано

        number = 5;
        result = number.HasValue ? (number.Value * number.Value).ToString() : "Не задано";
        WriteLine(result); // Вывод: 25
    }
}

Пояснение: int? позволяет хранить null. Свойство HasValue проверяет, задано ли значение. Если true, вычисляем квадрат, иначе выводим "Не задано".

Массивы и списки

Вопрос 4 (Новичок): Создание массива

Условие: Создайте массив из 4 строк и выведите их в обратном порядке.

Подсказка: Используйте цикл for, начиная с последнего индекса.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        string[] words = { "один", "два", "три", "четыре" };
        for (int i = words.Length - 1; i >= 0; i--)
        {
            WriteLine(words[i]);
        }
        // Вывод: четыре, три, два, один
    }
}

Пояснение: Массив строк инициализируется с 4 элементами. Цикл for начинается с последнего индекса (Length - 1) и движется к 0, выводя элементы.

Вопрос 5 (Средний): Работа со списком

Условие: Создайте список целых чисел, добавьте 5 чисел, удалите чётные и выведите оставшиеся.

Подсказка: Используйте List<int>, метод RemoveAll с лямбда-выражением.

Ответ
using System.Collections.Generic;
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        numbers.RemoveAll(x => x % 2 == 0);
        foreach (int num in numbers)
        {
            WriteLine(num);
        }
        // Вывод: 1, 3, 5
    }
}

Пояснение: Список инициализируется с 5 числами. Метод RemoveAll удаляет элементы, для которых лямбда-выражение x => x % 2 == 0 возвращает true (чётные числа).

Вопрос 6 (Продвинутый): Многомерный массив

Условие: Создайте двумерный массив 3x3, заполните его числами от 1 до 9 и выведите сумму элементов главной диагонали.

Подсказка: Главная диагональ — элементы, где индексы строк и столбцов равны ([i,i]).

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        int[,] matrix = {
            { 1, 2, 3 },
            { 4, 5, 6 },
            { 7, 8, 9 }
        };
        int sum = 0;
        for (int i = 0; i < 3; i++)
        {
            sum += matrix[i, i];
        }
        WriteLine($"Сумма диагонали: {sum}"); // Вывод: Сумма диагонали: 15
    }
}

Пояснение: Двумерный массив 3x3 инициализируется числами. Цикл суммирует элементы matrix[i,i] (1 + 5 + 9 = 15).

Управляющие конструкции

Вопрос 7 (Новичок): Проверка числа

Условие: Напишите программу, которая запрашивает число и выводит, является ли оно положительным, отрицательным или нулём.

Подсказка: Используйте if-else для проверки условий.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        Write("Введите число: ");
        int number = int.Parse(ReadLine());
        if (number > 0)
        {
            WriteLine("Положительное");
        }
        else if (number < 0)
        {
            WriteLine("Отрицательное");
        }
        else
        {
            WriteLine("Ноль");
        }
    }
}

Пояснение: Программа запрашивает число и использует if-else для проверки трёх условий: больше 0, меньше 0 или равно 0.

Вопрос 8 (Средний): Цикл с шагом

Условие: Выведите все нечётные числа от 1 до 10 с помощью цикла for.

Подсказка: Используйте шаг 2 в цикле for или проверяйте чётность внутри цикла.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 1; i <= 10; i += 2)
        {
            WriteLine(i);
        }
        // Вывод: 1, 3, 5, 7, 9
    }
}

Пояснение: Цикл for начинается с 1 и увеличивает i на 2, чтобы выводить только нечётные числа.

Вопрос 9 (Продвинутый): Вложенные циклы

Условие: Выведите таблицу умножения 5x5 (от 1 до 5) в виде таблицы.

Подсказка: Используйте два вложенных цикла for и форматированный вывод.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 1; i <= 5; i++)
        {
            for (int j = 1; j <= 5; j++)
            {
                Write($"{i * j,4}");
            }
            WriteLine();
        }
    }
}

Пояснение: Внешний цикл перебирает строки, внутренний — столбцы. {i * j,4} форматирует вывод, чтобы числа выравнивались.

Методы

Вопрос 10 (Новичок): Простой метод

Условие: Напишите метод, который принимает строку и выводит её в верхнем регистре.

Подсказка: Используйте метод строки ToUpper().

Ответ
using static System.Console;

class Program
{
    static void PrintUpper(string text)
    {
        WriteLine(text.ToUpper());
    }

    static void Main(string[] args)
    {
        PrintUpper("привет"); // Вывод: ПРИВЕТ
    }
}

Пояснение: Метод PrintUpper принимает строку и использует ToUpper() для преобразования в верхний регистр.

Вопрос 11 (Средний): Параметры out

Условие: Напишите метод, который принимает число и возвращает его квадрат и куб через параметры out.

Подсказка: Используйте out для возврата нескольких значений.

Ответ
using static System.Console;

class Program
{
    static void CalculatePowers(int number, out int square, out int cube)
    {
        square = number * number;
        cube = number * number * number;
    }

    static void Main(string[] args)
    {
        CalculatePowers(3, out int square, out int cube);
        WriteLine($"Квадрат: {square}, Куб: {cube}"); // Вывод: Квадрат: 9, Куб: 27
    }
}

Пояснение: Метод CalculatePowers использует out для возврата двух значений, вычисляя квадрат и куб числа.

Вопрос 12 (Продвинутый): Перегрузка методов

Условие: Создайте два метода Add для сложения двух чисел (int) и трёх чисел (double).

Подсказка: Перегрузка методов использует одинаковые имена с разными параметрами.

Ответ
using static System.Console;

class Program
{
    static int Add(int a, int b)
    {
        return a + b;
    }

    static double Add(double a, double b, double c)
    {
        return a + b + c;
    }

    static void Main(string[] args)
    {
        WriteLine(Add(2, 3)); // Вывод: 5
        WriteLine(Add(1.5, 2.5, 3.5)); // Вывод: 7.5
    }
}

Пояснение: Два метода Add имеют разные сигнатуры: один принимает два int, другой — три double. Компилятор выбирает подходящий метод.

Классы и объекты

Вопрос 13 (Новичок): Простой класс

Условие: Создайте класс Book с полями Title и Author. Выведите информацию о книге.

Подсказка: Используйте свойства и метод для вывода.

Ответ
using static System.Console;

class Book
{
    public string Title { get; set; }
    public string Author { get; set; }

    public void DisplayInfo()
    {
        WriteLine($"Книга: {Title}, Автор: {Author}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Book book = new Book { Title = "Война и мир", Author = "Лев Толстой" };
        book.DisplayInfo(); // Вывод: Книга: Война и мир, Автор: Лев Толстой
    }
}

Пояснение: Класс Book использует автосвойства для хранения данных. Метод DisplayInfo выводит информацию.

Вопрос 14 (Средний): Модификаторы доступа

Условие: Создайте класс Person с приватным полем age и публичным свойством для доступа к нему. Проверьте возраст на корректность.

Подсказка: Используйте private для поля и свойство с проверкой в set.

Ответ
using static System.Console;

class Person
{
    private int age;

    public int Age
    {
        get { return age; }
        set
        {
            if (value >= 0)
                age = value;
            else
                WriteLine("Возраст не может быть отрицательным");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person();
        person.Age = 25;
        WriteLine(person.Age); // Вывод: 25
        person.Age = -5; // Вывод: Возраст не может быть отрицательным
    }
}

Пояснение: Приватное поле age защищено от прямого доступа. Свойство Age проверяет значение в set, предотвращая некорректные данные.

Вопрос 15 (Продвинутый): Статический член

Условие: Создайте класс Counter с статическим полем для подсчёта созданных объектов. Выведите количество объектов.

Подсказка: Используйте static поле и увеличивайте его в конструкторе.

Ответ
using static System.Console;

class Counter
{
    public static int Count = 0;

    public Counter()
    {
        Count++;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        WriteLine($"Создано объектов: {Counter.Count}"); // Вывод: Создано объектов: 2
    }
}

Пояснение: Статическое поле Count принадлежит классу и увеличивается в конструкторе при создании каждого объекта.

Инкапсуляция, наследование, полиморфизм

Вопрос 16 (Новичок): Инкапсуляция

Условие: Создайте класс BankAccount с приватным полем balance и публичным свойством для доступа. Запретите отрицательный баланс.

Подсказка: Используйте свойство с проверкой в set.

Ответ
using static System.Console;

class BankAccount
{
    private decimal balance;

    public decimal Balance
    {
        get { return balance; }
        set
        {
            if (value >= 0)
                balance = value;
            else
                WriteLine("Баланс не может быть отрицательным");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        BankAccount account = new BankAccount();
        account.Balance = 100;
        WriteLine(account.Balance); // Вывод: 100
        account.Balance = -50; // Вывод: Баланс не может быть отрицательным
    }
}

Пояснение: Приватное поле balance защищено, а свойство Balance проверяет значение, обеспечивая инкапсуляцию.

Вопрос 17 (Средний): Наследование

Условие: Создайте базовый класс Vehicle с методом Move и производный класс Bicycle, который переопределяет Move.

Подсказка: Используйте virtual и override для переопределения метода.

Ответ
using static System.Console;

class Vehicle
{
    public virtual void Move()
    {
        WriteLine("Транспорт движется");
    }
}

class Bicycle : Vehicle
{
    public override void Move()
    {
        WriteLine("Велосипед едет");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Vehicle bike = new Bicycle();
        bike.Move(); // Вывод: Велосипед едет
    }
}

Пояснение: Vehicle задаёт виртуальный метод Move. Класс Bicycle переопределяет его, реализуя специфичное поведение.

Вопрос 18 (Продвинутый): Полиморфизм

Условие: Создайте базовый класс Shape и два производных класса Rectangle и Circle. Реализуйте метод Area для каждого.

Подсказка: Используйте абстрактный класс с абстрактным методом Area.

Ответ
using static System.Console;

abstract class Shape
{
    public abstract double Area();
}

class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public Rectangle(double width, double height)
    {
        Width = width;
        Height = height;
    }

    public override double Area()
    {
        return Width * Height;
    }
}

class Circle : Shape
{
    public double Radius { get; set; }

    public Circle(double radius)
    {
        Radius = radius;
    }

    public override double Area()
    {
        return Math.PI * Radius * Radius;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Shape rect = new Rectangle(4, 5);
        Shape circle = new Circle(3);
        WriteLine($"Площадь прямоугольника: {rect.Area()}"); // Вывод: 20
        WriteLine($"Площадь круга: {circle.Area()}"); // Вывод: ~28.27
    }
}

Пояснение: Абстрактный класс Shape требует реализации метода Area. Производные классы вычисляют площадь по своим формулам, демонстрируя полиморфизм.

Интерфейсы

Вопрос 19 (Новичок): Простой интерфейс

Условие: Создайте интерфейс ISpeakable с методом Speak и реализуйте его в классе Person.

Подсказка: Используйте interface и реализуйте метод в классе.

Ответ
using static System.Console;

interface ISpeakable
{
    void Speak();
}

class Person : ISpeakable
{
    public void Speak()
    {
        WriteLine("Привет, я человек!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ISpeakable person = new Person();
        person.Speak(); // Вывод: Привет, я человек!
    }
}

Пояснение: Интерфейс ISpeakable задаёт метод Speak, который реализуется в классе Person.

Вопрос 20 (Средний): Множественная реализация интерфейсов

Условие: Создайте два интерфейса IMovable и IDisplayable и реализуйте их в классе Car.

Подсказка: Реализуйте оба интерфейса через запятую в объявлении класса.

Ответ
using static System.Console;

interface IMovable
{
    void Move();
}

interface IDisplayable
{
    void Display();
}

class Car : IMovable, IDisplayable
{
    public void Move()
    {
        WriteLine("Машина едет");
    }

    public void Display()
    {
        WriteLine("Это машина");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        car.Move(); // Вывод: Машина едет
        car.Display(); // Вывод: Это машина
    }
}

Пояснение: Класс Car реализует два интерфейса, предоставляя методы Move и Display.

Вопрос 21 (Продвинутый): Интерфейс и абстрактный класс

Условие: Создайте абстрактный класс Animal и интерфейс ISound. Реализуйте их в классе Dog.

Подсказка: Наследуйте класс от Animal и реализуйте интерфейс ISound.

Ответ
using static System.Console;

abstract class Animal
{
    public abstract void Eat();
}

interface ISound
{
    void MakeSound();
}

class Dog : Animal, ISound
{
    public override void Eat()
    {
        WriteLine("Собака ест");
    }

    public void MakeSound()
    {
        WriteLine("Гав!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog();
        dog.Eat(); // Вывод: Собака ест
        dog.MakeSound(); // Вывод: Гав!
    }
}

Пояснение: Класс Dog наследует абстрактный метод Eat от Animal и реализует метод MakeSound из интерфейса ISound.

Обработка исключений

Вопрос 22 (Новичок): Простое исключение

Условие: Напишите программу, которая запрашивает индекс массива и обрабатывает выход за границы.

Подсказка: Используйте try-catch с IndexOutOfRangeException.

Ответ
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        int[] numbers = { 1, 2, 3 };
        try
        {
            Write("Введите индекс: ");
            int index = int.Parse(ReadLine());
            WriteLine(numbers[index]);
        }
        catch (IndexOutOfRangeException)
        {
            WriteLine("Ошибка: индекс вне диапазона");
        }
    }
}

Пояснение: Программа запрашивает индекс и пытается получить элемент массива. Если индекс некорректен, catch обрабатывает исключение.

Вопрос 23 (Средний): Пользовательское исключение

Условие: Создайте исключение InvalidInputException и выбросьте его, если введённое число меньше 10.

Подсказка: Создайте класс исключения и используйте throw.

Ответ
using static System.Console;

class InvalidInputException : Exception
{
    public InvalidInputException(string message) : base(message) { }
}

class Program
{
    static void CheckNumber(int number)
    {
        if (number < 10)
            throw new InvalidInputException("Число должно быть >= 10");
        WriteLine($"Число: {number}");
    }

    static void Main(string[] args)
    {
        try
        {
            Write("Введите число: ");
            int number = int.Parse(ReadLine());
            CheckNumber(number);
        }
        catch (InvalidInputException ex)
        {
            WriteLine(ex.Message);
        }
    }
}

Пояснение: Пользовательское исключение создаётся через наследование от Exception. Метод CheckNumber выбрасывает его при некорректном вводе.

Вопрос 24 (Продвинутый): Блок finally

Условие: Напишите программу, которая пытается открыть файл и всегда выводит сообщение о завершении операции.

Подсказка: Используйте try, catch и finally с File.ReadAllText.

Ответ
using System.IO;
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string content = File.ReadAllText("nonexistent.txt");
            WriteLine(content);
        }
        catch (FileNotFoundException)
        {
            WriteLine("Файл не найден");
        }
        finally
        {
            WriteLine("Операция завершена");
        }
    }
}

Пояснение: Блок try пытается прочитать файл. Если файла нет, catch обрабатывает исключение. finally выполняется всегда, выводя сообщение.

Работа с файлами

Вопрос 25 (Новичок): Чтение файла

Условие: Прочитайте содержимое файла "data.txt" и выведите его.

Подсказка: Используйте File.ReadAllText из System.IO.

Ответ
using System.IO;
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string content = File.ReadAllText("data.txt");
            WriteLine(content);
        }
        catch (FileNotFoundException)
        {
            WriteLine("Файл не найден");
        }
    }
}

Пояснение: File.ReadAllText читает весь текст файла. Исключение обрабатывается, если файл отсутствует.

Вопрос 26 (Средний): Запись строк

Условие: Запишите в файл "numbers.txt" числа от 1 до 5, каждое на новой строке.

Подсказка: Используйте StreamWriter с using.

Ответ
using System.IO;
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        using (StreamWriter writer = new StreamWriter("numbers.txt"))
        {
            for (int i = 1; i <= 5; i++)
            {
                writer.WriteLine(i);
            }
        }
        WriteLine("Числа записаны");
    }
}

Пояснение: StreamWriter записывает числа построчно. using обеспечивает автоматическое закрытие файла.

Вопрос 27 (Продвинутый): Подсчёт строк

Условие: Прочитайте файл и выведите количество строк в нём.

Подсказка: Используйте File.ReadAllLines для получения массива строк.

Ответ
using System.IO;
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string[] lines = File.ReadAllLines("data.txt");
            WriteLine($"Количество строк: {lines.Length}");
        }
        catch (FileNotFoundException)
        {
            WriteLine("Файл не найден");
        }
    }
}

Пояснение: File.ReadAllLines возвращает массив строк, а свойство Length даёт их количество.

Делегаты и события

Вопрос 28 (Новичок): Простой делегат

Условие: Создайте делегат для метода, который выводит сообщение, и вызовите его.

Подсказка: Объявите делегат с помощью delegate и свяжите с методом.

Ответ
using static System.Console;

delegate void MessageDelegate(string message);

class Program
{
    static void ShowMessage(string message)
    {
        WriteLine(message);
    }

    static void Main(string[] args)
    {
        MessageDelegate del = ShowMessage;
        del("Привет, делегат!"); // Вывод: Привет, делегат!
    }
}

Пояснение: Делегат MessageDelegate ссылается на метод ShowMessage, который вызывается через делегат.

Вопрос 29 (Средний): Лямбда-выражение

Условие: Создайте делегат для умножения двух чисел и реализуйте его с помощью лямбда-выражения.

Подсказка: Используйте => для лямбда-выражения.

Ответ
using static System.Console;

delegate int MathOperation(int a, int b);

class Program
{
    static void Main(string[] args)
    {
        MathOperation multiply = (a, b) => a * b;
        WriteLine(multiply(4, 5)); // Вывод: 20
    }
}

Пояснение: Лямбда-выражение (a, b) => a * b реализует умножение двух чисел через делегат.

Вопрос 30 (Продвинутый): Событие

Условие: Создайте класс Timer с событием Tick, которое вызывается и выводит сообщение.

Подсказка: Используйте event с делегатом Action.

Ответ
using static System.Console;

class Timer
{
    public event Action Tick;

    public void Start()
    {
        Tick?.Invoke();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer();
        timer.Tick += () => WriteLine("Тик!");
        timer.Start(); // Вывод: Тик!
    }
}

Пояснение: Событие Tick объявлено с делегатом Action. Лямбда-выражение подписывается на событие, а метод Start вызывает его.

PreviousВопросы с контрольной

Last updated 7 days ago