Академический Документы
Профессиональный Документы
Культура Документы
КУРСОВАЯ РАБОТА
по дисциплине программирование
(наименование дисциплины)
на тему: Решение типовых задач основных разделов программирования. Вариант 4
(тема курсовой работы)
Выполнил студент Асланян Артем Артаваздович курса 1 группы 23-КБ-ПР3
(фамилия, имя, отчество)
Допущен к защите
(дата)
Защищена Оценка
(дата)
(подпись, дата)
Краснодар
2023
ФГБОУ ВО «Кубанский государственный технологический университет»
(ФГБОУ ВО «КубГТУ»)
УТВЕРЖДАЮ
Зав. кафедрой ИСП к.т.н., доц.
М.В. Янаева
« 15 » сентября 2023 г.
ЗАДАНИЕ
на курсовую работу
Рекомендуемая литература:
1. Павловская Т. А. П С#. Программирование на языке высокого уровня. Учебник
для вузов. — СПб.: Питер, 2014. — 432 с: ил.
3
Содержание
Введение...................................................................................................................5
1 Нормативные ссылки...........................................................................................6
2 Одномерные массивы..........................................................................................7
2.1 Общая информация........................................................................................7
2.2 Постановка задач............................................................................................8
2.3 Математическое решение..............................................................................8
2.4 Блок-схемы алгоритмов...............................................................................11
2.5 Программная реализация.............................................................................20
2.6 Скриншоты выполнения программ............................................................24
3 Двумерные массивы...........................................................................................25
3.1 Общие сведения............................................................................................25
3.2 Постановка задач..........................................................................................27
3.3 Математическое решение............................................................................27
3.4 Блок-схемы алгоритмов...............................................................................30
3.5 Программные реализации...........................................................................43
3.6 Скриншоты выполнения программ............................................................47
Заключение............................................................................................................48
Список использованных источников..................................................................49
Приложение А. Тест на антиплагиат...................................................................50
4
Введение
Массивы, как одна из базовых структур данных, играют заслуженно
важную роль в эффективной организации и обработке информации,
выделяясь своей простотой и оперативностью при обращении к данным.
Важно понимать, что для разработки эффективных алгоритмов обработки
данных, а также для развития навыков в области информатики и
программирования, необходимо знать основные принципы работы с
массивами. Массивы являются важным инструментом для эффективной
работы с данными в широком спектре задач. Основной целью данной
курсовой работы является глубокий анализ массивов как структуры данных,
исследование их основных характеристик, типов, а также методов обработки
данных. Работа направлена на формирование теоретических знаний и
нацелена на использование полученных знаний в среде программирования
для решения типовых задач основных разделов программирования. Изучение
массивов важно и по сей день, массивы служат стартовой точкой для
изучения сложных структур данных и алгоритмов, освоение которых
открывает пути к разработке инновационных решений в IT. Значимость
курсовой работы заключается в важности понимания принципов работы с
массивами для развития навыков программирования и эффективной
обработки данных Объектом исследования являются алгоритмы работы с
одномерными и двумерными массивами. Предметом исследования
выступают одномерные и двумерные массивы в языке программирования C#.
Задачами являются основные действия с массивами, такие как сортировка,
ввод элементов, их поиск и вывод, изучение одномерных и двумерных
массивов, а также анализ эффективности различных алгоритмов работы с
массивами.
5
1 Нормативные ссылки
В данной пояснительной записке использованы ссылки на следующие
стандарты:
ГОСТ 2.105-95 ЕСКД. Общие требования к текстовым
документам;
ГОСТ 7.32-2107. Система стандартов по информации,
библиотечному и издательскому делу. Отчет о научно - исследовательской
работе. Структура и правила оформления;
ГОСТ Р.7.0.5-2008 СИБИД. Библиографическая ссылка. Общие
требования и правила составления;
ГОСТ 7.12-93 СИБИД. Библиографическая ссылка. Сокращение
слов на русском языке. Общие требования и правила.
6
2 Одномерные массивы
7
В научных вычислениях и инженерных расчетах для хранения и
манипуляций с данными.
В разработке компьютерных игр для управления данными, такими как
координаты объектов, состояние игрового мира и другие параметры.
В графике, например, при обработке изображений, где массивы могут
представлять пиксели или другие элементы изображения.
Необходимо учитывать ограничения и особенности работы с
одномерными массивами. Размер массивов фиксирован и определяется при
их создании. Выход за пределы размера массива приводит к ошибкам
выполнения. Эффективность операций над массивами значительно зависит
от способа их реализации, а также выбранного алгоритма.
Одномерные массивы предназначены для конструирования сложных
структур данных и алгоритмов, и освоение работы с ними является
фундаментальным в программировании. Это ключевой аспект, поскольку
обладание навыками работы с одномерными массивами позволяет
разрабатывать эффективные и оптимизированные решения для широкого
спектра задач.
8
2. Пользователю предлагается ввести размер массива через консоль.
3. Введенное пользователем ранее значение размера массива
считывается и преобразуется в целое число n.
4. Создаётся массив целых чисел A размером n.
5. Инициализируется генератор случайных чисел random.
6. Заполняется массив A, где каждый элемент массива получает
случайное значение в диапазоне от -100 до 100 (включительно).
7. Исходный массив выводится в консоль с помощью метода
(PrintArray).
(PrintArray) принимает массив и печатает его элементы
разделённые пробелом на экране.
8. Вызывается метод (FindMaxElement), который возвращает
максимальный элемент массива A.
(FindMaxElement) принимает массив и находит максимальный
элемент, перебирая каждый элемент и сравнивая его со
значением максимального элемента, которое изначально равно
первому элементу массива.
9. В консоль выводится значение максимального элемента.
10. Вызывается метод (ChangeSigns), который изменяет знаки элементов в
массиве следующим образом:
Если максимальный элемент массива чётный, то знаки всех
чётных элементов массива меняются на противоположные.
Если максимальный элемент массива нечётный, то знаки всех
нечётных элементов массива меняются на противоположные.
(ChangeSigns) принимает массив и максимальный элемент, затем
меняет знак каждого элемента массива в соответствии с
чётностью максимального элемента.
11. Изменённый массив выводится в консоль.
12. Метод (Main) завершает выполнение.
9
Алгоритм решения задания 2:
1. Программа начинается с выполнения метода (Main).
2. Создается массив целых чисел array и выводится его содержимое
через вызов метода (PrintArray).
3. Вызывается метод (CompressArray) для сжатия исходного массива
Осуществляется подсчет вхождений каждого элемента в массиве
с помощью метода (CountOccurrences).
Создается словарь counts, который отображает каждый
уникальный элемент массива на количество его вхождений.
Для каждого числа num из array, код проверяет наличие числа
в ключах counts. Если ключ найден, инкрементируется его
значение, в противном случае ключ добавляется с начальным
значением 1.
Создается новый список compressedArray, содержащий только те
элементы из array, количество вхождений которых (counts[num])
больше 1, с использованием метода (CreateCompressedArray).
Новый список compressedArray преобразуется обратно в массив
resultArray путем копирования элементов.
4. Содержимое "сжатого" массива выводится в консоль через метод
(PrintArray).
5. Метод (Main) завершает свое выполнение.
10
2.4 Блок-схемы алгоритмов
Блок-схема программы задания 1:
Метод (Main) запрашивает необходимый размер массива, затем создает
массив и заполняет его случайными числами, вызывает метод (PrintArray)
для печати всех элементов массива А в консоли, находит и возвращает
максимальный элемент в переданном массиве, используя метод
(FindMaxElement) и вызывает метод (ChangeSigns), меняя знаки элементов
массива согласно с условием.
11
Рисунок 2.1 – Блок-схема метода (Main).
Метод (FindMaxElement) – метод, в котором выполняется поиск
максимального элемента массива.
12
Рисунок 2.2 – Блок-схема метода (FindMaxElement).
13
Рисунок 2.3 – Блок-схема метода (ChangeSigns).
14
Рисунок 2.4 – Блок-схема метода (PrintArray).
19
Рисунок 2.8 – Блок-схема метода (PrintArray)
20
2.5 Программная реализация
Листинг программы задания 1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace task_1._1
{
class Program
{
static void Main()
{
Console.Write("Введите размер массива: ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("Исходный массив:");
PrintArray(A);
ChangeSigns(A, maxElement);
Console.WriteLine("Измененный массив:");
PrintArray(A);
}
static int FindMaxElement(int[] array)
{
int maxElement = array[0];
for (int i = 1; i < array.Length; i++)
{
if (array[i] > maxElement)
{
21
maxElement = array[i];
}
}
return maxElement;
}
static void ChangeSigns(int[] array, int maxElement)
{
for (int i = 0; i < array.Length; i++)
{
if (maxElement % 2 == 0)
{
if (array[i] % 2 == 0)
{
array[i] = -array[i];
}
}
else
{
if (array[i] % 2 != 0)
{
array[i] = -array[i];
}
}
}
}
static void PrintArray(int[] array)
{
foreach (var element in array)
{
Console.Write($"{element} ");
}
Console.WriteLine();
}
}
}
22
namespace task_1._2
{
class Program
{
static void Main()
{
int[] array = {1, 2, 3, 4, 5, 3, 7, 8, 9, 6, 10, 8, 1, 7};
Console.WriteLine("Исходный массив:");
PrintArray(array);
array = CompressArray(array);
23
var keys = counts.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
if (keys[i] == num)
{
counts[keys[i]]++;
found = true;
break;
}
}
if (!found)
counts[num] = 1;
}
return counts;
}
static List<int> CreateCompressedArray(int[] array, Dictionary<int,
int> counts)
{
List<int> compressedArray = new List<int>();
24
2.6 Скриншоты выполнения программ
Скриншоты выполнения программ к заданям 1 и 2 приведены на
рисунках 2.9 и 2.10:
25
3 Двумерные массивы
26
количество строк и столбцов. Размеры массива можно получить с
помощью методов GetLength(0) (для строк) и GetLength(1) (для
столбцов).
Итерация по массиву: Для перебора всех элементов двумерного
массива часто используют вложенные циклы for. Первый цикл
перебирает строки, а второй - столбцы.
Многомерные массивы: Кроме двумерных массивов, C# также
поддерживает многомерные массивы с более чем двумя измерениями.
Можно объявлять, создавать и работать с трехмерными,
четырехмерными и массивами большей размерности, используя
аналогичные принципы.
Двумерные массивы предоставляют удобный способ хранить и
управлять данными с двумя измерениями, такими как таблицы, матрицы и
изображения, и широко применяются в программировании на C#.
Двумерные массивы широко применяются в программировании для
работы с таблицами, матрицами и другими структурами данных, которые
имеют две или более измерения. Вот некоторые области, где используются
двумерные массивы:
1. Графика и визуализация: Двумерные массивы используются для
представления пикселей изображения, обеспечивая доступ к каждому
пикселю по его координатам.
2. Игры: Многие видеоигры используют двумерные массивы для
представления игровых карт, уровней и расположения игровых
объектов. Каждый элемент массива соответствует определенному
положению на карте или уровне.
3. Научные и инженерные вычисления: В математических моделях и
численных методах используются двумерные массивы для обработки
данных, например, для решения уравнения в частных производных
или моделирования физических систем.
27
4. Базы данных: Для хранения и организации структурированных
данных используются таблицы, которые часто реализуются с
помощью двумерных массивов.
5. Обработка изображений: Двумерные массивы используются для
загрузки, манипуляции и анализа цифровых изображений, например,
для фильтрации, масштабирования, поворота и сегментации
изображений.
6. Алгоритмы и поиск: Многие алгоритмы, такие как поиск пути,
алгоритмы сортировки и алгоритмы машинного обучения, требуют
использования двумерных массивов для удобного доступа к данным и
их обработки.
28
3. Метод (FindMinElement) принимает двумерный массив и две
переменные-выхода, чтобы найти минимальный элемент и его
позицию (в терминах индекса столбца, а не строки). Он проходит по
всем элементам, сравнивает их, и сохраняет минимальный элемент и
его индекс столбца.
4. Метод (ExtractColumn) использует находящийся индекс колонки и
извлекает соответствующий столбец из двумерного массива, сохраняя
его в одномерный массив column.
5. Метод (SortColumn) применяет сортировку выбором, чтобы
отсортировать элементы в извлеченном столбце от меньшего к
большему. Это делается путем поиска минимального элемента в
неотсортированной части массива и обмена его местами с текущим
элементом в процессе итерации.
6. Метод (ReplaceColumn) заменяет столбец в исходном двумерном
массиве отсортированным столбцом из предыдущего шага.
7. После замены метод (PrintArray) выводит модифицированный
двумерный массив, где один из столбцов был отсортирован.
Алгоритм решения задания 2:
1. Программа начинается с выполнения метода (Main). сначала
определяется двумерный массив square, который представляет собой
матрицу 3x3:
int[,] square = {
{23, 28, 21},
{22, 24, 26},
{27, 20, 25}
};
2. Вызывается метод (IsMagicSquare(square)), который проверяет,
является ли данный квадрат магическим. Результат проверки
(логическое значение true или false) выводится на экран.
29
Вычисляется сумма чисел в каждой строке, и проверяется, что все
эти суммы равны между собой.
Аналогичная проверка проводится для каждого столбца.
Вычисляется сумма чисел на главной диагонали (сверху слева до
угла внизу справа), и она также должна быть равна предыдущим
суммам.
То же самое происходит для побочной диагонали (сверху справа
до угла внизу слева).
Если все проверки пройдены успешно, квадрат считается
магическим, и метод возвращает true
3. Затем код создает магический квадрат фиксированного размера (в
данном случае 3x3) с помощью метода (GenerateMagicSquare(n)).
Начальное положение — это середина верхнего ряда.
Последовательно размещается число num в массиве,
увеличиваясь после каждого размещения.
Если следующая позиция выходит за пределы верхней границы,
перемещаемся в начало нижней строки (но сохраняем столбец).
Если следующая позиция выходит за пределы правой границы,
перемещаемся в начало левого столбца.
Если ячейка уже занята, перемещаемся на одну строку вниз и на
два столбца влево.
Если при этом выходит за пределы границ, корректируем
позицию аналогично предыдущим правилам.
Повторяем, пока не разместим все числа от 1 до n*n.
4. После генерации магического квадрата он выводится в консоль с
помощью метода (PrintSquare(generatedSquare)), который итерирует по
строкам и столбцам двумерного массива и печатает значения,
разделенные пробелами, с новой строкой после каждой строки
матрицы.
30
3.4 Блок-схемы алгоритмов
Блок-схема программы задания 1:
31
Метод (PrintOriginalArray) – метод вывода исходного двумерного
массива
32
Метод (FindMinElement) – основной метод программы 1, за поиск
минимального элемента и его позиции в массиве.
33
Метод (ExtractColumn) – метод, отвечающий за извлечение столбца с
заданным индексом.
34
Метод (SortColumn) – метод, отвечающий за реализацию алгоритма
сортировки выбором.
36
Метод (PrintArray) - метод вывода конечного двумерного массива
37
Блок-схема программы задания 2:
Метод (Main) инициализирует двумерный массив square с
определенными значениями, вызывает метод (IsMagicSquare), чтобы
проверить является ли квадрат магическим, вызывает метод
(GenerateMagicSquare) для генерации магического квадрата и выводит
значения сгенерированного магического квадрата в консоль.
38
Метод (IsMagicSquare) – один из основных методов, проверяющий,
является ли матрица магическим квадратом.
39
40
Рисунок 3.9 – Блок-схема метода (IsMagicSquare).
41
Метод (GenerateMagicSquare) - метод, отвечающий за построение
нового магического квадрата.
42
Метод (PrintSquare) создан для вывода матрицы на консоль.
43
3.5 Программные реализации
Листинг программы задания 1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace task_2._1
{
using System;
class Program
{
static void Main()
{
int[,] array = {
{8, 3, 4},
{7, 9, 6},
{1, 5, 2},
};
PrintOriginalArray(array);
int n = array.GetLength(0);
int m = array.GetLength(1);
SortColumn(columnToSort);
PrintArray(array);
}
Console.WriteLine("Исходный массив:");
return column;
}
45
Console.WriteLine("Отсортированный массив:");
namespace task_2._2
{
using System;
class MagicSquare
{
static void Main()
{
int[,] square = {
{23, 28, 21},
{22, 24, 26},
{27, 20, 25}
};
int sumRow = 0;
for (int i = 0; i < n; i++)
{
int currentSum = 0;
for (int j = 0; j < n; j++)
{
currentSum += square[i, j];
}
if (i == 0)
sumRow = currentSum;
46
else if (currentSum != sumRow)
return false;
}
if (currentSum != sumRow)
return false;
}
int diagonalSum = 0;
for (int i = 0; i < n; i++)
{
diagonalSum += square[i, i];
}
if (diagonalSum != sumRow)
return false;
int reverseDiagonalSum = 0;
for (int i = 0; i < n; i++)
{
reverseDiagonalSum += square[i, n - 1 - i];
}
if (reverseDiagonalSum != sumRow)
return false;
return true;
}
if (square[i, j] != 0)
{
j -= 2;
i++;
continue;
}
else
47
square[i, j] = num++;
j++;
i--;
}
return square;
}
49
Список использованных источников
1. Павловская, Т. А. C#. Программирование на языке высокого
уровня / Т. А. Павловская — 3 издание. ISBN 978-5-91180-174-8. — Питер:
ООО "Лидер", 2010 — 432 c.
2. Фленов, Михаил Библия C# / Михаил Фленов. - М.: БХВ-
Петербург, 2016 — 965 c.
3. [Электронный ресурс] // Документация по C#: [сайт]. — URL:
https://learn.microsoft.com/ru-ru/dotnet/csharp/ (дата обращения: 28.11.2023)
4. [Электронный ресурс] // Metanit: [сайт]. — URL:
https://metanit.com/sharp/ (дата обращения: 02.12.2023)
50
Приложение А. Тест на антиплагиат
51