Форум программистов, компьютерный форум CyberForum.ru

Отбросить нули - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
20.03.2013, 09:51     Отбросить нули #1
Ребят помогите отбросить нули. Например я ввожу 0000000000000005,45 а он должен принимать 5,45. И еще вопрос как сделать чтобы он не округлял значение? Потому что если я ввожу больше 16 символов то он последние округляет а мне нужно чтобы просто брал первые 16. Вот код:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <stdio.h>
 
int main()
 
{
setlocale(0,"rus");
 
double A, Z, U; 
char a[256];
char *c=0;
 
while(true)
    {
    printf("Введите значение числа A(Не более 16 символов)\n");
    scanf("%s", a);
    if(getchar()==' ') 
        {
        fflush (stdin);
        continue;
        }
fflush (stdin);
A=strtod(a,&c);
{
            printf("\nA=%.2f \n",A);
            if(!isdigit(c[0]) && c[0]!=0)
                {
                printf("\nОшибка в следующем:%s\n", c);
                printf("\nПопробуй еще раз\n\n");
                continue;
                }
break;
            }
    }
 
while(true)
    {
    printf("Введите значение числа Z(Не более 16 символов)\n");
    scanf("%s", a);
    if(getchar()==' ') 
        {
        fflush (stdin);
        continue;
        }
fflush (stdin);
Z=strtod(a,&c);
{
            printf("\nZ=%.2f \n",Z);
            if(!isdigit(c[0]) && c[0]!=0)
                {
                printf("\nОшибка в следующем:%s\n", c);
                printf("\nПопробуй еще раз\n\n");
                continue;
                }
break;
            }
    }
 
printf("U=%g\n", U=(A*Z*Z)+(((A/2)*(Z*Z))/13.61)-(A*Z));
 
return 0;
}
Добавлено через 7 минут
Я пробовал сделать вот так scanf("%16s", a); Но если ввести 000000000000000000000000000000000000000000005,45 то напишет что А=0 а надо чтоб отрбросил нули и взял 5,45 или же просто не округлял значение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 09:51     Отбросить нули
Посмотрите здесь:

Дано натуральное число n. Отбросить в нем все цифры, стоящие правее самой правой единицы либо оставить число без изменений, если единицы в нем нет C++
C++ Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы.
C++ Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить
Нужно отбросить нули C++
C++ Как отбросить пробелы после числа?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
20.03.2013, 10:21     Отбросить нули #2
C++
1
2
3
4
5
6
7
char s[100];
cin>>s;// вводим все число
char *p=s;
while(*p=='0')// Сдвигаем указатель до первого ненуля
   p++;
double f;
sscantf(p,"%lf",&f);// преобразуем в число
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
20.03.2013, 11:21  [ТС]     Отбросить нули #3
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
4
5
6
7
char s[100];
cin>>s;// вводим все число
char *p=s;
while(*p=='0')// Сдвигаем указатель до первого ненуля
   p++;
double f;
sscantf(p,"%lf",&f);// преобразуем в число
Большое спасибо, а как сделать чтобы он не округлял значение выводимое на экран?
и если сделать scanf("%16s", a); то он все равно не отбрасывает нули
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
20.03.2013, 12:35     Отбросить нули #4
cin>>s;
вводим весь текст до первого пробельного символа.
while(*p=='0')p++;
Сдвигаем указатель до первого ненуля.
В результате p адресует массив, который начинается с символа,
идущего сразу после последнего нуля.

Что не так?
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
20.03.2013, 12:54  [ТС]     Отбросить нули #5
Цитата Сообщение от zss Посмотреть сообщение
cin>>s;
вводим весь текст до первого пробельного символа.
while(*p=='0')p++;
Сдвигаем указатель до первого ненуля.
В результате p адресует массив, который начинается с символа,
идущего сразу после последнего нуля.

Что не так?
Может быть я не так вставил в код. Покажи рабочий вариант пожалуйста
zss
Модератор
Эксперт С++
 Аватар для zss
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,215
Завершенные тесты: 1
20.03.2013, 17:50     Отбросить нули #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <conio.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL,"Rus");
    double Z; 
    char a[256];
    puts("введите число с нулями:");
    gets(a);// вводим все число
    char *p=a;
    while(*p=='0')// Сдвигаем указатель до первого ненуля
        p++;
    sscanf(p,"%lf",&Z);// преобразуем в число
    printf("\nZ=%10.2lf\n",Z);
    _getch(); 
    return 0;
}
учтите, что в Русской локализации целая часть от дробной отделяется запятой,
т.е. вводить надо так
00000000000000000000000000000000073,25
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 05:55  [ТС]     Отбросить нули #7
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <conio.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL,"Rus");
    double Z; 
    char a[256];
    puts("введите число с нулями:");
    gets(a);// вводим все число
    char *p=a;
    while(*p=='0')// Сдвигаем указатель до первого ненуля
        p++;
    sscanf(p,"%lf",&Z);// преобразуем в число
    printf("\nZ=%10.2lf\n",Z);
    _getch(); 
    return 0;
}
учтите, что в Русской локализации целая часть от дробной отделяется запятой,
т.е. вводить надо так
00000000000000000000000000000000073,25
Спасибо, но еще одно но как убрать округление числа? Я ввожу например 000000000000000073,2564 и вместе 73,25 он выводит 7,26

Добавлено через 19 минут
*73,26
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 06:26     Отбросить нули #8
вот выделил твой код для проверки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
 
setlocale(0,"rus");
 
double A, Z, U; 
char a[256];
char *c=NULL;
for(int i=0;i<10;i++)
{
printf("Введите значение числа A(Не более 16 символов)\n");
scanf("%s", a);
    
fflush (stdin);
A=strtod(a,&c);
printf("\nA=%.2f \n",A);
}
 
 }
и вот что получилось
в чем проблемы?
Миниатюры
Отбросить нули  
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 06:32     Отбросить нули #9
Цитата Сообщение от MishkaSh Посмотреть сообщение
while(*p=='0')// Сдвигаем указатель до первого ненуля
А если первым символом будет пробел или минус?

Цитата Сообщение от MishkaSh Посмотреть сообщение
о но как убрать округление числа?
это вывод округляет
Цитата Сообщение от MishkaSh Посмотреть сообщение
printf("\nZ=%10.2lf\n",Z);
ты же сам задал 2 числа после запятой
округляй сам
например так
C++
1
2
int tmp=Z*100;
Z=(double)tmp/100.0;
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 06:57  [ТС]     Отбросить нули #10
Цитата Сообщение от ValeryS Посмотреть сообщение
А если первым символом будет пробел или минус?


это вывод округляет

ты же сам задал 2 числа после запятой
округляй сам
например так
C++
1
2
int tmp=Z*100;
Z=(double)tmp/100.0;
Если пробую так округлить то выдает ошибку, а если убрать 2 знака после запятой?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 07:02     Отбросить нули #11
Цитата Сообщение от MishkaSh Посмотреть сообщение
Если пробую так округлить то выдает ошибку,
какую?

Добавлено через 3 минуты
вот код сейчас проверил все работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
 
setlocale(0,"rus");
 
double A, Z, U; 
char a[256];
char *c=NULL;
for(int i=0;i<10;i++)
{
printf("Введите значение числа A(Не более 16 символов)\n");
scanf("%s", a);
 
A=strtod(a,&c);
int tmp=A*100;
A=(double)tmp/100.0;
printf("\nA=%.2f \n",A);
}
 
 }
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 07:05  [ТС]     Отбросить нули #12
Мне так же округление в целой части нужно убрать
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 07:07     Отбросить нули #13
Цитата Сообщение от MishkaSh Посмотреть сообщение
Мне так же округление в целой части нужно убрать
не понял?
кстати какое у тебя максимальное число
если 16значное то int не пойдет( не хватит разрядов)
нужен long long
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 07:10  [ТС]     Отбросить нули #14
Цитата Сообщение от ValeryS Посмотреть сообщение
какую?

Добавлено через 3 минуты
вот код сейчас проверил все работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
 
setlocale(0,"rus");
 
double A, Z, U; 
char a[256];
char *c=NULL;
for(int i=0;i<10;i++)
{
printf("Введите значение числа A(Не более 16 символов)\n");
scanf("%s", a);
 
A=strtod(a,&c);
int tmp=A*100;
A=(double)tmp/100.0;
printf("\nA=%.2f \n",A);
}
 
 }
Вот смотри, мне нужно чтобы не округлял
Миниатюры
Отбросить нули  
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 07:15  [ТС]     Отбросить нули #15
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял?
кстати какое у тебя максимальное число
если 16значное то int не пойдет( не хватит разрядов)
нужен long long
Я работаю в double суть в том что можно ввести хоть 5 миллионов символов но он должен взять первые 16 как и положено double и не округлять их что в целой части что после запятой

Добавлено через 1 минуту
ну или на крайняк как сделать чтобы например чтобы он писал что если введено больше символов чем надо то будет вычисление с погрешностью или же нажмите(к примеру y) для того чтобы ввести заново
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 07:26     Отбросить нули #16
Цитата Сообщение от MishkaSh Посмотреть сообщение
Вот смотри, мне нужно чтобы не округлял
э парень, так не получится
у любого числа есть предел
у double мантиса равна 53 бита( по крайней мере у меня так)
предел числа посчитай сам
почитай про IEEE формат

Добавлено через 1 минуту
Цитата Сообщение от MishkaSh Посмотреть сообщение
Я работаю в double суть в том что можно ввести хоть 5 миллионов символов но он должен взять первые 16 как и положено double и не округлять их что в целой части что после запятой
работай со строкой, анализируй а потом приводи к double
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 07:27  [ТС]     Отбросить нули #17
Цитата Сообщение от ValeryS Посмотреть сообщение
э парень, так не получится
у любого числа есть предел
у double мантиса равна 53 бита( по крайней мере у меня так)
предел числа посчитай сам
почитай про IEEE формат

Добавлено через 1 минуту

работай со строкой, анализируй а потом приводи к double
Так оно так и делает просто мне нужно чтобы не округлял или вылезало сообщение мол введите разумное число или будет расчеты с погрешностью вот как это сделать?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 07:37     Отбросить нули #18
Цитата Сообщение от MishkaSh Посмотреть сообщение
Так оно так и делает просто мне нужно чтобы не округлял или вылезало сообщение мол введите разумное число или будет расчеты с погрешностью вот как это сделать?
а у doudle всегда погрешности если не на вводе то при расчетах точно будут
могу предложить ввести свои данные как в бухгалтерских программах
структуру(класс) в которой две целочисленных одно для целого, другое для дробного
у целочисленных погрешностей не бывает( ну кроме переполнения)
или работать с long long
т.е твое число умноженное на 100 с ним делать все действия, а при выводе делить на 100
какой порядок у тебя в числах 10 в 16 или больше?
MishkaSh
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 127
21.03.2013, 07:41  [ТС]     Отбросить нули #19
Цитата Сообщение от ValeryS Посмотреть сообщение
а у doudle всегда погрешности если не на вводе то при расчетах точно будут
могу предложить ввести свои данные как в бухгалтерских программах
структуру(класс) в которой две целочисленных одно для целого, другое для дробного
у целочисленных погрешностей не бывает( ну кроме переполнения)
или работать с long long
т.е твое число умноженное на 100 с ним делать все действия, а при выводе делить на 100
какой порядок у тебя в числах 10 в 16 или больше?
Не понял ничего если честно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 07:46     Отбросить нули
Еще ссылки по теме:

из N выставленных оценок отбросить минимальную и максимальную и усреднить оставшиеся оценки C++
C++ Как отбросить сотые без округления?
Как отбросить последние символы строки C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
21.03.2013, 07:46     Отбросить нули #20
в бухгалтерских программах doudle не используется (из-за погрешностей)
а используется типа такого
C++
1
2
3
4
5
struct MyDouble
{
int integer;// целая часть
int fractional;// дробная часть
}
Yandex
Объявления
21.03.2013, 07:46     Отбросить нули
Ответ Создать тему
Опции темы

Текущее время: 17:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru