Файл: Разработка алгоритмов и программ с использованием массивов в среде С.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 46
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Результатом курсовой работы является два программных продукта, позволяющих создавать:
-
одномерный массив целых чисел, находить сумму элементов с нечетными номерами и сумму между первым и последним отрицательным элементом. -
двумерный целочисленный массив (прямоугольную матрицу) и находить максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы, а так же произведение элементов в тех строках, которые не содержат отрицательные элементы.
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");
}