Файл: Курсовой проект по дисциплине Основы программирования и алгоритмизации Тема Разработка программы табулирования функции.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 17.10.2024
Просмотров: 44
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Рисунок 2.9 – Блок-схема функции построения графика
Для реализации подзадачи 2 созданы следующие функции.
Функция int* sort_func(int* x, int c) выполняет шейкерную сортировку массива, указатель на который передается в качестве параметра. Также функции передается переменная (c), в которой хранится результат выбора пользователя, в зависимости от которого функция будет выполнять сортировку либо по возрастанию, либо по убыванию. Для реализации сортировки расческой сначала делим длину массива(N) на число 1,247(factor), которые представлены директивой. На каждом шаге это значение снова делим на число 1,247(factor). Тело цикла выполняется до тех пор, пока это значение больше 1. Блок-схема алгоритма представлена на рисунке 2.10.
Рисунок 2.10 – Блок-схема функции сортировки
Функция int find_func(int* x, int y) ищет введенное число в введенном массиве. Функции передается указатель на массив и параметр y, хранящий число. Используется директива N, равная длине массива. Блок-схема алгоритма представлена на рисунке 2.11.
Рисунок 2.11 – Блок-схема функции поиска элемента
Функция int сalc_func(int* x, int y) выполняет замену четных элементов массива на нолики, а нечетные элементы на единички. Происходит это путем считывания массива (элементы от 1 до 10). Если выполняется условие деления на 0 без остатка, то элементы меняются на нолики, а если не выполняется, то на единицу.
Блок-схема алгоритма представлена на рисунке 2.12.
Рисунок 2.12 – Блок-схема функции смены элементов массива
3. Тестирование программы
Начнем с интерфейса программы. Он представлен на рисунке 3.0.
Рисунок 3.0 – Интерфейс программы
Для тестирования программы будут вноситься те данные, о которых было сказано в предыдущий разделах, но так как программа функционирует со всеми возможностями, то иногда результатов будет больше чем нужно. На рисунке 3.1 мы видим табуляцию монотонной функции Y(x).
Рисунок 3.1 – Табуляция монотонной функции Y(x)
Рисунок 3.2 – Табуляция кусочной функции V(x)
На следующих рисунках (рисунок 3.3 - 3.4) будет приведен пример работы части программы с графиком под монотонную и кусочную функции:
Рисунок 3.3 – Меню программы; сортировка для функции V
Рисунок 3.4 – График кусочной функции V(x) при x > 3.61
На следующих рисунках (рисунок 3.5 - 3.7) будет приведен пример работы 2 подзадачи:
Рисунок 3.5 – Работа сортировки
Рисунок 3.6 – Работа поиска нужного элемена в массиве
Рисунок 3.7 – Работа замены элеменов в массиве
Заключение
В ходе курсового проектирования на языке СИ, с использованием среды
разработки Visual Studio 2019 была реализована программа табулирования функций, а также модули обработки одномерного массива.
Первая часть разработанной программы должна производить вычисление выбранной пользователем функции при заданном шаге и интервале вычисляемых значений, вывести результат в консоли в виде таблицы. А так же, программа должна строить график выбранной функции и выводить его в консоли вместе с осями координат.
Вторая часть программы должна сортировать введенный массив пузырьковым методом, в упорядоченный массив по убыванию вставлять элемент b не нарушив упорядоченности массива.
Все описанные действия должны предлагаться пользователю в виде меню. Должна быть возможность вернуться к основному меню выбора либо завершить выполнение программы. Необходима проверка на ошибки на каждом этапе программы.
Все требования к программе выполнены успешно. Реализован интерфейс программы, вычисление двух функций, сортировка введенного массива пузырьковым методом, а так же в упорядоченный массив по убыванию вставляет элемент b не нарушив упорядоченности массива, присутствует запись в файл результатов вычислений. Учтен ошибочный ввод с клавиатуры, имеется возможность начать программу заново или выйти из нее.
Список использованных источников
-
Практикум по Си: портал с практическими занятиями [Электронный ресурс] / https://sites.google.com/view/course-of-study1-c/главная/инструменты-разработки/создание-проекта?authuser=0 / -
Роберт С. Эффективный C. Профессиональное программирование. / Роберт С. // с.24-269. -
Культин Н.Б. С/C++ в задачах и примерах / Культин Н.Б. // Решения задач с.71-236. -
Жданова Т.А. Основы алгоритмизации и программирования: учебное пособие / Т.А. Жданова, Ю.С. Бузыкова. - Хабаровск: Изд-во Тихоокеан. гос.ун-та, 2011. - 56 с. -
Столяров А. В. Программирование: введение в профессию. I: Азы программирования. — М.: МАКС Пресс, 2016. — 464 с
Приложение
#include
#include
#include
#include
#include
#include
#include
#define SCREENW 115
#define SCREENH 40
#define N 10
typedef double (*TFun)(double);
double task_one();
double task_two();
double func1(double);
double func2(double);
double* tabl_func(TFun, double, double, double);
void plot(double, double, TFun);
void print_func(double*, double, double, double);
double sort_func(int*, int);
int find_func(int*, int);
int сalc_func(int*);
int func, select;
double xmin, xmax, dx, arrLength;
char b_l, b_r;
void main()
{
setlocale(LC_ALL, "RU");
printf(" \n");
printf(" ******************************************************\n");
printf(" * *\n");
printf(" * Курсовой проект *\n");
printf(" * Разработка программы для табулирования функции *\n");
printf(" * Выполнил: Логунов М. Д. *\n");
printf(" * Руководитель: Курипта О. В. *\n");
printf(" * Группа: бИСТ-213 *\n");
printf(" * *\n");
printf(" ******************************************************\n");
printf(" \n");
/// Задание 1
task_one();
/// Задание 2
task_two();
}
double task_one()
{
printf(" ********************** \n");
printf(" * * \n");
printf(" * ЗАДАНИЕ 1 * \n");
printf(" * * \n");
printf(" ********************** \n");
printf("\n Выберите функцию: \n\n");
printf(" 1 - Монотонная функция Y(x) \n");
printf(" 2 - Кусочная функция V(x) \n");
printf("\n\n Монотонная функция \n");
printf("\n Y(x) = arccos(0.5·|sin(x-3)|)+3x \n");
printf(" _________________________ \n");
printf(" x^(-1/3) \n");
printf(" \n");
printf("\n Кусочная функция \n");
printf(" ___ \n");
printf(" | \n");
printf(" | e^(x+0,8) при x > 3,61 \n");
printf(" V(x)= --| 1 при 0 <= x <= 3,61 \n");
printf(" | 0.5x при x < 0 \n");
printf(" |___ \n\n");
printf(" Ваш выбор: ");
scanf_s("%d", &func);
if (func == 3)
exit(0);
printf("\n Введите: 1 - Табуляция\n");
printf(" 2 - График\n\n");
printf(" Ваш выбор: ");
scanf_s("%d", &select);
printf("\n Введите интервал вида (xmin;xmax): ");
scanf(" %c%lf;%lf%c", &b_l, &xmin, &xmax, &b_r);
if (xmin > xmax)
{
printf(" Ошибка: Начальное значение больше конечного\n");
return;
}
switch (select)
{
case 1:
printf("\n Введите шаг табуляции: ");
scanf_s("%lf", &dx);
double* arr;
arrLength = ((xmax - xmin) / dx) + 1;
/// Выделение памяти под массив
switch (func)
{
case 1:
arr = tabl_func(func1, xmin, xmax, dx, b_l, b_r);
print_func(arr, xmin, xmax, dx, b_l, b_r);
free(arr);
return;
case 2:
arr = tabl_func(func2, xmin, xmax, dx, b_l, b_r);
print_func(arr, xmin, xmax, dx, b_l, b_r);
free(arr);
return;
default:
printf("Неизвестная команда\n"); break;
}
break;
case 2:
switch (func)
{
case 1:
plot(xmin, xmax, b_l, b_r, func1); break;
case 2:
plot(xmin, xmax, b_l, b_r, func2); break;
default:
printf("Неизвестная команда\n"); break;
}
break;
default:
printf("Неизвестная команда\n"); break;
}
}
/// Монотонная функция
double func1(double x)
{
if (x == 0)
{
return 0;
}
return acos(0.5 * abs(sin(x-3))) + 3 * x / pow(x, -(1/3));
}
/// Кусочная функция
double func2(double x)
{
if (x > 3.61)
{
return exp((-x + 0.8));
}
if (x <= 0 && x <= 3.61)
{
return 1;
}
if (x < 0)
{
return 0.5 * x;
}
}
/// Логика для табуляции
double* tabl_func(TFun f, double xmin, double xmax, double dx)
{
int i = 0;
double arrLength = ((xmax - xmin) / dx) + 1;
/// Выделение памяти для массива
double* arr = (double*)malloc(arrLength * sizeof(double));
for (double x = xmin + dx; x < xmax; x += dx, i++)
{
arr[i] = f(x);
}
return arr;
}
/// Печать табуляции
void print_func(double* arr, double xmin, double xmax, double dx)
{
int i = 0;
printf(" ____________________________ \n");
printf(" | | |\n");
printf(" | x | f(x) |\n");
printf(" |_____________|______________|\n");
for (double x = xmin + dx; x < xmax; x += dx, i++)
{
printf(" | | | \n");
printf(" | %8.2lf | %8.2lf | \n", x, arr[i]);
printf(" |_____________|______________|\n");
}
printf("\n");
}
/// Построение графика
void plot(double x0, double x1, TFun f)
{
char screen[SCREENW][SCREENH];
double x, y[SCREENW];
double ymin = 0, ymax = 0;
double hx, hy;
int i, j;
int xz, yz;
/// Расчет значений функции для каждой точки поля вывода графика
hx = (x1 - x0) / (SCREENW - 1);
for (i = 0, x = x0; i < SCREENW; ++i, x += hx)
{
y[i] = f(x);
if (y[i] < ymin) ymin = y[i];
if (y[i] > ymax) ymax = y[i];
}
hy = (ymax - ymin) / (SCREENH - 1);
yz = (int)floor(ymax / hy + 0.5);
xz = (int)floor((0. - x0) / hx + 0.5);
/// Построение осей и заполнение массива отображения пробелами
for (j = 0; j < SCREENH; ++j)
{
for (i = 0; i < SCREENW; ++i)
{
if (j == yz && i == xz) screen[i][j] = '+';
else if (j == yz) screen[i][j] = '-';
else if (i == xz) screen[i][j] = '|';
else screen[i][j] = ' ';
}
}
/// Определение положения значения функции на поле вывода
for (i = 0; i < SCREENW; ++i)
{
j = (int)floor((ymax - y[i]) / hy + 0.5);
screen[i][j] = '*';
}
/// Печать массива из символов
for (j = 0; j < SCREENH; ++j)
{
for (i = 0; i < SCREENW; ++i) putchar(screen[i][j]);
putchar('\n');
}
}
double task_two()
{
printf(" \n");
printf(" ********************** \n");
printf(" * * \n");
printf(" * ЗАДАНИЕ 2 * \n");
printf(" * * \n");
printf(" ********************** \n");
printf(" \n");
printf(" РАБОТА С МАССИВОМ \n");
printf(" \n");
printf(" Введите массив из %d чисел: \n\n", N);
int* x;
x = (int*)malloc(N * sizeof(double)); // выделение памяти под массив
int c;
int* xcopy;
xcopy = (int*)malloc(N * sizeof(double)); //выделение памяти под копию массива
for (int i = 0; i < N; i++)
{
printf(" x[%d] = ", i + 1);
scanf_s("%d", &x[i]);
}
int p = 1;
int steps;
int y = 0;
select = 0;
while (p == 1)
{
printf("\n Введите: 1 - Сортировать массив\n");
printf(" 2 - Поиск нужного числа в массиве\n");
printf(" 3 - Сменить элементы массива на 0 / 1\n");
printf(" 4 - Выход\n");
printf("\n Ваш выбор: ");
scanf_s("%d", &select);
switch (select)
{
case 1:
memcpy(xcopy, x, N * sizeof(double)); //копирование массива
printf(" \n");
printf(" Сортировка массива: по возрастанию (1)\n");
printf(" по убыванию (2)\n ");
printf("\n Ваш выбор: ");
scanf_s("%d", &c);
sort_func(xcopy, c);
for (int i = 0; i < N; i++)
{
printf(" x[%d] = %d\n", i + 1, xcopy[i]);
}
printf("\n Чтобы продолжить нажмите 1, чтобы завершить - 2\n");
printf("\n Ваш выбор: ");
scanf_s("%d", &p);
break;
case 2:
printf(" \n");
printf(" Поиск числа в массиве, введите число: ");
scanf_s("%d", &y);
int idx = find_func(x, y);
if (idx == -1)
printf(" Значение не найдено\n");
else
printf(" Индекс найденного элемента массива: %d\n", idx + 1);
printf("\n Чтобы продолжить нажмите 1, чтобы завершить - 2\n");
printf("\n Ваш выбор: ");
scanf_s("%d", &p);
break;
case 3:
memcpy(xcopy, x, N * sizeof(double)); /// Копирование массива
сalc_func(x,y);
printf("\n Чтобы продолжить нажмите 1, чтобы завершить - 2\n");
printf("\n Ваш выбор: ");
scanf_s("%d", &p);
break;
case 4:
exit(0);
default:
printf(" \n");
printf(" Неизвестная команда\n");
printf("\n Чтобы продолжить нажмите 1, чтобы завершить - 2\n");
printf("\n Ваш выбор: ");
scanf_s("%d", &p);
break;
}
}
free(x); /// Выгрузка памяти
free(xcopy);
}
void swap(int* arr, int i) /// Для обмена значений двух переменных
{
int buff;
buff = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = buff;
}
/// Алгоритм сортировки
double sort_func(int* arr, int c)
{
int l = 1;
int r = N - 1;
while (l <= r)
{
for (int i = r; i >= l; i--)
if (c == 1) {
if (arr[i - 1] > arr[i]) swap(arr, i);
}
else {
if (arr[i - 1] < arr[i]) swap(arr, i);
}
l++;
for (int i = l; i <= r; i++)
if (c == 1) {
if (arr[i - 1] > arr[i]) swap(arr, i);
}
else {
if (arr[i - 1] < arr[i]) swap(arr, i);
}
r--;
}
}
/// Поиск значения в массиве
int find_func(int* x, int y)
{
for (int i = 0; i < N; i++)
{
if (x[i] == y) return i;
}
return -1;
}
/// Смена элементов массива на 0 и 1
int сalc_func(int* x, int y)
{
for (int i = 0; i < N; i++)
{
if (i % 2 == y)
{
printf(" x[%d] --> x[1]\n", i + 1, x[i]);
}
else
{
printf(" x[%d] --> x[0]\n", i + 1, x[i]);
}
}
return y;
}