Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
1

Отбросить нули

20.03.2013, 09:51. Просмотров 1683. Ответов 30
Метки нет (Все метки)

Ребят помогите отбросить нули. Например я ввожу 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 или же просто не округлял значение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 09:51
Ответы с готовыми решениями:

Нужно отбросить нули
Вот смотрите. У меня стоит условие что если ввести больше 16 символов то...

Удалить нули из массива! Как удалить нули?но чтобы рисунок остался!
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main()...

Как отбросить сотые без округления?
Есть число, например, 3,46 как отбросить сотые, чтобы число получилось просто...

Как отбросить пробелы после числа?
Нужно чтобы программа не считала пробел за символ. Когда я ввожу пробелы перед...

Как отбросить последние символы строки
У меня есть строка. В ней, ну пусть 20 символов. А мне только первые 10 нужны. ...

30
zss
Модератор
Эксперт С++
7368 / 6773 / 4285
Регистрация: 18.12.2011
Сообщений: 17,905
Завершенные тесты: 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);// преобразуем в число
0
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
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); то он все равно не отбрасывает нули
0
zss
Модератор
Эксперт С++
7368 / 6773 / 4285
Регистрация: 18.12.2011
Сообщений: 17,905
Завершенные тесты: 1
20.03.2013, 12:35 4
cin>>s;
вводим весь текст до первого пробельного символа.
while(*p=='0')p++;
Сдвигаем указатель до первого ненуля.
В результате p адресует массив, который начинается с символа,
идущего сразу после последнего нуля.

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

Что не так?
Может быть я не так вставил в код. Покажи рабочий вариант пожалуйста
0
zss
Модератор
Эксперт С++
7368 / 6773 / 4285
Регистрация: 18.12.2011
Сообщений: 17,905
Завершенные тесты: 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
0
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
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
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,845
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);
}
 
 }
и вот что получилось
в чем проблемы?
0
Миниатюры
Отбросить нули  
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,845
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;
0
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
21.03.2013, 06:57  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
А если первым символом будет пробел или минус?


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

ты же сам задал 2 числа после запятой
округляй сам
например так
C++
1
2
int tmp=Z*100;
Z=(double)tmp/100.0;
Если пробую так округлить то выдает ошибку, а если убрать 2 знака после запятой?
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,845
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);
}
 
 }
0
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
21.03.2013, 07:05  [ТС] 12
Мне так же округление в целой части нужно убрать
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,845
21.03.2013, 07:07 13
Цитата Сообщение от MishkaSh Посмотреть сообщение
Мне так же округление в целой части нужно убрать
не понял?
кстати какое у тебя максимальное число
если 16значное то int не пойдет( не хватит разрядов)
нужен long long
0
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
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);
}
 
 }
Вот смотри, мне нужно чтобы не округлял
0
Миниатюры
Отбросить нули  
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
21.03.2013, 07:15  [ТС] 15
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял?
кстати какое у тебя максимальное число
если 16значное то int не пойдет( не хватит разрядов)
нужен long long
Я работаю в double суть в том что можно ввести хоть 5 миллионов символов но он должен взять первые 16 как и положено double и не округлять их что в целой части что после запятой

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

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

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

работай со строкой, анализируй а потом приводи к double
Так оно так и делает просто мне нужно чтобы не округлял или вылезало сообщение мол введите разумное число или будет расчеты с погрешностью вот как это сделать?
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,845
21.03.2013, 07:37 18
Цитата Сообщение от MishkaSh Посмотреть сообщение
Так оно так и делает просто мне нужно чтобы не округлял или вылезало сообщение мол введите разумное число или будет расчеты с погрешностью вот как это сделать?
а у doudle всегда погрешности если не на вводе то при расчетах точно будут
могу предложить ввести свои данные как в бухгалтерских программах
структуру(класс) в которой две целочисленных одно для целого, другое для дробного
у целочисленных погрешностей не бывает( ну кроме переполнения)
или работать с long long
т.е твое число умноженное на 100 с ним делать все действия, а при выводе делить на 100
какой порядок у тебя в числах 10 в 16 или больше?
0
MishkaSh
0 / 0 / 1
Регистрация: 19.02.2013
Сообщений: 130
21.03.2013, 07:41  [ТС] 19
Цитата Сообщение от ValeryS Посмотреть сообщение
а у doudle всегда погрешности если не на вводе то при расчетах точно будут
могу предложить ввести свои данные как в бухгалтерских программах
структуру(класс) в которой две целочисленных одно для целого, другое для дробного
у целочисленных погрешностей не бывает( ну кроме переполнения)
или работать с long long
т.е твое число умноженное на 100 с ним делать все действия, а при выводе делить на 100
какой порядок у тебя в числах 10 в 16 или больше?
Не понял ничего если честно
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,845
21.03.2013, 07:46 20
в бухгалтерских программах doudle не используется (из-за погрешностей)
а используется типа такого
C++
1
2
3
4
5
struct MyDouble
{
int integer;// целая часть
int fractional;// дробная часть
}
0
21.03.2013, 07:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 07:46

Скопировать в новый текстовый файл все символы исходного, заменив все нули на единицы, а единицы на нули
Дан текстовый файл f. Переписать в файл g все компоненты файла f с заменой...

из N выставленных оценок отбросить минимальную и максимальную и усреднить оставшиеся оценки
The_Immortal, пожалуйста помогите мне составить Построить и записать алгоритм...

Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить
Задание : Перед каждой буквой третьего слова поставить '/'. Лишние символы (с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru