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

Не могу довести до ума. Надо написать строчный калькулятор в 12-ричной системе счисления - C++

Восстановить пароль Регистрация
 
ofel
Сообщений: n/a
23.06.2013, 19:32     Не могу довести до ума. Надо написать строчный калькулятор в 12-ричной системе счисления #1
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <iostream>
#include <map>
#include <cctype>
#include <cmath>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
void per();
enum Token_value
{
     NUMBER, END, PLUS = '+', MINUS = '-', MUL = '*', DIV = '/', PRINT = ',',   LP = '(', RP = ')'
};
 
struct SyntaxError
{
    const char* p;
    
    SyntaxError(const char* q)
    {
        p = q;
    }
};
 
struct MathError
{
    const char* p;
    
    MathError(const char* q)
    {
        p = q;
    }
};
 
Token_value curr_tok = PRINT; //PRINT - это или '\n' или ';'
map <string, double> table;
int no_of_errors;
 
int error (const string& s)
{
    no_of_errors++;
    cerr << "Error: " << s << '\n';
    return 1;
}
 
double number_value;
string string_value;
string s1("abs");
 
Token_value get_token()
{
    char ch = 0;
    cin >> ch;
    switch(ch)
    {
        case 0:
            return curr_tok = END; 
        case ';':
        case '*':
        case '/':
        case '+':
        case '-':
        case '(':
        case ')':
        case '=':
            return curr_tok = Token_value(ch);
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
        case ',':
        case 'A':
        case 'B':
 
            cin.putback(ch);
            cin >> number_value;
            per(ch);
            return curr_tok = NUMBER;
        default:
            if (isalpha(ch))
            {
                cin.putback(ch);
                cin >> string_value;
                return curr_tok = NUMBER;
            }
            error ("Неправильная лексима");
            return curr_tok = PRINT;
    }
}
 
double expr(bool); // складывает и вычитает 
 
double prim(bool get)
{
    if (get) get_token();
    switch (curr_tok)
    {
        case NUMBER: //константа с плавующей точкой
        {
            double v = number_value;
            get_token(); //помещает значение в глобальную переменную number_value
            return v;
        }
        
        case MINUS:
            return -prim(true);
        case LP:
        {
            double e = expr(true);
            if (curr_tok != RP)
                return error("Ожидалась )");
            get_token();
            return e;
        }
        throw(SyntaxError("Неверная функция"));
    }
}
 
double term (bool get) //умножает и складывает
{
    double left = prim(get);
    for(;; ) //бесконечный цикл
    switch(curr_tok)
    {
        case MUL:
            left *= prim(true);
            break;
        case DIV:
            if (double d = prim(true))
            {
                left /= d;
                break;
            }
            return error("Деление на ноль");
        default:
            return left;
    }
}
 
double expr(bool get) 
{
    double left = term(get);
    for(;; )
    switch(curr_tok)
    {
        case PLUS:
            left += term(true);
            break;
        case MUL: 
            left *= prim(true);
            break;
        case MINUS:
            left -= term(true);
            break;
        default:
            return left;
    }
}
 
int main()
{   
    setlocale(LC_ALL,"Rus");
    while(cin) // проверка cin
    {
        get_token();
        if (curr_tok == END) //корректный выход из цикла, когда get_token() встречает конец файла
            break;
        if (curr_tok == PRINT) //освобождает expr() от обязанности обрабатывать пустые выражения
            continue; // переход к концу цикла 
        cout << expr(false);
 
    }
    return no_of_errors;}
 
void per()
{
    int k = 0;
    string stroka = "1BA2A", sim = "";
    string stroka2 = "";
    string::reverse_iterator rit;
    int base_n = 12, n = 0, n10 = 0, res = 0;
//**********перевод из base_n в 10чную*********************************
    int size_str = stroka.length();
    cout << stroka << " = " << size_str <<endl;
    for (int i = 0; i < stroka.length(); i++) sim += stroka[i];//инвертируем строку что бы получить число как многочлен
    cout << sim << endl;
    for (int i = 0; i < size_str; i++)
    {
        if (sim[i] <= 57)
        { res+= ((int)sim[i] - 48) * (int)pow((double)base_n,i);}//возводим в степень а * base_n^i , если цифра 
        else
        { res+= ((int)sim[i] - 55) * (int)pow((double)base_n,i);}//возводим в степень а * base_n^i , если символ
    }
    cout << endl;
    cout << " res = " << res << endl;//вывод результата
//*********перевод из 10чной в другую систему base_n*******************
    char * szString = new char[1];
    stroka2 = ltoa(res,szString,base_n);//стандартная функция С
    cout << " stroka2 = " << stroka2 << endl;
    cin >> k;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 19:32     Не могу довести до ума. Надо написать строчный калькулятор в 12-ричной системе счисления
Посмотрите здесь:

Описать функцию HexToDec(S) целого типа, определяющую целое неотрицательное число по его строковому представлению S в 16-ричной системе счисления C++
Определить целое неотрицательное число по его строковому представлению S в 16-ричной системе счисления C++
Не могу довести до ума..а хотя все эллиментарно...( C++
Не могу довести до ума, не хватает функции C++
C++ Ввести целое число N, вывести его в 8-ричной системе счисления
Ввести с консоли число в 16-ричной системе счисления, преобразовать его в битовое поле за счёт использования объединения C++
C++ Калькулятор в любой системе счисления
Палиндром записи числа в 16-ричной системе счисления C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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