Вывести только различные встречающиеся отрицательные действительные числа - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д