Вы находитесь на странице: 1из 53

Министерство науки и высшего образования Российской Федерации

ФГБОУ ВО «Кубанский государственный технологический университет»


(ФГБОУ ВО «КубГТУ»)

Институт компьютерных систем и информационной безопасности


Кафедра информационных систем и программирования
Направление подготовки 09.03.04 Программная инженерия
Профиль Проектирование и разработка программного обеспечения

КУРСОВАЯ РАБОТА

по дисциплине программирование
(наименование дисциплины)
на тему: Решение типовых задач основных разделов программирования. Вариант 4
(тема курсовой работы)
Выполнил студент Асланян Артем Артаваздович курса 1 группы 23-КБ-ПР3
(фамилия, имя, отчество)
Допущен к защите
(дата)

Руководитель (нормоконтролер) работы ассистент П.А.


Косолапов
(подпись, дата)

Защищена Оценка
(дата)

Члены комиссии: к.т.н., доц. В.А.


Мурлина
ст. преп. А.А.
Ковтун

(подпись, дата)

Краснодар
2023
ФГБОУ ВО «Кубанский государственный технологический университет»
(ФГБОУ ВО «КубГТУ»)

Институт компьютерных систем и информационной безопасности


Кафедра информационных систем и программирования
Направление подготовки 09.03.04 Программная инженерия
Профиль Проектирование и разработка программного обеспечения

УТВЕРЖДАЮ
Зав. кафедрой ИСП к.т.н., доц.
М.В. Янаева
« 15 » сентября 2023 г.

ЗАДАНИЕ
на курсовую работу

Студенту Асланяну Артему Артаваздовичу курса 1 группы 23-КБ-ПР3


Тема работы: Решение типовых задач основных разделов программирования.
Вариант 4
(утверждена указанием директора института № от )
План работы:
1. Изучение алгоритмов решения типовых задач;
2. Реализация на языке C#;
3. Оформление пояснительной записки;
Объем работы:
а) пояснительная записка с.
б) иллюстративная часть – лист(-ов)

Рекомендуемая литература:
1. Павловская Т. А. П С#. Программирование на языке высокого уровня. Учебник
для вузов. — СПб.: Питер, 2014. — 432 с: ил.

Срок выполнения: с « 15 » сентября по « 25 » декабря 2023 г.

Срок защиты: « » 2023 г.

Дата выдачи задания: « 20 » сентября 2023


г.

Дата сдачи работы на кафедру: « 30 » декабря 2023 г.

Руководитель работы ______________________________ ассистент П.А.


Косолапов
(подпись)
Задание принял студент А.А. Асланян
(подпись)
Реферат
Пояснительная записка к курсовой работе содержит: 50 страниц, 25
рисунков, 4 источника информации, 1 приложение
VISUAL STUDIO 2022, C#, ПРОГРАММЫ, МАССИВЫ, МЕТОДЫ
Цель работы заключается в решении типовых заданий по
программированию с помощью разработки консольных приложений,
Разрабатываемые консольные приложения на платформе .NET позволяют
углубить знания структур программ и приобрести необходимые навыки для
дальнейшей успешной работы с языком C#.
Объектом исследования вступают алгоритмы обработки одномерных
и двумерных массивов.
Предметом исследования являются одномерные и двумерные массивы
в языке программирования C#.
Задачи исследования:
 Заполнение массива элементами;
 Поиск элементов в массиве;
 Сортировка массива;
 Вывод массива экран;

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 Одномерные массивы

2.1 Общая информация


Одномерный массив представляет набор однотипных данных,
которые располагаются в последовательных ячейках памяти и
идентифицируются с помощью индексов. Для обращения к элементам
массива используются индексы. Индекс – это числовое значение,
обозначающее позицию элемента в массиве. Элементами массива могут быть
данные любого типа: целые числа, символы, вещественные числа, объекты и
так далее.
Одномерные массивы позволяют осуществлять следующие операции:
 Обеспечивают доступ к элементам: чтение и запись значений
элементов возможно посредством индексации.
 Обеспечивают возможность поиска: нахождение элемента с
определенным значением или удовлетворяющего определенным
условиям.
 Позволяют проводить сортировку: элементы массива могут быть
упорядочены по заданному критерию.
 Позволяют осуществлять перебор элементов: для последовательного
доступа к каждому элементу часто используются циклы.
Одномерные массивы широко применяются в различных областях
программирования:
 В системах управления базами данных для хранения и извлечения
данных.
 В алгоритмах и структурах данных, включая сортировку, поиск и
другие методы.
 В разработке операционных систем и других системных компонентов
для хранения и обработки данных.

7
 В научных вычислениях и инженерных расчетах для хранения и
манипуляций с данными.
 В разработке компьютерных игр для управления данными, такими как
координаты объектов, состояние игрового мира и другие параметры.
 В графике, например, при обработке изображений, где массивы могут
представлять пиксели или другие элементы изображения.
Необходимо учитывать ограничения и особенности работы с
одномерными массивами. Размер массивов фиксирован и определяется при
их создании. Выход за пределы размера массива приводит к ошибкам
выполнения. Эффективность операций над массивами значительно зависит
от способа их реализации, а также выбранного алгоритма.
Одномерные массивы предназначены для конструирования сложных
структур данных и алгоритмов, и освоение работы с ними является
фундаментальным в программировании. Это ключевой аспект, поскольку
обладание навыками работы с одномерными массивами позволяет
разрабатывать эффективные и оптимизированные решения для широкого
спектра задач.

2.2 Постановка задач


Задание 1. Дан одномерный массив целых чисел А(n). Разработать
программу нахождения максимального элемента. Если этот элемент является
четным числом, то всем четным числам таблицы сменить знак, в противном
случае сменить знак нечетным числам.
Задание 2. Дан одномерный массив целых чисел, в котором элементы
могут повторяться. Сжать массив, удалив из него все элементы,
встречающиеся в массиве только один раз.

2.3 Математическое решение


Алгоритм решения задания 1:
1. Программа начинается с выполнения метода (Main).

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).

Метод (ChangeSigns) изменяет знак, в зависимости от четности


максимального элемента.

13
Рисунок 2.3 – Блок-схема метода (ChangeSigns).

Метод (PrintArray) отвечает за вывод массива.

14
Рисунок 2.4 – Блок-схема метода (PrintArray).

Блок схема программы задания 2:


15
Метод (Main) инициализирует исходный массив целых чисел,
выводит его на консоль с помощью метода (PrintArray), вызывает метод
(CompressArray), чтобы получить новый массив, в котором останутся только
те числа, которые встречаются в исходном массиве более одного раза и
выводит полученный массив на консоль.

Рисунок 2.5 – Блок-схема метода (Main).


Метод (CompressArray) – метод, отвечающий за сжатие массива.
16
Рисунок 2.6 – Блок-схема метода (CompressArray).
Метод (CountOccurrences) выплоняет функцию подсчета количества
вхождений каждого элемента в массиве.
17
Рисунок 2.7 – Блок-схема метода (CountOccurrences).
Метод (CreateCompressedArray) создает новый массив, содержащий
только повторяющиеся элементы.
18
Рисунок 2.8 – Блок-схема метода (CreateCompressedArray).
Метод (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());

int[] A = new int[n];


Random random = new Random();
for (int i = 0; i < n; i++)
{
A[i] = random.Next(-100, 100);
}

Console.WriteLine("Исходный массив:");
PrintArray(A);

int maxElement = FindMaxElement(A);


Console.WriteLine($"Максимальный элемент: {maxElement}");

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();
}
}
}

Листинг программы задания 2:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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);

Console.WriteLine("Массив после сжатия:");


PrintArray(array);
}

static int[] CompressArray(int[] array)


{
Dictionary<int, int> counts = CountOccurrences(array);

List<int> compressedArray = CreateCompressedArray(array, counts);

int[] resultArray = new int[compressedArray.Count];


int index = 0;

foreach (int item in compressedArray)


{
resultArray[index] = item;
index++;
}
return resultArray;
}

static Dictionary<int, int> CountOccurrences(int[] array)


{
Dictionary<int, int> counts = new Dictionary<int, int>();

foreach (int num in array)


{
bool found = false;

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>();

foreach (int num in array)


{
if (counts[num] > 1)
compressedArray.Add(num);
}
return compressedArray;
}
static void PrintArray(int[] array)
{
foreach (int num in array)
{
Console.Write(num + " ");
}
Console.WriteLine();
}
}
}

24
2.6 Скриншоты выполнения программ
Скриншоты выполнения программ к заданям 1 и 2 приведены на
рисунках 2.9 и 2.10:

Рисунок 2.9 – Результат выполнения программы задания 1.

Рисунок 2.10 – Результат выполнения программы задания 2.

25
3 Двумерные массивы

3.1 Общие сведения


Двумерные массивы — это структуры данных, которые представляют
собой таблицы (матрицы) с фиксированным числом строк и столбцов. В
отличие от одномерных массивов, которые содержат элементы только в
одной линии, двумерные массивы имеют две размерности: строки и столбцы.
Каждая ячейка в двумерном массиве содержит значение, и на нее можно
ссылаться с помощью пары индексов — индекса строки и индекса столбца.
Концепция двумерного массива остается одной и той же: это коллекция
элементов, организованных в виде таблицы, где каждый элемент имеет
уникальные двумерные координаты для доступа к нему. Они являются
полезным инструментом для организации и управления данными, имеющими
двумерную структуру, такими как матрицы, таблицы и изображения.
Ниже описаны некоторые общие аспекты использования двумерных
массивов в C#:
 Объявление двумерного массива: Для объявления двумерного массива
в C# необходимо указать тип элементов массива и его имя. Например,
int[,] matrix; объявляет двумерный массив типа int.
 Создание и инициализация: После объявления массива можно создать
его, указав размеры для обоих измерений. Например, int[,] array = new
int[3, 4]; создаст двумерный массив размером 3x4. Также можно
инициализировать значения элементов при объявлении массива.
 Доступ к элементам: Для доступа к элементам двумерного массива
необходимо указать два индекса - индекс строки и индекс столбца.
Например, int value = array[1, 2]; получит значение из второй строки и
третьего столбца массива.
 Длина и размеры массива: Длина двумерного массива представляет
общее количество элементов в нем. Размеры массива определяют

26
количество строк и столбцов. Размеры массива можно получить с
помощью методов GetLength(0) (для строк) и GetLength(1) (для
столбцов).
 Итерация по массиву: Для перебора всех элементов двумерного
массива часто используют вложенные циклы for. Первый цикл
перебирает строки, а второй - столбцы.
 Многомерные массивы: Кроме двумерных массивов, C# также
поддерживает многомерные массивы с более чем двумя измерениями.
Можно объявлять, создавать и работать с трехмерными,
четырехмерными и массивами большей размерности, используя
аналогичные принципы.
Двумерные массивы предоставляют удобный способ хранить и
управлять данными с двумя измерениями, такими как таблицы, матрицы и
изображения, и широко применяются в программировании на C#.
Двумерные массивы широко применяются в программировании для
работы с таблицами, матрицами и другими структурами данных, которые
имеют две или более измерения. Вот некоторые области, где используются
двумерные массивы:
1. Графика и визуализация: Двумерные массивы используются для
представления пикселей изображения, обеспечивая доступ к каждому
пикселю по его координатам.
2. Игры: Многие видеоигры используют двумерные массивы для
представления игровых карт, уровней и расположения игровых
объектов. Каждый элемент массива соответствует определенному
положению на карте или уровне.
3. Научные и инженерные вычисления: В математических моделях и
численных методах используются двумерные массивы для обработки
данных, например, для решения уравнения в частных производных
или моделирования физических систем.

27
4. Базы данных: Для хранения и организации структурированных
данных используются таблицы, которые часто реализуются с
помощью двумерных массивов.
5. Обработка изображений: Двумерные массивы используются для
загрузки, манипуляции и анализа цифровых изображений, например,
для фильтрации, масштабирования, поворота и сегментации
изображений.
6. Алгоритмы и поиск: Многие алгоритмы, такие как поиск пути,
алгоритмы сортировки и алгоритмы машинного обучения, требуют
использования двумерных массивов для удобного доступа к данным и
их обработки.

3.2 Постановка задач


Задание 1. Дан двумерный массив А(n,m). Отсортировать столбец,
содержащий минимальный элемент массива по возрастанию.
Задание 2. Магическим квадратом порядка n называется квадратная
таблица размером n x n, состоящая из чисел 1,2,..., n2 так, что суммы по
каждому столбцу, каждой строке и каждой из двух диагоналей равны между
собой. Проверить, является ли заданная целочисленная квадратная матрица
магическим квадратом. Реализовать любой алгоритм построения магического
квадрата заданного размера.

3.3 Математическое решение


Алгоритм решения задания 1:
1. Программа начинается с выполнения метода (Main).
Объявляется и инициализируется двумерный массива array размером
3x3.
2. Метод (PrintOriginalArray) выводит исходный массив. Он проходит
через каждый элемент и выводит его на экран, создавая таблицу
значений.

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:

Метод (Main) cоздает и инициализирует двумерный массив целых


чисел array, выводит исходный массив на консоль с помощью метода
(PrintOriginalArray), определяет размеры массива n и m, ищет минимальный
элемент в массиве и его индекс в строках с помощью метода
(FindMinElement), извлекает столбец, содержащий минимальный элемент,
сортирует извлеченный столбец, заменяет столбец в исходном массиве на
отсортированный и выводит обновленный массив на консоль.

Рисунок 3.1 – Блок-схема метода (Main).

31
Метод (PrintOriginalArray) – метод вывода исходного двумерного
массива

Рисунок 3.2 – Блок-схема метода (PrintOriginalArray).

32
Метод (FindMinElement) – основной метод программы 1, за поиск
минимального элемента и его позиции в массиве.

Рисунок 3.3 – Блок-схема метода (FindMinElement).

33
Метод (ExtractColumn) – метод, отвечающий за извлечение столбца с
заданным индексом.

Рисунок 3.4 – Блок-схема метода (ExtractColumn).

34
Метод (SortColumn) – метод, отвечающий за реализацию алгоритма
сортировки выбором.

Рисунок 3.5 – Блок-схема метода (SortColumn).


35
Метод (ReplaceColumn) заменяет исходный столбец в массиве на
отсортированный.

Рисунок 3.6 – Блок-схема метода (ReplaceColumn).

36
Метод (PrintArray) - метод вывода конечного двумерного массива

Рисунок 3.7 – Блок-схема метода (PrintArray).

37
Блок-схема программы задания 2:
Метод (Main) инициализирует двумерный массив square с
определенными значениями, вызывает метод (IsMagicSquare), чтобы
проверить является ли квадрат магическим, вызывает метод
(GenerateMagicSquare) для генерации магического квадрата и выводит
значения сгенерированного магического квадрата в консоль.

Рисунок 3.8 – Блок-схема метода (Main).

38
Метод (IsMagicSquare) – один из основных методов, проверяющий,
является ли матрица магическим квадратом.

39
40
Рисунок 3.9 – Блок-схема метода (IsMagicSquare).

41
Метод (GenerateMagicSquare) - метод, отвечающий за построение
нового магического квадрата.

Рисунок 3.10 – Блок-схема метода (GenerateMagicSquare).

42
Метод (PrintSquare) создан для вывода матрицы на консоль.

Рисунок 3.11 – Блок-схема метода (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);

int minRowIndex, minElement;

FindMinElement(array, out minRowIndex, out minElement);

int[] columnToSort = ExtractColumn(array, minRowIndex);

SortColumn(columnToSort);

ReplaceColumn(array, columnToSort, minRowIndex);

PrintArray(array);
}

static void PrintOriginalArray(int[,] array)


{
int n = array.GetLength(0);
int m = array.GetLength(1);

Console.WriteLine("Исходный массив:");

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


{
for (int j = 0; j < m; j++)
{
Console.Write(array[i, j] + " ");
}
Console.WriteLine();
}
}

static void FindMinElement(int[,] array, out int rowIndex, out int


minElement)
{
int n = array.GetLength(0);
int m = array.GetLength(1);

minElement = array[0, 0];


44
rowIndex = 0;

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


{
for (int j = 0; j < m; j++)
{
if (array[i, j] < minElement)
{
minElement = array[i, j];
rowIndex = j;
}
}
}
}

static int[] ExtractColumn(int[,] array, int columnIndex)


{
int n = array.GetLength(0);
int[] column = new int[n];

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


{
column[i] = array[i, columnIndex];
}

return column;
}

static void SortColumn(int[] column)


{
int n = column.Length;

for (int i = 0; i < n - 1; i++)


{
int minIndex = i;
for (int j = i + 1; j < n; j++)
{
if (column[j] < column[minIndex])
{
minIndex = j;
}
}
int temp = column[i];
column[i] = column[minIndex];
column[minIndex] = temp;
}
}

static void ReplaceColumn(int[,] array, int[] column, int


columnIndex)
{
int n = array.GetLength(0);

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


{
array[i, columnIndex] = column[i];
}
}

static void PrintArray(int[,] array)


{
int n = array.GetLength(0);
int m = array.GetLength(1);

45
Console.WriteLine("Отсортированный массив:");

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


{
for (int j = 0; j < m; j++)
{
Console.Write(array[i, j] + " ");
}
Console.WriteLine();
}
}
}
}

Листинг программы задания 2:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace task_2._2
{
using System;

class MagicSquare
{
static void Main()
{
int[,] square = {
{23, 28, 21},
{22, 24, 26},
{27, 20, 25}
};

Console.WriteLine("Это магический квадрат?: " +


IsMagicSquare(square));

int n = 3; int[,] generatedSquare =


GenerateMagicSquare(n);

Console.WriteLine("Сгенерированный магический квадрат:");


PrintSquare(generatedSquare);
}

static bool IsMagicSquare(int[,] square)


{
int n = square.GetLength(0);

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;
}

for (int j = 0; j < n; j++)


{
int currentSum = 0;
for (int i = 0; i < n; i++)
{
currentSum += square[i, j];
}

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;
}

static int[,] GenerateMagicSquare(int n)


{
int[,] square = new int[n, n];
int i = n / 2;
int j = n - 1;

for (int num = 1; num <= n * n;)


{
if (i == -1 && j == n)
{
j = n - 2;
i = 0;
}
else
{
if (j == n)
j = 0;
if (i < 0)
i = n - 1;
}

if (square[i, j] != 0)
{
j -= 2;
i++;
continue;
}
else

47
square[i, j] = num++;

j++;
i--;
}

return square;
}

static void PrintSquare(int[,] square)


{
int n = square.GetLength(0);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(square[i, j] + " ");
}
Console.WriteLine();
}
}
}
}

3.6 Скриншоты выполнения программ


Скриншоты выполнения программ заданий 1 и 2 приведены на
рисунках 3.12 и 3.13:

Рисунок 3.12 – Результат выполнения программы задания 1

Рисунок 3.13 – Результат выполнения программы задания 2


48
Заключение
Таким образом, работа с одномерными и двумерными массивами
играет важную роль в разработке программных решений, и умение
эффективно манипулировать данными с использованием массивов является
неотъемлемой частью навыков программиста. В процессе исследования было
выяснено, что одномерные массивы обладают рядом преимуществ,
делающих их эффективным способом хранения и управления данными
одного типа. Они обеспечивают быстрый доступ к элементам и позволяют
осуществлять обширную обработку данных. Одномерные массивы широко
применяются в программировании, и основное понимание их работы
является ключевым навыком для разработчика.
С другой стороны, двумерные массивы предоставляют
дополнительную гибкость и возможность работы с данными, которые имеют
двумерную структуру или организованы в виде сетки. Они находят
применение в различных областях, таких как матрицы, таблицы,
изображения и другие структуры данных. Работа с двумерными массивами
требует понимания специфических методов и операций, которые позволяют
управлять данными в соответствии с их структурой.
В процессе исследования и использования одномерных и двумерных
массивов, были изучены и применены различные методы работы с ними. Это
помогло осознать их функционал более глубоко и разобраться в спецификах
их использования. Практическое выполнение задач, связанных с массивами,
способствовало накоплению опыта программирования и улучшению навыков
работы с данными структурами.

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

Вам также может понравиться