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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#define N 127
#define M 256
//Ввести строку. Вывести только различные встречающиеся отрицательные действительные числа.
//с использованием только библиотеки <stdio.h>
char* negative_float(char* , char*, double*);
double s_in_fl(char* );
int main()
{
    double A[N] = {0};
    char s1[M] = "", s2[M] = "";
    int i , j, flag = 0;
    puts("Enter line:");
    fgets(s1, M - 1, stdin);
    puts("All real numbers in a line:");
    negative_float(s1, s2, A);
    puts("Only non-recurring real numbers in a line:");
    for(i = 0; A[i] < 0; i++){
        for(j = 0, flag = 0; A[j] < 0; j++){
            if(i != j){
                if(A[i] == A[j])
                    flag = 1; 
            }
        }
        if(!flag) //если элемент массива не повторяется-печатаем
            printf("%g\n", A[i]);
    }
    return 0;
}
char* negative_float(char* buff, char* str, double* arr)//ищем и выводим на экран отрицательные
{ //вещественные числа,включая форматы -.хххх и -хххх.(-0 не считается, -0хххх - недопустимый формат)
    int i = 0, j, k = 0, m = 0;
    while(buff[i]){
        if(buff[i] == '-'){
            str[k++] = buff[i];
            if((buff[i + 1] >= '0' &&  buff[i + 1] <= '9') || buff[i + 1] == '.'){
                if(buff[i + 1] == '.'){//если после минуса сразу точка
                    str[k++] = buff[i + 1];
                    if(buff[i + 2] >= '0' && buff[i + 2] <= '9' ){
                        for(j = i + 2; (buff[j] >= '0' && buff[j] <= '9'); j++)
                            str[k++] = buff[j];
                        str[k] = '\0';
                        puts(str);
                        arr[m++] = s_in_fl(str);//переводим найденную подстроку
                          //в double и записываем число в массив A[N]
                    }
                }
                else{
                    for(j = i + 1; (buff[j] >= '0' && buff[j] <= '9'); j++)
                        str[k++] = buff[j];
                    if(buff[j] == '.'){
                        str[k++] = buff[j++];
                        for( ; (buff[j] >= '0' && buff[j] <= '9'); j++)
                            str[k++] = buff[j];
                    }
                    str[k] = '\0';
                    if(!(str[1] == '0' && str[2] != '.')){//исключаем формат -0ххх)
                        puts(str);
                        arr[m++] = s_in_fl(str);//переводим найденную подстроку
                    } //в double и записываем число в массив A[N]
                }
            }
        }
        if(k > 0)
            i += k;
        else
            i++;
        k = 0;
    }
    return str;
}
double s_in_fl(char* str)//переводим строку в double
{
    double x = 0;
    int i = 0, j = 0, dot = 0, exp = 1;
    for(i = 0; str[i]; i++){
        if(str[i] == '.')
            dot = i;
    }
    if(!dot){
        for(j = i - 1, exp = 1; j > 0; --j){
 
            x += (str[j] - '0') * exp;
            exp *= 10;
        }
        x *= -1;
    }
    else{
        for(int i = dot + 1, exp = 1; str[i]; i++){
            exp *= 10;
            x += (double)(str[i] - '0') / exp;
        }
        for(int j = dot - 1, exp = 1; j >= 0; --j){
            if(j == 0 && str[j] == '-'){
                x *= -1;
                break;
            }
            x += (str[j] - '0') * exp;
            exp *= 10;
        }
    }
    return x;
}

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

  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
Похожие ответы