курсовая. Курсовая работа. Разработка алгоритмов и программ с использованием массивов в среде С
Скачать 1.05 Mb.
|
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования «Воронежский государственный лесотехнический университет имени Г.Ф. Морозова» Кафедра вычислительной техники и информационных систем Пояснительная записка курсовой работы на тему «Разработка алгоритмов и программ с использованием массивов в среде С++» Вариант 4 09.03.02 Информационные системы и технологии По дисциплине «Программирование»
Воронеж 2023 Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования «Воронежский государственный лесотехнический университет имени Г.Ф. Морозова» Кафедра вычислительной техники и информационных систем ЗАДАНИЕ для курсовой работы Студенту Иванову Ивану Ивановичу группы ИС2-22-ЗБ (фамилия и полные инициалы) Воронежского государственного лесотехнического университета имени Г.Ф. Морозова Направление 09.03.02 Информационные системы и технологии Срок представления работы к защите «___» июня 2023 г. ТЕМА РАБОТЫ Разработка алгоритмов и программ с использованием массивов в среде Visual Studio 2020 ПОСТАНОВКА ЗАДАЧИ Разработать алгоритм и программу. Вариант № 4 зачетки__________________________________________________ СОДЕРЖАНИЕ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ Анализ содержательной постановки задачи, уточнение требований к ее реализации. Формализация задачи и ее декомпозиция. Формирование структур представления данных. Разработка алгоритмов решения подзадач. Выбор средств языка программирования, достаточных для решения поставленной задачи. Проектирование, программирование, отладка и документирование программы. Формирование отчета о выполненной курсовой работе и подготовка к защите работы. Руководитель, к.т.н, доцент _____________ В.В. Зиновьева (ученая степень, ученое звание) (подпись) (инициалы и фамилия) Задание принял студент ____________ 26 января 2022 г. И.И. Иванов (подпись) (число, месяц, год) (инициалы и фамилия) СОДЕРЖАНИЕ1 Теоретическая часть 5 1.1Объявление массива 5 2 Практическая часть 9 2.1. Постановка задачи 9 2.2 Исходные данные, результаты решения задачи 10 2.3 Выбор метода решения задачи 10 2.4. Составление алгоритма решения задачи 10 14 Рисунок 4. Задача 2 14 15 Рисунок 5. Задача 2.1 15 15 Рисунок 6. Задача 2.2 15 2.5 Результаты работы программы. 15 Для запуска программы на выполнение необходимо запустить файл program.exe. 16 Вывод итоговых данных осуществляется на экран. Примеры выполнения программного приложения представлены на рис.2 и рис.3. 16 ЗАКЛЮЧЕНИЕ 18 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 19 ПРИЛОЖЕНИЕ А. 20 Листинг программы Задача 1 20 ПРИЛОЖЕНИЕ В. 23 Листинг программы Задача 2 23 С++ является расширением языка С. С представляет собой гибкий и мощный язык программирования, использовавшийся для разработки наиболее важных программных продуктов в течение прошедших лет. Однако, как только проект превышает определенные размеры, возможности применения языка С достигают своих границ. В зависимости от проекта, программы размером от 25000 до 100000 строк оказываются трудными для разработки и управления потому, что их трудно охватить целиком. Работая в Bell Laboratories в Murray Hill, штат Нью-Джерси, Бьярн Страуструп (Bjarne Stroustrup) добавил к языку С несколько расширений с целью решить эту проблему. Первоначально язык назывался «С с классами». Это название было заменено на С++ в 1983 году. Большинство сделанных Страуструпом добавлений к С поддерживают объектно-ориентированное программирование, которое иногда сокращенно называют ООП. В следующем разделе будут кратко изложены основные концепции объектно-ориентированного программирования. Как отмечает Страуструп, целый ряд объектно-ориентированных концепций был добавлен в С++, основываясь на языке Симула-67. Поэтому С++ представляет собой смесь двух мощных программных методов. Хотя первоначально С++ был нацелен на работу с очень большими программами, это не ограничивает его применение. Фактически объектно-ориентированные атрибуты языка С++ могут быть эффективно применены фактически к любой задаче программирования. Этот язык часто используется для таких проектов, как создание редакторов, баз данных, персональных систем работы с файлами и коммуникационных программ. Благодаря тому, что С++ унаследовал эффективность языка С, с его помощью разрабатывается высокопроизводительное программное обеспечение. 1 Теоретическая часть Объявление массива Массив – это совокупность данных, которая обладает следующими свойствами: все элементы массива имеют один и тот же тип; массив имеет одно имя для всех элементов; доступ к конкретному элементу массива осуществляется по индексу. 1. Объявление массива Объявление массива имеет следующий синтаксис: <спецификация типа> <имя> [<константное выражение>]; <спецификация типа> <имя> [ ]; Здесь квадратные скобки являются элементом синтаксиса, а не признаком необязательности конструкции. Объявление массива может иметь одну из двух синтаксических форм, указанных выше. Квадратные скобки, следующие за именем, – признак того, что переменная является массивом. Константное выражение, заключенное в квадратные скобки определяет число элементов в массиве. Индексация элементов массива в языке C++ начинается с нуля. Таким образом, последний элемент массива имеет индекс на единицу меньше, чем число элементов массива. Во второй синтаксической форме константное выражение в квадратных скобках опущено. Эта форма может быть использована, если в объявлении массива присутствует инициализатор, либо массив объявляется как формальный параметр функции, либо данное объявление является ссылкой на объявление массива где-то в другом месте программы. Однако для многомерного массива может быть опущена только первая размерность. Многомерный массив, или массив массивов, объявляется путем задания последовательности константных выражений в квадратных скобках, следующей за именем: <спецификация типа> <имя> [<константное выражение>] Каждое константное выражение определяет количество элементов в данном измерении массива, поэтому объявление двумерного массива содержит два константных выражение, трехмерного – три и т.д. Массив может состоять из элементов любого типа, кроме типа void и функций, т.е. элементы массива могут иметь базовый, перечислимый, структурный тип, быть объединением, указателем или массивом. Примеры объявлений массивов: int x[10]; Одномерный массив из 10 целых чисел. Индексы меняются от 0 до 9. double y[2][10]; Двумерный массив вещественных чисел из 2 строк и 10 столбцов. 1.2 Инициализация массивов Как и простые переменные, массивы могут быть инициализированы при объявлении. Инициализатор для объектов составных типов (каким является массив) состоит из списка инициализаторов, разделенных запятыми и заключенных в фигурные скобки. Каждый инициализатор в списке представляет собой либо константу соответствующего типа, либо, в свою очередь, список инициализаторов. Эта конструкция используется для инициализации многомерных массивов. Наличие списка инициализаторов в объявлении массива позволяет не указывать число элементов по его первой размерности. В этом случае количество элементов в списке инициализаторов и определяет число элементов по первой размерности массива. Тем самым определяется размер памяти, необходимой для хранения массива. Число элементов по остальным размерностям массива, кроме первой, указывать обязательно. Если в списке инициализаторов меньше элементов, чем в массиве, то оставшиеся элементы неявно инициализируются нулевыми значениями. Если же число инициализаторов больше, чем требуется, то выдается сообщение об ошибке. Примеры инициализации массивов int a[3] = {0, 1, 2}; Число инициализаторов равно числу элементов double b[5] = {0.1, 0.2, 0.3}; Число инициализаторов меньше числа элементов int c[ ] = {1, 2, 4, 8, 16}; Число элементов массива определяется по числу инициализаторов int d[2][3] = {{0, 1, 2}, {3, 4, 5}}; Инициализация двумерного массива. Массив состоит из двух строк, в каждой из которых по 3 элемента. Элементы первой строки получают значения 0, 1 и 2, а второй – значения 3, 4 и 5. int e[3] = {0, 1, 2, 3}; Ошибка – число инициализаторов больше числа элементов. 1.3 Доступ к элементу массива Для доступа к конкретному элементу массива используются так называемые индексные выражения: <имя массива>[<целочисленное выражение>] Здесь квадратные скобки являются требованием синтаксисам языка, а не признаком необязательности конструкции. Индекс массива может быть не только константой, но и выражением, которое имеет целочисленный тип, например, a[i + 1] (здесь a должно быть именем ранее объявленного массива, а i – переменной целого типа). Объявление массива и индексное выражение, используемое для доступа к элементу массива, имеют схожий синтаксис. Различаются они по месту в программе. Это особенно важно, когда мы определяем индекс последнего элемента массива. Как было сказано ранее, индексы элементов массива в языке C начинаются с 0, и номер последнего элемента на 1 меньше количества элементов массива. Поэтому если Вы объявили массив x из 10 элементов, Вы не можете написать индексное выражение x[10], т.к. в этом случае Вы пытаетесь обратиться к элементу с индексом 10, которого нет в Вашем массиве. Компилятор не выдаст сообщения об ошибке, но результаты работы такой программы будут непредсказуемы. Имя массива является адресом его начала. Оно имеет тип константный указатель на <тип элементов массива>. Конструкция a[i] эквивалентна *(a + i) Для многомерного массива надо указать соответствующее количество индексов в квадратных скобках. 1.4 Обработка массивов Для обработки элементов массива обычно используется оператор пошагового цикла for. Для обработки многомерного массива используется соответствующее количество циклов. Массивы не самодостаточны в том смысле, что не гарантируется хранение информации о количестве элементов вместе с самим массивом. В большинстве реализаций С++ отсутствует проверка диапазона индексов для массивов. Таков традиционный низкоуровневый подход к массивам. Более совершенное понятие массива можно реализовать при помощи классов. В С++ массивы тесно связаны с указателями. Имя массива можно использовать в качестве указателя на его первый элемент. Гарантируется осмысленность значения указателя на элемент, следующий за последним элементом массива. Это важно для многих алгоритмов. Но ввиду того, что такой указатель на самом деле не указывает ни на какой элемент массива, его нельзя использовать ни для чтения, ни для записи. Результат получения адреса элемента массива, предшествующего первому, не определён, и такой операции следует избегать. Неявное преобразование массива в указатель при вызове функции приводит к потере информации о размере массива. Вызываемая функция должна каким-либо образом определить этот размер, чтобы выполнять осмысленные действия. 2 Практическая часть 2.1. Постановка задачиЗадание №1: В одномерном массиве, состоящем из n вещественных элементов вычислить: - сумму элементов массива с нечетными номерами - сумму элементов массива, расположенных между первым и последним отрицательным элементами Сжать массив, удалив из него все элементы, модули которых не превышают 1. Освободившиеся элементы в конце заполнить нулями Задание №2: Дана целочисленная квадратная матрица. Определить: - произведение элементов в тех строках, которые не содержат отрицательные элементы - максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы Цель данной работы состоит в создании пользовательских приложений для работы с массивами, разработанными в среде Visual Studio 2017. Программы должны предоставить возможность пользователю создавать и обрабатывать массивы, состоящие из целых или вещественных чисел. Результатом курсовой работы является два программных продукта, позволяющих создавать: одномерный массив целых чисел, находить сумму элементов с нечетными номерами и сумму между первым и последним отрицательным элементом. двумерный целочисленный массив (прямоугольную матрицу) и находить максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы, а так же произведение элементов в тех строках, которые не содержат отрицательные элементы. 2.2 Исходные данные, результаты решения задачи Для решения данной задачи необходимо подключить библиотеки: iostream, math.h. Согласно условию, нужно создать динамический массив, т.к. изначально неизвестно число строк и столбцов(N), 2.3 Выбор метода решения задачиДля разработки пользовательских приложений в рамках данной курсовой работы Visual Studio 2017. Visual Studio 2017– одна из самых мощных сред разработки для программирования на С++. Среда обладает удобной подсветкой текста, автодополнением кода, а так же является одной из самых популярных в мире. 2.4. Составление алгоритма решения задачиЗадание №1: После того, как пользователь задаст размерность массива, произойдёт его создание и заполнение, которое происходит путем использования стандартной функции random. В случае неправильного ввода размерности, пользователь получит об этом сообщение. Также сообщение будет выводиться, когда создание и заполнение массива будет завершено удачно. Затем программа последовательно вычисляет все необходимые по заданию величины и выполняет требуемые преобразования над массивом, а именно: - сумму элементов массива с нечетными номерами - сумму элементов массива, расположенных между первым и последним отрицательным элементами - сжать массив, удалив из него все элементы, модули которых не превышают 1. Блок схема программы приведена на рис. 1. Для вычисления суммы элементов с нечетными номерами достаточно пройти в цикле по массиву и сложить элементы через 1 начиная со второго, так как индексации начинается с 0. Затем получившуюся сумму необходимо вывести в консоль. Блок-схема на рис. 2 Для вычисления суммы между первым и последним отрицательными элементами необходимо пройти по массиву сначала от начала до конца, пока не будет найден первый отрицательный элемент. При нахождении его завершить цикл и запомнить индекс элемента. Затем аналогично выполнить цикл по массиву в обратную сторону и найти первый отрицательный элемент с конца. Затем проверить были ли найдены отрицательные элементы в принципе и если да, то в цикле от первого до второго найденного индекса сложить все элементы массива. Затем получившийся число необходимо вывести в консоль. Для сжатия массива необходимо пройти в цикле по массиву и сравнить все элементы по модулю с 1. Если найден элемент, который меньше 1, то в новом цикле от текущего элемента до конца сдвинуть все элементы на 1 влево, а в конце записать 0. Блок-схема на рис. 3 Затем массив необходимо вывести в консоль. Рисунок 1 – Блок-схема работы программы №1 Рисунок 2. Задание 1.1 Рисунок 3. Задание 1.3 Задание №2: После запуска программы пользователь должен ввести количество строк, столбцов матрицы. Затем программа автоматически генерирует матрицу заданного размера случайными числами. Для вычисления произведение элементов в тех строках, которые не содержат отрицательные элементы необходимо в цикле пройти по всем строкам матрицы и складывать все элементы в каждой строке. Если в строке найдено отрицательное значение, то переходить к суммированию элементов следующей строки. Если отрицательных элементов найдено не было, то вывести сумму в консоль. Для вычисления максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы необходимо выполнить цикл от 0 до N и сложить все числа в диагонали над и под главный, а затем сравнить две найденные суммы и вывести наибольшую. Рисунок 4. Задача 2 Рисунок 5. Задача 2.1 Рисунок 6. Задача 2.2 2.5 Результаты работы программы. Для запуска программы на выполнение необходимо запустить файл program.exe. Вывод итоговых данных осуществляется на экран. Примеры выполнения программного приложения представлены на рис.2 и рис.3. Рисунок 7. Тест задача 1 Рисунок 8. Тест задача 2 ЗАКЛЮЧЕНИЕ В ходе выполнения курсовой работы были рассмотрены структурированные типы данных, массивы. Программа выполняет создание и обработку массивов. Большое внимание уделялось созданию блок-схемы. СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ Царев Р. Ю. Программирование на языке С++ [Электронный ресурс] : учеб. пособие / Р. Ю. Царев. – Красноярск : Сиб. федер. ун-т, 2014. – 108 с. - ЭБС "Знаниум" - http://znanium.com/bookread2.php?book=510946 Кузин А.В. Программирование на языке Си/А.В.Кузин, Е.В.Чумакова - М.: Форум, НИЦ ИНФРА-М, 2015. - 144 с. - ЭБС "Знаниум". - http://znanium.com/bookread2.php?book=505194 Оксюта О. В. Основы программирования и алгоритмизации: методические указания к лабораторным работам для студентов по направлению подготовки 09.03.02 – Информационные системы и технологии / О. В. Оксюта; «ВГЛТУ». – Воронеж, 2018. – 75 с.- ЭБС ВГЛТУ. Оксюта О. В. Основы программирования и алгоритмизации: методические указания к выполнению курсовой работы для студентов по направлению подготовки 09.03.02 – Информационные системы и технологии / О. В. Оксюта; «ВГЛТУ». – Воронеж, 2018. – 6 с. - ЭБС ВГЛТУ. Алгоритмизация. Введение в язык программирования С++ [Электронный ресурс]. – Режим доступа: http://www.intuit.ru/studies/courses/16740/1301/info.– Загл. с экрана. Основы алгоритмизации и языков программирования [Электронный ресурс]. – Режим доступа: http://www.bourabai.kz/alg/index.htm.– Загл. с экрана. Алгоритмы и исполнители. Основы программирования [Электронный ресурс]. – Режим доступа: http://informaks.narod.ru/algo_pro.htm.– Загл. с экрана. Основы алгоритмизации и программирования. Дистанционное обучение [Электронный ресурс]. – Режим доступа: http://do.rksi.ru/library/courses/alg/.– Загл. с экрана. ПРИЛОЖЕНИЕ А.Листинг программы Задача 1// Program.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы. // #include #include #include using namespace std; /* В одномерном массиве, состоящим из n вещественных элементов вычислить - сумму элементов массива с нечетными номерами - сумму элементов массива, расположенных между первым и последним отрицательным элементами Сжать массив, удалив из него все элементы, модули которых не превышают 1. Освободившиеся элементы в конце заполнить нулями 2) Дана целочисленная квадратная матрица. Определить: - произведение элементов в тех строках, которые не содержат отрицательные элементы - максимум среди сумм элементов диагоналей, паралелельных главной диагонали матрицы */ int input(string mess) // ввод числа с проверкой на корректность { int val = 0; string text; while (true) { try { cout << mess; cin >> text; val = stoi(text); if (val > 0) // число должно быть положительное return val; else cout << "Введите положительное число" << endl; } catch (...) { cout << "Некорреткный ввод, повторите" << endl; } } } void sum_numbers(double* arr, int N) { int sum = 0; cout << "Выборка: " << endl; for (int i = 1; i < N; i = i + 2) { cout << arr[i] << " "; sum += arr[i]; } cout << endl << "Сумма элементов с нечетными индексами: " << sum << endl; } double* gen(int* N, int a, int b) { *N = input("Введите длину массива: "); double* arr = new double[*N] {0}; for (int i = 0; i < *N; i++) { arr[i] = rand() % (b - a) + a; cout << arr[i] << " "; } cout << endl; return arr; } void sum_neg(double* arr, int N) { int start = -1, end = -1, sum = 0; for (int i = 0; i < N; i++) { if (arr[i] < 0) { start = i; break; } } for (int i = N - 1; i >= 0; i--) { if (arr[i] < 0) { end = i; break; } } if (start == -1 || end == -1) cout << endl << "Отрицательные числа не найдены" << endl; else { sum = 0; cout << endl << "Выборка: " << endl; for (int i = start; i <= end; i++) { cout << arr[i] << " "; sum += arr[i]; } cout << endl << "Сумма элементов между первым и последним отрицательным числом: " << sum << endl; } } void press(double* arr, int N) { for (int i = 0; i < N; i++) { if (abs(arr[i]) < 1) { for (int k = i; k < N - 1; k++) { arr[k] = arr[k + 1]; } arr[N - 1] = 0; } } } void print(double* arr, int N) { cout << endl << "После сжатия: " << endl; for (int i = 0; i < N; i++) { cout << arr[i] << " "; } cout << endl; } int main() { setlocale(LC_ALL, "Russian"); int N; double* arr; string exit = "y"; do { arr = gen(&N, -5, 5); sum_numbers(arr, N); sum_neg(arr, N); press(arr, N); print(arr, N); cout << endl << "Повторить? y/n: "; cin >> exit; } while (exit == "y"); } ПРИЛОЖЕНИЕ В.Листинг программы Задача 2// task_2.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы. // #include #include using namespace std; int** gen(int* N, int a, int b) { int** arr; cout << "Введите размер N: "; cin >> *N; arr = new int*[*N]; for (int r = 0; r < *N; r++) { arr[r] = new int[*N] {0}; for (int k = 0; k < *N; k++) arr[r][k] = rand() % (b - a) + a; // для рандомной генерации } return arr; } void print(int** arr, int N) { for (int r = 0; r < N; r++) { for (int k = 0; k < N; k++) cout << arr[r][k] << " "; cout << endl; } cout << endl; } void sum_pos(int** arr, int N) { int count = 0; cout << endl << "Произведение чисел в строках без отрицательных значений: " << endl; for (int r = 0; r < N; r++) { int mul = 1; bool is_neg = false; for (int k = 0; k < N; k++) { mul *= arr[r][k]; if (arr[r][k] < 0) is_neg = true; } if (!is_neg) { cout << r << ": " << mul << endl; count++; } } if (count == 0) cout << "Не найден строк без отрицательных элементов" << endl; } void find_max(int** arr, int N) { int max = arr[0][1]; int sum_1 = 0; int sum_2 = 0; for (int i = 0; i < N - 1; i++) { sum_1 += arr[i][i + 1]; sum_2 += arr[i + 1][i]; } if (sum_1 > sum_2) max = sum_1; else max = sum_2; cout << endl << "Максимальная сумма: " << max; } int main() { setlocale(LC_ALL, "Russian"); int N; string exit = "y"; do { int** arr = gen(&N, -10, 10); print(arr, N); sum_pos(arr, N); find_max(arr, N); cout << endl << "Повторить? y/n: "; cin >> exit; } while (exit == "y"); } |