кпияп
1 subscriber
1 file
26 links
Download Telegram
{Console.WriteLine(name);}
// Использование перечислителя напрямую
IEnumerator<string> enumerator = names.GetEnumerator();
while (enumerator.MoveNext())
{Console.WriteLine(enumerator.Current);}
В этом примере мы создаем список names и используем два способа перебора его элементов:
1. С помощью foreach loop, который использует перечислитель, предоставляемый коллекцией.
2. Напрямую, получая перечислитель с помощью метода GetEnumerator() и вызывая методы MoveNext() и Current для последовательного перебора элементов.
Благодаря перечислителям, взаимодействие с коллекциями в C# становится более удобным и безопасным, так как они скрывают сложность внутренней реализации коллекций и предоставляют единообразный интерфейс для их обхода.
46. Укажите назначение класса ArrayList. Перечислите и опишите основные свойства и методы этого класса, укажите их параметры.
Класс ArrayList в C# предназначен для хранения и управления динамическими массивами объектов. Он является реализацией интерфейса IList, который обеспечивает доступ к элементам массива по индексу.
Основные свойства и методы класса ArrayList:
1. Свойства:
- Capacity: Возвращает или задает максимальное количество элементов, которые может содержать ArrayList.
- Count: Возвращает количество элементов в ArrayList.
- IsFixedSize: Возвращает значение, указывающее, является ли ArrayList массивом фиксированного размера.
- IsReadOnly: Возвращает значение, указывающее, является ли ArrayList только для чтения.
- IsSynchronized: Возвращает значение, указывающее, защищен ли ArrayList от многопоточного доступа.
- SyncRoot: Возвращает объект, который может использоваться для синхронизации доступа к ArrayList.
2. Методы:
- Add(object): Добавляет объект в конец ArrayList.
- AddRange(ICollection): Добавляет коллекцию элементов в конец ArrayList.
- Clear(): Удаляет все элементы из ArrayList.
- Contains(object): Определяет, содержится ли заданный объект в ArrayList.
- Copy(Array, int): Копирует элементы ArrayList в массив, начиная с указанного индекса назначения.
- GetRange(int, int): Возвращает подраздел элементов ArrayList.
- IndexOf(object): Возвращает индекс первого вхождения заданного объекта в ArrayList.
- Insert(int, object): Вставляет объект в ArrayList по указанному индексу.
- InsertRange(int, ICollection): Вставляет коллекцию элементов в ArrayList по указанному индексу.
- LastIndexOf(object): Возвращает индекс последнего вхождения заданного объекта в ArrayList.
- Remove(object): Удаляет первое вхождение указанного объекта из ArrayList.
- RemoveAt(int): Удаляет элемент ArrayList по указанному индексу.
- RemoveRange(int, int): Удаляет подраздел элементов ArrayList.
- Reverse(): Обращает порядок элементов в ArrayList.
- SetRange(int, ICollection): Заменяет подраздел элементов ArrayList указанной коллекцией.
- Sort(): Сортирует элементы ArrayList.
- ToArray(): Копирует элементы ArrayList в новый массив.
Вот пример использования класса ArrayList:
// Создание ArrayList
ArrayList myList = new ArrayList();
// Добавление элементов
myList.Add("Apple");
myList.Add("Banana");
myList.Add("Cherry");
// Вставка элемента по индексу
myList.Insert(1, "Orange");
// Удаление элемента
myList.Remove("Cherry");
// Получение элемента по индексу
object item = myList[2];
// Перебор элементов
foreach (object obj in myList)
{Console.WriteLine(obj);}
47. Раскройте сущность понятия «многопоточность». Опишите основы многопоточной обработки, класс Thread, принципы работы с потоками.
Многопоточность (Multithreading) - это концепция в программировании, позволяющая приложению выполнять несколько задач одновременно. Она основана на использовании нескольких потоков исполнения (threads) внутри одного процесса.
Поток - это единица выполнения внутри процесса, которая имеет свой собственный стек, регистры процессора и другие ресурсы, необходимые для выполнения работы. Многопоточность позволяет приложению выполнять несколько задач параллельно, используя несколько потоков.
Основные преимущества многопоточности:
1. Повышение производительности: Многопоточность позволяет эффективно использовать ресурсы компьютера, особенно в случае многоядерных процессоров.
2. Отзывчивость интерфейса: Выполнение длительных операций в отдельном потоке позволяет предоставлять пользователю отзывчивый интерфейс.
3. Разделение задач: Многопоточность облегчает разделение приложения на независимые задачи, которые могут выполняться параллельно.
В C# основным классом для работы с потоками является System.Threading.Thread. Он предоставляет следующие ключевые методы и свойства:
1. Конструкторы:
- Thread(ThreadStart): Создает новый поток с указанной функцией запуска.
- Thread(ParameterizedThreadStart): Создает новый поток с указанной функцией запуска, принимающей аргумент.
2. Свойства:
- IsAlive: Возвращает значение, указывающее, выполняется ли поток.
- IsBackground: Возвращает или задает значение, указывающее, является ли поток фоновым.
- Priority: Возвращает или задает приоритет потока.
- ThreadState: Возвращает текущее состояние потока.
3. Методы:
- Start(): Запускает поток.
- Join(): Блокирует вызывающий поток до тех пор, пока выполнение текущего потока не завершится.
- Abort(): Прерывает выполнение потока.
- Sleep(int): Приостанавливает выполнение текущего потока на указанное количество миллисекунд.
- Yield(): Указывает, что текущий поток готов отдать управление другому потоку.
Пример создания и запуска потока:
// Определение функции, выполняемой потоком
void WorkerThreadFunction()
{Console.WriteLine("Worker thread started.");
// Выполнение работы
Thread.Sleep(2000); // Имитация длительной операции
Console.WriteLine("Worker thread finished.");}
// Создание потока и запуск
Thread workerThread = new Thread(WorkerThreadFunction);
workerThread.Start();
// Выполнение основного потока
Console.WriteLine("Main thread started.");
workerThread.Join(); // Ожидание завершения worker-потока
Console.WriteLine("Main thread finished.");
В этом примере мы создаем новый поток, вызывая конструктор Thread с функцией WorkerThreadFunction, которая будет выполняться в этом потоке. Затем мы запускаем поток с помощью метода Start() и ожидаем его завершения в основном потоке с помощью метода Join().
Многопоточность позволяет создавать более эффективные и отзывчивые приложения, однако она также требует внимательного подхода к синхронизации доступа к общим ресурсам во избежание возникновения проблем, таких как гонки за данными и взаимные блокировки.
48. Опишите процесс запуска непараметризованного и параметризованного потока. Укажите ограничения при запуске параметризованных потоков, и пути их решений. Приведите примеры.
Процесс запуска непараметризованного и параметризованного потока в C# выглядит следующим образом:
1. Непараметризованный поток:
- Определение функции, которая будет выполняться в потоке:
csharp void WorkerThreadFunction() { // Код, который будет выполняться в потоке }
- Создание экземпляра класса Thread и передача в конструктор делегата ThreadStart, указывающего на функцию, которую нужно выполнить в потоке:
csharp Thread workerThread = new Thread(WorkerThreadFunction);
- Запуск потока с помощью метода Start():
csharp workerThread.Start();
2. Параметризованный поток:
- Определение функции, которая будет выполняться в потоке, с параметром:
csharp void WorkerThreadFunction(object parameter) { // Код, который будет выполняться в потоке, используя переданный параметр }
- Создание экземпляра класса Thread и передача в конструктор делегата ParameterizedThreadStart, указывающего на функцию, которую нужно выполнить в потоке, а также объекта, который будет передан в качестве параметра:
csharp object parameter = "Hello, worker thread!"; Thread workerThread = new Thread(WorkerThreadFunction); workerThread.Start(parameter);
Ограничения при запуске параметризованных потоков:
1. Тип параметра: Передаваемый параметр должен быть объектного типа, так как метод ParameterizedThreadStart ожидает объект object в качестве параметра. Если нужно передать значение типа значимого типа (например, int), его необходимо упаковать в объектный тип, например, object.
2. Передача нескольких параметров: если необходимо передать несколько параметров в поток, их нужно объединить в один объект, например, в виде класса или структуры.
Пути решения ограничений:
1. Использование упаковки/распаковки: для передачи параметров значимых типов можно использовать упаковку в object и распаковку обратно в исходный тип.
2. Использование класса или структуры для группировки параметров: если необходимо передать несколько параметров, можно создать класс или структуру, содержащую эти параметры, и передавать экземпляр этого типа в качестве параметра.
// Определение структуры для группировки параметров
struct WorkerThreadParameters
{public int Value1;
public string Value2;}
// Определение функции, выполняемой в потоке
void WorkerThreadFunction(object parameters)
{WorkerThreadParameters p = (WorkerThreadParameters)parameters;
Console.WriteLine($"Worker thread received: {p.Value1}, {p.Value2}");
// Выполнение работы}
// Создание и запуск параметризованного потока
WorkerThreadParameters threadParams = new WorkerThreadParameters
{Value1 = 42,
Value2 = "Hello, worker thread!"};
Thread workerThread = new Thread(WorkerThreadFunction);
workerThread.Start(threadParams);
В этом примере мы определяем структуру WorkerThreadParameters для группировки параметров, передаваемых в поток. Затем мы создаем экземпляр этой структуры, передаем его в качестве параметра при запуске потока, и внутри потока распаковываем параметры и используем их.
49. Раскройте сущность понятия «синхронизация потоков». Опишите приемы синхронизации потоков в языке программирования С#. Приведите примеры.
Синхронизация потоков - это процесс координации выполнения нескольких потоков, чтобы они могли безопасно взаимодействовать друг с другом и избежать таких проблем, как гонки данных и взаимные блокировки.
В C# существует несколько механизмов синхронизации потоков:
1. lock-object.
Это самый простой способ синхронизации. Мы заводим объект, который будем использовать для блокировки параллельного выполнения какого-то участка кода.
 Применять стоит, когда нам нужно, чтобы какой-то участок кода в один момент времени выполнялся только одним потоком. Тут может быть любая работа с файлами, БД и другими ресурсами.
 Важно понимать, что lock работает на уровне приложения, а не ОС, поэтому другое приложение может спокойно занять наш ресурс.
 Еще следует помнить, что код в lock секции должен выполняться в рамках одного потока, поэтому мы не можем использовать внутри асинхронные вызовы.

2. Мьютексы (Mutexes):
Mutex. Используется для ограничения доступа к ресурсу на уровне ОС.
 Его может освободить только тот поток, который его занял.
 Подойдет для ограничения доступа к файлам.

3. SemaphoreSlim. Облегченная версия семафора. Сам семафор предоставляется ОС и используется для того, чтобы ограничить число одновременных пользователей ресурса.
1. Если использовать не слим версию, то можем использовать для межпроцессорной синхронизации, так как работает на уровне ОС.
2. Можем указать, сколько одновременно потоков могут работать с ресурсом. Полезно, если мы не хотим перегрузить его, например, при обращении к сетевой карте при REST-запросах.
3. Слим версия может быть асинхронной, что полезно для работы с файлами, к которым мы хотим ограничить доступ. На работе некоторые настройки сервисов мы храним в .json-файлах, для ограничения доступа к ним из нескольких потоков, мы используем слим версию и асинхронное ожидание.

4. AutoResetEvent.
Как и классы выше служит для синхронизации доступа к ресурсу.
1. Отличие в том, что позволяет управлять одним потоком из другого.
2. AutoResetEvent - автоматически возвращается в начальное состояние после сигнала
3. Из примера выше видно, что для подобных ситуаций сейчас проще использовать Task и async/await.
4. Еще существует ManualResetEvent, который требуется возвращать в исходное состояние самостоятельно.
5. Для более сложных сценариев существует EventWaitHandle.

5. Interlocked. Служит для произведения атомарных операций.
1. Подходит, если есть какая-то переменная, которую мы хотим атомарно изменять.
2. Еще с его помощью можно поставить флаг на какую-то часть кода, которую должен выполнять какой-то из потоков, но нам не важно какой. Тогда при первом входе в метод поток будет поднимать флаг через Interlocked, а другие потоки будут выходить из метода, когда будут видеть, что флаг уже поднят.

50. Раскройте сущность понятия «параллельное программирование». Опишите способы определения и запуска отдельной задачи. Приведите примеры.
Параллельное программирование - это подход к написанию программ, при котором несколько задач или процессов выполняются одновременно, используя доступные вычислительные ресурсы, такие как многоядерные процессоры или распределенные системы.
Основные преимущества параллельного программирования:
1. Повышение производительности: Распределение работы между несколькими процессорными ядрами или компьютерами может значительно ускорить выполнение задач.
2. Масштабируемость: Параллельные системы могут легко наращиваться, добавляя дополнительные вычислительные ресурсы.
3. Отзывчивость: Параллельное выполнение задач позволяет приложениям оставаться отзывчивыми, даже если некоторые задачи занимают длительное время.
В C# существуют различные способы определения и запуска отдельных задач:
1. Использование класса Task:
- Класс Task представляет единицу асинхронной работы, которая может выполняться параллельно.
- Пример определения и запуска задачи:
Task task = Task.Run(() =>
{
// Код, выполняемый в задаче
Console.WriteLine("Task is running...");
});
// Ожидание завершения задачи
task.Wait();
2. Использование методов расширения Task:
- Класс Task предоставляет ряд методов расширения для более удобной работы с задачами.
- Пример использования метода Task.WhenAll():
Task task1 = Task.Run(() => { /* Код задачи 1 / });
Task task2 = Task.Run(() => { / Код задачи 2 / });
Task task3 = Task.Run(() => { / Код задачи 3 */ });
// Ожидание завершения всех задач
Task.WhenAll(task1, task2, task3).Wait();
3. Использование класса Parallel:
- Класс Parallel предоставляет простой способ выполнения параллельных итераций.
- Пример параллельного выполнения цикла:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Parallel.ForEach(numbers, number =>
{
// Выполнение итерации в параллельном потоке
Console.WriteLine($"Number: {number}");
});
4. Использование PLINQ (Parallel LINQ):
- PLINQ позволяет выполнять запросы LINQ в параллельном режиме.
- Пример параллельного выполнения LINQ-запроса:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var parallelQuery = numbers.AsParallel().Where(n => n % 2 == 0);
foreach (var number in parallelQuery)
{Console.WriteLine($"Even number: {number}");}
Параллельное программирование позволяет использовать доступные вычислительные ресурсы более эффективно, что особенно важно для ресурсоемких задач. Однако оно также требует внимательного подхода к синхронизации, управлению ресурсами и обработке ошибок, чтобы избежать проблем, таких как гонки данных и взаимные блокировки.
51. Раскройте сущность понятия «параллельное программирование». Опишите приемы работы с классом Parallel. Приведите примеры.
Параллельное программирование - это подход к организации вычислений, при котором несколько задач или операций выполняются одновременно, используя доступные вычислительные ресурсы, такие как многоядерные процессоры или распределенные системы. Основная цель параллельного программирования - повышение производительности и эффективности использования вычислительных мощностей.
Класс Parallel в C# предоставляет простые и эффективные способы организации параллельных вычислений. Вот несколько приемов работы с классом Parallel:
1. Параллельный цикл Parallel.For():
- Позволяет выполнять итерации цикла в параллельном режиме.
- Пример: Parallel.For(0, 1000, i => { // Выполнение итерации в параллельном потоке Console.WriteLine($"Iteration: {i}"); });
2. Параллельный цикл Parallel.ForEach():
- Позволяет выполнять итерацию по коллекции в параллельном режиме.
- Пример:
var numbers = Enumerable.Range(1, 1000).ToArray();
Parallel.ForEach(numbers, number =>
{// Выполнение итерации в параллельном потоке
Console.WriteLine($"Number: {number}");});
3. Параллельное выполнение задач Parallel.Invoke():
- Позволяет выполнять несколько независимых задач в параллельном режиме.
- Пример:
```csharp
Parallel.Invoke(
() => DoSomeWork1(),
() => DoSomeWork2(),
() => DoSomeWork3()
);
void DoSomeWork1()
{// Выполнение задачи 1 в параллельном потоке}
void DoSomeWork2()
{// Выполнение задачи 2 в параллельном потоке}
void DoSomeWork3()
{ // Выполнение задачи 3 в параллельном потоке}
4. Настройка параллельных операций:
- Класс ParallelOptions позволяет настраивать параллельные операции, такие как ограничение степени параллелизма.
- Пример:
var options = new ParallelOptions
{MaxDegreeOfParallelism = 4 // Ограничение степени параллелизма до 4 потоков};
Parallel.ForEach(numbers, options, number =>
{// Выполнение итерации в параллельном потоке с учетом настроек
Console.WriteLine($"Number: {number}");});
5. Использование Partitioner для разделения данных:
- Partitioner позволяет разделять данные на части, чтобы они могли быть обработаны параллельно.
- Пример:
```csharp
var numbers = Enumerable.Range(1, 1000).ToArray();
var partitioner = Partitioner.Create(0, numbers.Length);
Parallel.ForEach(partitioner, (range, loopState) =>
{for (int i = range.Item1; i < range.Item2; i++)
{// Обработка части массива в параллельном потоке Console.WriteLine($"Number: {numbers[i]}");}});
Класс Parallel предоставляет простой и эффективный способ использования параллелизма в C#. Он помогает разработчикам легко распараллеливать вычисления, не вдаваясь в сложности низкоуровневого управления потоками. Это особенно полезно для ресурсоемких задач, где параллельное выполнение может значительно повысить производительность.
52. Объясните сущность графического интерфейса пользователя, SDI- и MDI-приложений, форм, контейнеров, элементов управления. Приведите примеры.
Графический интерфейс пользователя (Graphical User Interface, GUI) - это тип пользовательского интерфейса, в котором взаимодействие между пользователем и компьютером основано на графических элементах, таких как окна, кнопки, меню, списки, иконки и другие визуальные компоненты.
В контексте разработки приложений в C# существуют два основных типа GUI-приложений:
1. SDI (Single Document Interface) - приложения, в которых каждый документ открывается в отдельном окне. Пример: Microsoft Word, Notepad.
2. MDI (Multiple Document Interface) - приложения, в которых все документы открываются в рамках единого главного окна. Пример: Microsoft Excel, Visual Studio.
Основными элементами GUI-приложений являются:
1. Формы (Forms) - основные контейнеры для размещения элементов управления. Форма представляет собой окно, в котором располагаются различные элементы интерфейса.
2. Контейнеры (Containers) - элементы, в которых можно размещать другие элементы управления. Примеры: панели (Panels), таблицы (TableLayoutPanels), потоковые панели (FlowLayoutPanels).
3. Элементы управления (Controls) - интерактивные компоненты, с которыми пользователь может взаимодействовать. Примеры: кнопки (Buttons), текстовые поля (TextBoxes), выпадающие списки (ComboBoxes), флажки (CheckBoxes), переключатели (RadioButtons).
Вот пример простого GUI-приложения в C# с использованием Windows Forms:
using System.Windows.Forms;
public class MyForm : Form
{private Button button;
private Label label;
public MyForm()
{// Настройка формы
Text = "My GUI Application";
Size = new System.Drawing.Size(300, 200);
// Создание элементов управления
button = new Button();
button.Text = "Click me!";
button.Location = new System.Drawing.Point(100, 100);
button.Click += Button_Click;
label = new Label();
label.Text = "Hello, GUI!";
label.Location = new System.Drawing.Point(100, 50);
// Добавление элементов на форму
Controls.Add(button);
Controls.Add(label);}
private void Button_Click(object sender, System.EventArgs e)
{label.Text = "Button was clicked!";}
static void Main()
{Application.Run(new MyForm());}}
В этом примере мы создаем форму, добавляем на нее кнопку и метку, а затем запускаем приложение. При нажатии на кнопку, текст метки изменится.
Графический интерфейс пользователя играет ключевую роль в создании современных, интуитивно понятных и удобных приложений. Использование SDI- и MDI-архитектур, форм, контейнеров и элементов управления позволяет разработчикам создавать богатые, интерактивные и визуально привлекательные пользовательские интерфейсы.
53. Опишите создание GUI-приложений, родительской и дочерних форм, изменение их свойств, организацию взаимодействия между формами. Приведите примеры.
Создание GUI-приложений в C# с использованием Windows Forms включает в себя следующие основные шаги:
1. Создание родительской формы:
- Добавьте новую форму в проект.
- Установите основные свойства формы, такие как размер, заголовок, фон и т.д.
- Разместите на форме необходимые элементы управления (кнопки, текстовые поля, метки и т.д.).
2. Создание дочерних форм:
- Добавьте новую форму в проект.
- Установите свойства дочерней формы, например, сделайте ее модальной или не модальной.
- Разместите на дочерней форме элементы управления, необходимые для взаимодействия с пользователем.
3. Организация взаимодействия между формами:
- Из родительской формы вызывайте дочернюю форму, передавая при необходимости данные.
- Используйте события, чтобы обрабатывать взаимодействие пользователя с дочерней формой (например, нажатие кнопок) и возвращать данные обратно в родительскую форму.

54. Опишите создание элементов управления, меню, панелей инструментов, строки состояния, изменение их свойств. Приведите примеры.
Создание элементов управления, меню, панелей инструментов и строки состояния в GUI-приложениях на основе Windows Forms в C# включает в себя следующие основные шаги:
1. Создание элементов управления:
- Перетащите необходимые элементы управления (кнопки, текстовые поля, списки и т.д.) из панели "Элементы управления" на форму.
- Установите необходимые свойства элементов управления, такие как размер, расположение, текст, шрифт, цвет и т.д.
- Подключите обработчики событий для реагирования на действия пользователя.
Пример создания кнопки и текстового поля:
Button button = new Button();
button.Text = "Click me!";
button.Location = new Point(50, 50);
button.Click += Button_Click;
TextBox textBox = new TextBox();
textBox.Location = new Point(50, 100);
textBox.Size = new Size(200, 20);
2. Создание меню:
- Создайте главное меню с помощью компонента MenuStrip.
- Добавьте пункты меню и подменю, установите их свойства и обработчики событий.
Пример создания главного меню с пунктом "Файл" и подменю "Новый" и "Выход":
MenuStrip menuStrip = new MenuStrip();
ToolStripMenuItem fileMenu = new ToolStripMenuItem("File");
ToolStripMenuItem newMenuItem = new ToolStripMenuItem("New");
ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("Exit");
fileMenu.DropDownItems.Add(newMenuItem);
fileMenu.DropDownItems.Add(exitMenuItem);
menuStrip.Items.Add(fileMenu);
3. Создание панели инструментов:
- Создайте панель инструментов с помощью компонента ToolStrip.
- Добавьте кнопки, выпадающие списки и другие элементы управления на панель инструментов.
Пример создания панели инструментов с кнопками "Сохранить" и "Печать":
ToolStrip toolStrip = new ToolStrip();
ToolStripButton saveButton = new ToolStripButton("Save");
ToolStripButton printButton = new ToolStripButton("Print");
toolStrip.Items.Add(saveButton);
toolStrip.Items.Add(printButton);
4. Создание строки состояния:
- Добавьте строку состояния с помощью компонента StatusStrip.
- Создайте элементы для строки состояния, такие как метки и индикаторы.
Пример создания строки состояния с двумя текстовыми полями:
StatusStrip statusStrip = new StatusStrip();
ToolStripStatusLabel statusLabel1 = new ToolStripStatusLabel("Ready");
ToolStripStatusLabel statusLabel2 = new ToolStripStatusLabel("Coordinates: 0, 0");
statusStrip.Items.Add(statusLabel1);
statusStrip.Items.Add(statusLabel2);
Во всех этих примерах вы можете изменять свойства элементов, такие как текст, размер, расположение, цвет и т.д., чтобы настроить внешний вид и поведение элементов управления, меню, панелей инструментов и строки состояния в соответствии с требованиями вашего приложения.
55. Опишите приемы рисования, вывода и анимации изображений на языке программирования С#. Приведите примеры.
Рисование, вывод и анимация изображений в C# можно реализовать с помощью технологии Windows Presentation Foundation (WPF). WPF предоставляет богатые возможности для работы с графикой и анимацией в GUI-приложениях.
1. Рисование изображений:
Одним из способов построения двухмерной графики в окне - это использование фигур. Фигуры фактически являются обычными элементами как например кнопка или текстовое поле. К фигурам относят такие элементы как Polygon (Многоугольник), Ellipse (овал), Rectangle (прямоугольник), Line (обычная линия), Polyline (несколько связанных линий). Все они наследуются от абстрактного базового класса System.Windows.Shapes.Shape:.


2. Вывод изображений
3. Анимация изображений:
- Используйте ImageAnimationBehavior для воспроизведения анимированных GIF-изображений.
- Создайте BitmapImage с несколькими кадрами для отображения анимированного изображения.
- Установите BitmapImage в качестве источника изображения Image.
Пример:
<Image x:Name="myImage">
<Image.Source>
<BitmapImage x:Name="myBitmapImage" CreateOptions="IgnoreColorProfile" CacheOption="OnLoad">
<BitmapImage.UriSource>
<Uri>animated-image.gif</Uri>
</BitmapImage.UriSource>
</BitmapImage>
</Image.Source>
</Image>
4. Использование графических эффектов:
- Применяйте различные визуальные эффекты, такие как тени, размытие, блики и т.д., используя Effect элемента Image.
- Создавайте пользовательские эффекты, используя ShaderEffect.
Пример:
<Image Source="image.png">
<Image.Effect>
<DropShadowEffect ShadowDepth="10" Color="#80000000" />
</Image.Effect>
</Image>
5. Управление изображениями программно:
- Используйте BitmapImage для загрузки и отображения изображений.
- Применяйте различные операции, такие как масштабирование, поворот и обрезка, используя классы TransformedBitmap и CroppedBitmap.
- Создавайте анимированные изображения с помощью BitmapImage и JpegBitmapEncoder.
Пример:
// Загрузка изображения
BitmapImage image = new BitmapImage(new Uri("image.png", UriKind.Relative));
// Масштабирование изображения
TransformedBitmap scaledImage = new TransformedBitmap(image, new ScaleTransform(0.5, 0.5));
// Отображение изображения
myImage.Source = scaledImage;
Эти примеры демонстрируют основные приемы работы с изображениями в WPF-приложениях на C#. Вы можете расширять эти возможности, используя дополнительные классы и методы для более сложных операций с графикой и анимацией.
56. Раскройте сущность технологии ADO.NET. Опишите процесс подключения к базе данных, выполнение операторов SQL по выборке данных. Приведите примеры.
ADO.NET - это технология .NET Framework, которая предоставляет набор классов для работы с данными из различных источников, включая реляционные базы данных. ADO.NET позволяет подключаться к базам данных, выполнять SQL-запросы, управлять транзакциями и обрабатывать полученные данные.
Процесс подключения к базе данных и выполнение SQL-операторов с использованием ADO.NET включает в себя следующие основные шаги:
1. Подключение к базе данных:
- Выберите провайдер базы данных (например, SqlClient для Microsoft SQL Server, OleDbClient для MS Access, OdbcClient для работы с ODBC-источниками).
- Создайте объект SqlConnection или OleDbConnection и укажите строку подключения.
- Откройте соединение с помощью метода Open().
Пример подключения к базе данных Microsoft SQL Server:
string connectionString = "Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
2. Выполнение SQL-запроса:
- Создайте объект SqlCommand или OleDbCommand для выполнения SQL-оператора.
- Укажите SQL-запрос и, при необходимости, передайте параметры.
- Вызовите метод ExecuteReader() для выполнения SELECT-запроса.
- Обработайте полученные данные с помощью SqlDataReader или OleDbDataReader.
Пример выполнения SELECT-запроса:
string queryString = "SELECT * FROM Employees WHERE EmployeeID = @EmployeeID";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@EmployeeID", 1);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{int id = reader.GetInt32(0);
string name = reader.GetString(1);
Console.WriteLine($"ID: {id}, Name: {name}");}
reader.Close();
3. Выполнение INSERT, UPDATE, DELETE:
- Создайте объект SqlCommand или OleDbCommand для выполнения SQL-оператора.
- Укажите SQL-запрос и, при необходимости, передайте параметры.
- Вызовите метод ExecuteNonQuery() для выполнения запроса.
Пример выполнения INSERT-запроса:
string queryString = "INSERT INTO Employees (Name) VALUES (@Name)";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@Name", "John Doe");
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected} row(s) affected.");
4. Управление транзакциями:
- Начните транзакцию с помощью метода BeginTransaction().
- Выполните необходимые SQL-операции внутри транзакции.
- Завершите транзакцию, вызвав Commit() или Rollback().
Пример использования транзакций:
using (SqlTransaction transaction = connection.BeginTransaction())
{try
{// Выполнение SQL-операций внутри транзакции
string queryString1 = "INSERT INTO Employees (Name) VALUES (@Name1)";
SqlCommand command1 = new SqlCommand(queryString1, connection, transaction);
command1.Parameters.AddWithValue("@Name1", "John Doe");
command1.ExecuteNonQuery();
string queryString2 = "INSERT INTO Employees (Name) VALUES (@Name2)";
SqlCommand command2 = new SqlCommand(queryString2, connection, transaction);
command2.Parameters.AddWithValue("@Name2", "Jane Smith");
command2.ExecuteNonQuery();
transaction.Commit();
Console.WriteLine("Transaction committed.");}
catch (Exception ex)
{transaction.Rollback();
Console.WriteLine($"Transaction rolled back: {ex.Message}");}}
57. Раскройте сущность технологии ADO.NET. Опишите выполнение операторов SQL по модификации, вставке и удалению записей в наборе данных. Приведите примеры.
ADO.NET - это технология .NET Framework, которая предоставляет набор классов для работы с данными из различных источников, включая реляционные базы данных. ADO.NET позволяет выполнять операции с данными, такие как модификация, вставка и удаление записей.
Выполнение SQL-операторов для модификации, вставки и удаления данных с использованием ADO.NET включает в себя следующие основные шаги:
1. Модификация записей:
- Создайте объект SqlCommand или OleDbCommand для выполнения SQL-оператора UPDATE.
- Укажите SQL-запрос и передайте параметры для обновляемых полей.
- Вызовите метод ExecuteNonQuery() для выполнения запроса.
Пример обновления записи:
string queryString = "UPDATE Employees SET Name = @Name WHERE EmployeeID = @EmployeeID";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@Name", "John Smith");
command.Parameters.AddWithValue("@EmployeeID", 1);
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected} row(s) updated.");
2. Вставка записей:
- Создайте объект SqlCommand или OleDbCommand для выполнения SQL-оператора INSERT.
- Укажите SQL-запрос и передайте параметры для вставляемых полей.
- Вызовите метод ExecuteNonQuery() для выполнения запроса.
Пример вставки записи:
string queryString = "INSERT INTO Employees (Name, Department) VALUES (@Name, @Department)";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@Name", "Jane Doe");
command.Parameters.AddWithValue("@Department", "Sales");
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected} row(s) inserted.");
3. Удаление записей:
- Создайте объект SqlCommand или OleDbCommand для выполнения SQL-оператора DELETE.
- Укажите SQL-запрос и передайте параметры для удаляемых записей.
- Вызовите метод ExecuteNonQuery() для выполнения запроса.
Пример удаления записи:
string queryString = "DELETE FROM Employees WHERE EmployeeID = @EmployeeID";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@EmployeeID", 1);
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected} row(s) deleted.");
Также ADO.NET предоставляет возможность работать с наборами данных, представленными объектами DataSet и DataTable. Это позволяет выполнять операции с данными в памяти и синхронизировать изменения с базой данных.
Пример работы с DataTable:
DataTable table = new DataTable("Employees");
table.Columns.Add("EmployeeID", typeof(int));
table.Columns.Add("Name", typeof(string));
DataRow row1 = table.NewRow();
row1["EmployeeID"] = 1;
row1["Name"] = "John Doe";
table.Rows.Add(row1);
DataRow row2 = table.NewRow();
row2["EmployeeID"] = 2;
row2["Name"] = "Jane Smith";
table.Rows.Add(row2);
// Модификация, вставка и удаление записей в DataTable
table.Rows[0]["Name"] = "John Smith";
table.Rows.Add(new object[] { 3, "David Johnson" });
table.Rows[1].Delete();
// Обновление данных в базе данных
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Employees", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Update(table);
Эти примеры демонстрируют основные возможности ADO.NET для выполнения операций с данными, таких как модификация, вставка и удаление записей. Вы можете использовать эти принципы для создания приложений, взаимодействующих с различными источниками данных.
58. Опишите методы развертывания и технологию создания инсталляционных программ.
Развертывание программного обеспечения - это процесс установки и настройки приложения на целевых серверах или компьютерах. Существует несколько распространенных методов развертывания, каждый из которых имеет свои особенности и преимущества:
Существует несколько основных методов развертывания:
1. Ручная установка. Это самый простой, но трудоемкий подход, когда пользователь или системный администратор вручную копирует и настраивает все необходимые файлы, библиотеки, конфигурации и т.д. Подходит для небольших программ с минимальными требованиями.
2. Использование установщиков (инсталляторов). Это специальные программы, которые автоматизируют процесс установки. Они упаковывают все компоненты программы в один дистрибутив и предоставляют интерфейс для простой установки на целевом компьютере. Популярные примеры - Microsoft Installer (MSI), NSIS, Inno Setup.
3. Развертывание через системы управления конфигурациями. Здесь используются специальные средства, такие как Puppet, Ansible, Chef, которые позволяют объявлять, развертывать и управлять всей инфраструктурой в виде кода. Это особенно полезно для сложных систем с множеством зависимостей.
4. Контейнеризация. Приложения упаковываются в контейнеры (например, Docker), которые включают в себя все необходимые зависимости. При развертывании контейнеры быстро разворачиваются на целевых системах.
Создание инсталятора.








Практический блок

I. Составьте программу на языке программирования C#:
1. Создать класс Edition с функциями, позволяющими вывести на экран информацию об издании, а также определить, является ли данное издание искомым.
2. Создать производные классы: Book (название, фамилия автора, год издания, издательство), Article (название, фамилия автора, название журнала, его номер и год издания), OnlineResource (название, фамилия автора, ссылка, аннотация). Разработать конструкторы класса, свойства для доступа к поля классам, переопределить методы базового класса.
3. Создать каталог (массив) из n изданий, вывести полную информацию из каталога, организовать поиск изданий по фамилии автора, организовать поиск наиболее древнего издания.
4. Организовать ввод данных с клавиатуры, предусмотреть обработку исключительных ситуаций, возникающих при вводе данных.
using System;
using System.Collections.Generic;
using System.Linq;
class Edition
{
public string Title { get; set; }
public string AuthorLastName { get; set; }
public Edition(string title, string authorLastName)
{
Title = title;
AuthorLastName = authorLastName;
}
public virtual void PrintInfo()
{
Console.WriteLine($"Название: {Title}, Автор: {AuthorLastName}");
}
public virtual bool IsMatch(string searchTerm)
{
return AuthorLastName.Equals(searchTerm, StringComparison.OrdinalIgnoreCase);
}
}
class Book : Edition
{
public int Year { get; set; }
public string Publisher { get; set; }

public Book(string ti tle, string authorLastName, int year, string publisher)
: base(title, authorLastName)
{
Year = year;
Publisher = publisher;
}

public override void PrintInfo()
{
base.PrintInfo();
Console.WriteLine($"Год издания: {Year}, Издательство: {Publisher}");
}
}
class Article : Edition
{
public string JournalName { get; set; }
public int JournalNumber { get; set; }
public int Year { get; set; }

public Article(string title, string authorLastName, string journalName, int journalNumber, int year)
: base(title, authorLastName)
{
JournalName = journalName;
JournalNumber = journalNumber;
Year = year;
}
public override void PrintInfo()
{
base.PrintInfo();
Console.WriteLine($"Журнал: {JournalName}, Номер: {JournalNumber}, Год: {Year}");
}
}
class OnlineResource : Edition
{
public string Link { get; set; }
public string Annotation { get; set; }
public OnlineResource(string title, string authorLastName, string link, string annotation)
: base(title, authorLastName)
{
Link = link;
Annotation = annotation;
}

public override void PrintInfo()
{
base.PrintInfo();
Console.WriteLine($"Ссылка: {Link}, Аннотация: {Annotation}");
}
}
class Program
{
static void Main()
{
List<Edition> catalog = new List<Edition>();
while (true)
{
Console.WriteLine("Выберите тип издания: 1 - Книга, 2 - Статья, 3 - Онлайн-ресурс, 0 - Завершить ввод");
int choice;
if (!int.TryParse(Console.ReadLine(), out choice) choice < 0 choice > 3)
{
Console.WriteLine("Неправильный ввод. Пожалуйста, введите число от 0 до 3.");
continue;
}
if (choice == 0)
{
break;
}
try
{
Console.Write("Введите название: ");
string title = Console.ReadLine();
Console.Write("Введите фамилию автора: ");
string authorLastName = Console.ReadLine();
if (choice == 1)
{
Console.Write("Введите год издания: ");
int year = int.Parse(Console.ReadLine());

Console.Write("Введите издательство: ");
string publisher = Console.ReadLine();

catalog.Add(new Book(title, authorLastName, year, publisher));
}
else if (choice == 2)
{
Console.Write("Введите название журнала: ");
string journalName = Console.ReadLine();
Console.Write("Введите номер журнала: ");
int journalNumber = int.Parse(Console.ReadLine());
Console.Write("Введите год издания: ");
int year = int.Parse(Console.ReadLine());
catalog.Add(new Article(title, authorLastName, journalName, journalNumber, year));
}
else if (choice == 3)
{
Console.Write("Введите ссылку: ");
string link = Console.ReadLine();
Console.Write("Введите аннотацию: ");
string annotation = Console.ReadLine();
catalog.Add(new OnlineResource(title, authorLastName, link, annotation));
}
}
catch (FormatException e)
{
Console.WriteLine("Ошибка ввода данных: " + e.Message);
}
}
Console.WriteLine("\nКаталог изданий:");
foreach (var edition in catalog)
{
edition.PrintInfo();
Console.WriteLine();
}
Console.Write("\nВведите фамилию автора для поиска: ");
string searchAuthor = Console.ReadLine();
var foundEditions = catalog.Where(e => e.IsMatch(searchAuthor)).ToList();
if (foundEditions.Any())
{
Console.WriteLine("\nНайденные издания:");
foreach (var edition in foundEditions)
{
edition.PrintInfo();
Console.WriteLine();
}
}
else
{
Console.WriteLine("Издания с таким автором не найдены.");
}
var oldestEdition = catalog.OfType<Book>()
.Concat<Edition>(catalog.OfType<Article>())
.OrderBy(e => e is Book book ? book.Year : ((Article)e).Year)
.FirstOrDefault();
if (oldestEdition != null)
{
Console.WriteLine("\nСамое древнее издание:");
oldestEdition.PrintInfo();
}
else
{
Console.WriteLine("В каталоге нет книг или статей.");
}
}
}
II. Составьте программу на языке программирования C#:
1. Создать класс Transport с функциями, позволяющими вывести на экран информацию о транспортном средстве, а также определить грузоподъемность транспортного средства.
2. Создать производные классы: Car (марка, номер, скорость, грузоподъемность), Motorbike (марка, номер, скорость, грузоподъемность, наличие коляски, при этом если коляска отсутствует, то грузоподъемность равна 0), Truck (марка, номер, скорость, грузоподъемность, наличие прицепа, при этом если есть прицеп, то грузоподъемность увеличивается в два раза). Разработать конструкторы класса, свойства для доступа к поля классам, переопределить методы базового класса.
3. Создать базу (массив) из n машин, вывести полную информацию из базы на экран, организовать поиск машин, удовлетворяющих требованиям грузоподъемности, организовать поиск наименее скоростного транспортного средства.
4. Организовать ввод данных с клавиатуры, предусмотреть обработку исключительных ситуаций, возникающих при вводе данных.
using System;
using System.Collections.Generic;
class Transport
{
public string Brand { get; set; }
public string Number { get; set; }
public int Speed { get; set; }
public int Capacity { get; set; }
public Transport(string brand, string number, int speed, int capacity)
{
Brand = brand;
Number = number;
Speed = speed;
Capacity = capacity;
}
public virtual void DisplayInfo()
{
Console.WriteLine($"Марка: {Brand}, Номер: {Number}, Скорость: {Speed} км/ч, Грузоподъемность: {Capacity} кг");
}
public virtual int GetCapacity()
{
return Capacity;
}
}
class Car : Transport
{
public Car(string brand, string number, int speed, int capacity) : base(brand, number, speed, capacity)
{
}
public override void DisplayInfo()
{
base.DisplayInfo();
}
}
class Motorbike : Transport
{
public bool HasSidecar { get; set; }
public Motorbike(string brand, string number, int speed, int capacity, bool hasSidecar) : base(brand, number, speed, capacity)
{
HasSidecar = hasSidecar;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Наличие коляски: {(HasSidecar ? "Есть" : "Нет")}");
}
public override int GetCapacity()
{
return HasSidecar ? base.GetCapacity() : 0;
}
}
class Truck : Transport
{
public bool HasTrailer { get; set; }
public Truck(string brand, string number, int speed, int capacity, bool hasTrailer) : base(brand, number, speed, capacity)
{
HasTrailer = hasTrailer;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Наличие прицепа: {(HasTrailer ? "Есть" : "Нет")}");
}
public override int GetCapacity()
{
return HasTrailer ? base.GetCapacity() * 2 : base.GetCapacity();
}
}
class Program
{
static void Main()
{
List<Transport> transports = new List<Transport>();
try
{
Console.Write("Введите количество транспортных средств: ");
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
Console.WriteLine($"Транспортное средство {i + 1}:");
Console.Write("Введите тип (Car, Motorbike, Truck): ");
string type = Console.ReadLine();
Console.Write("Введите марку: ");
string brand = Console.ReadLine();
Console.Write("Введите номер: ");
string number = Console.ReadLine();
Console.Write("Введите скорость: ");
int speed = int.Parse(Console.ReadLine());
Console.Write("Введите грузоподъемность: ");
int capacity = int.Parse(Console.ReadLine());
switch (type.ToLower())
{
case "car":
transports.Add(new Car(brand, number, speed, capacity));
break;
case "motorbike":
Console.Write("Наличие коляски (true/false): ");
bool hasSidecar = bool.Parse(Console.ReadLine());
transports.Add(new Motorbike(brand, number, speed, capacity, hasSidecar));
break;
case "truck":
Console.Write("Наличие прицепа (true/false): ");
bool hasTrailer = bool.Parse(Console.ReadLine());
transports.Add(new Truck(brand, number, speed, capacity, hasTrailer));
break;
default:
Console.WriteLine("Неверный тип транспортного средства.");
break;
}
}
}
catch (FormatException)
{
Console.WriteLine("Ошибка ввода данных. Пожалуйста, введите корректные значения.");
}
Console.WriteLine("\nПолная информация о транспортных средствах:");
foreach (var transport in transports)
{
transport.DisplayInfo();
Console.WriteLine();
}
Console.Write("Введите минимальную требуемую грузоподъемность: ");
int requiredCapacity = int.Parse(Console.ReadLine());
Console.WriteLine("\nТранспортные средства, удовлетворяющие требованиям грузоподъемности:");
foreach (var transport in transports)
{
if (transport.GetCapacity() >= requiredCapacity)
{
transport.DisplayInfo();
Console.WriteLine();
}
}
Transport slowestTransport = transports[0];
foreach (var transport in transports)
{
if (transport.Speed < slowestTransport.Speed)
{
slowestTransport = transport;
}
}
Console.WriteLine("\nНаименее скоростное транспортное средство:");
slowestTransport.DisplayInfo();
}
}
III. Составьте программу на языке программирования C#:
1. Создать класс Persona с функциями, позволяющими вывести на экран информацию о персоне, а также определить ее возраст (на момент текущей даты).
2. Создать производные классы: Enrollee (фамилия, дата рождения, факультет), Student (фамилия, дата рождения, факультет, курс), Teacher (фамилия, дата рождения, факультет, должность, стаж). Разработать конструкторы класса, свойства для доступа к поля классам, переопределить методы базового класса.
3. Создать базу (массив) из n персон, вывести полную информацию из базы на экран, организовать поиск персон, чей возраст попадает в заданный диапазон, организовать поиск преподавателей с наибольшим стажем работы.
4. Организовать ввод данных с клавиатуры, предусмотреть обработку исключительных ситуаций, возникающих при вводе данных.
using System;
using System.Collections.Generic;
using System.Linq;
class Persona
{
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
public Persona(string lastName, DateTime birthDate)
{
LastName = lastName;
BirthDate = birthDate;
}
public virtual void DisplayInfo()
{
Console.WriteLine($"Фамилия: {LastName}, Дата рождения: {BirthDate.ToShortDateString()}");
}
public int GetAge()
{
DateTime now = DateTime.Now;
int age = now.Year - BirthDate.Year;
if (now < BirthDate.AddYears(age))
age--;
return age;
}
}
class Enrollee : Persona
{
public string Faculty { get; set; }
public Enrollee(string lastName, DateTime birthDate, string faculty)
: base(lastName, birthDate)
{
Faculty = faculty;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Факультет: {Faculty}");
}
}
class Student : Enrollee
{
public int Course { get; set; }
public Student(string lastName, DateTime birthDate, string faculty, int course)
: base(lastName, birthDate, faculty)
{
Course = course;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Курс: {Course}");
}
}
class Teacher : Persona
{
public string Faculty { get; set; }
public string Position { get; set; }
public int Experience { get; set; }
public Teacher(string lastName, DateTime birthDate, string faculty, string position, int experience)
: base(lastName, birthDate)
{
Faculty = faculty;
Position = position;
Experience = experience;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Факультет: {Faculty}, Должность: {Position}, Стаж: {Experience} лет");
}
}
class Program
{
static void Main(string[] args)
{
List<Persona> persons = new List<Persona>();
persons.Add(new Enrollee("Иванов", new DateTime(2003, 5, 12), "Физико-математический"));
persons.Add(new Student("Петров", new DateTime(2000, 8, 25), "Химический", 3));
persons.Add(new Teacher("Сидоров", new DateTime(1975, 3, 10), "Физико-математический", "Доцент", 20));
Console.WriteLine("Полная информация о персонах:");
foreach (var person in persons)
{
person.DisplayInfo();
Console.WriteLine($"Возраст: {person.GetAge()} лет\n");
}
Console.WriteLine("Поиск персон, чей возраст попадает в заданный диапазон:");
int minAge = 20;
int maxAge = 50;
var personsInRange = persons.Where(p => p.GetAge() >= minAge && p.GetAge() <= maxAge);
foreach (var person in personsInRange)
{
person.DisplayInfo();
Console.WriteLine();
}
Console.WriteLine("Поиск преподавателей с наибольшим стажем работы:");
var maxExperienceTeachers = persons.OfType<Teacher>().OrderByDescending(t => t.Experience).Take(1);
foreach (var teacher in maxExperienceTeachers)
{
teacher.DisplayInfo();
Console.WriteLine();
}
}
}
IV. Составьте программу на языке программирования C#:
1. Создать класс Goods с функциями, позволяющими вывести на экран информацию о товаре, а также определить, соответствует ли он сроку годности на текущую дату.
2. Создать производные классы: Product (название, цена, дата производства, срок годности), Party (название, цена, количество шт, дата производства, срок годности), Kit (название, цена, перечень продуктов). Разработать конструкторы класса, свойства для доступа к поля классам, переопределить методы базового класса.
3. Создать базу (массив) из n товаров, вывести полную информацию из базы на экран, организовать поиск просроченного товара (на момент текущей даты), организовать поиск самого дешевого товара.
4. Организовать ввод данных с клавиатуры, предусмотреть обработку исключительных ситуаций, возникающих при вводе данных.
using System;
using System.Collections.Generic;
using System.Linq;
namespace GoodsApp
{
public class Goods
{
public string Name { get; set; }
public decimal Price { get; set; }
public virtual void DisplayInfo()
{
Console.WriteLine($"Название: {Name}, Цена: {Price:C}");
}
public virtual bool IsExpired()
{
return false;
}
}
public class Product : Goods
{
public DateTime ProductionDate { get; set; }
public TimeSpan ShelfLife { get; set; }
public Product(string name, decimal price, DateTime productionDate, TimeSpan shelfLife)
{
Name = name;
Price = price;
ProductionDate = productionDate;
ShelfLife = shelfLife;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Дата производства: {ProductionDate.ToShortDateString()}, Срок годности: {ShelfLife.Days} дней");
}
public override bool IsExpired()
{
return DateTime.Now > ProductionDate + ShelfLife;
}
}
public class Party : Goods
{
public int Quantity { get; set; }
public DateTime ProductionDate { get; set; }
public TimeSpan ShelfLife { get; set; }
public Party(string name, decimal price, int quantity, DateTime productionDate, TimeSpan shelfLife)
{
Name = name;
Price = price;
Quantity = quantity;
ProductionDate = productionDate;
ShelfLife = shelfLife;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine($"Количество: {Quantity}, Дата производства: {ProductionDate.ToShortDateString()}, Срок годности: {ShelfLife.Days} дней");
}
public override bool IsExpired()
{
return DateTime.Now > ProductionDate + ShelfLife;
}
}
public class Kit : Goods
{
public List<Product> Products { get; set; }
public Kit(string name, decimal price, List<Product> products)
{
Name = name;
Price = price;
Products = products;
}
public override void DisplayInfo()
{
base.DisplayInfo();
Console.WriteLine("Состав набора:");
foreach (var product in Products)
{
product.DisplayInfo();
}
}
public override bool IsExpired()
{
return Products.Any(product => product.IsExpired());
}
}
class Program
{
static void Main(string[] args)
{
List<Goods> goodsList = new List<Goods>();
try
{
Console.Write("Введите количество товаров: ");
int n = int.Parse(Console.ReadLine());

for (int i = 0; i < n; i++)
{
Console.WriteLine($"Введите данные для товара {i + 1}");
Console.Write("Тип товара (1 - Product, 2 - Party, 3 - Kit): ");
int type = int.Parse(Console.ReadLine());

Console.Write("Название: ");
string name = Console.ReadLine();

Console.Write("Цена: ");
decimal price = decimal.Parse(Console.ReadLine());

if (type == 1)
{
Console.Write("Дата производства (гггг-мм-дд): ");
DateTime productionDate = DateTime.Parse(Console.ReadLine());

Console.Write("Срок годности (в днях): ");
int shelfLifeDays = int.Parse(Console.ReadLine());

goodsList.Add(new Product(name, price, productionDate, TimeSpan.FromDays(shelfLifeDays)));
}
else if (type == 2)
{
Console.Write("Количество: ");
int quantity = int.Parse(Console.ReadLine());

Console.Write("Дата производства (гггг-мм-дд): ");
DateTime productionDate = DateTime.Parse(Console.ReadLine());

Console.Write("Срок годности (в днях): ");
int shelfLifeDays = int.Parse(Console.ReadLine());

goodsList.Add(new Party(name, price, quantity, productionDate, TimeSpan.FromDays(shelfLifeDays)));
}
else if (type == 3)
{
List<Product> products = new List<Product>();
Console.Write("Количество продуктов в наборе: ");
int productCount = int.Parse(Console.ReadLine());

for (int j = 0; j < productCount; j++)
{
Console.WriteLine($"Введите данные для продукта {j + 1} в наборе");
Console.Write("Название: ");
string productName = Console.ReadLine();

Console.Write("Цена: ");
decimal productPrice = decimal.Parse(Console.ReadLine());
Console.Write("Дата производства (гггг-мм-дд): ");
DateTime productProductionDate = DateTime.Parse(Console.ReadLine());

Console.Write("Срок годности (в днях): ");
int productShelfLifeDays = int.Parse(Console.ReadLine());

products.Add(new Product(productName, productPrice, productProductionDate, TimeSpan.FromDays(productShelfLifeDays)));
}

goodsList.Add(new Kit(name, price, products));
}
else
{
Console.WriteLine("Неверный тип товара. Повторите ввод.");
i--;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка ввода: {ex.Message}");
return;
}
Console.WriteLine("\nПолная информация о товарах:");
foreach (var goods in goodsList)
{
goods.DisplayInfo();
Console.WriteLine();
}
Console.WriteLine("Просроченные товары:");
foreach (var goods in goodsList.Where(g => g.IsExpired()))
{
goods.DisplayInfo();
Console.WriteLine();
}
var cheapestGoods = goodsList.OrderBy(g => g.Price).FirstOrDefault();
if (cheapestGoods != null)
{
Console.WriteLine("Самый дешевый товар:");
cheapestGoods.DisplayInfo();
}
else
{
Console.WriteLine("Товары не найдены.");
}
}
}
}
V. Составьте программу на языке программирования C#:
1. Создать класс Client с функциями, позволяющими вывести на экран информацию о клиентах банка, а также определить соответствие клиента критерию поиска.
2. Создать производные классы: Depositor (фамилия, дата открытия вклада, размер вклада, процент по вкладу), Credited (фамилия, дата выдачи кредита, размер кредита, процент по кредиту, остаток долга), Organization (название, дата открытия счета, номер счета, сумма на счету). Разработать конструкторы класса, свойства для доступа к поля классам, переопределить методы базового класса.
3. Создать базу (массив) из n клиентов, вывести полную информацию из базы на экран, организовать поиск клиентов, начавших сотрудничать с банком с заданной даты, организовать поиск организации с наибольшей суммой средств на счету.
4. Организовать ввод данных с клавиатуры, предусмотреть обработку исключительных ситуаций, возникающих при вводе данных.
using System;
using System.Collections.Generic;
using System.Linq;
public abstract class Client
{
public string Name { get; set; }
public Client(string name)
{
Name = name;
}
public abstract void DisplayInfo();
public abstract bool MatchesCriteria(DateTime date);
}
public class Depositor : Client
{
public DateTime DepositDate { get; set; }
public decimal DepositAmount { get; set; }
public double InterestRate { get; set; }
public Depositor(string name, DateTime depositDate, decimal depositAmount, double interestRate)
: base(name)
{
DepositDate = depositDate;
DepositAmount = depositAmount;
InterestRate = interestRate;
}
public override void DisplayInfo()
{
Console.WriteLine($"Вкладчик: {Name}, Дата открытия вклада: {DepositDate.ToShortDateString()}, Размер вклада: {DepositAmount}, Процент по вкладу: {InterestRate}%");
}
public override bool MatchesCriteria(DateTime date)
{
return DepositDate >= date;
}
}
public class Credited : Client
{
public DateTime CreditDate { get; set; }
public decimal CreditAmount { get; set; }
public double InterestRate { get; set; }
public decimal RemainingDebt { get; set; }
public Credited(string name, DateTime creditDate, decimal creditAmount, double interestRate, decimal remainingDebt)
: base(name)
{
CreditDate = creditDate;
CreditAmount = creditAmount;
InterestRate = interestRate;
RemainingDebt = remainingDebt;
}
public override void DisplayInfo()
{
Console.WriteLine($"Кредитополучатель: {Name}, Дата выдачи кредита: {CreditDate.ToShortDateString()}, Размер кредита: {CreditAmount}, Процент по кредиту: {InterestRate}%, Остаток долга: {RemainingDebt}");
}
public override bool MatchesCriteria(DateTime date)
{
return CreditDate >= date;
}
}
public class Organization : Client
{
public DateTime AccountOpenDate { get; set; }
public string AccountNumber { get; set; }
public decimal AccountBalance { get; set; }
public Organization(string name, DateTime accountOpenDate, string accountNumber, decimal accountBalance)
: base(name)
{
AccountOpenDate = accountOpenDate;
AccountNumber = accountNumber;
AccountBalance = accountBalance;
}
public override void DisplayInfo()
{
Console.WriteLine($"Организация: {Name}, Дата открытия счета: {AccountOpenDate.ToShortDateString()}, Номер счета: {AccountNumber}, Сумма на счету: {AccountBalance}");
}
public override bool MatchesCriteria(DateTime date)
{
return AccountOpenDate >= date;
}
}
class Program
{
static void Main(string[] args)
{
List<Client> clients = new List<Client>
{
new Depositor("Иванов", new DateTime(2022, 1, 15), 10000m, 5.5),
new Credited("Петров", new DateTime(2023, 3, 10), 50000m, 15, 25000m),
new Organization("TechCorp", new DateTime(2021, 5, 5), "1234567890", 200000m)
};
Console.WriteLine("Все клиенты:");
foreach (var client in clients)
{
client.DisplayInfo();
}
DateTime searchDate = new DateTime(2022, 1, 1);
Console.WriteLine($"\nКлиенты, начавшие сотрудничество после {searchDate.ToShortDateString()}:");
foreach (var client in clients.Where(c => c.MatchesCriteria(searchDate)))
{
client.DisplayInfo();
}
var richestOrganization = clients.OfType<Organization>().OrderByDescending(o => o.AccountBalance).FirstOrDefault();
if (richestOrganization != null)
{
Console.WriteLine("\nОрганизация с наибольшей суммой на счету:");
richestOrganization.DisplayInfo();
}
else
{
Console.WriteLine("\nОрганизаций не найдено.");
}
}
}
VI. В одномерном массиве, состоящем из n вещественных элементов (предусмотреть ввод значения переменной n с клавиатуры), вычислить:
- сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами.
Элементы массива сгенерировать случайным образом. Реализовать вывод элементов массива на консоль и в текстовый файл. Нахождение суммы и произведения оформить в виде отдельных методов, выполняющихся в разных потоках. Результаты работы программы вывести на консоль и в текстовый файл. Реализовать обработку исключительных ситуаций, возникающих во время выполнения программы.
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("Введите количество элементов массива (n): ");
int n = int.Parse(Console.ReadLine());
double[] array = GenerateRandomArray(n);
Console.WriteLine("Сгенерированный массив:");
foreach (var item in array)
{
Console.WriteLine(item);
}
string filePath = "array.txt";
File.WriteAllLines(filePath, array.Select(x => x.ToString()));

Task<double> sumTask = Task.Run(() => SumNegativeElements(array));
Task<double> productTask = Task.Run(() => ProductBetweenMaxMin(array));

Task.WaitAll(sumTask, productTask);
double sumOfNegatives = sumTask.Result;
double productBetweenMaxMin = productTask.Result;

Console.WriteLine($"Сумма отрицательных элементов: {sumOfNegatives}");
Console.WriteLine($"Произведение элементов между максимальным и минимальным элементами: {productBetweenMaxMin}");

string resultFilePath = "results.txt";
File.WriteAllText(resultFilePath,
$"Сумма отрицательных элементов: {sumOfNegatives}\n" +
$"Произведение элементов между максимальным и минимальным элементами: {productBetweenMaxMin}");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
static double[] GenerateRandomArray(int n)
{
Random rand = new Random();
double[] array = new double[n];
for (int i = 0; i < n; i++)
{
array[i] = rand.NextDouble() * 200 - 100;
}
return array;
}
static double SumNegativeElements(double[] array)
{
return array.Where(x => x < 0).Sum();
}
static double ProductBetweenMaxMin(double[] array)
{
if (array.Length < 2) return 0;

int maxIndex = Array.IndexOf(array, array.Max());
int minIndex = Array.IndexOf(array, array.Min());
if (maxIndex > minIndex)
{
var temp = maxIndex;
maxIndex = minIndex;
minIndex = temp;
}
double product = 1;
for (int i = maxIndex + 1; i < minIndex; i++)
{
product *= array[i];
}
return product;
}
}
VII. В одномерном массиве, состоящем из n целочисленных элементов (предусмотреть ввод значения переменной n с клавиатуры), вычислить:
- сумму положительных элементов массива;
- произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Элементы массива сгенерировать случайным образом. Реализовать вывод элементов массива на консоль и в текстовый файл. Нахождение суммы и произведения оформить в виде отдельных методов, выполняющихся в разных потоках. Результаты работы программы вывести на консоль и в текстовый файл. Реализовать обработку исключительных ситуаций, возникающих во время выполнения программы.
using System;
using System.IO;
using System.Linq;
using System.Threading;
class Program
{
static int[] array;
static int sumPositive;
static long productBetweenMaxMin;
static void Main()
{
try
{
Console.Write("Введите размер массива n: ");
int n = int.Parse(Console.ReadLine());
array = new int[n];
Random rand = new Random();
for (int i = 0; i < n; i++)
{
array[i] = rand.Next(-100, 101);
}
Console.WriteLine("Сгенерированный массив:");
Console.WriteLine(string.Join(", ", array));
File.WriteAllText("array.txt", string.Join(", ", array));
Thread sumThread = new Thread(ComputeSumPositive);
Thread productThread = new Thread(ComputeProductBetweenMaxMin);
sumThread.Start();
productThread.Start();
sumThread.Join();
productThread.Join();
Console.WriteLine($"Сумма положительных элементов: {sumPositive}");
Console.WriteLine($"Произведение элементов между максимальным и минимальным по модулю элементами: {productBetweenMaxMin}");
using (StreamWriter writer = new StreamWriter("results.txt"))
{
writer.WriteLine($"Сумма положительных элементов: {sumPositive}");
writer.WriteLine($"Произведение элементов между максимальным и минимальным по модулю элементами: {productBetweenMaxMin}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Произошла ошибка: {ex.Message}");
}
}
static void ComputeSumPositive()
{
sumPositive = array.Where(x => x > 0).Sum();
}
static void ComputeProductBetweenMaxMin()
{
int maxAbs = array.Select((value, index) => new { value, index })
.OrderByDescending(x => Math.Abs(x.value))
.First().index;

int minAbs = array.Select((value, index) => new { value, index })
.OrderBy(x => Math.Abs(x.value))
.First().index;
if (maxAbs > minAbs)
{
int temp = maxAbs;
maxAbs = minAbs;
minAbs = temp;
}
productBetweenMaxMin = 1;
for (int i = maxAbs + 1; i < minAbs; i++)
{
productBetweenMaxMin *= array[i];
}
if (maxAbs + 1 == minAbs)
{
productBetweenMaxMin = 0;
}
}
}
VIII. В одномерном массиве, состоящем из n целочисленных элементов (предусмотреть ввод значения переменной n с клавиатуры), вычислить:
- произведение элементов массива с четными номерами;
- сумму элементов массива, расположенных между первым и последним нулевыми элементами.
Элементы массива сгенерировать случайным образом. Реализовать вывод элементов массива на консоль и в текстовый файл. Нахождение произведения и суммы оформить в виде отдельных методов, выполняющихся в разных потоках. Результаты работы программы вывести на консоль и в текстовый файл. Реализовать обработку исключительных ситуаций, возникающих во время выполнения программы.
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("Введите количество элементов массива (n): ");
int n = int.Parse(Console.ReadLine());
int[] array = GenerateRandomArray(n);
PrintArray(array);
WriteArrayToFile(array, "array.txt");
Task<long> productTask = Task.Run(() => CalculateProductOfEvenIndexedElements(array));
Task<int> sumTask = Task.Run(() => CalculateSumBetweenFirstAndLastZeros(array));
Task.WaitAll(productTask, sumTask);
long product = productTask.Result;
int sum = sumTask.Result;
Console.WriteLine($"Произведение элементов массива с четными номерами: {product}");
Console.WriteLine($"Сумма элементов массива между первым и последним нулевыми элементами: {sum}");
WriteResultsToFile(product, sum, "results.txt");
}
catch (FormatException ex)
{
Console.WriteLine("Ошибка: введено некорректное значение. " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
}
static int[] GenerateRandomArray(int n)
{
Random rand = new Random();
int[] array = new int[n];
for (int i = 0; i < n; i++)
{
array[i] = rand.Next(-10, 10);
}
return array;
}
static void PrintArray(int[] array)
{
Console.WriteLine("Массив:");
foreach (int element in array)
{
Console.Write(element + " ");
}
Console.WriteLine();
}
static void WriteArrayToFile(int[] array, string fileName)
{
using (StreamWriter writer = new StreamWriter(fileName))
{
foreach (int element in array)
{
writer.Write(element + " ");
}
}
}
static long CalculateProductOfEvenIndexedElements(int[] array)
{
long product = 1;
for (int i = 0; i < array.Length; i += 2)
{
product *= array[i];
}
return product;
}
static int CalculateSumBetweenFirstAndLastZeros(int[] array)
{
int firstZeroIndex = Array.IndexOf(array, 0);
int lastZeroIndex = Array.LastIndexOf(array, 0);
if (firstZeroIndex == -1 lastZeroIndex == -1 firstZeroIndex == lastZeroIndex)
{
return 0;
}
int sum = 0;
for (int i = firstZeroIndex + 1; i < lastZeroIndex; i++)
{
sum += array[i];
}
return sum;
}
static void WriteResultsToFile(long product, int sum, string fileName)
{
using (StreamWriter writer = new StreamWriter(fileName))
{
writer.WriteLine($"Произведение элементов массива с четными номерами: {product}");
writer.WriteLine($"Сумма элементов массива между первым и последним нулевыми элементами: {sum}");
}
}
}
IX. В одномерном массиве, состоящем из n вещественных элементов (предусмотреть ввод значения переменной n с клавиатуры), вычислить:
- сумму элементов массива с нечетными номерами;
- сумму элементов массива, расположенных между первым и последним отрицательными элементами.
Элементы массива сгенерировать случайным образом. Реализовать вывод элементов массива на консоль и в текстовый файл. Нахождение суммы и произведения оформить в виде отдельных методов, выполняющихся в разных потоках. Результаты работы программы вывести на консоль и в текстовый файл. Реализовать обработку исключительных ситуаций, возникающих во время выполнения программы.
using System;
using System.IO;
using System.Linq;
using System.Threading;
class Program
{
static void Main()
{
try
{
Console.Write("Введите количество элементов в массиве: ");
int n = int.Parse(Console.ReadLine());
double[] array = GenerateRandomArray(n);
Console.WriteLine("Сгенерированный массив:");
PrintArray(array);
// Создание потоков для вычислений
Thread oddIndexSumThread = new Thread(() => {
double sumOddIndexes = SumOddIndexes(array);
Console.WriteLine($"Сумма элементов массива с нечетными номерами: {sumOddIndexes}");
WriteToFile($"Сумма элементов массива с нечетными номерами: {sumOddIndexes}");
});
Thread betweenNegativesSumThread = new Thread(() => {
double sumBetweenNegatives = SumBetweenFirstAndLastNegative(array);
Console.WriteLine($"Сумма элементов между первым и последним отрицательными элементами: {sumBetweenNegatives}");
WriteToFile($"Сумма элементов между первым и последним отрицательными элементами: {sumBetweenNegatives}");
});
// Запуск потоков
oddIndexSumThread.Start();
betweenNegativesSumThread.Start();
// Ожидание завершения потоков
oddIndexSumThread.Join();
betweenNegativesSumThread.Join();
}
catch (Exception ex)
{
Console.WriteLine($"Произошла ошибка: {ex.Message}");
WriteToFile($"Произошла ошибка: {ex.Message}");
}
}
static double[] GenerateRandomArray(int n)
{
Random random = new Random();
double[] array = new double[n];
for (int i = 0; i < n; i++)
{
array[i] = random.NextDouble() * 200 - 100;
}
return array;
}
static void PrintArray(double[] array)
{
foreach (var item in array)
{
Console.Write($"{item:F2} ");
}
Console.WriteLine();
WriteToFile("Сгенерированный массив: " + string.Join(" ", array.Select(x => x.ToString("F2"))));
}
static double SumOddIndexes(double[] array)
{
double sum = 0;
for (int i = 1; i < array.Length; i += 2)
{
sum += array[i];
}
return sum;
}
static double SumBetweenFirstAndLastNegative(double[] array)
{
int firstNegativeIndex = -1;
int lastNegativeIndex = -1;
for (int i = 0; i < array.Length; i++)
{
if (array[i] < 0)
{
if (firstNegativeIndex == -1)
{
firstNegativeIndex = i;
}
lastNegativeIndex = i;
}
}
if (firstNegativeIndex == -1 firstNegativeIndex == lastNegativeIndex)
{
return 0; // Если нет отрицательных элементов или только один отрицательный элемент
}

double sum = 0;
for (int i = firstNegativeIndex + 1; i < lastNegativeIndex; i++)
{
sum += array[i];
}
return sum;
}
static void WriteToFile(string text)
{
using (StreamWriter writer = new StreamWriter("output.txt", true))
{
writer.WriteLine(text);
}
}
}
X. В одномерном массиве, состоящем из n вещественных элементов (предусмотреть ввод значения переменной n с клавиатуры), вычислить:
- номера максимальных элементов массива;
- сумму элементов массива, расположенных до последнего положительного элемента.
Элементы массива сгенерировать случайным образом. Реализовать вывод элементов массива на консоль и в текстовый файл. Нахождение номеров и суммы оформить в виде отдельных методов, выполняющихся в разных потоках. Результаты работы программы вывести на консоль и в текстовый файл. Реализовать обработку исключительных ситуаций, возникающих во время выполнения программы.
using System;
using System.IO;
using System.Linq;
using System.Threading;
class Program
{
static void Main()
{
try
{
Console.Write("Введите значение n: ");
int n = int.Parse(Console.ReadLine());
Random rand = new Random();
double[] array = new double[n];
for (int i = 0; i < n; i++)
{
array[i] = rand.NextDouble() * 200 - 100;
}
string filePath = "output.txt";
using (StreamWriter writer = new StreamWriter(filePath))
{
Console.WriteLine("Массив:");
writer.WriteLine("Массив:");
foreach (double elem in array)
{
Console.WriteLine(elem);
writer.WriteLine(elem);
}
}
Thread maxElementsThread = new Thread(() => FindMaxElements(array, filePath));
Thread sumBeforeLastPositiveThread = new Thread(() => SumBeforeLastPositive(array, filePath));
maxElementsThread.Start();
sumBeforeLastPositiveThread.Start();
maxElementsThread.Join();
sumBeforeLastPositiveThread.Join();
Console.WriteLine("Результаты сохранены в файл " + filePath);
}
catch (Exception ex)
{