Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 27.10.2010
Сообщений: 80
1

Нежелательное округление дробных чисел

15.09.2012, 00:53. Показов 2302. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не пойму, почему когда компилирую, при вводе числа, например, "2112.12" вывод просто "2112" , без дробной части, в чем проблема?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
main()
 
{
    char number [10];
    int i, proverka, num;
    printf("vvedite chislo: ");
    scanf("%s", number);
    proverka=0;
    for (i = 0; number[i] != EOF; ++i) 
    {
        if (number[i] >= '0' || number[i] <= '9')
        {
            proverka = 1;
        }
        else 
        { 
            proverka = 0; 
        }
    }
    if (proverka == 1)
    {
        num = atoi(number); // конвертируем строку в int
        printf("num = %d", num);
    }
    getch();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2012, 00:53
Ответы с готовыми решениями:

Генерация случайных дробных чисел
Мне надо сделать массив из случайных дробных чисел от -14 до 26

Генерация дробных случайных чисел от 0,1 до 0,9
Нужны дробные случайные числа от 0,1 до 0,9 Сваял на пробу прогу: #include &lt;stdio.h&gt; #include...

Остаток от деления дробных чисел
Помогите, пожалуйста, найти остаток от деления дробного числа типа float или double.

Среднее арифметическое пяти дробных чисел
Написать программу, которая вводит с клавиатуры 5 дробных чисел и вычисляет их среднее...

17
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
15.09.2012, 00:56 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

у вас все числа int
C
1
int i, proverka, num;
смените на double
C
1
2
int i, proverka;
double num;
и здесь

C
1
printf("num = %f", num);
0
0 / 0 / 0
Регистрация: 27.10.2010
Сообщений: 80
15.09.2012, 00:59  [ТС] 3
defer, вывод 12.0000, ввожу 12.12 , вы можете мне помочь по аське? icq 54255259
0
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 23
15.09.2012, 01:05 4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
main()
 
{
    char number [10];
    int i, proverka;
    float num;
    printf("vvedite chislo: ");
    scanf("%s", number);
    proverka=0;
    for (i = 0; number[i] != EOF; ++i) 
    {
        if (number[i] >= '0' || number[i] <= '9')
        {
            proverka = 1;
        }
        else 
        { 
            proverka = 0; 
        }
    }
    if (proverka == 1)
    {
        num = atof(number); // конвертируем строку в float
        printf("num = %f", num);
    }
    getch();
}
0
0 / 0 / 0
Регистрация: 27.10.2010
Сообщений: 80
15.09.2012, 01:08  [ТС] 5
desu, а можно как-то сделать проверку, если пользователь введет после точки букву, чтобы выводил ошибку, например "12.ш", программа выводит "12", а нужна надпись " ошибка"
0
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 23
15.09.2012, 01:21 6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 if (number[i] >= '0' || number[i] <= '9' || number[i] == '.')
        {
            proverka = 1;
        }
        else 
        { 
            proverka = 0; 
        }
 
if (proverka == 1)
    {
        num = atof(number); // конвертируем строку в float
        printf("num = %f", num);
    }
else printf ("Ошибка! \n");
0
0 / 0 / 0
Регистрация: 27.10.2010
Сообщений: 80
15.09.2012, 01:24  [ТС] 7
desu, попробуй скомпилировать, ввожу 213.шр, вывод 213.0
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.09.2012, 01:25 8
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
main()
 
{
    char number [10];
    int i = 0, proverka;
    float num;
    printf("vvedite chislo: ");
    scanf("%s", number);
    proverka=1;
    while (number[i] != '\0' && proverka)
    {
        if (number[i++] < '0' || number[i] > '9')
           proverka = 0;
    }
    if (proverka == 1)
    {
        num = atof(number); // конвертируем строку в float
        printf("num = %f", num);
    }
    else
        printf("Oshibka");
    getch();
    return 0;
}
А выводит, потому что условие неправильное, вместо
C
1
number[i] >= '0' || number[i] <= '9'
надо было писать
C
1
number[i] >= '0' && number[i] <= '9'
0
0 / 0 / 0
Регистрация: 27.10.2010
Сообщений: 80
15.09.2012, 01:33  [ТС] 9
Psilon, ввожу "123" , выдает сообщение в "ошибка"

Добавлено через 6 минут
Psilon, а нет все окей, спасибо, НО, если вводить "123.ошош" , прога дает "123.000"
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.09.2012, 01:37 10
pilot12, попробуйте, я исправил немного, еще раз повторюсь:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
main()
 
{
    char number [10];
    int i, proverka;
    float num;
    printf("vvedite chislo: ");
    scanf("%s", number);
    proverka=1;
    for (i = 0; number[i] != '\0' && proverka; i++)
    {
        if ((number[i] < '0' || number[i] > '9') && !(number[i] == '.' && number[i+1] !='.'))
           proverka = 0;
    }
    if (proverka)
    {
        num = atof(number); // конвертируем строку в float
        printf("num = %f", num);
    }
    else
        printf("Oshibka");
    getch();
    return 0;
}
0
Заблокирован
Автор FAQ
15.09.2012, 12:07 11
pilot12, вот так сделай и всё заработает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main()
{
    double val      =  0;
    char chEnd      =  0;
    char sInput[32] = {0};
    while(1)
    {
        printf("Enter double : ");
        if(!scanf("%32[^\n]", sInput))
            printf("Empty input\n");
        else
        if(sscanf(sInput, "%lf%c", &val, &chEnd) == 1)
            printf("Your input value : %lf\n",val);
        else//Áûë ââîä öèôèðåé è áóêâ
            printf("Incorrect input format\n");
        getchar();
        chEnd       = 0;
        sInput[0]   = 0;
    }
    return 0;
}
Миниатюры
Нежелательное округление дробных чисел  
0
-=ЮрА=-
15.09.2012, 12:13
  #12

Не по теме:

Psilon,

Цитата Сообщение от Psilon Посмотреть сообщение
!(number[i] == '.' && number[i+1] !='.')
- что за ужастик с выходом за область отведенной памяти?

Цитата Сообщение от Psilon Посмотреть сообщение
num = atof(number); // конвертируем строку в float
- есть куда более безопасная sscanf вот её и пользуйтесь а не генерируйте исключения прям в коде

Цитата Сообщение от Psilon Посмотреть сообщение
getch();
- это для MSVS, вобщем привыкаем что все и вся будут кричать что использовать эту функцию нельзя. В принципе GetAsyncKeyState либо GetKeyboardState будут поинтересней (но опять же для MSVS) а так советую использовать 2 getchar - а либо ввод ключа либо вообще перестать писать в консоли а разрабатывать приложения с интерфейсом

0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.09.2012, 12:19 13
- что за ужастик с выходом за область отведенной памяти?
Пофиг, в крайнем случае сравним с '\0', а это ничего плохого не даст
- есть куда более безопасная sscanf вот её и пользуйтесь а не генерируйте исключения прям в коде
я на С пишу третий день в жизни
- это для MSVS, вобщем привыкаем что все и вся будут кричать что использовать эту функцию нельзя. В принципе GetAsyncKeyState либо GetKeyboardState будут поинтересней (но опять же для MSVS) а так советую использовать 2 getchar - а либо ввод ключа либо вообще перестать писать в консоли а разрабатывать приложения с интерфейсом
ок. см, почему я такой лох выше.
0
Заблокирован
Автор FAQ
15.09.2012, 12:23 14
pilot12, хотя доведу и твой вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
 
int main()
{
    int i           = 0;
    int proverka    = 1;
    int dotCount    = 0;
    double val      =  0;
    char sInput[32] = {0};
    
    while(1)
    {
        dotCount    = 0;
        proverka    = 1;
        printf("Enter double : ");
        if(!scanf("%32[^\n]", sInput))
            printf("Empty input\n");
        else
        for(i = 0; sInput[i] && proverka; i = i + 1)
        {
            if(sInput[i] == '.')
                dotCount = dotCount + 1;
            else
            if(sInput[i] < '0' || '9' < sInput[i] || 1 < dotCount)
                proverka = 0;   
        }
        if(proverka)
        {
            if(!sscanf(sInput, "%lf", &val))
                printf("sscanf error\n");
            else
                printf("Your input : %lf\n", val);
        }
        else
            printf("Incorrect input\n");
        getchar();
    }
    return 0;
}
Миниатюры
Нежелательное округление дробных чисел  
0
Заблокирован
Автор FAQ
15.09.2012, 12:30 15
Цитата Сообщение от Psilon Посмотреть сообщение
Пофиг, в крайнем случае сравним с '\0', а это ничего плохого не даст
- это для строк пофик (потому что слешзеро в конце есть, а чтобы было если был скажем int массивчик), не надо такое сравнение, либо в условии окончания цикла можно было ставить
number[i - 1] != '\0'

Цитата Сообщение от Psilon Посмотреть сообщение
см, почему я такой лох выше.
- упаси господь!Я такого не говорил, просто проинформмировал как обстоят дела с гетчем на нашем форуме(если покопаться в моих постах за прошлые годы, то можно увидеть что и я его использовал, а потом местный продвинутый люд окончательно замечаниями за гетч достал и мне пришлось отказался от этой функции)
А на счёт функций поинтересней можно почитать в моём блоге https://www.cyberforum.ru/blogs/34326/blog263.html

Не по теме:

(хотя думаю найдётся немало людей, которые обкакают и мой блог - ведь для многих я был есть и буду "тупым Юрой":D
Так что решать использовать либо нет примеры из моего блога лежат целиком на плечах читателя;))

0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.09.2012, 12:33 16
-=ЮрА=-,
- это для строк пофик (потому что слешзеро в конце есть, а чтобы было если был скажем int массивчик), не надо такое сравнение, либо в условии окончания цикла можно было ставить
number[i - 1] != '\0'
не ну мозгов понять про выход за границы у меня хватает, я ж на шарпе программирую, там любой выход за границы - ошибка в лучшем случае рантайма, в худшем - компиляции. Так что это уже давно и прочно въелось)

Что касается функций: я только-только K&R начал читать, так что пока не в курсе даже ansi C, не то, что какого-нибудь C99
0
Заблокирован
16.09.2012, 15:46 17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
хотя думаю найдётся немало людей, которые обкакают и мой блог - ведь для многих я был есть и буду "тупым Юрой"
Так что решать использовать либо нет примеры из моего блога лежат целиком на плечах читателя)

Не по теме:

встречалось даже "идиот"(c). :D Твой блог мне однажды помог. Искал алгоритм вычисления детерминанта и тупо скопирастил ствои функции (детерминант и минор матрицы). Для СЛАУ <= 10 строк потянет.

0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.09.2012, 18:51 18
alkagolik,

Не по теме:

странно, что так мало, у меня на дельфи функция считала минор до матрицы 1024х1024, больше просто не пробовал:) И считал довольно шустро - минут 10:)

0
16.09.2012, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2012, 18:51
Помогаю со студенческими работами здесь

Округление чисел
Выдает ошибку в строке, а именно не нравится знак процента : suma = sum %100; , почему?

Найти и вывести сумму всех дробных чисел в строке
Найти и вывести сумму всех дробных чисел в строке. Размер строки 80. Вводится пользователь, но...

После ввода дробных чисел, данные не заносятся в переменные
Пишу лабу для универа. Никогда не думал, что возникнут затыки на таком: После ввода целых чисел...

Нежелательное округление чисел при делении
double x; x = 9/2; textBox1.Text = x.ToString(); В текстбокс выводится... 4!!! Как? При делении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru