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

Поиск бинарных чисел в строке символов и их преобразование - C++

Восстановить пароль Регистрация
 
Fareiro
15 / 15 / 1
Регистрация: 06.12.2012
Сообщений: 130
06.12.2012, 04:15     Поиск бинарных чисел в строке символов и их преобразование #1
Добрый вечер. Нужна помощь в реализации программы.
Задача:
Кликните здесь для просмотра всего текста
Дана строка символов, в которой содержатся числа в двоичной системе записанные в формате <числа>,< числа>(1.1, 1010.01) - но это не обязательное условие. Нужно найти в строке эти числа, перевести в десятеричную систему и вывести сумму этих чисел. Строка заканчивается ";".

Если перед числом стоит "-" то при подсчете суммы число учитывается как отрицательное. На примере показано.

Примеры:
Кликните здесь для просмотра всего текста
Примерный вид строки: abc<=d@10be-11a1,1be;
Содержание: 10, -11, 1.1
Операции: 10-11+1.1 (все в двоичной системе) или 2-3+1.5(если не ошибаюсь)
На вывод: 0,5

Или так: fka>?oqja1001,01 jak@al-1,1sh;
На вывод: 7.75


Поиск по строке можно сделать как-то так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool havenumber(char z)
{
    return z>='0' && z<='9';
}
char findnumber()
{
char z;
do
    cin >> z;
    while (!havenumber(z));
    return z;
}

Или так с выводом уже:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char str[20];
    char *pStr;
    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++;
    }

Но как включить туда еще случай, когда перед числом стоит "-"? Вообщем вся проблема состоит в этом поиске чисел, включая случай когда перед числом стоит "-". Все остальное не вызывает никаких вопросов.

Буду признателен за вашу помощь. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 04:15     Поиск бинарных чисел в строке символов и их преобразование
Посмотрите здесь:

поиск символов в строке C++
C++ поиск символов в строке
C++ Поиск символов в строке
C++ Поиск символов в строке
C++ поиск символов в строке
C++ Поиск предложения в тексте. Преобразование в массив символов. Не работает
Поиск чисел в строке символов C++
C++ Преобразование символов в строке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fareiro
15 / 15 / 1
Регистрация: 06.12.2012
Сообщений: 130
10.12.2012, 03:25  [ТС]     Поиск бинарных чисел в строке символов и их преобразование #2
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <cstdio> 
#include <cstdlib> 
 
using namespace std; 
 
enum STATE { 
   NN, 
   SIGN, 
   BNUM, 
   CCOMA, 
   ENUM 
}; 
 
enum CTYPE { 
   DIGIT, 
   MINUS, 
   COMA, 
   OTHER 
}; 
 
CTYPE getCTYPE(int character) { 
   switch (character) { 
      case '0': return DIGIT; 
      case '1': return DIGIT; 
      case '-': return MINUS; 
      case ',': return COMA; 
      default: return OTHER; 
   } 
} 
 
int main() { 
   // переменная для суммы бинарных чисер 
   double sum = 0.0; 
 
   // переменная для считывания чисел
   double num; 
   double tnum; 
 
   // определение, был ли знак минуса перед числом
   bool minus; 
   int c; 
 
   // состояние в котором находимся
   STATE state; 
   // начальное положение
   state = NN; 
    
   // строка заканчивается  ';'
   int end_character = ';'; 
   // все до первого ';'
   while ( (c = getchar()) != end_character) { 
    
      switch (state) { 
         case NN: 
            switch (getCTYPE(c))
     { 
               case MINUS: 
            minus = true; 
            num = 0.0; 
            state = SIGN; 
            break; 
               case DIGIT: 
            minus = false; 
            num = (c == '0' ? 0.0 : 1.0); 
            state = BNUM; 
            break; 
            }; break; 
 
    //----------------------------------------------------------     
    case SIGN: 
            switch (getCTYPE(c)) 
    { 
               case DIGIT: 
            state = BNUM; 
            num = num * 2 + (c == '0' ? 0.0 : 1.0); 
            break; 
               case OTHER: 
            state = NN; break; 
            }; break; 
         
    //----------------------------------------------------------
 
    case BNUM: 
            switch (getCTYPE(c)) { 
               case MINUS: 
            minus = true; 
            num = 0.0; 
            state = SIGN; 
            break; 
               case DIGIT: 
            num = num * 2 + (c == '0' ? 0.0 : 1.0); 
            break; 
               case COMA: tnum = 1.0 / 2.0; state = CCOMA; break; 
               case OTHER: state = NN; break; 
            }; break; 
 
   //-----------------------------------------------------------
 
         case CCOMA: 
            switch (getCTYPE(c)) { 
               case MINUS: 
            minus = true; 
            num = 0.0; 
            state = SIGN; 
            break; 
               case DIGIT: 
            num += (c == '0' ? 0.0 : tnum); 
            tnum /= 2; 
            state = ENUM; 
            break; 
               case COMA: 
            state = NN; 
            break; 
               case OTHER: 
            state = NN; 
            break; 
            }; break; 
 
  //------------------------------------------------------------
         case ENUM: 
            switch (getCTYPE(c)) { 
               case MINUS: 
            sum = minus ? sum - num : sum + num; 
            minus = true; 
            num = 0.0; 
            state = SIGN; 
            break; 
               case DIGIT: 
            num += tnum; 
            tnum /= 2; break; 
               case COMA: 
            sum = minus ? sum - num : sum + num; 
            state = NN; 
            break; 
               case OTHER: 
            sum = minus ? sum - num : sum + num; 
            state = NN;
            break; 
            }; break; 
      }; 
   } 
   if (state == ENUM) { 
      if (minus) 
         sum -= num; 
      else 
         sum += num; 
   } 
   printf("%lf\n", sum); 
   return 0; 
}
Нужна помощь в переписи данного кода в функции или в нечто другое. Буду весьма благодарен за помощь. Заранее спасибо.
Fareiro
15 / 15 / 1
Регистрация: 06.12.2012
Сообщений: 130
12.12.2012, 16:38  [ТС]     Поиск бинарных чисел в строке символов и их преобразование #3
Может кому-то понадобиться...
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
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
bool cyfra(char znak)
{
    if (znak=='1' || znak=='0')
    {
        return true;
    }
    else
        return false;
}
 
int wartosc(char znak)
{
    if (znak=='0')
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
 
float jakaliczba(char &obecnyznak)
{
    char c;
    float wynik=0,dwa=2;  
    int wykladnik=-1;
    bool ujemna=false;
    if (obecnyznak=='-')
    {
        ujemna=true;
    }
    if (cyfra(obecnyznak))
    {
        wynik=wartosc(obecnyznak);
    }
 
    do
    {
        cin>>c;
        if (cyfra(c))
        {
            wynik=wynik*2+wartosc(c);
        }
 
    }
    while (cyfra(c));
    if (c==',')
    {
        do
        {
        cin>>c;
        if (cyfra(c))
        {
            wynik=wynik+wartosc(c)*exp(log(dwa)*wykladnik); 
            wykladnik=wykladnik-1;
        }
        }
        while (cyfra(c));
    }
 
    obecnyznak=c;
    if (ujemna)
        wynik=-wynik;
    return wynik;
}
int main()
{
    char ch;
    float suma=0;
    do
    {
        cin>> ch;
        if (ch=='1' || ch=='0' || ch=='-')
        {
            suma=suma+jakaliczba(ch);
        }
        
    }
    while (ch!=';');
    cout<<suma<<"\n";
    getch();
    return 0;
}
Yandex
Объявления
12.12.2012, 16:38     Поиск бинарных чисел в строке символов и их преобразование
Ответ Создать тему
Опции темы

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