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

Калькулятор - C++

Восстановить пароль Регистрация
 
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
11.04.2010, 01:14     Калькулятор #1
вводиться некоторое матиматическое выражение. программа должна сама считовывать скобки и +-*/
и выводить на экран не результат а как она решена.

дана задача)
сам калькулятор я написал читая струструпа. (калькулятор работает как просто калькулятор.) но не могу вывести результат так как хочет препод.
спрашивал у препода говорит используй string чтобы он читал мат. выражение и выводил.
пока в голову ничего не пришло) как его использовать.
написал на visualc++

подскажите что надо еще ввести в код чтобы он выводил и результат и способ как он его решил

Добавлено через 20 минут
поискал на сайте но тут даны только простые калькуляторы.

Добавлено через 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
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <assert.h>
 
int tok;
double tokval;
 
int next() {
    for (;;) {
        int c = getchar();
        if (c == EOF || strchr("+-*/^()\n", c) != NULL) return tok = c;
        if (isspace(c)) continue;
        if (isdigit(c) || c == '.') {
            ungetc(c, stdin);
            scanf(" %lf", &tokval);
            return tok = 'n';
        }
        fprintf(stderr, "Bad character: %c\n", c); abort();
    }
}
 
void skip(int t) { assert(tok == t); next(); }
 
double expr();
 
 
double numpar() {
    if (tok == 'n') { double x = tokval; skip('n'); return x; }
    skip('('); double x = expr(); skip(')'); return x;
}
 
 
double factor() {
    double x = numpar();
    if (tok == '^') { skip('^'); x = pow(x, factor()); }
    return x;
}
 
 
double term() {
    double x = factor();
    for (;;) {
        if (tok == '*') { skip('*'); x *= factor(); }
        else if (tok == '/') { skip('/'); x /= factor(); }
        else return x;
    }
}
 
 
double expr() {
    double x = term();
    for (;;) {
        if (tok == '+') { skip('+'); x += term(); }
        else if (tok == '-') { skip('-'); x -= term(); }
        else return x;
    }
}
 
int main() {
    next();
    while (tok != EOF) {
        if (tok == '\n') { skip('\n'); continue; }
        printf("%.9g\n", expr());
    }
    return 0;
}
это исходник который я использовал в своей программе.
если поможете я просто добавлю его в исходник и покажу преподу)

Добавлено через 20 часов 53 минуты
или дайте какой нить совет как это можно сделать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2010, 01:14     Калькулятор
Посмотрите здесь:

Калькулятор C++
Калькулятор C++
Калькулятор C++
C++ Калькулятор
калькулятор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.04.2010, 01:24     Калькулятор #2
в общем преподу надо чотобы программа выводила последовательность действий с учетом приоритетов или что? "то как она решена" - это не понятно. ну например:
выражение 3*(9-5)+1 должно быть переведено в + * 3 - 9 5 1, префиксная нотация. так? или надо перевесли в постфиксную нотацию? дерево при выполнении можно использовать?
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
11.04.2010, 04:15  [ТС]     Калькулятор #3
именно так последовательность действии +учет приоритетов
например 784*(78+(75/5)-3*4
вывести должна
75 / 5>78+ результат1> 784* результат2> 3*4> результат 3 -результат4
дерево можно.

Добавлено через 42 минуты
если быть точнне то так
75/5>+>78>*>748>->3*4
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.04.2010, 22:22     Калькулятор #4
у меня тут старая прога завалялась я там подкоректировал кое что. и в итоге:
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
#include <iostream>
using namespace std;
struct node{
    node *l,*r;
    char val;
    node(node *ll,node *rr,char c):l(ll),r(rr),val(c){}
};
void print(node *t,int n)
{
    if (t)
    {
        print(t->r,n+1);
        for (int i=0;i<n;i++) cout << "  ";
        cout << t->val << '\n';
        print(t->l,n+1);
    }
}
void del(node *&t)
{
    if (t)
    {
        del(t->r);
        del(t->l);
        delete t;
    }
 
}
char lookahead;
int amount_of_errors=0;
void match(char c)
{
    if (lookahead==c)
    {
        cin.get(lookahead);
        while(lookahead==' '||lookahead=='\t')cin.get(lookahead);
    }
    else
    {
        cout << "\nsyntax error in " << lookahead << '\n';
        amount_of_errors++;
    }
}
node *scan()
{
    while(lookahead==' '||lookahead=='\t')cin.get(lookahead);
    if (isalpha(lookahead)||isdigit(lookahead))return new node(0,0,lookahead);
    else
    {
        cout << "\nsyntax error in " << lookahead << '\n';
        amount_of_errors++;
        return 0;
    }
}
node *expr();
node *factor()
{
    if (lookahead=='(')
    {
        match('(');node *t=expr(); match(')');
        return t;
    }
    else
    {
        node *t = scan();
        match(lookahead);
        return t;
    }
}
node *prim();
node *prim1()
{
    if (lookahead=='*')
    {
        match('*'); return prim();
    }
    else if (lookahead=='/')
    {
        match('/'); return prim();
    }
    else {}
}
node *prim()
{
    node *t1=factor();
    if (lookahead=='*' || lookahead=='/')
    {
        char c=lookahead;
        node *t2=prim1();
        return new node(t1,t2,c);
    }
    else return t1;
}
node *expr1()
{
    if (lookahead=='-')
    {
        match('-'); return expr();
    }
    else if (lookahead=='+')
    {
        match('+'); return expr();
    }
    else {}
}
node *expr()
{
    node *t1=prim();
    if (lookahead=='+' || lookahead=='-')
    {
        char c=lookahead;
        node *t2=expr1();
        return new node(t1,t2,c);
    }
    else return t1;
}
void super_print(node *t)
{
    if (t)
    {
        if (t->r)super_print(t->r);
        if (t->l)super_print(t->l);
 
        if (strchr("*+/-",t->val))
        {
            if (!strchr("*+/-",t->l->val) && !strchr("*+/-",t->r->val)) cout << t->l->val;
            cout << t->val;
            if (!strchr("*+/-",t->l->val)&& strchr("*+/-",t->r->val)) cout << t->l->val;
            if (!strchr("*+/-",t->r->val)) cout << t->r->val;
            cout << '>';
        }
    }
}
int main()
{
    node *root=0;
    match(lookahead);
    root=expr();
    if (amount_of_errors)
    {
        cout << "errors presents in tree constructing\n";
    }
    else
    {
        //print(root,0);
        super_print(root);
    }
    del(root);
    return 0;
}
она принимает только числа из одного знака и не умеет пропускать пробелы. Только вот что программа должна выводить вот на это 4+6*9-2*8? ибо в нотации, требуемой твоим преподом ,токое адекватно не выведешь. в том числе и это 784*(78+(75/5))-3*4 тут только 3*4>75/5>+>78>*>748>->.
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
12.04.2010, 01:00  [ТС]     Калькулятор #5
Цитата Сообщение от Aye Aye Посмотреть сообщение
она принимает только числа из одного знака и не умеет пропускать пробелы. Только вот что программа должна выводить вот на это 4+6*9-2*8? ибо в нотации, требуемой твоим преподом ,токое адекватно не выведешь. в том числе и это 784*(78+(75/5))-3*4 тут только 3*4>75/5>+>78>*>748>->.
2>+>6*9>->2*8
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2010, 06:25     Калькулятор #6
Цитата Сообщение от Aye Aye Посмотреть сообщение
в общем преподу надо чотобы программа выводила последовательность действий с учетом приоритетов или что? "то как она решена" - это не понятно. ну например:
выражение 3*(9-5)+1 должно быть переведено в + * 3 - 9 5 1, префиксная нотация. так? или надо перевесли в постфиксную нотацию? дерево при выполнении можно использовать?
Ещё вариант: 3*(9-5=4)=12+1=13. Так вывести?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2010, 07:20     Калькулятор
Еще ссылки по теме:

Калькулятор C++
калькулятор C++
калькулятор ( C++

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

Или воспользуйтесь поиском по форуму:
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
13.04.2010, 07:20  [ТС]     Калькулятор #7
хм можно наверно надо уточнить

Добавлено через 22 часа 45 минут
мда. препод говорить что надо делать через нити. dizi. не знаю как перевести на русский
Yandex
Объявления
13.04.2010, 07:20     Калькулятор
Ответ Создать тему
Опции темы

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