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

Непонятно - C++

Восстановить пароль Регистрация
 
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
12.12.2010, 20:28     Непонятно #1
Есть простая програмка, решающая логические уравнения. Все решает замечательно, но при вводе короткого уравнения a|b по непонятной причине ждет продолжения ввода, при вводе аналогичного уравнения с другим оператором a&b все проходит замечательно - получаем ответ.

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
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
struct token
{
  char variable;
  bool value;
};
 
bool calc(vector<token>& var);
 
void error(string err_msg)
{
  cout << "Error: " << err_msg << endl;
}
 
int set_var(vector<token>& var)
{
  char ch=' ';
  while (true)
    {
      cin >> ch;
      if (ch==';') break;
      for (int i=0;i<var.size();i++) 
    if(var[i].variable==ch) 
      {
        error("This variable is already in use!"); 
        return var.size();
      }
      if((int(ch)>=65 && int(ch)<=90)||(int(ch)>=97 && int(ch)<=122)) 
    {
      char tmp=' ';
      bool val=false;
      cin >> tmp;
      if (tmp!='=') {error("'=' require!");break;}
      cin >> tmp;
      if(tmp!='0' && tmp!='1') 
        {
          error("Unknown value! Use 0 and 1!");
          break;
        }
      val=int(tmp)-48;//48-код нуля, 49 единицы
      token tok;
      tok.variable=ch;
      tok.value=val;
      var.push_back(tok);
    }
      else {error("Bad syntax!");break;}
    }
  return var.size();
}
 
bool primary(vector<token>& var)
{
  char ch;
  cin >> ch;
  switch(ch)
    {
    case '(': 
      {
    double tmp_val; 
    tmp_val=calc(var); 
    char tmp_ch; 
    if (tmp_ch!=')') 
      error("Missing ')'!");
    return tmp_val;
      }
    case '!': 
      {
    double tmp_val; 
    tmp_val=primary(var); 
    if(tmp_val) 
      tmp_val=false;
    else 
      tmp_val=true;
    return tmp_val;
      }
    default : 
      if((int(ch)>=65 && int(ch)<=90)||(int(ch)>=97 && int(ch)<=122))
    {
      for(int i=0;i<var.size();i++) 
        if(var[i].variable==ch) 
          return var[i].value;
    }
      error("primary(): Unknown variable!");
      
    }
}
 
bool calc(vector<token>& var)
{
  bool val1=primary(var);
  while(true)
    {
      char op;
      error("Zhdem op");
      cin >> op;
      switch(op)
    {
    case '&': 
      if(val1==true && primary(var)==true) val1=true; 
      else val1=false;
      error("v & ");
      break;
    case '|': 
      if(val1==true || primary(var)==true) val1=true; 
      else val1=false;
      error("v | ");
      break;
    default : 
      //error("calc(): Unknown operator!");
      cin.putback(op);
      error("v default ");
      return val1;
    }
    }
}
 
int main()
{
  cout << "Vvedite peremennie i ih znacheniia (naprimer a=0 b=1 c=0;)\n";
  vector<token> var;
  cout << set_var(var) << " peremennih zadano\n";
  //for (int i=0;i<var.size();i++) cout << var[i].variable << " = " << var[i].value << endl;
  char ch;
  cout << "Vvedite uravnenie\n";
  cout << "OTBET: " << calc(var) << endl;
}
Самое интересное, что если поменять условие в
C++
1
2
3
4
5
    case '|': 
      if(val1==true || primary(var)==true) val1=true; 
      else val1=false;
      error("v | ");
      break;
на
C++
1
2
3
4
5
    case '|': 
      if(val1==true && primary(var)==true) val1=true; 
      else val1=false;
      error("v | ");
      break;
все идет как должно быть и вода от меня не ожидается

Добавлено через 9 часов 58 минут
может кто объяснить такое поведение?

Добавлено через 7 часов 59 минут
помогите разобраться
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2010, 20:28     Непонятно
Посмотрите здесь:

C++ typedef непонятно чего
непонятно что не правильно C++
Непонятно условие C++
Домашка по C++,непонятно! C++
почему DBL_MIN=0? непонятно C++
C++ wxDev-C++ непонятно
Непонятно решение задачи C++
C++ непонятно со строкой

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
12.12.2010, 20:43     Непонятно #2
Наверное, это в случае, когда val1==true - тогда результат выражения primary(var)==true уже не вычисляется, то есть функция primary не вызывается. А чтение из потока находится в ней. Сделай типа
C++
1
2
bool t1 = ..., t2 = ...;
if (t1 || t2) ...
И для & тоже, только там такое будет, если наоборот val1 равно false.
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
12.12.2010, 23:43  [ТС]     Непонятно #3
точно..) мне кажется достаточно даже поменять их местами. однако, помнится вчера многочисленными попытках заносил в переменные нули, примари должна была вызываться..
Yandex
Объявления
12.12.2010, 23:43     Непонятно
Ответ Создать тему
Опции темы

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