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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
#1

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

17.08.2011, 19:17. Просмотров 2310. Ответов 28
Метки нет (Все метки)

народ помогите ошибку найти)) полюбому какой нить пустяк а я чета не догоняю))

программа калькулятор.. пишишь например 223+211 и програма должна понять где в строке переменные и какое действие с ними делать..

вот код:

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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    int i;
    double a,b,c;
    string s(""),str1(""),str2(""),znak("");
    cout<< "Vvedi     a (+,-,/,*,) b  "<<endl;
    cin>>s;
    int k=s.length();
    for (i=0;i<k;i++)
    {
    if ((s[i]='+')||(s[i]='-')||(s[i]='/')||(s[i]='*'))
    {
    int iznakq=i;
}
}         
for(i=0;i<iznakq;i++)
{
    str1+=s[i];
}
for(i=iznakq+1;i<k;i++)
{
    str2+=s[i];
}
 
 
istringstream ss(str1);
ss>>a;
istringstream sss(str2);
ss>>b;
 
znak=s[iznakq];
                                          
    if (znak=="+")
    {
               c=a+b;
               }
      if (znak=="-")
    {
               c=a-b;
               }          
     if (znak=="/")
    {
               c=a/b;
               }    
       if (znak=="*")
    {
               c=a*b;
               }     
               
               cout<<c<<endl;
               system("pause");
               return 0;
               }
ошибку находит в цикле строка 20.. ссылаеться на переменную iznakq
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2011, 19:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос калькулятор (C++):

Простой калькулятор и калькулятор с парсингом - C++
Ребят я совсем не давно только начал изучать сишку, решил написать простенький калькулятор который работает с 2 числами. Возник вопрос, как...

Калькулятор на С++ - C++
калькулятор в принципе готов, надо только сделать запрет деления на 0, помогите кто чем может #include&lt;stdio.h&gt; #include&lt;conio.h&gt; ...

Калькулятор на С - C++
калькулятор в принципе готов, надо только сделать деление на дробные числа, помогите кто чем может пожалуйста

Калькулятор на C++ - C++
Доброго времени суток! У меня возник вопрос. При вводе чисел в cmd, они у меня просто складываются, но код (мне кажется) правильный. Думаю...

калькулятор - C++
Всем привет, извините, что постю сюда эту тему, но выхода нет((( Проблема состоит в том что надо сделать калькулятор из множества действий...

Калькулятор - C++
нужен калькулятор на языку С. уровень знания первый курс

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.08.2011, 21:04 #16
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Образцовый кальк с помощью рекурсии.
Взят из книги Страуструпа
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
#include <iostream>
#include <map>
#include <sstream>
#include <cctype>
enum Token_value {
    NAME, NUMBER, END,
    PLUS = '+', MINUS='-', MUL='*', DIV='/',
    PRINT=';', ASSIGN='=', LP='(', RP=')'
};
Token_value curr_tok=PRINT;
std::map<std::string,double> table;
double number_value;
std::string string_value;
int no_of_errors;
double error(const std::string& s){ 
    no_of_errors++;
    std::cerr << "error: " << s << std::endl;
    return 1;
}
Token_value get_token()
{
    char ch = 0;
    do {
        if (!std::cin.get(ch)) return curr_tok = END;
    } while (ch!='\n'&&isspace(ch));
 
    switch (ch) {
        case 0:
             return curr_tok = END;
        case ';':case '\n':
             return curr_tok = PRINT;
        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 '.':
             std::cin.putback(ch);
             std::cin>>number_value;
             return curr_tok=NUMBER;
        default:
             if (isalpha(ch)) {
                 string_value = ch;
                 while (std::cin.get(ch)&&isalnum(ch)) string_value.push_back(ch);
                 std::cin.putback(ch);
                 return curr_tok = NAME;
             }
             error ("bad token");
             return curr_tok = PRINT;
    }
}
double expr(bool get);
double prim(bool get){
    if (get) get_token();
    switch (curr_tok){
    case NUMBER:{
        double v=number_value;
        get_token();
        return v;
    }
    case NAME:{
        double& v = table[string_value];
        if (get_token()==ASSIGN) v=expr(true);
        return v;
    }
    case MINUS:return -prim(true);
    case LP:{
        double e=expr(true);
        if (curr_tok!=RP) return error("')'expected");
        get_token();
        return e;
    }
    default:
        return error("primary expected");
    }
}
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("divide by 0");
 
         default:return left;
        }
}
double expr(bool get){
    double left=term(get);
    for (;;)
        switch(curr_tok){
        case PLUS:
            left+=term(true);
            break;
        case MINUS:
            left-=term(true);
            break;
        default:
            return left;
        }
}
int main() {
    table["pi"]=3.141592653589793;
    table["e"]=2.7182818284590452;
    while (std::cin){
        get_token();
        if (curr_tok==END) break;
        if (curr_tok==PRINT) continue;
        std::cout << expr(false) << std::endl;
    }
    return no_of_errors;
}
Поддерживает переменные и скобки, не поддерживает функции.
Я им часто пользуюсь в консоли, это быстрее чем пайтона открывать =\
3
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 21:07  [ТС] #17
вот ети как то сложновато пока для мя)))))
0
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.08.2011, 21:10 #18
это будет сложно для ТС, он только на чал учить С++
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
17.08.2011, 21:11 #19
Цитата Сообщение от diagon Посмотреть сообщение
Образцовый кальк с помощью рекурсии.
Взят из книги Страуструпа
Я 2 главы про этот калькулятор не могу понять, все из-за этого кривого слова "Терм" кто-нибуль может понятно объяснить, что это такое?
0
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 21:11  [ТС] #20
у мя в моем коде почемуто выводит непонятные для меня цифры)) много цифр))

вот подправленый код)) скомпилируте у ся кто нить плиз)) че покажет?)

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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    int i,iznakq;
    int a,b,c;
    string s(""),str1(""),str2(""),znak("");
    cout<< "Vvedi     a (+,-,/,*,) b  "<<endl;
    cin>>s;
    int k=s.length();
    for (i=0;i<k;i++)
    {
    if ((s[i]=='+')||(s[i]=='-')||(s[i]=='/')||(s[i]=='*'))
    {
     iznakq=i;
}
}         
for(i=0;i<iznakq;i++)
{
    str1+=s[i];
}
for(i=iznakq+1;i<k;i++)
{
    str2+=s[i];
}
 
 
istringstream ss(str1);
ss>>a;
istringstream sss(str2);
sss>>b;
 
znak=s[iznakq];
                                          
    if (znak=="+")
    {
               c=a+b;
               }
      if (znak=="-")
    {
               c=a-b;
               }          
     if (znak=="/")
    {
               c=a/b;
               }    
       if (znak=="*")
    {
               c=a*b;
               }     
               
               cout<<c<<endl;
               system("pause");
               return 0;
               }


при чем он должен выводить одну переменную а он выводит через пробел следующие 4077552 2009249812
0
CJ_Sashok
Живу от Клика до Клика
34 / 34 / 5
Регистрация: 01.06.2010
Сообщений: 157
17.08.2011, 23:37 #21
Если порыться в темах( в этом разделе), то можно найти тему, которую я давным давно создавал. Называется она Простенький калькулятор . Вопщем задача у меня была такая же. Вот мой код:
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
#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
int plus(string a1);
int minus(string a2);
int ymnoz(string a3);
int podel(string a4);
double otv;
int plus(string a1){
    int i,i1;
    string b,c;
for(i=0;i<a1.length();i++){ // Цикл для проверки знак на "ПЛЮС"
    if (a1[i] != '+'){ b =b+a1[i];} //если не "ПЛЮС", то к b прибавим символ a[i]
    else if (a1[i] == '+'){//Если ПЛЮС, то...
 
break;} // Выход из цикла
}
for(i1=i+1;i1<a1.length();i1++){ //Цикл для проверки знака на "РАВНО"
         if (a1[i1] != '=') c =c+a1[i1]; //Если не "РАВНО", то к "c" прибавим символ a[i]
         else if (a1[i1] == '='){ // Если "РАВНО", то...
        return otv =  atof(b.c_str()) + atof(c.c_str()) ;
             break;}}
}
int minus(string a2){
    int i,i1;
    string b,c;
for(i=0;i<a2.length();i++){
    if (a2[i] != '-'){ b =b+a2[i];}
    else if (a2[i] == '-'){
 
break;}
}
for(i1=i+1;i1<a2.length();i1++){
         if (a2[i1] != '=') c =c+a2[i1];
         else if (a2[i1] == '='){
        return otv =  atof(b.c_str()) - atof(c.c_str()) ;
             break;}}
}
int ymnoz(string a3){
    int i,i1;
    string b,c;
for(i=0;i<a3.length();i++){
    if (a3[i] != '*'){ b =b+a3[i];}
    else if (a3[i] == '*'){
 
break;}
}
for(i1=i+1;i1<a3.length();i1++){
         if (a3[i1] != '=') c =c+a3[i1];
         else if (a3[i1] == '='){
        return otv =  atof(b.c_str()) * atof(c.c_str()) ;
             break;}}
}
int podel(string a4){
    int i,i1;
    string b,c;
for(i=0;i<a4.length();i++){
    if (a4[i] != '/'){ b =b+a4[i];}
    else if (a4[i] == '/'){
 
break;}
}
for(i1=i+1;i1<a4.length();i1++){
         if (a4[i1] != '=') c =c+a4[i1];
         else if (a4[i1] == '='){
        return otv = atof(b.c_str()) / atof(c.c_str()) ;
    break;}}
}
int main(){
    cout << " ------------------------------------------------------------------- \n";
    cout << "|_____________________                                              |\n";
    cout << "|Eazy Calculator v.1.1|                                             |\n";
    cout << "|_____________________|                                             |\n";
    setlocale( LC_ALL,"Russian" );
    cout << "|Введите пример, например,'2+2='(без кавычек)и нажмите на ENTER:    |\n";
    rest:
    cout << " ------------------------------------------------------------------- \n";
    string a;
getline(cin,a);
for(int i2 = 0;i2< a.length();i2++){
    if (a[i2] == '+'){
        plus(a);
        cout <<otv<<'\n';
        cout <<"___________________________\n"<< "Нажмите 'SPACE', чтобы продолжить...";
        int ch;
        ch =_getch();
        if (ch == 32){cout << '\n'; goto rest;}}
    else if (a[i2] == '-'){
        minus(a);
        cout <<otv<<'\n';
        cout <<"___________________________\n"<< "Нажмите 'SPACE', чтобы продолжить...";
        int ch;
        ch =_getch();
        if (ch == 32){cout << '\n'; goto rest;}}
    else if (a[i2] == '*'){
        ymnoz(a);
        cout <<otv<<'\n';
        cout <<"___________________________\n"<< "Нажмите 'SPACE', чтобы продолжить...";
        int ch;
        ch =_getch();
        if (ch == 32){cout << '\n'; goto rest;}}
    else if (a[i2] == '/'){
        podel(a);
        cout <<otv<<'\n';
        cout <<"___________________________\n"<< "Нажмите 'SPACE', чтобы продолжить...";
        int ch;
        ch =_getch();
        if (ch == 32){cout << '\n'; goto rest;}}
    }
}
0
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
18.08.2011, 00:03 #22
Ferk, рекомендую вам почитать книжечку Лафоре.
1
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
18.08.2011, 02:11 #23
Всё то же, но компактнее
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
#define calc(a, b, c) (((b) == '+') ? ((a) + (c)) : ((b) == '-') ? ((a) - (c)) : ((b) == '*') ? ((a) * (c)) : ((a) / (c)))
 
int main(void){
    double x, y;
    char act[2] = { 0 };
    
    while ( printf("> ") && scanf("%lf %1[+-*/] %lf", &x, act, &y) == 3 )
        printf("= %.2f\n", calc(x, *act, y));
    
    return 0;
}
2
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
18.08.2011, 03:10 #24
Так C++ же вроде надо.

Добавлено через 27 минут
Может, так?
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
#include <iostream>
#include <conio.h>
#include <iomanip>
using namespace std;
 
double calc ( double, double, char );
 
int main ()
{
    double a, b;
    char symbol;
    
    while ( true )
    {
        cout << "Enter: ";
        cin >> a >> symbol >> b;
    
        cout << "Result is: " << setprecision ( 4 ) << calc ( a, b, symbol );
        cout << endl << endl;
    }
 
    getch ();
    return 0;   
}
 
double calc ( double a, double b, char symbol )
{
    switch ( symbol )
    {
       case '+':
          return a + b;
       case '-':
          return a - b;
       case '*':
          return a * b;
       case '/':
          return a / b;
    }
}
Или программа должна в строке распознать числа и символы?
1
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
18.08.2011, 15:46  [ТС] #25
написал)) вот исправленный))

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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
main()
{
      int a,b,c,i;
      string s(""),str1(""),str2(""),zn("");
      cout<<"vvedi virogenie    a (+,-,*,/) b"<<endl;;
      cin>>s;
      int izn;
      for (i=0;i<s.length();i++)
      {
          if((s[i]=='+')||(s[i]=='-')||(s[i]=='*')||(s[i]=='/'))
          {
          izn=i;
          zn=s[izn];
          break;
           }
           }
           
           for(i=0;i<izn;i++)
           {
                              str1=str1+s[i];
                              }
           for(i=izn+1;i<s.length();i++)
           {
                              str2=str2+s[i];
                              }                  
                              
            istringstream ss1(str1);
            ss1 >> a;
            istringstream ss2(str2);
            ss2 >> b;
            
            if(s[izn]=='+')
            {
            c=a+b;
            }
            if(s[izn]=='-')
            {
            c=a-b;
            }
            if(s[izn]=='*')
            {
                          c=a*b;
                          }
                          if(s[izn]=='/')
                          {
                                        c=a/b;
                                        }
                              
           
           
           cout<<" "<<c<<endl;
           system("pause");
           return 0;
           }
там тока деление целочисленное ща переделую))

пошол совершенствовать его))
0
LosAngeles
Заблокирован
18.08.2011, 17:44 #26
чем этот плох код?
калькулятор
0
Avazart
Эксперт С++
7190 / 5364 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 17
18.08.2011, 19:11 #27
А что если задача сложнее например может быть ввод 223+211/566 ?
Кол-во операций может меняться?
0
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
19.08.2011, 12:43 #28
Цитата Сообщение от Avazart Посмотреть сообщение
А что если задача сложнее например может быть ввод 223+211/566 ?
тогда читай это или смотри эту программу.
2
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
19.08.2011, 23:22 #29
Цитата Сообщение от Dani Посмотреть сообщение
Я 2 главы про этот калькулятор не могу понять, все из-за этого кривого слова "Терм" кто-нибуль может понятно объяснить, что это такое?
По своему печальному опыту с этим калькулятором могу сказать,что для меня самым лучшим способом было давать калькулятору считать что-либо и смотреть,что происходит в дебаггере,пошагово.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2011, 23:22
Привет! Вот еще темы с ответами:

Калькулятор в С++ - C++
Доброго времени суток. Нужно разработать класс «Калькулятор» Вид данных: квадрат; Необходимо осуществить ввод и вывод координат...

калькулятор - C++
делаю калькулятор...столкнулся с проблемкой...при вычислении чисел с плавающей точкой...как можно реализовать

Калькулятор - C++
На форуме наткнулся на тему &quot;Римский калькулятор&quot;. Вот код: Functions.cpp #include&lt;iostream&gt; const int arabar = { 1, 4, 5, 9,...

калькулятор - C++
Здравствуйте!! У меня возникла проблема. Мне нужно ввести выражение и занести его в массив. Символов не ограничено. Заранее спасибо. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.08.2011, 23:22
Ответ Создать тему
Опции темы

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