15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
1

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

06.12.2012, 04:15. Показов 687. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Нужна помощь в реализации программы.
Задача:
Кликните здесь для просмотра всего текста
Дана строка символов, в которой содержатся числа в двоичной системе записанные в формате <числа>,< числа>(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++;
    }

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

Буду признателен за вашу помощь. Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2012, 04:15
Ответы с готовыми решениями:

Поиск чисел в строке символов
Прошу помочь с алгоритмом,т к сама не понимаю. Пыталась записать каждое число в отдельную строку,а...

Преобразование символов в строке
Нужно изменить буквы в строке по следующему принципу: &quot;a&quot; на &quot;b&quot;, &quot;A&quot; на &quot;B&quot;, &quot;z&quot; на &quot;a&quot; и т.д....

Поиск предложения в тексте. Преобразование в массив символов. Не работает
Задача: Программа должна считывать текст из файла и выводит на экран предложение, содержащее...

Поиск вещественных чисел в произвольной строке символов
Ребят, всем привет! Нужна программа на паскале на тему &quot;работа со строковыми переменными&quot;. Суть...

2
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
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; 
}
Нужна помощь в переписи данного кода в функции или в нечто другое. Буду весьма благодарен за помощь. Заранее спасибо.
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
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;
}
0
12.12.2012, 16:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2012, 16:38
Помогаю со студенческими работами здесь

Преобразование символов в строке
При записи в БД, это: ®,”,,’ и все подобное... становиться таким: ”...

Преобразование экранированных символов в нормальные в строке
Есть строка-результат веб-запроса с кучей экранированных кавычек и прочего: что-то вроде &quot;...

Преобразование количества символов в строке в тип int
В учебной программе по английскому языку в зависимости от количества символов в строке, нужно...

поиск байта в строке и преобразование
имеется: ComPort.ReadStr(Str, Count); 1. нужно в Str найти нужный байт и если нашёлся - что-то...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru