Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
bossforU
0 / 0 / 0
Регистрация: 30.11.2010
Сообщений: 22
#1

Посчитать сумму цифр double - C++

02.03.2012, 00:16. Просмотров 1446. Ответов 13
Метки нет (Все метки)

Помогите. Новичек в Си. Обучаюсь. В голову пришла задача:
Есть число с точкой( типа double), нужно посчитать суму цифр до точки и после. Обе суммы вывести на экран.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2012, 00:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Посчитать сумму цифр double (C++):

Посчитать сумму цифр и сумму делителей данного целого числа - C++
помогите пожалуйста Составить программу, которая решает следующие задачи, используя только переменные динамической памяти: посчитать...

Посчитать сумму цифр в строке - C++
int sumchis(char*s) { int i = 0; int sum; char ch; while (s!='\0') { if(isdigit(s)) { ch = s; ...

Посчитать сумму всех цифр,входящих в текст - C++
Дан текст.Посчитать сумму всех цифр,входящих в текст. Пример. Если к 12 прибавить 2,то получим 14. Результат.10 Пояснение 1+2+2+1+4=10

Посчитать сумму цифр всех целых чисел 1 до n - C++
[ход решения в gcc

Определить количество цифр в числе и посчитать их сумму - C++
пользователь вводит число, опредилить количество цифр в числе, посчитать их сумму написал следующий код: #include <iostream> using...

Рекурсивно посчитать сумму кубов цифр числа - C++
#include <iostream> using namespace std; int funccube (int a){ int cube,sum; cube =a*a*a; sum+=funccube(a%10); a= a / 10; ...

13
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 08:49 #2
Переведи число в строку, потом подсчитывай сумму цифр до и после десятичной точки
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
02.03.2012, 09:12 #3
Цитата Сообщение от bossforU Посмотреть сообщение
Есть число с точкой( типа double), нужно посчитать суму цифр до точки и после
Попробуй решить задачу без компа на листочке. Дано число 1/3. Чему равна сумма цифр после точки?
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
02.03.2012, 09:22 #4
Уточни пожалуйста задание. Тебе надо количество цифр посчитать или сумму значений цифр (как в счастливом билетике)?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 09:23 #5
Цитата Сообщение от KokosSPb Посмотреть сообщение
Тебе надо количество цифр посчитать или сумму значений цифр (как в счастливом билетике)?
Цитата Сообщение от bossforU Посмотреть сообщение
нужно посчитать суму цифр до точки и после. Обе суммы вывести на экран
что непонятного?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 09:55 #6
Вот «решение» задачи через разбор строки с помощью простого автомата (число задается с необязательным знаком и дробной частью, без лидирующих и завершающих пробельных символов):
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
int main(int argc, char* argv[])
{
    int state = 0;
    int integral = 0;
    int fractional = 0;
    int ret = 0;
 
    char* number;
    
    if(argc != 2)
    {
    fprintf(stderr, "Usage: %s FLOATING\n", argv[0]);
    ret = 1;
    goto ex;
    }
 
    number = argv[1];
    
    while(*number != '\0')
    {
    char c = *number++;
        
    switch(state)
    {
    case 0:
        if(isdigit(c))
        {
        integral += c - '0';
        state = 2;
        }
        else if(c == '-' || c == '+')
        state = 1;
        else
        goto noparse;
        
        break;
        
    case 1:
        if(isdigit(c))
        {
        integral += c - '0';
        state = 2;
        }
        else
        goto noparse;
        
        break;
 
    case 2:
        if(isdigit(c))
        integral += c - '0';
        else if(c == '.')
        state = 3;
        else
        goto noparse;
 
        break;
 
    case 3:
    case 4:
        if(isdigit(c))
        {
        fractional += c - '0';
        state = 4;
        }
        else
        goto noparse;
        
        break;
        
    default:
        fprintf(stderr, "Unknown state %d\n", state);
        ret = 1;
        goto ex;
    }
    }
 
    if(state == 2 || state == 4)
    {
    printf("Given a floating-point number %s;"
           " sum of digits in integral part %d;"
           " sum of digits in fractional part %d\n",
           argv[1], integral, fractional);
    goto ex;
    }
    
 noparse:
    fprintf(stderr, "%s: no parse (state = %d)\n", argv[1], state);
    ret = 1;
    
 ex:
    exit(ret);
}
Если нужно, чтобы число обязательно задавалось с дробной частью, то тогда нужно оставить в строке 82 единственное допустимое завершающее состояние 4
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
02.03.2012, 10:53 #7
Да, с просони не так прочитал

Ну можно строчкой, а можно циклами:
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
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <conio.h>
 
using namespace std;
 
int main(int argc,char** argv)
{   
    double ch,i;
    int x,a,b,c,t;
 
    cout << "Enter the number"<<endl;
    cin >> ch;
 
    a=b=0;
    
    t=(int)ch;
    for(int sch=0;sch<9;sch++){
        i=100000;
        for(int l=0;l<sch;l++) {i=i/10;};
    x=(int)(ch/i);
    c=(x-((int)(ch/(i*10))*10));
    if(x<=t){//левая часть - a
    a=a+c;
    }
    else{//правая часть - b
    b=b+c;
    }
    }
    cout << a<<endl;
    cout << b;
    getch();
 
    return 0;
}
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 11:08 #8
Цитата Сообщение от KokosSPb Посмотреть сообщение
Ну можно строчкой, а можно циклами:
вот ведь незадача:
Код
Enter the number
0.999999999
0
27
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
02.03.2012, 11:28 #9
потому что ограничено количество символов, мною
C++
1
2
 i=100000;
sch<9
надо больше - увеличь количество нулей в i и на тоже количество ограничение sch, могу - если очень надо, сделать выяснение - необходимого количества знаков, цикл с выяснением моей x и проверкой условия x<=0 и в обратную сторону
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 11:29 #10
KokosSPb, это не решение
Да и вообще, как мне кажется, через переменные с плавающей точкой в общем случае задачу решить не получится. Ну если только не использовать какой-нибудь тип с произвольной точностью, но в С/С++ таких нет
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
02.03.2012, 11:33 #11
Цитата Сообщение от Nameless One Посмотреть сообщение
KokosSPb, это не решение
Да и вообще, как мне кажется, через переменные с плавающей точкой в общем случае задачу решить не получится. Ну если только не использовать какой-нибудь тип с произвольной точностью, но в С/С++ таких нет
а по мне - решение
просто я предложил еще вариант, вдруг понадобится
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
02.03.2012, 11:34 #12
Цитата Сообщение от Nameless One Посмотреть сообщение
Да и вообще, как мне кажется, через переменные с плавающей точкой в общем случае задачу решить не получится.
Точно так же решение при помощи изначального представления числа в виде строки неправильное. Да и задача по своей сути изначально неправильная с точки зрения решения при помощи программы
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 11:45 #13
Цитата Сообщение от Evg Посмотреть сообщение
Точно так же решение при помощи изначального представления числа в виде строки неправильное
почему же? Для строки, которая удовлетворяет регулярному выражению "(-|\+)?\d+(\.\d+)?" (конечная десятичная дробь), мое решение подойдет.
Или ты имел в виду, что не каждое вещественное число можно задать в данном виде? Тогда я с тобой соглашусь.
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
02.03.2012, 11:52 #14
Цитата Сообщение от Nameless One Посмотреть сообщение
Или ты имел в виду, что не каждое вещественное число можно задать в данном виде?
Да.

Потому что постановка задачи в виде "дана строка, представляющая собой вещественное число" не было. А если её поставить, то она принципиально ничем не отличается от "дана строка, задающая e-mail, отделить имя пользователя от адреса сервера"
0
02.03.2012, 11:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2012, 11:52
Привет! Вот еще темы с ответами:

Посчитать сумму цифр стоящих друг от друга через две - C++
Доброе время суток! Ребята, объясните, как на основе этого кода я смогу посчитать сумму цифр стоящих друг от друга через две То есть, я...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Дана последовательность чисел. Посчитать сумму цифр десятичной записи всех отрицательных чисел - C++
Дана последовательность чисел. Посчитать сумму цифр десятичной записи всех отрицательных чисел. как это сделать циклом?

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...


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

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

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