Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define ERROR_CODE -1
  6. #define RIGHT 0
  7. #define INPUT_OK 1
  8. #define ALLOWED_INPUT_SIZE 38
  9. #define SIGN_QUANTITY_LIMIT 2
  10. #define DEGREE_LIMIT 1
  11. #define DOT_LIMIT 1
  12. #define POSITIVE_NUMBER 1
  13. #define NEGATIVE_NUMBER -1
  14. #define TRUE 1
  15. #define FALSE 0
  16.  
  17. /*1)Смоделировать операцию деления действительного числа
  18. на действительное число в форме (+,-)m.n Е (+,-)K, где
  19. суммарная длина мантиссы (m+n) - до 30 значащих цифр, а
  20. величина порядка K - до 5 цифр. Результат выдать в форме
  21.  (+,-)0.m1 Е (+,-)K1, где m1 - до 30 значащих цифр, а K1 - до 5
  22. цифр.
  23.  *
  24.  * */
  25.  
  26. typedef struct // структура для хранения чисел в проавильном формате
  27. {
  28.     int size; // размер числа
  29.     int digits[ALLOWED_INPUT_SIZE]; // Число
  30.     int E; // порядок числа (значение после Е)
  31.     int sign;
  32. } big_decimal;
  33.  
  34. void welcome_text()
  35. {
  36.     printf("Data entry begins strictly with the sign of the number(+ or -) \n"
  37.            "If there is degree in number, then the sign of degree (+ or"
  38.            " -) is also indicated strictly after E \n"
  39.            "If you enter E, there should be no spaces between numbers and E \n"
  40.            "The number entered must not exceed 30 characters \n"
  41.            "The size of the input degree must not exceed 5 characters \n"
  42.            "Real numbers must be entered through a dot \n"
  43.            "                    ------------------------------\n");
  44. }
  45.  
  46.  
  47. void swap(int *xp, int *yp)/*Функция, меняющая местами числа*/
  48. {
  49.     int temp = *xp;
  50.     *xp = *yp;
  51.     *yp = temp;
  52. }
  53.  
  54.  
  55. void reverse_array(int *array, int size)
  56. {
  57.     for (int i = 0; i < size / 2; i++)
  58.     {
  59.         swap(&array[i], &array[size - i]);
  60.     }
  61. }
  62.  
  63.  
  64. /*Функция, убирающая нули сразу после точки*/
  65. void remove_zero(int *digits, int *size, int *E)
  66. {
  67.  
  68.     int i = 0;
  69.     int size_remember = *size;
  70.  
  71.     /*Если встретился 0 в начале массива цифр, то смещаем его в конец*/
  72.     /*С последующем уменьшением размера массива цифр*/
  73.     while (digits[i] == 0)
  74.     {
  75.         for (int j = 0; j < (size_remember - 1); j++)
  76.         {
  77.             swap(&digits[j], &digits[j + 1]);
  78.         }
  79.         --*size;
  80.     }
  81.  
  82. }
  83.  
  84. int compare(int *a, int *b, int arraySize, int index)
  85. {
  86.  
  87.     int val1 = a[index];
  88.     int val2 = b[index];
  89.  
  90.     if (val1 == val2)
  91.     {
  92.         return compare(a, b, arraySize, index + 1);
  93.     }
  94.  
  95.     if (val1 > val2)
  96.     {
  97.         return 1;
  98.     }
  99.     else
  100.     {
  101.         return -1;
  102.     }
  103. }
  104.  
  105.  
  106. void *minus(int array1[], int array2[], int size, int returnArray[])
  107. {
  108.  
  109.     int borrow = -1;
  110.  
  111.     for (int i = size - 1; i >= 0; i--)
  112.     {
  113.  
  114.         if (array1[i] < array2[i])
  115.         {
  116.             borrow = i - 1;
  117.             array1[i] += 10;
  118.         }
  119.  
  120.         int res = array1[i] - array2[i];
  121.         if (borrow == i)
  122.         {
  123.             borrow = -1;
  124.             res--;
  125.         }
  126.         returnArray[i] = res;
  127.     }
  128. }
  129.  
  130. void number_split(char *string, int *digits, int *size, int *E, int *sign)
  131. {
  132.  
  133.     /*Переменная для исключения добавления лишнего нуля в массив цифр*/
  134.     int useless_zero = FALSE;
  135.     if (string[1] == '0' && (string[0] == '-' || string[0] == '+') && (string[2] == '.'))
  136.     {
  137.         useless_zero = TRUE;
  138.     }
  139.  
  140.     /*Переменная для отрезания незначащих нулей в конце*/
  141.     /*для исключения их добавления в массив цифр*/
  142.     int size_to_delete = 0;
  143.     int index = 0;
  144.  
  145.     /*Проверка знака перед числом*/
  146.     if (string[0] == '-')
  147.     {
  148.         *sign = NEGATIVE_NUMBER;
  149.     }
  150.     else
  151.     {
  152.         *sign = POSITIVE_NUMBER;
  153.     }
  154.  
  155.     int E_flag = FALSE;/*Переменная для проверки наличия Е в числе*/
  156.     int sign_E = POSITIVE_NUMBER;/*Знак порядка*/
  157.     /*Переменная запоминающая старый порядок перед нормализацией*/
  158.     int old_E = 0;
  159.     int point_flag = FALSE;/*Переменная для проверки наличия точки в числе*/
  160.  
  161.     /*Проверка наличия целой части*/
  162.     while (index < strlen(string))
  163.     {
  164.         /*Встретилась ли точка при записи числа*/
  165.         if (string[index] == '.')
  166.         {
  167.             point_flag = TRUE;
  168.         }
  169.  
  170.         /*Встретилась ли E при записи числа*/
  171.         if (string[index] == 'E')
  172.         {
  173.             if (string[index + 1] == '-')
  174.             {
  175.                 sign_E = NEGATIVE_NUMBER;
  176.             }
  177.  
  178.             E_flag = TRUE;
  179.             int index_zero_check = index;
  180.  
  181.             /*Удаление незначащих нулей с конца*/
  182.             while (string[index_zero_check - 1] == '0')
  183.             {
  184.                 index_zero_check--;
  185.                 ++(*E);
  186.                 size_to_delete++;
  187.             }
  188.         }
  189.  
  190.         /*Проверка на наличие целой части числа*/
  191.         if ((string[index] != '+') && (string[index] != '-') && (string[index] != '.') &&
  192.             (string[index] != 'E') && (E_flag == FALSE))
  193.         {
  194.             /*Встретилась ли точка?Т.к. целой части нет, то порядок далее убывает*/
  195.             if (point_flag == TRUE)
  196.             {
  197.                 --(*E);
  198.             }
  199.             /*Перевод чисел из char в int*/
  200.             digits[*size] = string[index] - '0';
  201.             ++(*size);
  202.         }
  203.  
  204.         /*Запись изначального порядка числа*/
  205.         if (E_flag == TRUE)
  206.         {
  207.             if ((string[index] != 'E') && (string[index] != '+') && (string[index] != '-'))
  208.             {
  209.                 /*Запись старого порядка числа*/
  210.                 old_E = old_E + (string[index] - '0');
  211.                 if (strlen(string) > index + 1)
  212.                 {
  213.                     old_E = old_E * 10;
  214.                 }
  215.             }
  216.         }
  217.  
  218.         index++;
  219.  
  220.     }
  221.  
  222.     /*Корректировка размера массива цифр в соотв с наличием незначащих нулей*/
  223.     *size = *size - size_to_delete;
  224.  
  225.     /*Смещение цифр в зависимости от наличия незначащего нуля в начале*/
  226.     if (useless_zero == TRUE)
  227.     {
  228.         for (int j = 0; j < (*size - 1); j++)
  229.         {
  230.             swap(&digits[j], &digits[j + 1]);
  231.         }
  232.         --(*size);
  233.     }
  234.  
  235.     /*Преобразование порядка с учетом знака Е*/
  236.     old_E *= sign_E;
  237.     /*Получение финального порядка числа*/
  238.     *E = *E + old_E;
  239.     remove_zero(digits, size, E);
  240.  
  241. }
  242.  
  243.  
  244. char input_format_check(char *string)
  245. {
  246.  
  247.     /*Массив допустимых символов*/
  248.     char allowed_array[14] = "0123456789E+-.";
  249.     int size = 0;
  250.     int E_quantity_check = 0; /*Подсчет кол-ва встречаемого символа E*/
  251.     int sign_quantity_check = 0;/*Подсчет кол-ва встречаемого символа знака*/
  252.     int dot_quantity_check = 0;/*Подсчет кол-ва встречаемого символа точки*/
  253.  
  254.     /*Если число не начинается со знака,то ошибка*/
  255.     if ((string[size] != '-') && (string[size] != '+'))
  256.     {
  257.         return ERROR_CODE;
  258.     }
  259.  
  260.     /*Движение по строке до ее конца*/
  261.     while (size != strlen(string))
  262.     {
  263.         /*Переменная для проверки корректности введенного сивола*/
  264.         int check_correct_input = 0;
  265.  
  266.         for (int i = 0; i < 14; i++)
  267.         {
  268.             /*Входит ли введенный символ в список допустиых*/
  269.             if (string[size] == allowed_array[i])
  270.             {
  271.                 check_correct_input = 1;
  272.             }
  273.         }
  274.  
  275.         if (string[size] == 'E')
  276.         {
  277.             /*Проверка обязательного знака после E*/
  278.             if ((string[size + 1] != '-') && (string[size + 1] != '+'))
  279.             {
  280.  
  281.                 /*Проверка введен ли порядок после E*/
  282.                 if ((string[size + 2] != '0') && (string[size + 2] != '1')
  283.                     && (string[size + 2] != '2') && (string[size + 2] != '3')
  284.                     && (string[size + 2] != '4') && (string[size + 2] != '5')
  285.                     && (string[size + 2] != '6') && (string[size + 2] != '7')
  286.                     && (string[size + 2] != '8') && (string[size + 2] != '9'))
  287.                 {
  288.                     return ERROR_CODE;
  289.                 }
  290.  
  291.             }
  292.  
  293.             E_quantity_check++;
  294.  
  295.         }
  296.         if (string[size] == '-' || string[size] == '+')
  297.         {
  298.  
  299.             /*Проверка знака на первой позиции*/
  300.             if ((size != 0))
  301.             {
  302.  
  303.                 /*Проверка знака после E*/
  304.                 if (string[size - 1] != 'E')
  305.                 {
  306.                     return ERROR_CODE;
  307.                 }
  308.  
  309.             }
  310.  
  311.             if (string[size + 1] == 'E')
  312.             {
  313.                 return ERROR_CODE;
  314.             }
  315.  
  316.             sign_quantity_check++;
  317.  
  318.         }
  319.  
  320.         if (string[size] == '.')
  321.         {
  322.  
  323.             /*Исключение чисел с запятой в порядке*/
  324.             if (E_quantity_check == DEGREE_LIMIT)
  325.             {
  326.                 return ERROR_CODE;
  327.             }
  328.  
  329.             dot_quantity_check++;
  330.  
  331.         }
  332.  
  333.         /*Проверка допустимого количества элементов*/
  334.         if ((check_correct_input != 1) || (sign_quantity_check > SIGN_QUANTITY_LIMIT) \
  335.  || (E_quantity_check > DEGREE_LIMIT) || (dot_quantity_check > DOT_LIMIT))
  336.         {
  337.             return ERROR_CODE;
  338.         }
  339.  
  340.         /*Переход к следующему символу строки*/
  341.         size++;
  342.  
  343.     }
  344.  
  345.     return RIGHT;
  346.  
  347. }
  348.  
  349.  
  350. int input_function(char *input)
  351. {
  352.  
  353.     if (scanf("%100s", input) != INPUT_OK)
  354.     {
  355.         return ERROR_CODE;
  356.     }
  357.  
  358.     /*Проверка длинны введенного чилса*/
  359.     if (strlen(input) > ALLOWED_INPUT_SIZE)
  360.     {
  361.         printf("Input size exceeded");
  362.         return ERROR_CODE;
  363.     }
  364.  
  365.     /*Проверка корректности введенного формата числа*/
  366.     if (input_format_check(input) != RIGHT)
  367.     {
  368.         printf("Invalid input format");
  369.         return ERROR_CODE;
  370.     }
  371.  
  372.     return RIGHT;
  373.  
  374. }
  375.  
  376.  
  377. int main()
  378. {
  379.  
  380.     welcome_text();/*Правила ввода текста в консоли*/
  381.  
  382.     char input[ALLOWED_INPUT_SIZE];/*Строка ввода первого числа*/
  383.     char input2[ALLOWED_INPUT_SIZE];/*Строка второго  числа*/
  384.     printf("Input first number:");
  385.  
  386.     /*Проверка правильного формата первого числа*/
  387.     if (input_function(input) == ERROR_CODE)
  388.     {
  389.         return ERROR_CODE;
  390.     }
  391.  
  392.     printf("                     ------------------------------\n");
  393.     printf("Input second number:");
  394.  
  395.     /*Проверка правильного формата второго числа*/
  396.     if (input_function(input2) == ERROR_CODE)
  397.     {
  398.         return ERROR_CODE;
  399.     }
  400.  
  401.     /* Переменные для нормализации вида числа*/
  402.     int digits[ALLOWED_INPUT_SIZE]; /* Массив цифр первого числа */
  403.     int sign = 1;/*Знак первого числа*/
  404.     int size = 0;/*Размер массива цифр первого числа*/
  405.     int E = 0; /*Порядок первого числа*/
  406.  
  407.     int digits2[ALLOWED_INPUT_SIZE];/* Массив цифр второго числа */
  408.     int sign2 = 1;/*Знак второго числа*/
  409.     int size2 = 0;/*Размер массива цифр второго числа*/
  410.     int E2 = 0;/*Порядок второго числа*/
  411.  
  412.     number_split(input, digits, &size, &E, &sign);/*Нормализация первого числа*/
  413.  
  414.     for (int i = 0; i < size; i++)
  415.     {
  416.         printf("%d ", digits[i]);
  417.     }
  418.     printf("sign = %d, E = %d , size = %d \n", sign, E, size);
  419.  
  420.     number_split(input2, digits2, &size2, &E2, &sign2);/*Нормализация второго числа*/
  421.  
  422.     for (int i = 0; i < size2; i++)
  423.     {
  424.         printf("%d ", digits2[i]);
  425.     }
  426.     printf("sign = %d, E = %d , size = %d \n", sign2, E2, size2);
  427.  
  428.     /*Сборка всех данных в структуру*/
  429.     big_decimal number_1;
  430.     big_decimal number_2;
  431.  
  432.     number_1.sign = sign;
  433.     number_1.E = E;
  434.     number_1.size = size;
  435.     for (int i = 0; i < number_1.size; i++)
  436.     {
  437.         number_1.digits[i] = digits[i];
  438.     }
  439.  
  440.     number_2.sign = sign2;
  441.     number_2.E = E2;
  442.     number_2.size = size2;
  443.     for (int i = 0; i < number_2.size; i++)
  444.     {
  445.         number_2.digits[i] = digits2[i];
  446.     }
  447.     int res[number_1.size];
  448.  
  449.     minus(number_1.digits, number_2.digits, number_1.size, res);
  450.  
  451.     for (int i = 0; i < number_1.size; i++)
  452.     {
  453.         printf("%d ", res[i]);
  454.     }
  455.     return RIGHT;
  456. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement