Загрузка данных


Задание 1. Характеристики качества ПО
Требование «Интерфейс приложения должен быть сделан так, чтобы никакие некорректные действия пользователя не привели к сбою программы» в соответствии со стандартом модели качества программного обеспечения (ISO/IEC 25010) относится к двум ключевым характеристикам:
 * Надёжность (Reliability) — подхарактеристика отказоустойчивость (Fault tolerance). Способность программы сохранять стабильную работу и выполнять свои функции даже при возникновении сбоев или передаче некорректных входных данных.
 * Удобство использования (Usability) — подхарактеристика защита от ошибок пользователя (User error protection). Свойство системы предотвращать возникновение ошибок со стороны пользователя либо обрабатывать их мягко, не допуская аварийного закрытия приложения.
Задание 2. Анализ кода работы со списком
В представленной программе исключительные ситуации могут возникнуть в четырех строках:
 * int maxLength = int.Parse(Console.ReadLine());
   * FormatException — если введенная строка содержит буквы, знаки препинания, пробелы или пустой ввод вместо целого числа.
   * OverflowException — если число выходит за границы диапазона значений типа int (от -2 147 483 648 до 2 147 483 647).
 * int lstLength = rnd.Next(2, maxLength);
   * ArgumentOutOfRangeException — метод Random.Next(min, max) требует, чтобы нижняя граница была меньше или равна верхней. Если пользователь введет maxLength меньше 2 (например, 0, 1 или отрицательное значение), произойдет ошибка.
 * int num = rnd.Next(2, maxLength);
   * ArgumentOutOfRangeException — аналогично, если maxLength окажется меньше 2.
 * lst.RemoveAt(num);
   * ArgumentOutOfRangeException — метод удаления по индексу вызывает исключение, если переданный индекс выходит за фактические границы списка (num < 0 или num >= lst.Count). В коде число элементов lstLength генерируется случайным образом в интервале от 2 до maxLength - 1, а индекс num генерируется независимо в том же диапазоне. В результате num может оказаться больше реального количества элементов в списке lst.
Задание 3. Причина отсутствия исключения при делении на 0 вещественных чисел
Отсутствие исключения при делении вещественных чисел (float, double) на ноль связано с поддержкой стандарта IEEE 754 (двоичная арифметика с плавающей запятой).
В данном стандарте результат деления на ноль строго регламентирован и возвращает специальные зарезервированные значения, а не прерывает работу программы:
 * Деление положительного числа на 0.0 дает Infinity (положительная бесконечность).
 * Деление отрицательного числа на 0.0 дает -Infinity (отрицательная бесконечность).
 * Деление 0.0 на 0.0 дает NaN (Not a Number — не число).
В целочисленных типах данных (int, long) подобных представлений для бесконечности на уровне архитектуры нет, поэтому операция целочисленного деления на ноль приводит к генерации исключения DivideByZeroException.
Задание 4. Пример программы с выходом за границы массива
using System;

class Program
{
    static void Main()
    {
        int[] numbers = new int[5];

        for (int i = 0; i <= numbers.Length; i++)
        {
            numbers[i] = i * 10;
            Console.WriteLine(numbers[i]);
        }
    }
}

Пояснение:
Массив numbers инициализирован на 5 элементов, то есть допустимый диапазон индексов составляет от 0 до 4. В условии цикла for ошибочно указан знак <=, из-за чего на финальной итерации переменная i становится равной 5. При обращении к numbers[5] генерируется исключение IndexOutOfRangeException.
Задание 5. Пример программы с переполнением стека
using System;

class Program
{
    static void InfiniteRecursion()
    {
        InfiniteRecursion();
    }

    static void Main()
    {
        InfiniteRecursion();
    }
}

Пояснение:
Метод InfiniteRecursion вызывает сам себя без условия выхода (базового случая рекурсии). При каждом вызове в стек вызовов помещаются адрес возврата и служебные данные. Так как память, выделенная под стек потока, строго ограничена, бесконечный вызов приводит к ее полному заполнению и генерации исключения StackOverflowException.