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

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

Войти
Регистрация
Восстановить пароль
 
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
#1

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

12.12.2010, 20:28. Просмотров 364. Ответов 2
Метки нет (Все метки)

Есть простая програмка, решающая логические уравнения. Все решает замечательно, но при вводе короткого уравнения 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++
Для книг, хранящихся в библиотеке, задаются: регистрационный номер книги, автор, название, год издания, издательство, количество страниц....

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

Непонятно условие - C++
Здравствуйте, уважаемые форумчане! По заданию написано: &quot;инкапсулировать поля класса в независимой структуре и в ней реализовать методы...

Домашка по C++,непонятно! - C++
Ребята Салют,из-за работы всё проворонил и не знаю как обращятся этим C++ а задали мне на вопросы ответить если отвечю оценка будет а дали...

почему DBL_MIN=0? непонятно - C++
хочу получить min значение типа double, но мне он почему-то выдает 0, хотя DBL_MAX работает хорошо. вот код #include&lt;float.h&gt; ...

выдает ошибку...непонятно - C++
вроде все правильно сделал вот условие задачи: Дано целое число N (&gt; 1), а также первый член A и разность D арифметической прогрессии....

непонятно что не правильно - C++
#include &lt;conio.h&gt; #include &lt;math.h&gt; ...

Непонятно выполняется оператор if - C++
Собственно вопрос очень глупый, наткнулся на такой код в теме: int main() { setlocale(LC_ALL, &quot;Russian&quot;); int n; ...

Объявление функции (непонятно) - C++
Не могу понять, чем отличаются объявления функции в 1 и 2 вариантах? Смысл писать в 1 ванианте отдельно прототип функции(первую строчку:...

STL find_end (непонятно Оо) - C++
чтото сильно ругается... что не так? :ireful: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 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
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
12.12.2010, 23:43  [ТС]     Непонятно #3
точно..) мне кажется достаточно даже поменять их местами. однако, помнится вчера многочисленными попытках заносил в переменные нули, примари должна была вызываться..
Yandex
Объявления
12.12.2010, 23:43     Непонятно
Ответ Создать тему
Опции темы

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