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