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

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

Войти
Регистрация
Восстановить пароль
 
ofel
Сообщений: n/a
#1

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

23.06.2013, 19:32. Просмотров 434. Ответов 0
Метки нет (Все метки)

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-ричной системе счисления (C++):

Не могу довести до ума, не хватает функции - C++
/* c помощью текстового редактора блокнот создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки...

Не могу довести до ума..а хотя все эллиментарно...( - C++
Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Xнач до Хкон с шагом dX. Формула -ax-c при...

Палиндром записи числа в 16-ричной системе счисления - C++
Среди всех четырехзначных чисел найти числа, запись которых в 16-р системе исчисления представляет собой палиндром, и подсчитать количество...

Ввести целое число N, вывести его в 8-ричной системе счисления - C++
Доброго времени суток. Помогите пожалуйста написать программу - &quot;Ввести целое число N, вывести его в 8-ричной системе счисления&quot;. И...

Определить целое неотрицательное число по его строковому представлению S в 16-ричной системе счисления - C++
Очень прошуууу помочь .Param47. Описать функцию HexToDec(S) целого типа, определяющую целое неотрицательное число по его строковому...

Ввести с консоли число в 16-ричной системе счисления, преобразовать его в битовое поле за счёт использования объединения - C++
Задание:Разработать битовое поле, описывающее состояния элементов прибора. Ввести с консоли число в 16-ричной системе счисления,...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 19:32
Привет! Вот еще темы с ответами:

Описать функцию HexToDec(S) целого типа, определяющую целое неотрицательное число по его строковому представлению S в 16-ричной системе счисления - C++
Очень прошуууу помочь .Param47. Описать функцию HexToDec(S) целого типа, определяющую целое неотрицательное число по его строковому...

Калькулятор в любой системе счисления - C++
Добрый день. Нужно сделать калькулятор в 2-16ричной системе счисления. Проблема в том, что вычислять можно только напрямую, без перевода в...

Калькулятор в любой системе счисления - C++
Добрый день, нужно написать что-то типа этого http://numsys.ru/#feedback. Подскажите пожалуйста, как реализовать двоичный-шестнадцатиричный...

Калькулятор: выполнение арифметических операций в любой системе счисления - C++
Нужен калькулятор который может совершать арифметичиские операции(+,-,*,/) в любой системе исчисления (2-16)


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

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

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