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

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

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

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

17.08.2011, 19:17. Просмотров 2284. Ответов 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
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2011, 19:17     калькулятор
Посмотрите здесь:

Калькулятор - C++
Помогите пожалуйста сделать в этом калькуляторе скобки. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include...

Калькулятор - C++
Пишу калькулятор. Прошу помощи. Вот мой код #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;string.h&gt; #include &lt;cmath&gt; using...

Калькулятор на С++ - C++
Сделал калькулятор, работает нормально, но программа считает только два числа за раз: &gt;&gt;Картинка&lt;&lt; , как сделать так чтоб пользователь...

Калькулятор - C++
Вот сам калькулятор: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR -1 #include&lt;stdlib.h&gt;...

Калькулятор - C++
Написал примитивный калькулятор: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; using namespace std; int...

Калькулятор - C++
Есть такое условие: If(b=='+') s=a+b; как сделать так чтобы я мог додавать не два числа а a+b+...+n

C++ Калькулятор - C++
Начал практиковаться в C++ помогите понять почему не работает мой калькулятор? Вроде все правильно,ввожу числа а он просто отключается....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Techno
Вирусоборец
317 / 119 / 2
Регистрация: 15.07.2011
Сообщений: 293
17.08.2011, 19:21     калькулятор #2
Код
 if ((s[i]='+')||(s[i]='-')||(s[i]='/')||(s[i]='*'))
    {
    int iznakq=i;
}
Если условие if не выполнится, то переменная iznakq, которая дальше используется, не будет объявлена.
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 19:23  [ТС]     калькулятор #3
(2 пост) чее???

Добавлено через 1 минуту
а тоесть я просто не там обьявил переменную?))

Добавлено через 53 секунды
Цитата Сообщение от Techno Посмотреть сообщение
Код
 if ((s[i]='+')||(s[i]='-')||(s[i]='/')||(s[i]='*'))
    {
    int iznakq=i;
}
Если условие if не выполнится, то переменная iznakq, которая дальше используется, не будет объявлена.
все понял спасибо))
Techno
Вирусоборец
317 / 119 / 2
Регистрация: 15.07.2011
Сообщений: 293
17.08.2011, 19:25     калькулятор #4
Цитата Сообщение от Ferk Посмотреть сообщение
а тоесть я просто не там обьявил переменную?))
Именно так)))
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
17.08.2011, 19:40     калькулятор #5
и у меня дикое ощущение что ты здесь имел виду не присваивание а сравнение.
Код
    if ((s[i]='+')||(s[i]='-')||(s[i]='/')||(s[i]='*'))
Код
    if ( ( s[i] == '+' ) || ( s[i] == '-' ) || ( s[i] == '/' ) || ( s[i]=='*' ) )
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 19:56  [ТС]     калькулятор #6
да спасибо) испаравил... но все равно не пашет))
LosAngeles
Заблокирован
17.08.2011, 20:25     калькулятор #7
не очень рационально сделано.
я подрихтовал слегка
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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
 
    double a,b,c;
    string s;
    char znak = 0;
    cout << "Vvedi     a (+,-,/,*,) b  " <<endl;
    cin >> s;
 
    istringstream ss(s);
    ss >> a >> znak >> b;
 
    switch (znak)
    {
    case '+':
        c=a+b;
        break;
    case '-':
        c=a-b;
        break;
    case '/':
        c=a/b;
        break;
    case '*':
        c=a*b;
        break;
    default:
        cout << "Illegal character" << endl;
        exit(0);
    }
        
 
    cout<<c<<endl;
    system("pause");
    return 0;
}
Добавлено через 7 минут
обрати внимание на форматирование кода и сравни насколько его легче читать по сравнению с моим вариантом. В любой нормальной ide в меню Правка есть пункт Автоформатирование и горячая клавиша которая автоматически форматирует выделенный текст.

Добавлено через 1 минуту
проверку деления на ноль тоже не забудь добавить
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.08.2011, 20:26     калькулятор #8
Цитата Сообщение от Ferk Посмотреть сообщение
пишишь например 223+211 и програма должна понять где в строке переменные и какое действие с ними делать..
Зря =)
Не твой уровень, аналогичная задача на acmp 56% стоит, а ты 4% задачи с трудом еще решаешь...
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,290
Записей в блоге: 17
17.08.2011, 20:46     калькулятор #9
Давно задумывался над решением подобной задачи, а разве нет какого-то более легкого,рационального решения, например с использованием библиотеки ?
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 20:55  [ТС]     калькулятор #10
Цитата Сообщение от diagon Посмотреть сообщение
Зря =)
Не твой уровень, аналогичная задача на acmp 56% стоит, а ты 4% задачи с трудом еще решаешь...
Та задача не совсем анолагичная.. она на много сложнее.. там выражения.. ..

и почиму это я 4% с трудом решаю?))

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Давно задумывался над решением подобной задачи, а разве нет какого-то более легкого,рационального решения, например с использованием библиотеки ?
хз)) я месяц с++ учю)) попытался так решить)) она пока не пашит)) но завтра я разберусь и доделаю ее))

Добавлено через 46 секунд
даж меньше месяца)
dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.08.2011, 20:59     калькулятор #11
я писал однажды калькулятор, сейчас кину

Добавлено через 19 секунд
если конечно надо
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.08.2011, 20:59     калькулятор #12
Цитата Сообщение от Ferk Посмотреть сообщение
Та задача не совсем анолагичная.. она на много сложнее.. там выражения.. ..
Ненамного... Парсить немного сложнее, если через рекурсию делать, то еще проще.

Цитата Сообщение от Ferk Посмотреть сообщение
и почиму это я 4% с трудом решаю?))
Пардон, перепутал с кем-то... Но судя по твоим темам тяжело тебе эта тема дастся =\ Впрочем, без учета переменных, скобок, функций и приоритетов операторов это действительно не так сложно.
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 21:01  [ТС]     калькулятор #13
Цитата Сообщение от LosAngeles Посмотреть сообщение
не очень рационально сделано.
я подрихтовал слегка
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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
 
    double a,b,c;
    string s;
    char znak = 0;
    cout << "Vvedi     a (+,-,/,*,) b  " <<endl;
    cin >> s;
 
    istringstream ss(s);
    ss >> a >> znak >> b;
 
    switch (znak)
    {
    case '+':
        c=a+b;
        break;
    case '-':
        c=a-b;
        break;
    case '/':
        c=a/b;
        break;
    case '*':
        c=a*b;
        break;
    default:
        cout << "Illegal character" << endl;
        exit(0);
    }
        
 
    cout<<c<<endl;
    system("pause");
    return 0;
}
Добавлено через 7 минут
обрати внимание на форматирование кода и сравни насколько его легче читать по сравнению с моим вариантом. В любой нормальной ide в меню Правка есть пункт Автоформатирование и горячая клавиша которая автоматически форматирует выделенный текст.

Добавлено через 1 минуту
проверку деления на ноль тоже не забудь добавить

я у ся в дев с++ не могу чет найти)))))

Добавлено через 1 минуту
Цитата Сообщение от aram_gyumri Посмотреть сообщение
я писал однажды калькулятор, сейчас кину

Добавлено через 19 секунд
если конечно надо
кидай)) поглядим))
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
17.08.2011, 21:02     калькулятор #14
Цитата Сообщение от Ferk Посмотреть сообщение
я у ся в дев с++ не могу чет найти)))))
у меня оно автоматически стоит это форматирование кода
dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.08.2011, 21:03     калькулятор #15
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <cmath>
#include <windows.h>
using namespace std;
void StartExe(string s)
{
    s="start "+s;
    system(s.c_str());
}
void Sum(string s)
{
    long long a,b;
    a=atoll(s.substr(0,s.find("+")).c_str());
    b=atoll(s.substr(s.find("+")+1,s.length()).c_str());
    cout << a+b << endl;
}
void Sub(string s)
{
    long long a,b;
    a=atoll(s.substr(0,s.find("-")).c_str());
    b=atoll(s.substr(s.find("-")+1,s.length()).c_str());
    cout << a-b << endl;
}
void Mul(string s)
{
    long long a,b;
    a=atoll(s.substr(0,s.find("*")).c_str());
    b=atoll(s.substr(s.find("*")+1,s.length()).c_str());
    cout << a*b << endl;
}
void Div(string s)
{
    long long a,b;
    a=atoll(s.substr(0,s.find("//")).c_str());
    b=atoll(s.substr(s.find("//")+2,s.length()).c_str());
    cout << a/b << endl;
}
void Mod(string s)
{
    long long a,b;
    a=atoll(s.substr(0,s.find("%")).c_str());
    b=atoll(s.substr(s.find("%")+1,s.length()).c_str());
    cout << a%b << endl;
}
void Power(string s)
{
    long long a,b;
    a=atoll(s.substr(0,s.find("^")).c_str());
    b=atoll(s.substr(s.find("^")+1,s.length()).c_str());
    cout << pow(a,b) << endl;
}
void DivF(string s)
{
    long double a,b;
    a=atof(s.substr(0,s.find("/")).c_str());
    b=atof(s.substr(s.find("/")+1,s.length()).c_str());
    cout << a/b << endl;
}
void ShowBox(string s)
{
    s=s.substr(s.find("(")+1,s.find(")")-1);
    string text=s.substr(1,s.find(",")-1),caption=s.substr(s.find(",")+2,s.length()-1);
    text=text.substr(0,text.length()-1);
    caption=caption.substr(0,caption.length()-2);
    MessageBox(NULL,text.c_str(),caption.c_str(),MB_OK);
}
int main()
{
    cout << "\t\t\t EasyProg Interpreter v1.0";
    while (true)
    {
        cout << "\n>>> ";
        string s;
        getline(cin,s);
        if (s.length()==0) continue;
        else if (s.find("exec")!=-1)
        {
            string path=s.substr(s.find("exec")+5,s.length());
            StartExe(path);
        }
        else if (s.find("+")!=-1) Sum(s);
        else if (s.find("-")!=-1) Sub(s);
        else if (s.find("*")!=-1) Mul(s);
        else if (s.find("//")!=-1) Div(s);
        else if (s.find("%")!=-1) Mod(s);
        else if (s.find("^")!=-1) Power(s);
        else if (s.find("/")!=-1) DivF(s);
        else if (s.find("MsgBox(")!=-1) ShowBox(s);
        else if (s=="exit") {cout << "Good Bye."; Sleep(500); exit(0);}
        else if (s=="clear") {system("cls"); cout << "\t\t\t EasyProg Interpreter v1.0";}
        else cout << "It's not correct command.\n";
    }
    return 0;
}
Добавлено через 40 секунд
Вот, но это не просто калькулятор.
diagon
Higher
1927 / 1193 / 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;
}
Поддерживает переменные и скобки, не поддерживает функции.
Я им часто пользуюсь в консоли, это быстрее чем пайтона открывать =\
Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 21:07  [ТС]     калькулятор #17
вот ети как то сложновато пока для мя)))))
dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.08.2011, 21:10     калькулятор #18
это будет сложно для ТС, он только на чал учить С++
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
17.08.2011, 21:11     калькулятор #19
Цитата Сообщение от diagon Посмотреть сообщение
Образцовый кальк с помощью рекурсии.
Взят из книги Страуструпа
Я 2 главы про этот калькулятор не могу понять, все из-за этого кривого слова "Терм" кто-нибуль может понятно объяснить, что это такое?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2011, 21:11     калькулятор
Еще ссылки по теме:

Калькулятор - C++
Всем привет) Начну с того что я не программист... Но вот решил просто освоить для себя. Выбрал язык Си. Купил книгу начал читать....

Калькулятор - C++
Доброго времени суток, Народ! Помогите плиз с задачей. Нужен исходник калькулятора, самого простого, на 4 действия. Заранее спасибо!!!

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

Калькулятор - C++
Добрый вечер всем! Я решил написать калькулятор, но возникла одна проблема: я хочу написать чтобы он решал вот такие примеры: а + b а +...

Калькулятор - C++
Решил написать калькулятор, а вот и он: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR 'a' ...


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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
17.08.2011, 21:11     калькулятор
Ответ Создать тему
Опции темы

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