Вот ответы на контрольные вопросы из PDF.
**1. Какой характеристике качества соответствует требование?**
Это **надёжность** (подхарактеристика «отказоустойчивость»): программа не должна падать из-за неправильных действий пользователя. Также подходит «удобство использования» (подхарактеристика «защита от ошибок пользователя»). Если спросят одну, называй надёжность.
**2. Где в коде со списком возможны исключения:**
- `int.Parse(Console.ReadLine())` может выбросить `FormatException`, если ввели не число. Также возможен `OverflowException` для слишком большого числа.
- `rnd.Next(2, maxLength)` (обе строки, где он вызывается) выбросит `ArgumentOutOfRangeException`, если `maxLength < 2`. Нижняя граница тогда больше верхней.
- `lst.RemoveAt(num)` может выбросить `ArgumentOutOfRangeException`. Размер списка `lstLength` и индекс `num` генерируются независимо, и `num` может оказаться равным или больше `lstLength`. Такого элемента в списке нет.
Остальные строки (`Add`, `WriteLine`) безопасны.
**3. Почему при делении на 0 вещественных чисел нет исключения?**
Вещественные числа считаются по стандарту IEEE 754. В нём есть специальные значения: деление на 0 даёт бесконечность (`Infinity` или `-Infinity`), а `0.0 / 0.0` даёт `NaN` («не число»). У целых чисел такого значения нет, поэтому там выбрасывается исключение `DivideByZeroException`.
**4. Пример выхода за границы массива:**
```csharp
int[] a = new int[5]; // индексы 0..4
Console.WriteLine(a[5]); // IndexOutOfRangeException
```
**5. Пример переполнения стека:**
```csharp
static void F(int n)
{
F(n + 1); // рекурсия без условия выхода
}
static void Main()
{
F(0); // StackOverflowException
}
```
Функция бесконечно вызывает сама себя, и стек вызовов заканчивается. В C# это исключение нельзя поймать через `try-catch`, программа завершится аварийно.