Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Алина_К
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 5
1

Как реализовать сложение и вычитание

27.12.2012, 00:23. Просмотров 797. Ответов 4
Метки нет (Все метки)

Скажу сразу изъясняться по человечески я не умею... В общем!
у нас есть веб-служба в которой у нас калькулятор, к которой мы обращаемся при помощи прокси сборки как к объекту.
я создала веб-службу с методом

C#
1
2
3
4
5
6
7
8
[WebMethod]
        public float Calculate(String expression)
        {
            Parser parser = new Parser();
                    parser.setVariable("Pi",3.14159265);
                    parser.setVariable("e", 2.71828183);
            return (float)parser.Parse(expression);
        }
и класс Parser собственно в котором находится калькулятор... текст для которого взят из интернета и не очень мне понятен...

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.Specialized;
 
namespace Web_Service_Test
{
    class Result
{
 
    public double acc; 
    public String rest;
private   long p; 
 
    public Result(double v, String r) {
        this.acc = v;
        this.rest = r;
    }
 
public    Result(long p)
    {
        // TODO: Complete member initialization
this.p = p;
    }
}
public class Parser {
    private Dictionary<String, Double> variables;
 
    public Parser() {
        variables = new Dictionary<String, Double>();
    }
 
    public void setVariable(String variableName, Double variableValue) {
        variables.Add(variableName, variableValue);
 
    }
 
    public Double getVariable(String variableName) {
        if (!variables.ContainsKey(variableName)) {
 
            return 0.0;
        }
        return variables[variableName];
    }
 
    public double Parse(String s) {
        Result result = PlusMinus(s);
        if (result.rest.Length != 0) {
 
        }
        return result.acc;
    }
 
    private Result PlusMinus(String s){
        Result current = MulDiv(s);
        double acc = current.acc;
 
        while (current.rest.Length > 0) {
            if (!(current.rest.ElementAt(0) == '+' || current.rest.ElementAt(0) == '-'))
                break;
 
            char sign = current.rest.ElementAt(0);
            String next = current.rest.Substring(1);
 
            current = MulDiv(next);
            if (sign == '+') {
                acc += current.acc;
            } else {
                acc -= current.acc;
            }
        }
        return new Result(acc, current.rest);
    }
 
    private Result Bracket(String s){
        char zeroChar = s.ElementAt(0);
        if (zeroChar == '(') {
            Result r = PlusMinus(s.Substring(1));
            if (r.rest.Length != 0 && r.rest.ElementAt(0) == ')')
            {
                r.rest = r.rest.Substring(1);
            } else {
            }
            return r;
        }
        return FunctionVariable(s);
    }
 
    private Result Power(String s) {
        Result current = Bracket(s);
 
        double acc = current.acc;
 
        while (true) {
            if (current.rest.Length == 0) {
                return current;
            }
            char sign = current.rest.ElementAt(0);
            if (sign != '^')
                return current;
 
            String next = current.rest.Substring(1);
            Result right = Bracket(next);
            if (sign == '^') {
                acc = Math.Pow(acc, right.acc);
            }
            current = new Result(acc, right.rest);
        }
 
    }
 
    private Result FunctionVariable(String s) {
        String f = "";
        int i = 0;
        while (i < s.Length
                && (Char.IsLetter(s.ElementAt(i)) || (Char.IsDigit(s
                        .ElementAt(i)) && i > 0)))
        {
                            f += s.ElementAt(i);
            i++;
        }
        if (f.Length != 0) {
            if (s.Length > i && s.ElementAt(i) == '(')
            {
                Result r = Bracket(s.Substring(f.Length));
                return processFunction(f, r);
            } else {
                return new Result(getVariable(f), s.Substring(f.Length));
            }
        }
        return Num(s);
    }
 
    private Result MulDiv(String s)  {
        Result current = Power(s);
 
        double acc = current.acc;
        while (true) {
            if (current.rest.Length == 0) {
                return current;
            }
            char sign = current.rest.ElementAt(0);
            if (sign != '*' && sign != '/' && sign != '%')
                return current;
 
            String next = current.rest.Substring(1);
            Result right = Power(next);
 
            if (sign == '*') {
                acc *= right.acc;
            } else if (sign == '%') {
                acc = acc % right.acc;
            } else {
                acc /= right.acc;
            }
 
            current = new Result(acc, right.rest);
        }
    }
 
    private Result Num(String s){
        int i = 0;
        int dot_cnt = 0;
        bool negative = false;
        if (s.ElementAt(0) == '-') {
            negative = true;
            s = s.Substring(1);
        }
 
        while (i < s.Length
                && (Char.IsDigit(s.ElementAt(i)) || s.ElementAt(i) == '.')) {
            if (s.ElementAt(i) == '.' && ++dot_cnt > 1) {
                throw new Exception("not valid number '"
                        + s.Substring(0, i + 1) + "'");
            }
            i++;
        }
        if (i == 0) {
            throw new Exception("can't get valid number in '" + s + "'");
        }
 
        double dPart = Double.Parse(s.Substring(0, i));
        if (negative)
            dPart = -dPart;
        String restPart = s.Substring(i);
 
        return new Result(dPart, restPart);
    }
 
    private Result processFunction(String func, Result r) {
        if (func=="sin") {
            return new Result(Math.Sin((r.acc)), r.rest);
        } else if (func==("cos")) {
            return new Result((double) Math.Round(Math.Cos((r.acc)) * 1000000000) / 1000000000, r.rest);
        } else if (func==("tg")) {
            return new Result((double) (Math.Round(Math.Sin((r.acc)) * 1000000000) / 1000000000)
                    / Math.Round(Math.Cos(r.acc) * 1000000000)
                    / 1000000000, r.rest);
 
        } else if (func==("ctg")) {
            return new Result((double) Math.Round(1 / Math.Tan(r.acc) * 1000000000) / 1000000000, r.rest);
        } else if (func==("ln")) {
            return new Result(Math.Log(r.acc), r.rest);
        } else if (func==("sqrt")) {
            return new Result(Math.Sqrt(r.acc), r.rest);
        } else if (func==("sqr")) {
            return new Result(Math.Pow(r.acc, 2), r.rest);
        } else if (func==("asin")) {
            return new Result((Math.Asin(r.acc)), r.rest);
        } else if (func==("acos")) {
            return new Result((Math.Acos(r.acc)), r.rest);
        } else if (func==("atg")) {
            return new Result((Math.Atan(r.acc)), r.rest);
        } else if (func==("actg")) {
            return new Result((Math.Atan(1 / r.acc)), r.rest);
        } else if (func==("lg")) {
            return new Result(Math.Log10(r.acc), r.rest);
        } else if (func==("sh")) {
            return new Result(Math.Sinh(r.acc), r.rest);
        } else if (func==("ch")) {
            return new Result(Math.Cosh(r.acc), r.rest);
        } else if (func==("th")) {
            return new Result(Math.Tanh(r.acc), r.rest);
        } else if (func==("cth")) {
            return new Result(1 / Math.Tanh(r.acc), r.rest);
        } else if (func==("Arsh")) {
            return new Result(Math.Log(r.acc
                    + Math.Sqrt(Math.Pow(r.acc, 2) + 1)), r.rest);
        } else if (func==("Arch")) {
            if (r.acc >= 1)
                return new Result(Math.Log(r.acc
                        + Math.Sqrt(Math.Pow(r.acc, 2) - 1)), r.rest);
        } else if (func==("Arth")) {
            return new Result(0.5 * Math.Log((1 + r.acc) / (1 - r.acc)), r.rest);
        } else if (func==("Arcth")) {
            return new Result(0.5 * Math.Log((r.acc + 1) / (r.acc - 1)), r.rest);
        } else if (func==("fct")) {
            return new Result(long.Parse(Math.Round(r.acc).ToString()), r.rest);
 
        } 
        return r;
    }
 
    public static long factorial(long l) {
        long ret = 1;
        for (int i = 1; i <= l; ++i)
            ret *= i;
        return ret;
    }
 
}}

мне нужно что б он выполнял просто сложение, вычитание, деление, умножение - помогите с кодом!!!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2012, 00:23
Ответы с готовыми решениями:

Вычитание списков, как ускорить код
Есть два списка: GarList и KonList. В каждом списке хранятся объекты...

Унарное вычитание: как соответствовать принципам платформы
Здравствуйте. Возможно, вопрос покажется глупым, но передо мной встал выбор....

Как написать bruteforce? Всмысле как реализовать алгоритм (внутри)
Как сделать перебор чисел просто: просто прибавлять единичку) А как реализовать...

Структура. Вычитание
Задача, в общем, такая: Описать структуру с именем Worker? содержащую...

Как реализовать хранение длинных чисел, их сложение и вычитание?
Бесконечно длинных чисел.

4
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
27.12.2012, 11:23 2
Алина, а что, собственно, не работает? Опишите, какое значение имеет expression на входе. И если возникает исключение, то какое и где.
0
Алина_К
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 5
30.12.2012, 02:24  [ТС] 3
Все работает. Мне просто нужно что бы тут был не калькулятор со всякими действиями, а например чтобы выполнялось просто сложение и все...
0
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
30.12.2012, 23:11 4
Тогда почему бы не выбросить парсер и не написать простой метод
C#
1
2
3
4
5
[WebMethod]
        public float Sum(float a, float b)
        {
            return a + b;
        }
Есть какой-то смысл в использовании кода, который лишний и непонятный?

В текущей реализации, если уж она Вам важна, передайте в качестве параметра строку вида "2 + 2". Сам не проверял, но думаю, что метод должен вернуть 4.0 . Методы setVariable(), видимо, не обязательны и в Вашем случае тоже могут быть удалены (если только Вы не собираетесь искать значение выражения вроде "Pi - 3").
0
Алина_К
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 5
02.01.2013, 21:36  [ТС] 5
Ну я так с помощью веб метода и делала, только с ним почему-то прокси-сборка моя не работает. Вопрос я этот уже решила. Спасибо
0
02.01.2013, 21:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 21:36

Нужны советы как реализовать сложение, вычитание, умножение полиномов/многочленов и деление на число
Всем здравствуйте! надеюсь написать с вашей помощью программку для сложения,...

Реализовать сложение, вычитание, умножение многочленов
.model small .stack 256 .386 .data mes1 db 0Dh, 0Ah, 'Enter the degree: $'...

Рекурсия. Сложение и вычитание через сложение/вычитание единицы
Помогите пожалуйста народ!! Задача: Сложение и вычитание через...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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