通过C/C++,实现一元一次方程求解

通过C/C++,实现一元一次方程求解:

  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 string str, str_l, str_r;
  5 
  6 struct node
  7 {
  8     // a表示x前面的系数,b表示常数系数
  9     double a, b;
 10 };
 11 
 12 // 判断优先级的大小
 13 int priority(char c)
 14 {
 15     if (c == '*' || c == '/')
 16         return 2;
 17     if (c == '+' || c == '-')
 18         return 1;
 19     return 0;
 20 }
 21 
 22 void calc(stack <char> &op, stack <node> &num)
 23 {
 24     node bb = num.top();
 25     num.pop();
 26     node aa = num.top();
 27     num.pop();
 28     node temp_node;
 29 
 30     switch (op.top())
 31     {
 32     case '+':
 33         temp_node.a = aa.a + bb.a;
 34         temp_node.b = aa.b + bb.b;
 35         num.push(temp_node);
 36         break;
 37     case '-':
 38         temp_node.a = aa.a - bb.a;
 39         temp_node.b = aa.b - bb.b;
 40         num.push(temp_node);
 41         break;
 42     case '*':
 43         // 处理一元一次方程,不考虑二次项
 44         temp_node.a = aa.a * bb.b + aa.b * bb.a;
 45         temp_node.b = aa.b * bb.b;
 46         num.push(temp_node);
 47         break;
 48     case '/':
 49         temp_node.a = aa.a / bb.b;
 50         temp_node.b = aa.b / bb.b;
 51         num.push(temp_node);
 52         break;
 53     }
 54     op.pop();
 55 }
 56 
 57 int main()
 58 {
 59     while (1)
 60     {
 61         cin >>str;
 62 
 63         // 得到str_l, str_r
 64         for (int i = 0; i < str.size(); ++ i)
 65         {
 66             if (str[i] == '=')
 67             {
 68                 str_l = str.substr(0, i);
 69                 str_r = str.substr(i + 1, str.size());
 70             }
 71         }
 72 
 73         // 定义符号栈、数字栈
 74         stack <node> num_l;
 75         stack <node> num_r;
 76         stack <char> op_l;
 77         stack <char> op_r;
 78         // 定义左右两边串的长度
 79         int len_l = str_l.size();
 80         int len_r = str_r.size();
 81 
 82         // 遍历左边的字符串
 83         for (int i = 0; i < len_l; ++ i)
 84         {
 85             if (isdigit(str_l[i]))
 86             {
 87                 node temp_node;
 88                 double temp = atof(&str_l[i]);
 89                 while (isdigit(str_l[i]) || str_l[i] == '.')
 90                     ++ i;
 91                 if (str_l[i] == 'x')
 92                 {
 93                     temp_node.a = temp;
 94                     temp_node.b = 0;
 95                     num_l.push(temp_node);
 96                 }
 97                 else
 98                 {
 99                     temp_node.a = 0;
100                     temp_node.b = temp;
101                     num_l.push(temp_node);
102                     -- i;
103                 }
104             }
105             else if (str_l[i] == 'x')
106             {
107                 node temp_node;
108                 temp_node.a = 1;
109                 temp_node.b = 0;
110                 num_l.push(temp_node);
111             }
112             else if (str_l[i] == '(')
113             {
114                 op_l.push(str_l[i]);
115             }
116             else if (str_l[i] == ')')
117             {
118                 while (op_l.top() != '(')
119                     calc(op_l, num_l);
120                 op_l.pop();
121             }
122             else if (op_l.empty())
123             {
124                 op_l.push(str_l[i]);
125             }
126             else if (priority(op_l.top()) < priority(str_l[i]))
127             {
128                 op_l.push(str_l[i]);
129             }
130             else if (priority(op_l.top()) >= priority(str_l[i]))
131             {
132                 while (!op_l.empty() && priority(op_l.top()) >= priority(str_l[i]))
133                     calc(op_l, num_l);
134                 op_l.push(str_l[i]);
135             }
136         }
137 
138         // 遍历右边的字符串
139         for (int i = 0; i < len_r; ++ i)
140         {
141             if (isdigit(str_r[i]))
142             {
143                 node temp_node;
144                 double temp = atof(&str_r[i]);
145                 while (isdigit(str_r[i]) || str_r[i] == '.')
146                     ++ i;
147                 if (str_r[i] == 'x')
148                 {
149                     temp_node.a = temp;
150                     temp_node.b = 0;
151                     num_r.push(temp_node);
152                 }
153                 else
154                 {
155                     temp_node.a = 0;
156                     temp_node.b = temp;
157                     num_r.push(temp_node);
158                     -- i;
159                 }
160             }
161             else if (str_r[i] == 'x')
162             {
163                 node temp_node;
164                 temp_node.a = 1;
165                 temp_node.b = 0;
166                 num_r.push(temp_node);
167             }
168             else if (str_r[i] == '(')
169             {
170                 op_r.push(str_r[i]);
171             }
172             else if (str_r[i] == ')')
173             {
174                 while (op_r.top() != '(')
175                     calc(op_r, num_r);
176                 op_r.pop();
177             }
178             else if (op_r.empty())
179             {
180                 op_r.push(str_r[i]);
181             }
182             else if (priority(op_r.top()) < priority(str_r[i]))
183             {
184                 op_r.push(str_r[i]);
185             }
186             else if (priority(op_r.top()) >= priority(str_r[i]))
187             {
188                 while (!op_r.empty() && priority(op_r.top()) >= priority(str_r[i]))
189                     calc(op_r, num_r);
190                 op_r.push(str_r[i]);
191             }
192         }
193 
194 
195         while (!op_l.empty())
196             calc(op_l, num_l);
197         while (!op_r.empty())
198             calc(op_r, num_r);
199 
200         double x1 = num_l.top().a, y1 = num_l.top().b;
201         double x2 = num_r.top().a, y2 = num_r.top().b;
202 
203         // cout <<x1 <<" " <<y1 <<" " <<x2 <<" " <<y2 <<endl;
204         printf("%.2lf\n", (y2 - y1) / (x1 - x2));
205     }
206 
207 
208     return 0;
209 }

 

posted @ 2019-03-18 21:04  GetcharZp  阅读(5152)  评论(0编辑  收藏  举报