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

  • [--- Начало программы ---]

  • [--- Конец программы ---]

  • Отчёт по лабораторной работе №1. Задание Задан массив Х размером N. Сформировать из него матрицу А, содержащую по L элементов в строке. Недостающие элементы в последней строке (если такие будут) заполнить нулями. Напечатать матрицу по строкам. Выполнил студент группы 484


    Скачать 476.69 Kb.
    НазваниеЗадание Задан массив Х размером N. Сформировать из него матрицу А, содержащую по L элементов в строке. Недостающие элементы в последней строке (если такие будут) заполнить нулями. Напечатать матрицу по строкам. Выполнил студент группы 484
    Дата21.08.2019
    Размер476.69 Kb.
    Формат файлаdocx
    Имя файлаОтчёт по лабораторной работе №1.docx
    ТипОтчет
    #85259
    страница3 из 3
    1   2   3

    Форматы представления данных


    Программа использует следующие переменные:

    Таблица 1 – Переменные, используемы в программе

    Имя

    Тип

    Описание

    size

    int

    Размерность исходного массива

    matrix

    int**

    Массив, выделенный под матрицу

    arr

    int*

    Исходный массив

    choiсe

    int

    Выбор пункта меню


    Для задания максимального и минимального размера массивов, а также предела генерирования случайных чисел используются следующие константы:

    Таблица 2 – Константы, используемы в программе

    Имя

    Тип

    Значение

    Описание

    MIN_ARRAY_SIZE_VALUE

    const int

    1

    Минимальный размер массива

    MAX_ARRAY_SIZE_VALUE

    const int

    1000

    Максимальный размер массива

    MIN_ARRAY_SIZE_VALUE

    const int

    1

    Минимальный размер строки матрицы

    MAX_ARRAY_SIZE_VALUE

    const int

    10

    Максимальный размер строки матрицы

    RAND

    const int

    1000

    Предел генерирования случайных чисел
    1. Структура программы


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

    Модуль FileWork:

    Таблица 3 – Функции, составляющие модуль FileWork

    Имя

    Описание

    OutputData

    Сохранение данных в файл

    InputData

    Ввод данных из файла

    Модуль Input:

    Таблица 4 – Функции, составляющие модуль Input

    Имя

    Описание

    GetInt

    Получение целого числа

    GetBool

    Получение переменной типа bool

    GetMenuItem

    Получение выбора пользователя

    GetInput

    Проверка пользовательского ввода


    Модуль ArraySetter:
    Таблица 5 – Функции, составляющие модуль ArraySetter


    Имя

    Описание

    SetArr

    Функция создания массива


    Модуль MatrixSetter:
    Таблица 6 – Функции, составляющие модуль MatrixSetter


    Имя

    Описание

    SetMatrix

    Функция создания матрицы


    Модуль Menu:
    Таблица 7 – Функции, составляющие модуль Menu


    Имя

    Описание

    MainMenu

    Вывод главного меню на экран

    DisplayFileMenu

    Вывод меню работы с файлами

    DisplayGoodbyeMenu

    Вывод меню завершения программы



    Модуль ColorSetter:
    Таблица 7 – Функции, составляющие модуль ColorSetter


    Имя

    Описание

    SetColor

    Установка цвета выводимого текста


    1. Описание хода выполнения лабораторной работы


    • В ходе лабораторной работы было создано решение (Solution) в интегрированной среде разработки Microsoft Visual Studio C++ 2019. В нём был создан проект.

    • В созданном проекте нужно было отключить использование предварительно скомпилированных заголовков, а также удалить файлы “pch.h” и “pch.cpp”.

    • После набора текста программы выяснилось, что вывод текста на экран консольного приложения работает неправильно из-за различия кодировок консольного приложения и среды разработки. Для решения этой проблемы была использована функция setlocale(LC_ALL, "Russian"), которая обеспечивает работу приложения с символами кириллицы.

    • При работе программы с файлами нужно было добавить проверки на валидность имени файла, а также на то, создан ли файл или нет при сохранении.

    • При получении пользовательского ввода необходимо было добавить проверку, на его корректность.

    • Перед повторением программы необходимо очищать память для того, чтобы не возникало непредвиденных ошибок, связанных с заполнением областей памяти старыми числами.
    1. Результат работы программы


    В результате работы программа выводит два начальных массива различными цветами, а также итоговый массив, элементы которого выводятся различными цветами, в зависимости от того, из какого массива они были взяты.


    Рисунок 2 – Заполнение массивов с клавиатуры



    Рисунок 3 – Заполнение массивов случайными числами


    Рисунок 4 – Заполнение массивов из файла



    Рисунок 5 – Попытка сохранить в уже созданный файл


    Рисунок 6 – Попытка сохранить в файл с запрещенным именем
    1. Текст программы


    [--- Начало программы ---]

    // [--- Начало программы ---]

    // Lab1.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год.

    #include

    #include "MatrixSetter.h"

    #include "MenuItems.h"

    #include "Menu.h"
    using namespace std;
    void main() {

    MenuItem choice = static_cast(0);

    setlocale(LC_ALL, "Russian");

    cout << "Лабораторная работа №1" << endl

    << "Студента 484 группы Криштопа Артёма" << endl

    << "Вариант №13" << endl

    << "Вывод матрицы из созданного пользователем массива." << endl << endl

    << "Задание:" << endl << endl

    << "Задан массив Х размером N.Сформировать из него матрицу А, содержащую по L" << endl

    << "элементов в строке.Недостающие элементы в последней строке(если такие будут)" << endl

    << "заполнить нулями.Напечатать матрицу по строкам." << endl

    << "\nПрограмма позволяет пользователю задать массив тремя способами:" << endl

    << "1. Ввести значения с клавиатуры" << endl

    << "2. Позволить программе самостоятельно заполнить его случайными числами." << endl

    << "3. Ввести значения для массива из файла." << endl

    << "\nСозданный массив програма преобразует в матрицу с длиной строки L, которую пользователь вводит с клавиатуры." << endl << endl;

    system("pause");

    system("cls");

    SetMatrix();

    }
    // FileWork.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #include

    #include

    #include

    #include "Input.h"

    #include "ArraySetter.h"
    using namespace std;
    void OutputData(int **&arr, int rows, int columns) {

    string filePath;

    bool isDataSaved = false;

    do {

    cout << "Сохранить данные в ( введите путь к файлу ):" << endl;

    cin >> filePath;
    if (!std::experimental::filesystem::is_regular_file(filePath)) {

    cout << "\nАдрес содержит недопустимые значения. Повторите ввод." << endl;

    cin.ignore(INT_MAX, '\n');

    continue;

    }
    if (ifstream(filePath)) {

    cout << "Файл уже существует." << endl << endl

    << "Выберите действие:" << endl

    << "0. Перезаписать существующий файл." << endl

    << "1. Повторить ввод." << endl;

    bool isAnother = GetBool();

    if (isAnother) {

    continue;

    }

    }
    ofstream myFile(filePath, ofstream::app);

    if (!myFile) {

    cout << "Запись запрещена. Повторите ввод." << endl;

    myFile.close();

    continue;

    }
    myFile.close();

    myFile.open(filePath, ofstream::trunc);

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

    for (int j = 0; j < columns; j++) {

    myFile << arr[i][j] << "\t";

    }

    myFile << endl;

    }

    myFile.close();

    cout << "Запись данных завершена." << endl;

    isDataSaved = true;

    } while (!isDataSaved);

    }
    int *InputData(int &myArraySize) {

    string filePath;

    bool isDataLoaded = false;

    myArraySize = 0;

    int *myArray = nullptr;

    do {

    cout << "Загрузить данные из ( введите путь к файлу ):" << endl;

    cin >> filePath;
    if (!ifstream(filePath)) {

    cout << "Файл не существует. Повторите ввод." << endl;

    cin.ignore(INT_MAX, '\n');

    continue;

    }
    if (!std::experimental::filesystem::is_regular_file(filePath)) {

    cout << "Адрес содержит недопустимые значения. Повторите ввод." << endl;

    cin.ignore(INT_MAX, '\n');

    continue;

    }
    ifstream myFile(filePath);
    if (!myFile) {

    cout << "Загрузка запрещена. Повторите ввод." << endl;

    myFile.close();

    continue;

    }
    if (!(myFile >> myArraySize) || myArraySize <= 0) {

    cout << "Некорректный размер массива." << endl;

    myFile.close();

    continue;

    }
    myArray = new int[myArraySize];
    int i = 0;

    for (; i < myArraySize; i++) {

    if (!(myFile >> myArray[i])) {

    cout << "Некорректные данные. Проверьте соответствие количества элементов и размера массива в файле и повторите попытку." << endl;

    myFile.close();

    break;

    }

    }
    if (i == myArraySize) {

    cout << "Загрузка данных завершена." << endl;

    isDataLoaded = true;

    }

    else {

    delete[] myArray;

    myArray = nullptr;

    }
    myFile.close();

    } while (!isDataLoaded);

    return myArray;

    }

    // ArraySetter.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #include

    #include

    #include "FileWork.h"

    #include "Menu.h"

    #include "Input.h"

    #include "ColorSetter.h"
    using namespace std;
    void SetArr(int &size, int *&arr) {

    srand(time(nullptr));

    int choice = QUIT;

    MenuItem userChoice = static_cast(0);

    do {

    MainMenu(choice);

    switch (choice) {

    case KEYBOARD:

    cout << "Начинаем работать с массивом." << endl

    << "Программе необходимо знать его размер ( Минимальный - 1, Максимальный - 1000 ):" << endl;

    size = GetInput();

    if (cin.fail() || size < MIN_ARRAY_SIZE_VALUE || size > MAX_ARRAY_SIZE_VALUE) {

    while (cin.fail() || size < MIN_ARRAY_SIZE_VALUE || size > MAX_ARRAY_SIZE_VALUE) {

    cout << "Такое значение не поддерживается программой." << endl;

    size = GetInput();

    }

    }

    choice = QUIT;

    break;

    case RANDOM:

    cout << "Начинаем работать с массивом." << endl

    << "Программе необходимо знать его размер ( Минимальный - 1, Максимальный - 1000 ):" << endl;

    size = GetInput();

    if (cin.fail() || size < MIN_ARRAY_SIZE_VALUE || size > MAX_ARRAY_SIZE_VALUE) {

    while (cin.fail() || size < MIN_ARRAY_SIZE_VALUE || size > MAX_ARRAY_SIZE_VALUE) {

    cout << "Такое значение не поддерживается программой." << endl;

    size = GetInput();

    }

    }

    arr = new int[size];

    cout << "\nСозданный массив:" << endl;

    SetColor(Red, Black);

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

    arr[i] = rand() % 1000 + 1;

    cout << arr[i] << " ";

    }

    SetColor(White, Black);

    choice = QUIT;

    break;

    case MYFILE:

    DisplayFileMenu();

    userChoice = GetMenuItem();

    switch (userChoice) {

    case LOAD: {

    size = 0;

    arr = InputData(size);

    cout << "\nСозданный массив:" << endl;

    SetColor(Red, Black);

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

    cout << arr[i] << " ";

    }

    SetColor(White, Black);

    cout << endl;

    choice = QUIT;

    break;

    }

    case EXIT:

    cout << "До свидания!" << endl;

    choice = QUIT;

    system("pause");

    break;

    default:

    cout << "Повторите ввод." << endl;

    cout << endl;

    break;

    }

    choice = QUIT;

    break;

    default:

    break;

    }

    } while (choice != QUIT);

    }

    // MatrixSetter.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #include

    #include "ArraySetter.h"

    #include "ColorSetter.h"

    #include "FileWork.h"

    #include "Input.h"

    #include "Menu.h"
    using namespace std;
    void SetMatrix() { // функция создания матрицы с помощью массива.

    // Начинаем построение матрицы.

    int size; // размер массива

    int *arr = nullptr;

    SetArr(size, arr); // Вызов функции SetArr, задающей массив.

    if (arr == nullptr) {

    return;

    }

    int columns, rows; // columns - количество элементов строки, rows - количество строк

    cout << "\n\nТеперь из этих значений построим матрицу." << endl

    << "Какой будет длина её строки?( не более 10 ):" << endl; // columns

    columns = GetInput(); // используем GetArrSize, чтобы матрица не "расползалась" в консоли

    if (cin.fail() || columns < MIN_STRING_SIZE_VALUE || columns > MAX_STRING_SIZE_VALUE) {

    while (cin.fail() || columns < MIN_STRING_SIZE_VALUE || columns > MAX_STRING_SIZE_VALUE) {

    cout << "Такое значение не поддерживается программой." << endl;

    columns = GetInput();

    }

    }

    int **matrix = nullptr;

    rows = size / columns; // Количество строк = длина массива / количество столбцов
    if (size % columns != 0) {

    rows++; // Если длина массива / количество столбцов не равны 0 - прибавляем 1 строку в матрице.

    }

    matrix = new int*[size]; // Выделение памяти под матрицу размером columns.

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

    matrix[i] = new int[rows];

    }

    // Задание матрицы.

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

    for (int j = 0; j < columns; j++) {

    if (i * columns + j < size) {

    matrix[i][j] = arr[i * columns + j];

    }

    else {

    matrix[i][j] = 0;

    }

    }

    }

    // Вывод матрицы.

    cout << endl;

    SetColor(Green, Black); // установка зелёного цвета на чёрном фоне для выводимого текста

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

    for (int j = 0; j < columns; j++) {

    cout << matrix[i][j] << "\t";

    }

    cout << endl;

    }

    SetColor(White, Black); // возврат исходного цвета текста

    cout << "Хотите ли вы сохранить результаты работы программы в файл?" << endl

    << "1. Да" << endl

    << "2. Нет" << endl << endl

    << "Ваш выбор:" << endl;

    int savechoice = GetInput();

    if (cin.fail() || savechoice < SAVE || savechoice > NOTSAVE) {

    while (cin.fail() || savechoice < SAVE || savechoice > NOTSAVE) {

    cout << "Такое значение не поддерживается программой." << endl;

    savechoice = GetInput();

    }

    }

    if (savechoice == SAVE) {

    OutputData(matrix, rows, columns); // функция вывода данных в файл

    }

    DisplayGoodbyeMenu(); // вывод меню завершения программы

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

    delete[] matrix[i];

    matrix[i] = nullptr;

    }

    delete[] matrix;

    matrix = nullptr;

    }

    // Menu.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #include

    #include "MenuItems.h"

    #include "FileWork.h"

    #include "MatrixSetter.h"

    #include "Input.h"
    using namespace std;
    void MainMenu(int &choice) {

    cout << "Выберите способ задания массива:" << endl

    << "1. Ввод с клавиатуры" << endl

    << "2. Случайные числа от 1 до 1000" << endl

    << "3. Подкачка данных из файла" << endl

    << "\n\n-----------------------\n" << "0. Выход из программы" << endl

    << "\nВаш выбор:" << endl;

    choice = GetChoice();

    switch (choice) {

    case KEYBOARD:

    break;

    case RANDOM:

    break;

    case MYFILE:

    break;

    case QUIT:

    cout << "До свидания!" << endl;

    system("pause");

    choice = QUIT;

    return;

    default:

    break;

    }

    }
    void DisplayFileMenu() {

    cout << "Начинаем работу с файлами." << endl << endl;

    cout << "Выберите пункт меню:" << endl;

    cout << "1. Загрузить данные из файла" << endl;

    cout << "2. Выйти из программы" << endl << endl;

    cout << "Ваш выбор: ";

    }
    void DisplayGoodbyeMenu() {

    cout << "\nПрограмма завершена. Выберите дальнейшее действие:\n" << endl << endl

    << "0. Выйти из программы." << endl

    << "1. Запустить программу заново." << endl

    << "2. Запустить программу заново и очистить консоль." << endl << endl

    << "Ваш выбор:" << endl;

    int filechoice;

    filechoice = GetInput();

    if (cin.fail() || filechoice < QUIT || filechoice > SAVEANDREPLAY) {

    while (cin.fail() || filechoice < QUIT || filechoice > SAVEANDREPLAY) {

    cout << "Такое значение не поддерживается программой." << endl;

    filechoice = GetInput();

    }

    }

    switch (filechoice) {

    case QUIT:

    cout << "До свидания!" << endl;

    system("pause");

    return;

    case REPLAY:

    SetMatrix();

    case REPLAYCLS:

    system("cls");

    SetMatrix();

    default:

    break;

    }

    }
    // Input.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #include

    #include "MenuItems.h"

    #include
    using namespace std;
    #define MIN_ARRAY_SIZE_VALUE 1 // минимальный размер массива

    #define MAX_ARRAY_SIZE_VALUE 1000 // максимальный размер массива

    #define MIN_STRING_SIZE_VALUE 1 // минимальный размер строки матрицы

    #define MAX_STRING_SIZE_VALUE 10 // максимальный размер строки матрицы
    template
    T GetInput() {

    T userInput;

    cin >> userInput;

    if (cin.fail() || userInput < 0) {

    while (cin.fail() || userInput < 0) {

    cout << "Ещё бы чуть-чуть и всё пропало, но разработчик позаботился о Вас. Попробуйте ещё разок." << endl;

    cin.clear();

    cin.ignore(INT_MAX, '\n');

    cin >> userInput;

    }

    }

    cin.ignore(INT_MAX, '\n');

    return userInput;

    }

    int GetInt() {

    return GetInput();

    }
    bool GetBool() {

    bool userInput;

    cin >> userInput;

    while (cin.fail()) {

    cout << "Повторите ввод." << endl;

    cin.clear();

    cin.ignore(INT_MAX, '\n');

    cin >> userInput;

    }

    cin.ignore(INT_MAX, '\n');

    return userInput;

    }
    MenuItem GetMenuItem() {

    int userInput;

    cin >> userInput;

    if (cin.fail() || userInput < LOAD || userInput > EXIT) {

    while (cin.fail() || userInput < LOAD || userInput > EXIT) {

    cout << "Такое значение не поддерживается программой." << endl;

    cin.clear();

    cin.ignore(INT_MAX, '\n');

    cin >> userInput;

    }

    }

    cin.ignore(INT_MAX, '\n');

    return static_cast(userInput);

    }

    // ColorSetter.cpp

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #include

    #include "ConsoleColors.h"

    #include
    void SetColor(ConsoleColor text, ConsoleColor background)

    {

    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTextAttribute(hConsole, (WORD)((background << 4) | text));

    }

    // ArraySetter.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once

    void SetArr(int &size, int *&arr);

    // ColorSetter.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once

    #include "ConsoleColors.h"

    void SetColor(ConsoleColor text, ConsoleColor background);

    // ConsoleColors.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once
    enum ConsoleColor {

    Black = 0,

    Blue = 1,

    Green = 2,

    Cyan = 3,

    Red = 4,

    Magenta = 5,

    Brown = 6,

    LightGray = 7,

    DarkGray = 8,

    LightBlue = 9,

    LightGreen = 10,

    LightCyan = 11,

    LightRed = 12,

    LightMagenta = 13,

    Yellow = 14,

    White = 15

    };

    // FileWork.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once

    void OutputData(int **&arr, int rows, int columns);

    int* InputData(int &myArraySize);

    // Input.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once

    #include "MenuItems.h"

    template

    T GetInput();

    int GetArrSize();

    int GetStringSize();

    int GetInt();

    int GetFileChoice();

    bool GetBool();

    MenuItem GetMenuItem();

    int GetChoice();

    int GetSave();

    // MatrixSetter.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once

    void SetMatrix();

    // Menu.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once
    void MainMenu(int &choice);

    void DisplayFileMenu();

    void DisplayGoodbyeMenu();

    // MenuItems.h

    // Лабораторная работа №1.

    // Студент группы 484, Криштоп Артём Александрович. 2019 год
    #pragma once
    enum MenuItem {

    KEYBOARD = 1, RANDOM, MYFILE,

    QUIT = 0, REPLAY, REPLAYCLS, SAVEANDEXIT, SAVEANDREPLAY,

    LOAD = 1, EXIT,

    SAVE = 1, NOTSAVE

    };
    [--- Конец программы ---]

    1   2   3


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