Вывести только различные встречающиеся отрицательные действительные числа - 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.