Данные вопросы предназначены для САМОСТОЯТЕЛЬНОГО обучения.
Типы данных и переменные
Вопрос 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 вызывает его.