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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
Floom
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
#1

Наличие введенной цифры в дробной части числа - C++

26.12.2009, 19:27. Просмотров 1722. Ответов 15
Метки нет (Все метки)

Доброго времени суток, уважаемые!
Помощь нужна в следующем:
Пользователь вводит число типа double. Далее вводит некую цифру M. Требуется определить, сколько раз введенная цифра встречается в дробной части нашего числа. Вот мой вариант, но он неэффективен, если в числе присутствует нуль:

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
#include <iostream>
#include <math.h>
int main()
{
    double p;
    int m,buffer,i;
    i=0;
    std::cout << "vvedite p" << std::endl;
    std::cin >> p;
    std::cout << "vvedite m" << std::endl;
    std::cin >> m;
 
    while (buffer!=0)
    {
    P-=floor(P);
    P*=10;
    buffer=floor(P);
    if (M==buffer)
    i++;
    P-=buffer;
      }
    std::cout << i;
    
      return 0;
}
В принципе программа-то простенькая, но не могу придумать, как остановить цикл. Я пробовал сначала переводить дробную часть в char, потом посимвольно переводил в массив и там уже проще было работать, но при использовании sprintf мне выдавалась строка только с 8 элементами, то есть если, допустим, число 3.45464748, то при конвертации получалось только 0 0 4 5 4 6 4 7 =\
Направьте на путь истинный =)
Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2009, 19:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наличие введенной цифры в дробной части числа (C++):

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

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

Определить равна ли сумма k цифр дробной части заданного вещественного числа сумме цифр целой части - C++
Помогите доделать задание, исправьте пожалуйста код!!! Срочно! Задание: Выполнить задания, выделяя цифры числа, хранящегося в переменной...

Определения, равна сумма цифр целой части вещественного числа сумме такого же количества цифр в дробной части - C++
Нада написать 2 программки 1. Определения, равна сумма цифр целой части вещественного числа сумме такого же количества цифр в дробной...

Классы. Вывести значение числа цифр в дробной части числа - C++
#include &quot;stdafx.h&quot; #include &lt;locale.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; class Chislo { ...

Вывести старшую цифру дробной части и младшую цифру целой части числа - C++
Искал у вас, не нашел. Я новичок в этом деле, если вам не трудно напишите полностью решение ща контрольная ( 31. Даны натуральные...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
26.12.2009, 20:10 #2
могу посоветовать ввести ограничение на i.
1
Floom
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 20:30  [ТС] #3
Цитата Сообщение от Sekt Посмотреть сообщение
могу посоветовать ввести ограничение на i.
Каким образом, не поясните?
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.12.2009, 20:35 #4
Floom, Со строками не хотите попробовать решить?
0
Alex_C#
20 / 20 / 1
Регистрация: 25.12.2009
Сообщений: 86
26.12.2009, 20:39 #5
Преобразуй дробную часть в строку и потом при помощи strncmp() сравнивай каждую цифру с твоей и считай, сколько раз совпала
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
26.12.2009, 20:41 #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
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
using std::endl;
 
int main(){
    double num;
    int digit;
    size_t count;
    
    cout << "Enter double value: ";
    cin >> num;
    cout << "Digit to find: ";
    cin >> digit;
    
    count = 0;
    while ( num - floor(num) > 0.0 ) {
        if ( digit == (int)((num - floor(num)) * 10.0) )
            ++count;
        num *= 10.0;
    }
    cout << "Digit " << digit << " meet " << count << " times" << endl;
    
    return 0;
}
1
Floom
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 21:06  [ТС] #7
Преобразовать при помощи чего? Я пробовал ввести char str[10] и потом sprintf(str, "%d", P), но в str функция записывала только 8 символов, как я написал выше.

Добавлено через 6 минут
easybudda, работает в принципе нормально, но вот опять проблема, если в дробной части будет 0, то уже идет не так. По пути, который я тут выложил, мне посоветовали пойти. Я сначала пробовал переводить в строку, чтобы избежать нулевого элемента, да и здесь тоже советуют строки использовать, но вот какой функцией лучше перевести...

Добавлено через 14 минут
Вот, посмотрите, пожалуйста. Это вариант со строками и массивом. Знаю, неэффективен также из-за того, что памяти много тратится, но пофигу, главное, чтоб работало. Но вот почему-то sprintf берет только 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
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
#include <iostream.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
 
int main()
 
{
    double M,P,buffer;
    int i,dlina;
    int arr[20];
    char str[20];
    i=0;
    cout << "Vvedite chislo P" << endl;
    cin >> P;
    
    cout << "Vvedite cifru M" << endl;
    cin >> M;
    
    buffer=0.0;
    
    P-=floor(P);
    
    sprintf(str, "%f", P);
    
    cout << str << endl;
    cout << endl;
 
    dlina=strlen(str);
    
           for (i=0; i<dlina; i++)
    {
        char temp = str[i];
        arr[i] = atoi(&temp);
    }
 
    for (i=2; i<dlina; i++)
        cout << arr[i] << " ";
        cout << endl;
 
    buffer=0;
 
    for (i=2; i<dlina; i++)
    {
        if (arr[i]==M)
        buffer++;
    }
    cout << "Vvedennaya cifra vstrechaetsa" << " " << buffer << " " << "raz" << endl;
 
  return 0;
}
0
Alex_C#
20 / 20 / 1
Регистрация: 25.12.2009
Сообщений: 86
26.12.2009, 21:07 #8
Например так можно из double в string перевести. Дальше - дело техники =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include "string"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    double p =22.5;
    int temp, num = 5;
    temp=p;
    p -= temp;
    std::string str;
    str = fcvt(p, num, &num, &num);
    std::cout << str;
    std::cin.ignore();  
    return 0;
}
1
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.12.2009, 21:09 #9
Floom, А зачем переводить. Сразу считывайте, например, в переменную типа char p[10] первое значение. А второе считывать в переменную типа char m
1
Floom
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 5
26.12.2009, 21:24  [ТС] #10
Огромное спасибо отписавшимся, буду пробовать.
0
Alex_C#
20 / 20 / 1
Регистрация: 25.12.2009
Сообщений: 86
26.12.2009, 21:26 #11
Если не получится, как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include "string"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int count=0, temp, num = 10;
    char M;
    double p;
    std::cin>>p >> M;
    temp=p;
    p -= temp;
    std::string str;
    str = fcvt(p, num, &num, &num);
    num=10;
    for(int i=0; i<num; i++)
    {
        if (M == str[i])count++;
    }
    std::cout << count;
    return 0;
}
P.S. num - количество знаков после запятой
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
26.12.2009, 21:26 #12
Цитата Сообщение от Floom Посмотреть сообщение
easybudda, работает в принципе нормально, но вот опять проблема, если в дробной части будет 0, то уже идет не так.
В каком смысле?
Наличие введенной цифры в дробной части числа
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
26.12.2009, 21:28 #13
valeriikozlov, полностью с тобой согласен, ведь указан только тип данных, которые нужно обработать и не указуется как именно обрабатывать, а ведь проще всего - строками..
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.12.2009, 21:31 #14
Floom, Кстати проверил код easybudda не нашел там недочетов в работе. Все работает правильно.
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
26.12.2009, 21:40 #15
Floom, На С и не заморачиваясь проверками вот так бы могло выглядеть
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int main(void){
    char buf[BUFSIZ], c, *p;
    size_t count = 0;
    
    printf("Number: ");
    fgets(buf, sizeof(buf), stdin);
    printf("Digit: ");
    scanf("%c", &c);
    
    if ( ( p = strchr(buf, '.') ) == NULL ){
        printf("Wrong number!\n");
        return 1;
    }
    while ( p = strchr(++p, c) )
        ++count;
    printf("Meet %d times\n", count);
    
    return 0;
}
На С++ по той же логике, только вместо char buf[BUFSIZ] и *p - std::string и std::string::iterator...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2009, 21:40
Привет! Вот еще темы с ответами:

Отделение дробной части от числа - C++
у меня такое задание: Функци принимает в себя дробное число и возвращает только его дробную часть мне нужно вывести на экран только...

Выделение дробной части из числа - C++
Дано число, например, х=124,556 нужно найти его целую и дробную части, чтобы получилось так: int a(целая),b(дробная) а=124 b=556 ...

Отделение целой части числа от дробной - C++
деление любое дробное число например: 12.34 и эту цифру надо делить что бы в одном строке было написано 12,34 (то что мы набрали) ...

Последовательность в дробной части вещественного числа - C++
Верно ли, что первые n цифр дробной части заданного по-ложительного вещественного числа образуют возрастающую последовательность? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.12.2009, 21:40
Ответ Создать тему
Опции темы

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