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

Как найти в строке вещественные числа ? - C++

Восстановить пароль Регистрация
 
TheAlpha
6 / 6 / 2
Регистрация: 03.01.2013
Сообщений: 113
25.02.2013, 22:19     Как найти в строке вещественные числа ? #1
Всем доброго времени суток, как в строке найти вещественные числа, знаю функцию isdigit(c) но она проверяет является ли с - числом, а нужно вещественное
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
25.02.2013, 22:55     Как найти в строке вещественные числа ? #2
А мне вроде всегда казалось, что вещественные числа - это все числа, которые можно расположить на числовой прямой. А это вообще все числа Так что думаю, можно проверять и isdigit ))) Хотя возможно, меня сейчас кто-нибудь поправит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.02.2013, 23:13     Как найти в строке вещественные числа ? #3
Цитата Сообщение от TheAlpha Посмотреть сообщение
знаю функцию isdigit(c) но она проверяет является ли с - числом
Она проверяет является ли аргумент цифрой (0 - 9).

Добавлено через 1 минуту
Для начала нужно сформулировать: как выглядит вещественное число в строке.

Добавлено через 3 минуты
Например: последовательность цифр, среди которых имеется один символ '.'. Перед такой последовательностью может быть символ '+' или '-'.
TheAlpha
6 / 6 / 2
Регистрация: 03.01.2013
Сообщений: 113
25.02.2013, 23:27  [ТС]     Как найти в строке вещественные числа ? #4
Цитата Сообщение от Psixodelik Посмотреть сообщение
А мне вроде всегда казалось, что вещественные числа - это все числа, которые можно расположить на числовой прямой. А это вообще все числа Так что думаю, можно проверять и isdigit ))) Хотя возможно, меня сейчас кто-нибудь поправит
Смотрите, вот мой код, но правда я тут на си писал и не через isdigit

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>
int main() {
    char *pStr;
    char str[80];
    short isNumber = 0;
    gets(str);
    pStr = str;
    while (*pStr) {
        if (*pStr >= '0' && *pStr <= '9') {
            isNumber = 1;
            printf("%c", *pStr);
        } else {
            if (isNumber) {
                isNumber = 0;
                printf(" ");
            }
        }
        pStr++;
    }
    gets(str);
    return 0;
}
если ввести 4.5, то он выведет 4 и 5 отдельно, а нужно что бы как одно число было

Добавлено через 7 минут
Не заметил, просто условие нужно было изменить немного

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>
int main() {
    char *pStr;
    char str[80];
    short isNumber = 0;
    gets(str);
    pStr = str;
    while (*pStr) {
        if (*pStr >= '0' && *pStr <= '9' || *pStr=='.' ) {
            isNumber = 1;
            printf("%c", *pStr);
        } else {
            if (isNumber) {
                isNumber = 0;
                printf(" ");
            }
        }
        pStr++;
    }
    gets(str);
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.02.2013, 23:38     Как найти в строке вещественные числа ? #5
Знак числа?

Добавлено через 1 минуту
Если в строке вот такое: 4...5? Или такое: ..... ?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.02.2013, 23:40     Как найти в строке вещественные числа ? #6
Можно еще воспользоваться регулярными выражениями, но, думаю, заданием подразумевалось именно написание цикла-парсера
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
26.02.2013, 00:19     Как найти в строке вещественные числа ? #7
Разбиваете сроку на токены (можно при помощи strtok) и дальше парсируете лексемы отыскивая удовлетворяющий результат:
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 <iostream>
#include <cstring>
#include <vector>
 
int main()
{
    char line[] = "123, this is -45.45, 34.0.34 and 31; -34.08, --66.22";
    char* ptr = NULL;
    std::vector<const char*> tok;
 
    ptr = strtok(line, " ,:;\t\n\b");
    while (ptr)
    {
        tok.push_back(ptr);
        ptr = strtok('\0', " ,:;\t\n\b");
    }
 
    for (size_t i = 0; i < tok.size(); ++i) {
        bool status = false;
        size_t cnt = 0;
        for (size_t j = 0; j < strlen(tok[i]); ++j)
        {
            if (tok[i][0] == '.' || tok[i][strlen(tok[i])-1] == '.')
                break;
            if (!isdigit(tok[i][j]) && tok[i][j] != '.' && (tok[i][j] == '-' && j > 0))
                break;
            if (tok[i][j] == '.')
                ++cnt;
            if (cnt > 1)
                break;
            if (j == strlen(tok[i])-1 && cnt)
                status = true;
        }
        if (status)
            std::cout << tok[i] << '\n';
    }
       
   return 0; 
}
Добавлено через 2 минуты
Bash
1
2
3
ilyuha21st@coldshoot:~/projects$ ./prog
-45.45
-34.08
TheAlpha
6 / 6 / 2
Регистрация: 03.01.2013
Сообщений: 113
26.02.2013, 00:33  [ТС]     Как найти в строке вещественные числа ? #8
Цитата Сообщение от xtorne21st Посмотреть сообщение
Разбиваете сроку на токены (можно при помощи strtok) и дальше парсируете лексемы отыскивая удовлетворяющий результат:
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 <iostream>
#include <cstring>
#include <vector>
 
int main()
{
    char line[] = "123, this is -45.45, 34.0.34 and 31; -34.08, --66.22";
    char* ptr = NULL;
    std::vector<const char*> tok;
 
    ptr = strtok(line, " ,:;\t\n\b");
    while (ptr)
    {
        tok.push_back(ptr);
        ptr = strtok('\0', " ,:;\t\n\b");
    }
 
    for (size_t i = 0; i < tok.size(); ++i) {
        bool status = false;
        size_t cnt = 0;
        for (size_t j = 0; j < strlen(tok[i]); ++j)
        {
            if (tok[i][0] == '.' || tok[i][strlen(tok[i])-1] == '.')
                break;
            if (!isdigit(tok[i][j]) && tok[i][j] != '.' && (tok[i][j] == '-' && j > 0))
                break;
            if (tok[i][j] == '.')
                ++cnt;
            if (cnt > 1)
                break;
            if (j == strlen(tok[i])-1 && cnt)
                status = true;
        }
        if (status)
            std::cout << tok[i] << '\n';
    }
       
   return 0; 
}
Добавлено через 2 минуты
Bash
1
2
3
ilyuha21st@coldshoot:~/projects$ ./prog
-45.45
-34.08
Довольно таки сложный этот код для меня - мало что понимаю (

Добавлено через 6 минут
Цитата Сообщение от TheAlpha Посмотреть сообщение
Довольно таки сложный этот код для меня - мало что понимаю (
Вот смотрите еще --66.22 он же должен еще вывести -66.22

Добавлено через 1 минуту
и вот тут 34.0.34 тут же вроде тоже вещ числа присутствуют....
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.02.2013, 00:48     Как найти в строке вещественные числа ? #9
Цитата Сообщение от TheAlpha Посмотреть сообщение
и вот тут 34.0.34 тут же вроде тоже вещ числа присутствуют....
!!!
Цитата Сообщение от alsav22 Посмотреть сообщение
Для начала нужно сформулировать: как выглядит вещественное число в строке.
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
26.02.2013, 01:08     Как найти в строке вещественные числа ? #10
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
#include <stdio.h>
#include <iostream.h>
#include <string.h>
 
int main()   
{
    char st[100], sl[100];
 
 gets(st);
 
  int n=strlen(st);
        
   sl[0]='\0';
   for (int i=1; i<n; i++)
   {
       int h=0;
       int l=0;
 
 
      if (st[i]=='.')
            {
           for (int j=i-1;j>=0;j--)
               if (((st[j]>='0')&& (st[j]<='9'))||(st[j]=='-')) h++; else break;
 
               if (h>0)            
                   for (int j=i+1;j<n;j++)
                     if ((st[j]>='0')&& (st[j]<='9')) l++; else break;
                     if (l>0)
                         for (int j=i-h;j<i+l+1;j++)
                             cout<< st[j];
 
                         cout<<endl;}
              
       
   }
 
return 1;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
26.02.2013, 01:24     Как найти в строке вещественные числа ? #11
Цитата Сообщение от TheAlpha Посмотреть сообщение
Вот смотрите еще --66.22 он же должен еще вывести -66.22
Добавлено через 1 минуту
и вот тут 34.0.34 тут же вроде тоже вещ числа присутствуют....
Это я посчитал за ошибки... так в действительности не может быть больше одного знака разделяющего целую и дробную часть, также как и не может быть числа с двумя знаками минуса.

Добавлено через 2 минуты
Цитата Сообщение от TheAlpha Посмотреть сообщение
Довольно таки сложный этот код для меня - мало что понимаю (
Этот код без "глубоко проникновения в суть" для любого покажется сложным, кроме того кто его придумал , так как отсутствуют поясняющие комментарии.

Добавлено через 3 минуты
Единственное (из основных моментов) что отсутствует проверка на токен определенного положительного значения т.е. +34.57 +01.47: начинающегося со знака "плюс". Но это можно легко подправить .
TheAlpha
6 / 6 / 2
Регистрация: 03.01.2013
Сообщений: 113
26.02.2013, 17:08  [ТС]     Как найти в строке вещественные числа ? #12
Цитата Сообщение от olya7 Посмотреть сообщение
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
#include <stdio.h>
#include <iostream.h>
#include <string.h>
 
int main()   
{
    char st[100], sl[100];
 
 gets(st);
 
  int n=strlen(st);
        
   sl[0]='\0';
   for (int i=1; i<n; i++)
   {
       int h=0;
       int l=0;
 
 
      if (st[i]=='.')
            {
           for (int j=i-1;j>=0;j--)
               if (((st[j]>='0')&& (st[j]<='9'))||(st[j]=='-')) h++; else break;
 
               if (h>0)            
                   for (int j=i+1;j<n;j++)
                     if ((st[j]>='0')&& (st[j]<='9')) l++; else break;
                     if (l>0)
                         for (int j=i-h;j<i+l+1;j++)
                             cout<< st[j];
 
                         cout<<endl;}
              
       
   }
 
return 1;
}
На мой взгляд довольно таки интересно получилось у Вас. Код работает. Спасибо. Вот только вопрос, можете объяснить sl[0]='\0';
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 17:52     Как найти в строке вещественные числа ?
Еще ссылки по теме:

C++ Даны вещественные числа x, y
Найти вещественные числа, у которых сумма цифр целой и дробной части равны C++
Вещественные числа C++

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

Или воспользуйтесь поиском по форуму:
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
26.02.2013, 17:52     Как найти в строке вещественные числа ? #13
Грубо говоря обнуляем буфер

Добавлено через 26 минут
Вообще,изначально несколько по другому думалось,поэтому вводился буфер,но сейчас можно это просто удалить
Yandex
Объявления
26.02.2013, 17:52     Как найти в строке вещественные числа ?
Ответ Создать тему
Опции темы

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