/**
* @file Main.cpp
* @autor Коваленко І. В. 515б
* @date 02.02.2023
* @brief Лабораторна робота №2, варіант 11
*
* Модульне тестування. Завдання 2
*/
#include "Foonk.h"
#include <stdio.h>
#include <locale.h>
int main(void) {
setlocale(LC_ALL, "ru");
//вызов калькулятора
calculation(0,0,0,0);
//завершение программы
printf("Завершение программы.");
return 0;
}
#define PRIVATE static
#define PUBLIC
#define END_PROGRAM 0
#define ERROR -1
#define DEGREES 57.29577951308
#ifndef MYBOOLEAN_H
#define MYBOOLEAN_H
#define false 0
#define true 1
typedef int bool; // or #define bool int
#endif
//прототипы функций
double object();
char action_on_object();
double calculation(double object_x, bool continue_of_operation_return, char action_on_object, double object_y);
double continue_of_operation(double answer_from_calculator);
double calculation_addition(double object_x, double object_y);
double calculation_subtraction(double object_x, double object_y);
double calculation_multiplication(double object_x, double object_y);
double calculation_division(double object_x, double object_y);
double calculation_of_arcsinx(double object_x);
double calculation_of_root(double object_x);
double calculation_of_degree(double object_x);
#include "Foonk.h"
#include <stdio.h>
#include <locale.h>
#include <math.h>
//функция возвращающая числа
double object() {
double num;
//ввод данных
printf("Введите ваше число: ");
scanf("%lg", &num);
//возврат числа
return num;
}
//функция возвращающет действие и првоеряет корректность действия
char action_on_object() {
//переменная действия
char action;
//оглашение возможных действий ( + , - , * , / , C , arcsin(x) , 4rx , x^3)
printf("\n==================================================\n");
printf("Введите действие, которое хотите ввести.\nВозможные действия:\n\t+\t|\tсумма\n\t-\t|\tразница\n\t*\t|\tумнжение\n\t/\t|\tделение\n\tC\t|\tочистка данных\n\ta\t|\tarcsin(x)\n\tr\t|\tкорень четвертой степени\n\td\t|\tстепень третьей степени\n");
printf("\n==================================================\n\n");
//ввод действия
action = getchar();
//проверка действия
switch (action) {
case '+':
case '-':
case '*':
case '/':
case 'C':
case 'a':
case 'r':
case 'd':
break;
default:
printf("Ошибка введенных данных. Пожалуйста, попробуйте снова.");
return ERROR;
}
//объявление выполняемого значения
printf("Ваше действие: %c\n", action);
//возврат значений действия
return action;
}
//функция-калькулятор (первое число, повторный вызов функции?, выполняемое действие, второе число)
double calculation(double object_x, bool continue_of_operation_return, char callback_of_action_on_object, double object_y) {
//условия запроса данных и их условия, для устранения ошибок
if(continue_of_operation_return == 0)
object_x = object();
callback_of_action_on_object = action_on_object();
if (callback_of_action_on_object == -1)
return ERROR;
if (!(callback_of_action_on_object == 'C' || callback_of_action_on_object == 'a' || callback_of_action_on_object == 'r' || callback_of_action_on_object == 'd'))
object_y = object();
//создание переменных
double calculated_object;
//возможные действия калькулятора
switch (callback_of_action_on_object) {
//сложение чисел
case '+':
calculated_object = calculation_addition(object_x, object_y);
break;
//вычитание чисел
case '-':
calculated_object = calculation_subtraction(object_x, object_y);
break;
//умножение чисел
case '*':
calculated_object = calculation_multiplication(object_x, object_y);
break;
//деление чисел
case '/':
if (object_y == 0) {
printf("Ошибка. Знаменатель не может ровняться нулю.");
return ERROR;
}
calculated_object = calculation_division(object_x, object_y);
break;
//стереть данные
case 'C':
calculated_object = 0;
break;
//арксинус первой переменной
case 'a':
if (object_x < -1 || object_x > 1) {
printf("Ошибка. Число должно быть в промежутке [-1 ; 1].");
return ERROR;
}
printf("Рассчет и перевод значений в градусы...\n");
calculated_object = calculation_of_arcsinx(object_x);
break;
//корень четвертой степени числа
case 'r':
if (object_x < 0) {
printf("Ошибка. Недопустимые значения под корнем, число должно быть больше либо равно нулю.\n");
return ERROR;
}else
calculated_object = calculation_of_root(object_x);
break;
//число в третьей степени
case 'd':
calculated_object = calculation_of_degree(object_x);
break;
//ошибочные данные
default:
printf("Ошибка введенных данных. Пожалуйста, попробуйте снова.");
return ERROR;
}
//вызов функции запроса на продолжение
return continue_of_operation(calculated_object);
}
//сложение чисел
double calculation_addition(double object_x, double object_y) {
return object_x + object_y;
}
//вычитание чисел
double calculation_subtraction(double object_x, double object_y) {
return object_x - object_y;
}
//умножение чисел
double calculation_multiplication(double object_x, double object_y) {
return object_x * object_y;
}
//деление чисел
double calculation_division(double object_x, double object_y) {
return object_x / object_y;
}
//арксинус первой переменной
double calculation_of_arcsinx(double object_x) {
return asin(object_x) * DEGREES;
}
//корень четвертой степени числа
double calculation_of_root(double object_x) {
return pow(object_x, 0.25);
}
//число в третьей степени
double calculation_of_degree(double object_x) {
return pow(object_x, 3.0);
}
//функция продолжения операции, она определяет, будет ли продолжена операция или нет
double continue_of_operation(double answer_from_calculator) {
//запрос на продолжение
printf("Ответ: %lg\nХотите выполнить больше операций?\n", answer_from_calculator);
printf("1 - да\n2 - нет\n");
//создание переменной
char done;
//ввод данных
done = getchar();
//если да
if (done == 1) {
printf("Ваше число: %lg\n", answer_from_calculator);
return calculation(answer_from_calculator, 1, 0, 0);
}
//если нет
else if (done == 2)
return END_PROGRAM;
//ошибка
else
return ERROR;
}