Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C program #1

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions RGR_system_software/Discriminant.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "Discriminant.h"

// Функція для обчислення дискримінанту
double discriminant(double a, double b, double c) {
return b*b - 4*a*c;
}

7 changes: 7 additions & 0 deletions RGR_system_software/Discriminant.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#ifndef DISCRIMINANT_H
#define DISCRIMINANT_H

// Функція для обчислення дискримінанту
double discriminant(double a, double b, double c);

#endif // DISCRIMINANT_H
86 changes: 86 additions & 0 deletions RGR_system_software/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
CC=gcc
TARGET=APP_RGR
BUILD_DIR=build
#BUILD_DIR=~/RGR/RGR_SysSofEmbSys_2023/RGR_system_software
LIBRARY_TYPE?=object
#LIBRARY_TYPE=static

# Список об'єктних файлів, які потрібно скомпілювати
ifeq ($(LIBRARY_TYPE), static)
OBJECTS=$(addprefix $(BUILD_DIR)/, main.o libfunc.a)
else
OBJECTS=$(addprefix $(BUILD_DIR)/, main.o Discriminant.o Roots.o)
endif

# Компілювати зі статичною або спільною бібліотекою
ifeq ($(LIBRARY_TYPE), static)
LIBRARY_FLAG=-static
LIBRARY_NAME=libfunc.a
endif

# Задаємо змінні середовища для компілятора та лінкера
ALL_WARNINGS ?=
ifeq ($(ALL_WARNINGS), 1)
CFLAGS=-Wall
else
CFLAGS ?=
endif
LDFLAGS=-lm

# Створення виконуваного файлу Linking
all: $(BUILD_DIR)/$(TARGET)

$(BUILD_DIR)/$(TARGET): $(OBJECTS) | $(BUILD_DIR)/$(LIBRARY_NAME)
ifeq ($(LIBRARY_TYPE), static)
$(CC) $(OBJECTS) -lfunc -L./$(BUILD_DIR) $(LDFLAGS) -o $@
else
$(CC) $(OBJECTS) $(LDFLAGS) -o $@
endif

# Компіляція коду
$(BUILD_DIR)/main.o: main.c Discriminant.h Roots.h | $(BUILD_DIR)
$(CC) -c $< $(CFLAGS) -o $@

$(BUILD_DIR)/Discriminant.o: Discriminant.c Discriminant.h | $(BUILD_DIR)
$(CC) -c $< $(CFLAGS) -o $@

$(BUILD_DIR)/Roots.o: Roots.c Roots.h | $(BUILD_DIR)
$(CC) -c $< $(CFLAGS) -o $@


# Створення бібліотеки
$(BUILD_DIR)/$(LIBRARY_NAME): $(addprefix $(BUILD_DIR)/, Discriminant.o Roots.o)
ifeq ($(LIBRARY_TYPE), static)
ar rcs $@ $^
endif

# Ціль для статичного аналізу коду
.PHONY: check

check:
ifeq ($(CHECK_TOOL), cppcheck)
$(CHECK_TOOL) *.c *.h
@echo "has bin checked with cppcheck!"
else ifeq ($(CHECK_TOOL), checkpatch)
perl checkpatch.pl --no-tree --ignore NEW_TYPEDEFS --ignore MACRO_ARGUMENTS \
--ignore BLOCK_COMMENT_STYLE --ignore LINE_CONTINUATIONS \
--ignore LEADING_SPACE --ignore TRAILING_SPACE -f $(addsuffix /*.[ch], .)
@echo "has bin checked with checkpatch!"
else
@echo "ERROR: Please provide a static code analysis tool with CHECK_TOOL variable"
@exit 1
endif


.PHONY: clean

# Ціль для очищення згенерованих файлів
clean:
rm -rf $(BUILD_DIR)/*.o
rm -rf $(BUILD_DIR)/*.a
rm -rf $(BUILD_DIR)/*.so
rm -rf $(BUILD_DIR)/$(TARGET)

# Створення директорії build
$(BUILD_DIR):
mkdir $(BUILD_DIR)
18 changes: 18 additions & 0 deletions RGR_system_software/Roots.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#include <math.h>
#include "Roots.h"

// Функція для обчислення коренів рівняння
void roots(double a, double b, double c, double disc, int* num_roots, double* x1, double* x2) {

if (disc > 0) {
*num_roots = 2;
*x1 = (-b + sqrt(disc)) / (2*a);
*x2 = (-b - sqrt(disc)) / (2*a);
} else if (disc == 0) {
*num_roots = 1;
*x1 = -b / (2*a);
} else {
*num_roots = -1;
}
}

7 changes: 7 additions & 0 deletions RGR_system_software/Roots.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#ifndef ROOTS_H
#define ROOTS_H

// Функція для обчислення коренів рівняння
void roots(double a, double b, double c, double disc, int* num_roots, double* x1, double* x2);

#endif // ROOTS_H
Binary file added RGR_system_software/build/APP_RGR
Binary file not shown.
Binary file added RGR_system_software/build/Discriminant.o
Binary file not shown.
Binary file added RGR_system_software/build/Roots.o
Binary file not shown.
155 changes: 155 additions & 0 deletions RGR_system_software/build/bash_RGR
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
#!/bin/bash

flag_run_choice=false

# Перевірка на дійсні числа
is_valid_number() {
re='^[+-]?[0-9]+([.][0-9]+)?$'
if ! [[ $1 =~ $re ]]; then
echo "Помилка: '$1' не є дійсним числом."
exit 1
fi
}


num_2_roots=0
num_1_roots=0
num_0_roots=0

# Функція для виведення довідки
show_help() {
echo "Довідка:"
echo " 1. Запустити програму знову? (y або Y - так, n або N - ні)"
echo " Якщо обрати 'y' або 'Y' то запустить програму повторно і"
echo " запитає це знову."
echo " Якщо обрати 'n' або 'N' то перейде до наступного запитання"
echo ""
echo " 2. Запустити програму з заданою кількістю повторів? (y або Y - так, n або N - ні)"
echo " Якщо обрати 'y' або 'Y' то запитає кількість повторів та "
echo " виведе статистику."
echo " Якщо обрати 'n' або 'N' то закінчиться робота скрипта."
echo ""
}


# Головна функція
main() {
# Перевірка наявності виконуваного файлу APP_RGR
if [ ! -x "./APP_RGR" ]; then
echo "Помилка: Неможливо знайти або виконати файл APP_RGR."
exit 1
fi
#Перший запуск програми
if [[ $# == 2 ]]; then
./APP_RGR "$param_a" "$param_b"
elif [[ $# == 1 ]]; then
./APP_RGR "$param_a"
elif [[ $# == 0 ]]; then
./APP_RGR
else
./APP_RGR "$param_a" "$param_b" "$param_c"
fi

#echo "Параметри: $param_a $param_b $param_c"
while true; do
# Запитання про показ довідки
if [[ $flag_run_choice == false ]]; then
read -p "Довідка по роботі зі скриптом (h або H, n або N - ні): " help_choice
if [[ $help_choice == "h" || $help_choice == "H" ]]; then
show_help
fi
fi

# Запуск програми без запитань
read -p "Запустити програму знову? (y або Y - так, n або N - ні): " run_choice
if [[ $run_choice == "y" || $run_choice == "Y" ]]; then

if [[ $# == 2 ]]; then
./APP_RGR "$param_a" "$param_b"
elif [[ $# == 1 ]]; then
./APP_RGR "$param_a"
elif [[ $# == 0 ]]; then
./APP_RGR
else
./APP_RGR "$param_a" "$param_b" "$param_c"
fi

flag_run_choice=false

elif [[ $run_choice == "n" || $run_choice == "N" ]]; then
read -p "Запустити програму з заданою кількістю повторів чи вийти? (y або Y - так, n або N - вийти): " run_choice
if [[ $run_choice == "y" || $run_choice == "Y" ]]; then

flag_run_choice=true
# Запуск програми з заданою кількістю повторів
read -p "Введіть кількість повторів: " repeat_count
is_valid_number "$repeat_count"

for ((i=1; i<=repeat_count; i++)); do
if [[ $# == 2 ]]; then
./APP_RGR "$param_a" "$param_b"
elif [[ $# == 1 ]]; then
./APP_RGR "$param_a"
elif [[ $# == 0 ]]; then
./APP_RGR
else
./APP_RGR "$param_a" "$param_b" "$param_c"
fi
#./APP_RGR "$param_a" "$param_b" "$param_c"
#read -p "" output
output=$?
if [[ $output == "0" ]]; then
((num_2_roots++))
elif [[ $output == "1" ]]; then
((num_1_roots++))
elif [[ $output == "2" ]]; then
((num_0_roots++))
fi
done
echo "Кількість рішень з 2 коренями: $num_2_roots"
echo "Кількість рішень з 1 коренем: $num_1_roots"
echo "Кількість без розв'язку: $num_0_roots"

elif [[ $run_choice == "n" || $run_choice == "N" ]]; then
exit 1 # Завершення з кодом виходу 1
fi
fi
num_2_roots=0
num_1_roots=0
num_0_roots=0
# Запитання про повторний запуск у режимі без запитань
#if [[ $flag_run_choice == false ]]; then
#read -p "Чи хочете ви запустити програму повторно? (y або Y - так, будь-що інше - ні): " continue_choice
#if [[ $continue_choice != "y" && $continue_choice != "Y" ]]; then
#break
#fi
#fi
done
}
# Значення параметрів, що передаються в програму при запуску
if [[ $# == 3 ]]; then
param_a=$1
param_b=$2
param_c=$3
is_valid_number "$param_a"
is_valid_number "$param_b"
is_valid_number "$param_c"
main "$param_a" "$param_b" "$param_c"
elif [[ $# == 2 ]]; then
param_a=$1
param_b=$2
#param_c=
is_valid_number "$param_a"
is_valid_number "$param_b"
main "$param_a" "$param_b"
elif [[ $# == 1 ]]; then
param_a=$1
is_valid_number "$param_a"
#param_b=
#param_c=
main "$param_a"
else
main
fi
# Виклик головної функції
#main "$param_a" "$param_b" "$param_c"
Binary file added RGR_system_software/build/main.o
Binary file not shown.
Loading