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

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

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


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

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


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

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

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

Руководитель (нормоконтролер) работы к.т.н., доц. В.А. Мурлина


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

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

Члены комиссии: ассистент П.А. Косолапов


ст. преп. А.А. Ковтун

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

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

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


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

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

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

Студенту Ткачёву Ивану Андреевичу курса 1 группы 23-КБ-ПР4


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

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

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

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

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

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

Руководитель работы ______________________________ к.т.н., доц. В.А. Мурлина


(подпись)
Задание принял студент И.Ю. Крикунов
(подпись)
Реферат

Пояснительная записка к курсовой работе содержит: 29 страниц, 13


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

3
Содержание
Введение...................................................................................................................5
1. Нормативные ссылки........................................................................................6
2. Одномерные массивы.......................................................................................7
2.1. Общие сведения.......................................................................................7
2.2. Постановка задачи...................................................................................7
2.3. Математические решения.......................................................................8
2.4. Блок-схемы алгоритмов..........................................................................9
2.5. Программные реализации.....................................................................12
2.6. Скриншоты выполнения программ.....................................................15
3. Двумерные массивы........................................................................................16
3.1. Общие сведения.....................................................................................16
3.2. Постановка задач...................................................................................16
3.3. Математические решения.....................................................................16
3.4. Блок-схемы алгоритмов........................................................................18
3.5. Программные реализации.....................................................................22
3.6. Скриншоты выполнения программ.....................................................25
Заключение............................................................................................................27
Список использованных источников..................................................................28
Приложение А.......................................................................................................29

4
Введение

Актуальность темы. Массивы представляют собой часто


используемый метод для хранения разнообразных данных. Они пригодны как
для хранения упорядоченных и неупорядоченных списков информации, так и
для организации таблиц и выполнения множества других задач. Понятие
"массив" существенно важно при работе над научными, техническими и
экономическими проблемами, связанными с обработкой больших объемов
данных.
Цель работы: Разработка и реализация программы,
демонстрирующей применение массивов для конкретной задачи. Этот проект
направлен на развитие практических навыков работы с массивами в решении
разнообразных задач, основанных на алгоритмах.
Задачи:
 получить список заданий для их реализации;
 составить алгоритм и математическое обоснование решения
предоставленных задач;
 реализовать идею решения на C# в среде программирования
Microsoft Visual Studio;
 построить блок-схемы составленных программ;
 оформить полученный продукт в виде пояснительной записки;
 сделать вывод по работе.

5
1. Нормативные ссылки

В данной пояснительной записке использованы ссылки на следующие


стандарты:
 ГОСТ 2.105-95 ЕСКД. Общие требования к текстовым
документам;
 ГОСТ 7.32-2007. Система стандартов по информации,
библиотечному и издательскому делу. Отчет о научно - исследовательской
работе. Структура и правила оформления;
 ГОСТ Р.7.0.5-2008 СИБИД. Библиографическая ссылка. Общие
требования и правила составления;
 ГОСТ 7.12-93 СИБИД. Библиографическая ссылка. Сокращение
слов на русском языке. Общие требования и правила.

6
2. Одномерные массивы

2.1. Общие сведения


Одномерный массив в программировании представляет собой
структуру данных, где хранится упорядоченный ряд элементов одного типа,
каждый из которых определяется своим индексом. Создание такого массива
включает объявление типа данных его элементов, указание имени массива и
его размера, а инициализация — установку значений элементов. [1, 2]
Возможности одномерного массива включают:
 хранение данных различных типов: массив может содержать
целые числа, числа с плавающей точкой, символы, булевы значения и другие
типы данных;
 доступ к элементам: элементы в массиве нумеруются, начиная с
0, что обеспечивает простой доступ к элементам по их индексам;
 изменение элементов: значения элементов массива могут быть
изменены путем присвоения новых значений по их индексам;
 операции над элементами: массив позволяет выполнять
различные операции, такие как сортировка, поиск минимального или
максимального значения, подсчет суммы или среднего значения и многое
другое. [3]

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


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

7
2.3. Математические решения
Алгоритм решения задания 1: пользователь вводит размерность
массива, после чего программа создает одномерный массив
соответствующего размера и заполняет его случайными числами в диапазоне
от -10 до 10. Созданный массив выводится на экран с помощью метода
string.join().
Далее программа инициализирует переменную geometricMean и
присваивает ей значение 1. Затем в цикле перебора элементов массива
происходит умножение накопленного в этой переменной значения на
абсолютную величину отрицательных элемента массива. Если
отрицательных чисел в массиве нет, то происходит завершение работы
программы. Далее вычисляется геометрическое среднее путем извлечения
корня из полученного накопленного умножением значения.
Инициализируем переменную minDistance с максимальным значением
типа данных Integer и savedIndex со значением -1. Далее в цикле ищем такое
число в массиве, чтобы абсолютная разность с геометрическим средним была
наименьшей, и сохраняем индекс этого элемента. Затем создаем последний
цикл, в котором происходит уменьшение чисел на 1 начиная с сохраненного
в переменной savedIndex индекса. Результат выводится в консоль с помощью
метода string.join().
Алгоритм решения задания 2: пользователь вводит размерность
массива, после чего программа создает одномерный массив
соответствующего размера и заполняет его случайными числами в диапазоне
от -10 до 10. Созданный массив выводится на экран с помощью метода
string.join().
Далее в цикле происходит сортировка элементов массива с помощью
алгоритма сортировки вставкой. Во внешнем цикле задается переменная min,
в которую после выполнения вложенного цикла записывается индекс
минимального числа в массиве. Во вложенном цикле игнорируются
отрицательные элементы, поэтому в результате сортировки они останутся на

8
своих местах. Далее происходит обмен значениями между текущим
указателем в цикле и найденным минимальным значением. Результат
выводится в консоль с помощью метода string.join().
2.4. Блок-схемы алгоритмов

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

9
Рисунок 2 – Блок-схема метода StartTask1() часть 1

10
Рисунок 3 – Блок-схема метода StartTask1() часть 2

11
Рисуснок 4 – Блок-схема метода StartTask2()
2.5. Программные реализации
Листинг метода Main:
static void Main(string[] args)
{

12
Console.WriteLine("Введите нормер задания (1, 2, 3, 4)");
int taskNumber = 0;
string? input = Console.ReadLine();
if (input != null)
{
taskNumber = int.Parse(input);
}
switch (taskNumber)
{
case 1:
{
StartTask1();
}
break;
case 2:
{
StartTask2();
}
break;
case 3:
{
StartTask3();
}
break;
case 4:
{
StartTask4();
}
break;
default:
return;
}
}

Листинг метода StartTask1:


private static void StartTask1()
{
Console.WriteLine("Введите размер массива");
int n = 0;
string? input = Console.ReadLine();
if (input != null)
{
n = int.Parse(input);
}
Random rnd = new Random();
int[] array = new int[n];
for (int i = 0; i < array.Length; i++)
{
array[i] = rnd.Next(-10,10);
}
Console.WriteLine("Исходный массив:");
13
Console.WriteLine(string.Join(", ",array));
double geometricMean = 1;
for (int i = 0; i < array.Length; i++)
{
if (array[i] < 0)
{
geometricMean *= Math.Abs(array[i]);
}
}
if (geometricMean == 1)
{
Console.WriteLine("Нет отрицательных чисел");
return;
}
geometricMean = Math.Sqrt(geometricMean);
Console.WriteLine($"Геометрическое среднее: {geometricMean}");
int minDistance = int.MaxValue;
int savedIndex = -1;
for (int i = 0; i < array.Length; i++)
{
if (Math.Abs(array[i] - (int)geometricMean) < minDistance)
{
minDistance = Math.Abs(array[i] - (int)geometricMean);
savedIndex = i;
}
}
for (int i = savedIndex+1; i < array.Length; i++)
{
array[i] -= 1;
}
Console.WriteLine("Результат:");
Console.WriteLine(string.Join(", ", array));
}

Листинг метода StartTask2:


private static void StartTask2()
{
Console.WriteLine("Введите размер массива");
int n = 0;
string? input = Console.ReadLine();
if (input != null)
{
n = int.Parse(input);
}
Random rnd = new Random();
int[] array = new int[n];
for (int i = 0; i < array.Length; i++)
{
array[i] = rnd.Next(-10, 10);
}
Console.WriteLine("Исходный массив:");
14
Console.WriteLine(string.Join(", ", array));
for (int i = 0; i < array.Length - 1; i++)
{
int min = i;
for (int j = i + 1; j < array.Length; j++)
{
if (array[j] < 0) continue;
if (array[j] < array[min])
{
min = j;
}
}
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
Console.WriteLine("Сортированный массив:");
Console.WriteLine(string.Join(", ", array));
}
2.6. Скриншоты выполнения программ
Скриншоты выполнения программ заданий 1 и 2 приведены на
рисунках 5 и 6

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

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

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

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


Двумерный массив представляет собой структуру данных,
организованную в виде таблицы с двумя измерениями (строки и столбцы).
Как и обычный массив, он хранит элементы одного типа, однако для доступа
к ним используются два индекса: один для строки и другой для столбца. Это
позволяет однозначно определить каждый элемент по его координатам в
массиве (индекс строки и столбца).
Двумерные массивы обладают рядом возможностей, которые
выделяют их среди одномерных массивов:
 операции с матрицами: они применяются в математических
операциях и алгоритмах, связанных с матричными вычислениями.
 представление структур данных: используются для
моделирования таблиц, графиков и изображений в программировании.
 пространственное представление данных: обеспечивают удобное
хранение информации с пространственной структурой, такой как карты,
сетки или данные на плоскости.
3.2. Постановка задач
Задание 1. Найти максимум среди всех локальных минимумов
заданной матрицы.
Задание 2. Даны три целые матрицы размером 9х4. Напечатать ту из
них, где больше нулевых строк (если таких матриц несколько, напечатать их
все).
3.3. Математические решения
Алгоритм решения задания 1: пользователь вводит размер двумерного
массива (число n), после этого программа создает двумерный массив
соответствующего размера и заполняет его случайными элементами в
диапазоне числе от -10 до 10. Созданный массив выводится в консоль. Далее
инициализируется переменная maximum со значением, равным минимально

16
допустимому типом Integer. Затем в цикле происходит поиск элемента в
массиве, являющимся локальным минимумом и при этом большим, чем
значение переменной maximum. Найденное значение записывается в
переменную maximum и выводится в консоль.
Алгоритм решения задания 2: происходит создание и заполнение
случайными числами в диапазоне от 0 до 1 трех массивов размерностью 9 на
4. Далее происходит построчный перебор элементов массивов, при этом
подсчитывается количество нулей в строке. Если число нулей соответствует
длине строки, то происходит инкремент одной из переменных
countNullRows1, countNullRows2, countNullRows3 в зависимости от того, по
какому массиву происходит итерирование. Затем массив выводится в
консоль.

17
3.4. Блок-схемы алгоритмов

Рисунок 7 – Блок-схема метода StartTask3

18
Рисунок 8 – Блок-схема метода IsLocalMinimum

19
Рисунок 9 – Блок-схема метода StartTask4 часть 1

20
Рисунок 10 – Блок-схема метода StartTask4 часть 2

21
Рисунок 11 – Блок-схема метода StartTask4 часть 3

3.5. Программные реализации


Листинг метода StartTask3():
private static void StartTask3()
{
Console.WriteLine("Введите размер матрицы");
int n = 0;
string? input = Console.ReadLine();
if (input != null)
{
n = int.Parse(input);
}
Random rnd = new Random();
int[,] array = new int[n,n];
Console.WriteLine("Исходный массив:");
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i, j] = rnd.Next(-10, 10);
Console.Write(array[i, j] + ", ");
}
Console.WriteLine();
}
int maximum = int.MinValue;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)

22
{
int current = array[i, j];
if (IsLocalMinimum(array, i, j) && current > maximum){
maximum = current;
}
}
}
Console.WriteLine($"Максимальный локальный минимум: {maximum}");
}
Листинг метода IsLocalMinimum():
private static bool IsLocalMinimum(int[,] matrix, int n, int m)
{
int current = matrix[n,m];
if (n + 1 < matrix.GetLength(0))
{
if (matrix[n + 1, m] < current)
return false;
}
if (n - 1 >= 0)
{
if (matrix[n - 1, m] < current)
return false;
}
if (m + 1 < matrix.GetLength(0))
{
if (matrix[n, m + 1] < current)
return false;
}
if (m - 1 >= 0)
{
if (matrix[n, m - 1] < current)
return false;
}
return true;
}
Листинг метода StartTask4():
private static void StartTask4()
{
Random rnd = new Random();
int[,] array = new int[9, 4];
int[,] array2 = new int[9, 4];
int[,] array3 = new int[9, 4];
int countNullRows1 = 0;
int countNullRows2 = 0;
int countNullRows3 = 0;
for (int i = 0; i < array.GetLength(0); i++)
{
int count1 = 0;
for (int j = 0; j < array.GetLength(1); j++)
{

23
array[i, j] = rnd.Next(2);
if (array[i, j] == 0) count1++;
}
if (count1 == 4) countNullRows1++;
}
for (int i = 0; i < array2.GetLength(0); i++)
{
int count2 = 0;
for (int j = 0; j < array2.GetLength(1); j++)
{
array2[i, j] = rnd.Next(2);
if (array2[i, j] == 0) count2++;
}
if (count2 == 4) countNullRows2++;
}
for (int i = 0; i < array3.GetLength(0); i++)
{
int count3 = 0;
for (int j = 0; j < array3.GetLength(1); j++)
{
array3[i, j] = rnd.Next(2);
if (array3[i, j] == 0) count3++;
}
if (count3 == 4) countNullRows3++;
}
if (countNullRows1 < countNullRows2)
{
if (countNullRows2 < countNullRows3)
{
for (int i = 0; i < array3.GetLength(0); i++)
{
for (int j = 0; j < array3.GetLength(1); j++)
{
Console.Write(array3[i, j] + ", ");
}
Console.WriteLine();
}
}
else
{
for (int i = 0; i < array2.GetLength(0); i++)
{
for (int j = 0; j < array2.GetLength(1); j++)
{
Console.Write(array2[i, j] + ", ");
}
Console.WriteLine();
}
}
}
else
{

24
if (countNullRows1 > countNullRows3)
{
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.Write(array[i, j] + ", ");
}
Console.WriteLine();
}
}
else
{
for (int i = 0; i < array3.GetLength(0); i++)
{
for (int j = 0; j < array3.GetLength(1); j++)
{
Console.Write(array3[i, j] + ", ");
}
Console.WriteLine();
}
}
}
}

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


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

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

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

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

27
Список использованных источников
1. Павловская Т.А. С#. Программирование на языке высокого
уровня. Учебник для вузов. – СПб.: Питер, 2014. – 432 с: ил.
2. SkillBox Media | Код // Что такое массив и как он устроен. 2
февраля 2023. URL: https://skillbox.ru/media/code/chto-takoe-massiv-i-kak-on-
ustroen/ (Дата обращения: 12.10.2023)
3. Metanit.com – Сайт о программировании // Массивы C#. 10
ноября 2021. URL: https://metanit.com/sharp/tutorial/2.4.php (Дата обращения:
18.10.2023)

28
Приложение А

29

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