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

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

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

программа калькулятор.. пишишь например 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++
C++ Калькулятор
C++ C++ Калькулятор
C++ Калькулятор
Калькулятор C++
Калькулятор C++
C++ Калькулятор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Techno
Вирусоборец
 Аватар для 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
 Аватар для 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
Вирусоборец
 Аватар для Techno
317 / 119 / 2
Регистрация: 15.07.2011
Сообщений: 293
17.08.2011, 19:25     калькулятор #4
Цитата Сообщение от Ferk Посмотреть сообщение
а тоесть я просто не там обьявил переменную?))
Именно так)))
Danvern
 Аватар для 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
 Аватар для 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
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.08.2011, 20:26     калькулятор #8
Цитата Сообщение от Ferk Посмотреть сообщение
пишишь например 223+211 и програма должна понять где в строке переменные и какое действие с ними делать..
Зря =)
Не твой уровень, аналогичная задача на acmp 56% стоит, а ты 4% задачи с трудом еще решаешь...
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,778
Записей в блоге: 17
17.08.2011, 20:46     калькулятор #9
Давно задумывался над решением подобной задачи, а разве нет какого-то более легкого,рационального решения, например с использованием библиотеки ?
Ferk
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 20:55  [ТС]     калькулятор #10
Цитата Сообщение от diagon Посмотреть сообщение
Зря =)
Не твой уровень, аналогичная задача на acmp 56% стоит, а ты 4% задачи с трудом еще решаешь...
Та задача не совсем анолагичная.. она на много сложнее.. там выражения.. ..

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

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

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

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

Цитата Сообщение от Ferk Посмотреть сообщение
и почиму это я 4% с трудом решаю?))
Пардон, перепутал с кем-то... Но судя по твоим темам тяжело тебе эта тема дастся =\ Впрочем, без учета переменных, скобок, функций и приоритетов операторов это действительно не так сложно.
Ferk
 Аватар для 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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
17.08.2011, 21:02     калькулятор #14
Цитата Сообщение от Ferk Посмотреть сообщение
я у ся в дев с++ не могу чет найти)))))
у меня оно автоматически стоит это форматирование кода
dr.curse
 Аватар для 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
 Аватар для diagon
1921 / 1187 / 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
 Аватар для Ferk
3 / 3 / 1
Регистрация: 28.07.2011
Сообщений: 105
17.08.2011, 21:07  [ТС]     калькулятор #17
вот ети как то сложновато пока для мя)))))
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.08.2011, 21:10     калькулятор #18
это будет сложно для ТС, он только на чал учить С++
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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++
калькулятор C++
C++ Калькулятор в С++
C++ Калькулятор на C++

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

Или воспользуйтесь поиском по форуму:
Ferk
 Аватар для 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     калькулятор
Ответ Создать тему
Опции темы

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