Главная страница
Навигация по странице:

  • 1. Постановка задачи

  • Входные данные: Число элементов массива n (типа int). Элементы массива A[i] того типа, который выбрал пользователь. Выходные данные

  • Ограничения

  • 2. Разработка программы 2.1 Разработка структуры приложения

  • 2.2 Разработка интерфейса 2.3 Описание пользовательского интерфейса

  • 3. Реализация и тестирование программы

  • 3.2 Тестирование программы

  • Приложение. Код программы

  • Отчёт по лабораторной работе 4. Остапчук Андрей Вячеславович а1221 Отчёт по лабораторной работе 4. Вариант 12 Задание


    Скачать 174.92 Kb.
    НазваниеОстапчук Андрей Вячеславович а1221 Отчёт по лабораторной работе 4. Вариант 12 Задание
    АнкорLaba4
    Дата05.11.2022
    Размер174.92 Kb.
    Формат файлаdocx
    Имя файлаОтчёт по лабораторной работе 4.docx
    ТипДокументы
    #771352

    Остапчук Андрей Вячеславович А-12-21

    Отчёт по лабораторной работе №4. Вариант 12

    Задание

    В одномерном массиве, состоящем из п элементов, вычислить:

    1) номер максимального по модулю элемента массива;

    2) сумму элементов массива, расположенных после первого положительного элемента.

    3) преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [а,b], а потом — все остальные.

    1. Постановка задачи


    Разработать объектно-ориентрованную программу в соответствии с заданием.

    Функции программы:

    • Выбор типа элементов, с которыми будет работать программа (int, float и double)

    • Ввод числа элементов массива

    • Ввод и вывод элементов массива

    • Вывод номера максимального по модулю элемента массива

    • Вывод суммы элементов массива, расположенных после первого положительного

    • Сортировка элементов массива: сначала элементы целая часть которых лежит в заданном интервале, потом – все остальные.

    Входные данные:

    Число элементов массива n (типа int).

    Элементы массива A[i] того типа, который выбрал пользователь.

    Выходные данные:

    Элементы массива A[i]; целочисленный номер максимального по модулю элемента массива - imax; сумма модулей элементов массива, расположенных после первого положительного элемента- sum (тип суммы зависит от типа элементов).

    Ограничения:

    Число элементов массива n, элемент массива A[i] - не число, а некорректные символы

    Реакция -> вывод сообщения о необходимости повторного ввода числа.

    Вид приложения - консольное приложение на языке C++.

    Среда разработки – Visual Studio 2022 Preview

    2. Разработка программы

    2.1 Разработка структуры приложения

    Для корректной работы данной программы необходимо создать класс Funct. Далее определяются функции и методы класса, которые нужны для решения задачи. Диаграмма класса представлена на (Рис.1).

    Диаграмма класса Funct



    Рис.1

    В таблицах: Табл. 1, Табл. 2. описаны методы и шаблоны функций программы.

    Табл.1. Методы

    Методы

    public:

    void poisk() Описание меню, в котором возможно вызвать любую функцию этой программы.

    Табл.2. Шаблоны функций

    Название

    Входные данные

    Выходные данные

    Описание

    template

    void vvod(T* A, const int n)

    T* A массив выбранного типа

    const int n - размер массива

    - (void)

    Ввод элементов массива


    template

    void maximum(T* A, int n, T max = 0, int mi = 0)

    mi

    Поиск номера максимального эл-та массива

    template

    void summa(T* A, int n, T sum = 0, int k = 0)

    sum

    Поиск суммы эл-тов массива расположенных после первого положительного

    template

    void perestanovka(T* A, int n, T a, T b, T p)

    - (void)

    Сортировка массива: сначала элементы входящие в заданный интервал, затем все остальные; вывод массива



    2.2 Разработка интерфейса

    2.3 Описание пользовательского интерфейса

    Категории пользователей: для широкого круга пользователей;

    Функции пользователя: выбор типа элементов и работа с одним из них: нахождение максимального по модулю элемента массива, вычисление суммы элементов массива, стоящих после первого положительного элемента, сортировка массива;

    Диалог с пользователем в консольном приложении:

    На Рис.2 . представлено первое меню программы, с выбором действий:



    Рис. 2. Пример первоначального меню

    3. Реализация и тестирование программы


    3.1 Описание разработанной программы

    Все программы представляют собой объектно-ориентированные приложения, написанные на языке C++ в среде разработки Visual Studio 2022 Preview

    В классе Funct реализован один метод: poisk, который объединяет в себе все функции (через меню):

    1. void vvod(T* A, const int n) позволяет ввести элементы массива различных типов

    2. void maximum(T* A, int n, T max = 0, int mi = 0) ищет номер максимального элемента массива

    3. void summa(T* A, int n, T sum = 0, int k = 0) ищет сумму элементов массива, расположенных после первого положительного элемента.

    4. void perestanovka(T* A, int n, T a, T b, T p) сортирует массив: сначала элементы входящие в заданный интервал, затем все остальные; вывод массива

    Функции шаблонные, описываются с использование template и применимы к разным типам.

    Обработка исключительных ситуаций осуществляется с помощью ввода с клавиатуры строки, с последующим преобразованием её в соответствующий объекту тип. При не возможности преобразования в консоли выходит сообщение «Error! Повторите ввод <имя переменной>=»

    3.2 Тестирование программы

    Объект испытаний – программа ConsoleApplication12.cpp

    Цель испытаний – проверить работу программы.

    Средства испытаний – локальный отладчик Windows.

    Метод испытаний - функциональное тестирование при средних, граничных и аномальных значениях. Тесты представлены в Табл.3.
    Табл. 3. Тесты

    № Теста




    Тест №1

    Нормальные условия:

    Введите размер массива: n= 5

    Массив типа int:

    Введите элементы массива:

    3 -9 0 2 1

    Номер максимального по модулю элемента массива:2

    Cумма элементов массива, расположенных после первого положительного элемента=-6

    Введите левую границу интервала: a=1

    Введите правую границу интервала: b=4

    Массив выглядит теперь так:

    3 2 1 0 -9

    Результат: Корректная работа программы

    Тест №2


    Продолжение Табл. 3. Тесты

    Некорректный ввод числа элементов в массиве:

    Введите размер массива: n= kjj

    Результат: Ошибка! Повторите ввод n=

    Тест№3

    Нулевая сумма у массива:

    Введите элементы массива:

    3

    e

    Ошибка! Повторно введите элемент массива = -7

    3

    4

    Номер максимального по модулю элемента массива:2

    Cумма элементов массива, расположенных после первого положительного элемента=0

    Введите левую границу интервала: a=-9

    Введите правую границу интервала: b=0

    Массив выглядит теперь так:

    -7 3 3 4

    Результат: Корректная работа программы

    Тест№4

    Граничное значение а больше, чем значение b:

    Результат:

    Введите левую границу интервала: a=5

    Введите правую границу интервала: b=2

    Правая граница не может быть меньше левой

    Введите правую границу интервала ещё раз

    b=

    Тест№5

    Шаблон функции вывода массива на экран

    1 - Решение задачи с массивом типа int через шаблон;

    2 - Решение задачи с массивом типа double через шаблон;

    3 - Решение задачи с массивом типа float через шаблон;

    4 - конец;

    5

    Нет такой команды!

    Press ENTER

    1 - Решение задачи с массивом типа int через шаблон;

    2 - Решение задачи с массивом типа double через шаблон;

    3 - Решение задачи с массивом типа float через шаблон;

    4 - конец;

    Тест№6

    Все элементы массива отрицательные:

    Введите размер массива: n= 5

    Введите элементы массива:

    -8 -5 -8 -6 -5

    Номер максимального по модулю элемента массива:1

    Сумма элементов массива, расположенных после первого положительного элемента=0

    Введите левую границу интервала: a=-7

    Введите правую границу интервала: b=-3

    Массив выглядит теперь так:

    -5 -6 -5 -8 -8

    Тест№7

    Нормальные условия:

    Введите размер массива: n= 5

    Массив типа int:

    Введите элементы массива:

    2 -7 0 3 12

    Номер максимального по модулю элемента массива:5

    Cумма элементов массива, расположенных после первого положительного элемента=8

    Введите левую границу интервала a=0

    Введите правую границу интервала b=8

    Массив выглядит теперь так:

    2 0 3 12 -7

    Результат: Корректная работа программы

    Продолжение Табл. 3. Тесты

    Продолжение Табл.3.
    Вывод: В ходе выполнения лабораторной были применены шаблонные функции для решения задачи. Исходя из результатов тестирования, можно сказать, что программы работают корректно с нормальными и граничными значениями.

    Приложение. Код программы


    //Остапчук Андрей Вячеславович А-12-21, Лаба 4, Вариант 12

    #include

    #include

    #include

    #include

    using namespace std;

    template //Функция ввода значений эл-тов массива

    void vvod(T* A, const int n) {

    T u;

    cout << "\nМассив типа int:\n" << endl << "Введите элементы массива:" << endl;

    for (int i = 0; i < n; i++) {

    while (!(cin >> u) || (cin.peek() != '\n')) {

    cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Если вы вводили массив через enter - повторно введите элемент, если через пробел - введите все элементы массива заново = ";

    } T m = u;

    A[i] = m;

    }

    }

    template

    void maximum(T* A, int n, T max = 0, int mi = 0) {

    for (int i = 0; i < n; i++) {

    if (abs(A[i]) > max) {

    max = abs(A[i]);

    mi = i + 1;

    }

    }

    cout << "Номер максимального по модулю элемента массива:" << mi;

    return;

    }

    template

    void summa(T* A, int n, T sum = 0, int k = 0) {

    cout << endl;

    for (int i = 0; i < n; i++) {

    k = i + 1;

    if (A[i] > 0) break;

    }

    for (int i = k; i < n; i++) {

    sum = sum + A[i];

    }

    cout << "Cумма элементов массива, расположенных после первого положительного элемента=" << sum << endl;

    return;

    }

    template

    void perestanovka(T* A, int n, T a, T b, T p) {

    cout << "Введите левую границу интервала" << endl << "a=";

    cin >> a;

    if (cin.fail()) {

    cout << "Ошибка: такой формат ввода недопустим!" << endl;

    exit(0);

    }

    cout << "Введите правую границу интервала" << endl << "b=";

    while (cin >> b && b < a) {

    cout << "Правая граница не может быть меньше левой" << endl;

    cout << "Введите правую границу интервала ещё раз" << endl << "b=";

    }

    if (cin.fail()) {

    cout << "Ошибка: такой формат ввода недопустим!" << endl;

    exit(0);

    }

    cout << "Массив выглядит теперь так:" << "\n";

    cout << endl;

    for (int i = 0; i < n; i++) {

    int j = i - 1;

    while (j >= 0 && (A[j] < a) || (A[j] > b) && A[j + 1] >= a && A[j + 1] <= b) {

    swap(A[j], A[j + 1]);

    j--;

    }

    }

    return;

    }
    int main() {

    setlocale(LC_ALL, "ru");

    int mi = 0, k = 0;

    int* iA, imax = 0, isum = 0, ia = 0, ib = 0, ip = 0;

    double* dA, dmax = 0, dsum = 0, da = 0, db = 0, dp = 0;

    float* fA, fmax = 0, fsum = 0, fa = 0, fb = 0, fp = 0;

    cout << "\t\t Шаблон функции вывода массива на экран\n\n";

    char c;

    while (1) {

    cout << "1 - Решение задачи с массивом типа int через шаблон;\n";

    cout << "2 - Решение задачи с массивом типа double через шаблон;\n";

    cout << "3 - Решение задачи с массивом типа float через шаблон;\n";

    cout << "4 - конец;\n";

    scanf_s("%c", &c);

    switch (c)

    {

    case '1': { int s;

    cout << "Введите размер массива: n= ";

    while (!(cin >> s) || (cin.peek() != '\n'))

    {

    cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Повторите ввод n=";

    }int n = s;

    iA = new int[n];

    vvod(iA, n);

    maximum(iA, n, imax, mi);

    summa(iA, n, isum, k);

    perestanovka(iA, n, ia, ib, ip);

    for (int i = 0; i < n; i++) {

    cout << iA[i] << "\n";

    }

    delete[] iA; break;

    }

    case '2': { int ds;

    cout << "Введите размер массива: n= ";

    while (!(cin >> ds) || (cin.peek() != '\n'))

    {

    cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Повторите ввод n=";

    }int dn = ds;

    dA = new double[dn];

    vvod(dA, dn);

    maximum(dA, dn, dmax, mi);

    summa(dA, dn, dsum, k);

    perestanovka(dA, dn, da, db, dp);

    for (int i = 0; i < dn; i++) {

    cout << dA[i] << "\n";

    }

    delete[] dA; break;

    }

    case '3': { int fs;

    cout << "Введите размер массива: n= ";

    while (!(cin >> fs) || (cin.peek() != '\n'))

    {

    cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Повторите ввод n=";

    }int fn = fs;

    fA = new float[fn];

    vvod(fA, fn);

    maximum(fA, fn, fmax, mi);

    summa(fA, fn, fsum, k);

    perestanovka(fA, fn, fa, fb, fp);

    for (int i = 0; i < fn; i++) {

    cout << fA[i] << "\n";

    }

    delete[] fA; break;

    }

    case '4': return 0; break;

    default: cout << ("Нет такой команды!\nPress ENTER\n");

    }

    scanf_s("%c", &c);

    }

    system("pause");

    return 0;

    }



    написать администратору сайта