Вывести только различные встречающиеся отрицательные действительные числа - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Программа с комментарием и с использованием только библиотеки <stdio.h> Ввести строку. Вывести только различные встречающиеся отрицательные действительные числа.

Решение задачи: «Вывести только различные встречающиеся отрицательные действительные числа»

textual
Листинг программы
  1. #include <stdio.h>
  2. #define N 127
  3. #define M 256
  4. //Ввести строку. Вывести только различные встречающиеся отрицательные действительные числа.
  5. //с использованием только библиотеки <stdio.h>
  6. char* negative_float(char* , char*, double*);
  7. double s_in_fl(char* );
  8. int main()
  9. {
  10.     double A[N] = {0};
  11.     char s1[M] = "", s2[M] = "";
  12.     int i , j, flag = 0;
  13.     puts("Enter line:");
  14.     fgets(s1, M - 1, stdin);
  15.     puts("All real numbers in a line:");
  16.     negative_float(s1, s2, A);
  17.     puts("Only non-recurring real numbers in a line:");
  18.     for(i = 0; A[i] < 0; i++){
  19.         for(j = 0, flag = 0; A[j] < 0; j++){
  20.             if(i != j){
  21.                 if(A[i] == A[j])
  22.                     flag = 1;
  23.             }
  24.         }
  25.         if(!flag) //если элемент массива не повторяется-печатаем
  26.             printf("%g\n", A[i]);
  27.     }
  28.     return 0;
  29. }
  30. char* negative_float(char* buff, char* str, double* arr)//ищем и выводим на экран отрицательные
  31. { //вещественные числа,включая форматы -.хххх и -хххх.(-0 не считается, -0хххх - недопустимый формат)
  32.     int i = 0, j, k = 0, m = 0;
  33.     while(buff[i]){
  34.         if(buff[i] == '-'){
  35.             str[k++] = buff[i];
  36.             if((buff[i + 1] >= '0' &&  buff[i + 1] <= '9') || buff[i + 1] == '.'){
  37.                 if(buff[i + 1] == '.'){//если после минуса сразу точка
  38.                     str[k++] = buff[i + 1];
  39.                     if(buff[i + 2] >= '0' && buff[i + 2] <= '9' ){
  40.                         for(j = i + 2; (buff[j] >= '0' && buff[j] <= '9'); j++)
  41.                             str[k++] = buff[j];
  42.                         str[k] = '\0';
  43.                         puts(str);
  44.                         arr[m++] = s_in_fl(str);//переводим найденную подстроку
  45.                           //в double и записываем число в массив A[N]
  46.                     }
  47.                 }
  48.                 else{
  49.                     for(j = i + 1; (buff[j] >= '0' && buff[j] <= '9'); j++)
  50.                         str[k++] = buff[j];
  51.                     if(buff[j] == '.'){
  52.                         str[k++] = buff[j++];
  53.                         for( ; (buff[j] >= '0' && buff[j] <= '9'); j++)
  54.                             str[k++] = buff[j];
  55.                     }
  56.                     str[k] = '\0';
  57.                     if(!(str[1] == '0' && str[2] != '.')){//исключаем формат -0ххх)
  58.                         puts(str);
  59.                         arr[m++] = s_in_fl(str);//переводим найденную подстроку
  60.                     } //в double и записываем число в массив A[N]
  61.                 }
  62.             }
  63.         }
  64.         if(k > 0)
  65.             i += k;
  66.         else
  67.             i++;
  68.         k = 0;
  69.     }
  70.     return str;
  71. }
  72. double s_in_fl(char* str)//переводим строку в double
  73. {
  74.     double x = 0;
  75.     int i = 0, j = 0, dot = 0, exp = 1;
  76.     for(i = 0; str[i]; i++){
  77.         if(str[i] == '.')
  78.             dot = i;
  79.     }
  80.     if(!dot){
  81.         for(j = i - 1, exp = 1; j > 0; --j){
  82.  
  83.             x += (str[j] - '0') * exp;
  84.             exp *= 10;
  85.         }
  86.         x *= -1;
  87.     }
  88.     else{
  89.         for(int i = dot + 1, exp = 1; str[i]; i++){
  90.             exp *= 10;
  91.             x += (double)(str[i] - '0') / exp;
  92.         }
  93.         for(int j = dot - 1, exp = 1; j >= 0; --j){
  94.             if(j == 0 && str[j] == '-'){
  95.                 x *= -1;
  96.                 break;
  97.             }
  98.             x += (str[j] - '0') * exp;
  99.             exp *= 10;
  100.         }
  101.     }
  102.     return x;
  103. }

Объяснение кода листинга программы

  1. В начале кода объявлены следующие переменные:
    • double A[N] = {0} - массив для хранения отрицательных вещественных чисел;
    • char s1[M] = , s2[M] = - строки для ввода и вывода;
    • int i, j, flag = 0 - общие переменные для работы с массивом и строками.
  2. Функция negative_float ищет и выводит на экран отрицательные вещественные числа. Ее параметры:
    • char* buff - входная строка;
    • char* str - строка, в которой найдены отрицательные числа;
    • double* arr - массив для хранения найденных чисел.
  3. В функции s_in_fl переводится строка в double. Ее параметр:
    • char* str - входная строка.
  4. В основной функции после ввода строки и вызова функции negative_float происходит вывод только не повторяющихся найденных отрицательных чисел.
  5. В функции negative_float после проверки каждого найденного числа на уникальность, оно печатается на экране и записывается в массив A.
  6. В функции s_in_fl число переводится в формат с плавающей точкой. Если в строке есть точка, то число воспринимается как дробное, если нет - как целое.
  7. Если в строке есть дефис, то число умножается на -1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы