Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 3

Вывести на экран результат заданного выражения

06.08.2012, 16:39. Показов 6650. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Встретил такую задачу
Создайте новое консольное приложение и попробуйте
написать программу, реализующую следующий алгоритм:

Пользователь вводит строку, в которой содержится арифметическое
выражение, содержащее целые числа и операции +, -, *, /. Наподобие
такого:

5 + 55 – 12 * 6 / 2 + 33 - 21

Задача – вывести на экран результат данного выражения.

Для этого Вам потребуется разобрать введенную строку на
составляющие – числа и операции. Затем определить
последовательность выполнения операций и вычислить выражение.

Как это можно реализовать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2012, 16:39
Ответы с готовыми решениями:

Объяснить результат и вывести на экран результат логического выражения
Объяснить результат и вывести на экран результат логического выражения T = S для заданных значений логических переменных a, b, c. ...

Предикат y(N), выводящий на экран результат выражения для заданного N
Предикат y(N), выводящий на экран результат выражения для заданного N \sum_{i=1}^{N}\sum_{j=2}^{N}ln i/ln j Вот код. В чем ошибка?...

Для выражения опишите на языке Prolog предикат y(N), выводящий на экран результат выражения для заданного N
Для выражения, см. на скрине , опишите на языке Prolog предикат y(N), выводящий на экран результат выражения для заданного N. N — целое...

12
 Аватар для buntar
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
06.08.2012, 16:43
Ищите информацию по Обратной Польской последовательности - на форуме есть, это то что вам надо.
1
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
06.08.2012, 17:03
Без скобок?
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 3
06.08.2012, 17:04  [ТС]
SandWraith, да без скобок, но * и / должны выполняться первыми.
0
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
06.08.2012, 18:09
Лови примитивную реализацию (нет проверок на некоректность введенного выражения):

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
 
namespace ConsoleApplication3
{
    
        class Program
        {
            struct Token
            {
                public char operation;
                public double argument;
                public override string ToString()
                {
                    return operation + argument.ToString();
                }
            }
 
            static double Calculate(double a, double b, char o)
            {
                switch (o)
                {
                    case '/':
                        return a / b;
                    case '*':
                        return a * b;
                    case '+':
                        return a + b;
                    case '-':
                        return a - b;
                    default: throw new ArgumentException();
                }
            }
 
            public static void Main()
            {
                while (true)
                {
                    Console.Write("Enter the expression:");
                    var expression = Console.ReadLine();
 
                    if (string.IsNullOrEmpty(expression)) break;
 
                    expression = "+" + expression;
 
                    // Парсинг строки
 
                    var list = new List<Token>();
                    while (!string.IsNullOrEmpty(expression))
                    {
                        var operator_index = expression.LastIndexOfAny(new[] { '/', '*', '+', '-' });
                        var argument = expression.Substring(operator_index + 1);
 
                        list.Add(new Token()
                        {
                            argument = int.Parse(argument),
                            operation = expression[operator_index],
                        });
 
                        expression = expression.Remove(operator_index);
                    }
 
                    list.Reverse();
 
                    // Вычисление
                    var search_for_priority = true;
                    while (list.Count > 1)
                    {
                        // Печать текущего выражения
                        Console.WriteLine(string.Join("", list.Select(i => i.operation + i.argument.ToString())));
 
                        // Ищем индекс перевого выражения с приоритетным оператором / или *
                        int processing_item_index;
 
                        if (search_for_priority)
                            processing_item_index = list.FindIndex(i => (i.operation == '/') || (i.operation == '*'));
                        else
                        {
                            search_for_priority = false;
                            processing_item_index = -1;
                        }
 
                        if (processing_item_index == -1)
                            processing_item_index = list.Count - 1;
 
                        // Обрабатываем
                        var previous_item = list[processing_item_index - 1];
                        var processing_item = list[processing_item_index];
                        previous_item.argument = Calculate(previous_item.argument, processing_item.argument, processing_item.operation);
 
                        list.RemoveAt(processing_item_index);
                        list.RemoveAt(processing_item_index - 1);
 
                        list.Insert(processing_item_index
                            - 1, previous_item);
                    }
 
                    var result = list[0].argument;
 
                    Console.WriteLine("Result: {0}", result);
                }
 
 
                
            }
 
            
        }
        
 
    
}
У кого есть мысли по улучшению кода (кроме проверок) - советуйте.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.08.2012, 18:30
сплиттим исходную строку через "-"
все подстроки кроме первой запоминаем в "контейнере отрицательных". первую, если не пустая - в "контейнере положительных".
все элементы -контейнера: сплиттим через "+". если получаем больше одной подстроки - заменяем обрабатываемую первой, остальные добавляем к +контейнеру
затем по аналогичному принципу обрабатываем отдельно +элементы (на */), и суммируем, отдельно -элементы, и вычитаем.
1
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
06.08.2012, 18:34
Цитата Сообщение от novi4ok Посмотреть сообщение
сплиттим исходную строку через "-"...
imho, слишком сложно, тем более, что тебе на последнем шаге,например, выражение: 10*5/10*5 как ты его будешь "сплитить на / и *"?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.08.2012, 18:42
Цитата Сообщение от SandWraith Посмотреть сообщение
imho, слишком сложно, тем более, что тебе на последнем шаге,например, выражение: 10*5/10*5 как ты его будешь "сплитить на / и *"?
заведу *контейнер и /контейнер, набью сомножетелями-делителями и перемножу-поделю.
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 3
06.08.2012, 18:46  [ТС]
SandWraith, Спасибо!
0
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
06.08.2012, 22:01
http://lkml.org/lkml/2000/8/25/132
0
27 / 27 / 8
Регистрация: 25.07.2012
Сообщений: 48
07.08.2012, 11:37
можно еще как-то так
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace kalc
{
 
 
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder s;
            s = new StringBuilder(Console.ReadLine());
            Console.WriteLine(Pars(s));
            Console.ReadKey();
        }
 
        public static int Pars(StringBuilder st)
        {
            int result = 0;
            bool flag = true;
            int i = 0;
            int j = 0;
            StringBuilder curr = new StringBuilder();
            char[] symb = new char[st.Length];
            int[] enumer = new int[st.Length];
            int[] sign = new int[st.Length];
            st.CopyTo(0, symb, 0, st.Length);
            foreach (char c in symb)
                if (c == '*')
                {
                    sign[i] = 1;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
 
                }
                else if (c == '/')
                {
                    sign[i] = 2;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
                }
                else if (c == '+')
                {
                    sign[i] = 3;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
                }
                else if (c == '-')
                {
                    sign[i] = 4;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
                }
                else
                {
                    curr.Append(c);
                }
            try
            {
                enumer[j] = Convert.ToInt16(curr.ToString());
                curr.Clear();
                j++;
            }
            catch
            {
                Console.WriteLine("Your string invalid!");
                return 0;
            }
            int[] newEnumer = new int[j];
            int[] newSign = new int[i];
            int count = i;
            int k = 0;
            int kSign = 0;
            int kenum = 0;
            for (i = 0; i < count; i++)
            {
                if ((sign[i] == 1) && flag)
                {
                    newEnumer[k] = enumer[kenum] * enumer[kenum + 1];
                    kenum += 2;
                    k++;
                    flag = false;
 
                }
                else if (sign[i] == 1)
                {
                    newEnumer[k - 1] = newEnumer[k - 1] * enumer[kenum];
                    kenum++;
                }
                else if ((sign[i] == 2) && flag)
                {
                    newEnumer[k] = enumer[kenum] / enumer[kenum + 1];
                    kenum += 2;
                    k++;
                    flag = false;
                }
                else if (sign[i] == 2)
                {
                    newEnumer[k - 1] = newEnumer[k - 1] / enumer[kenum];
                    kenum++;
                }
                else
                {
                    flag = true;
                    newSign[kSign] =sign[i];
                    newEnumer[k] = enumer[kenum];
                    kSign++;
                    kenum++;
                    k++;
                }
            }
 
            for (i = 0; i < kSign; i++)
            {
                if (newSign[i] == 3)
                    result = newEnumer[i] + newEnumer[++i];
                else
                    result = newEnumer[i] - newEnumer[++i];
            }
            return result;
        }
    }
}
Добавлено через 50 минут

вот здесь исправленный код)

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace kalc
{
 
 
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder s;
            s = new StringBuilder(Console.ReadLine());
            Console.WriteLine(Pars(s));
            Console.ReadKey();
        }
 
        public static int Pars(StringBuilder st)
        {
            int result = 0;
            bool flag = true;
            bool first = true;
            int i = 0;
            int j = 0;
            StringBuilder curr = new StringBuilder();
            char[] symb = new char[st.Length];
            int[] enumer = new int[st.Length];
            int[] sign = new int[st.Length];
            st.CopyTo(0, symb, 0, st.Length);
            foreach (char c in symb)
                if (c == '*')
                {
                    sign[i] = 1;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
 
                }
                else if (c == '/')
                {
                    sign[i] = 2;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
                }
                else if (c == '+')
                {
                    sign[i] = 3;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
                }
                else if (c == '-')
                {
                    sign[i] = 4;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
                }
                else
                {
                    curr.Append(c);
                }
            try
            {
                enumer[j] = Convert.ToInt16(curr.ToString());
                curr.Clear();
                j++;
            }
            catch
            {
                Console.WriteLine("Your string invalid!");
                return 0;
            }
            int[] newEnumer = new int[j];
            int[] newSign = new int[i];
            int count = i;
            int k = 0;
            int kSign = 0;
            int kenum = 0;
            for (i = 0; i < count; i++)
            {
                if ((sign[i] == 1) && flag)
                {
                    newEnumer[k] = enumer[kenum] * enumer[kenum + 1];
                    kenum += 2;
                    k++;
                    flag = false;
                    first = false;
 
                }
                else if (sign[i] == 1)
                {
                    newEnumer[k - 1] = newEnumer[k - 1] * enumer[kenum];
                    kenum++;
                    first = false;
                }
                else if ((sign[i] == 2) && flag)
                {
                    newEnumer[k] = enumer[kenum] / enumer[kenum + 1];
                    kenum += 2;
                    k++;
                    flag = false;
                    first = false;
                }
                else if (sign[i] == 2)
                {
                    newEnumer[k - 1] = newEnumer[k - 1] / enumer[kenum];
                    kenum++;
                    first = false;
                }
                else
                {
 
                    if (first)
                    {
                        flag = true;
                        newSign[kSign] = sign[i];
                        newEnumer[k] = enumer[kenum];
                        kSign++;
                        kenum++;
                        k++;
                    }
                    else
                    {
                        flag = true;
                        newSign[kSign] = sign[i];
                        newEnumer[k] = enumer[kenum];
                        kSign++;
                        first = true;
                        
                    }
 
                   
                    
                   
                }
            }
            first = true;
            for (i = 0, j=0; i < kSign; i++, j++)
            {
 
                if ((newSign[i] == 3)&&first)
                
                {
                    result += newEnumer[j] + newEnumer[j+1];
                    first=false;
                }
                else if((newSign[i] == 4)&&first)
                result = newEnumer[j] - newEnumer[j+1];
 
                else if ((newSign[i] == 3) && !first)
                {
                    result += newEnumer[j + 1];
                }
                else if ((newSign[i] == 4) && !first)
                {
                    result -= newEnumer[j + 1];
                }
            }
            return result;
        }
    }
}
Добавлено через 1 минуту
1
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
07.08.2012, 11:45
Сходу замечание - постоянная копипаста фграгементов вида:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 sign[i] = 4;
                    i++;
                    try
                    {
                        enumer[j] = Convert.ToInt16(curr.ToString());
                        curr.Clear();
                        j++;
                    }
                    catch
                    {
                        Console.WriteLine("Your string invalid!");
                        return 0;
                    }
1
27 / 27 / 8
Регистрация: 25.07.2012
Сообщений: 48
07.08.2012, 11:57
да и там где
for (i = 0; i < count; i++)
......
......

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
else
                {
 
                    if (first)
                    {
                        flag = true;
                        newSign[kSign] = sign[i];
                        newEnumer[k] = enumer[kenum];
                        kSign++;
                        kenum++;
                        k++;
                    }
                    else
                    {
                        flag = true;
                        newSign[kSign] = sign[i];
                        newEnumer[k] = enumer[kenum];
                        kSign++;
                        first = true;
                        
                    }
                    if (i + 1 == count)
                    {
                        newEnumer[k] = enumer[kenum];
                    }
 
                   
                    
                   
                }
.....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2012, 11:57
Помогаю со студенческими работами здесь

Найти значение выражения. Не получается вывести результат на экран
Добрый вечер! Помогите найти ошибку. Ассемблер изучаю всего несколько дней. Необходимо вычислить значение выражения...

Вывести результат вычисления выражения, записанного в текстовом файле, на экран
Создать приложение через которую можно открыть текстовой файл. в котором будет написано 7+3 и программа должна показать результат на экране.

Вычислить значение выражения f(x) для значения x, вводимого с клавиатуры. Вывести результат на экран
Помогите решить 3 задание пожалуйста заранее спс. и посоветуйте какую нить литературу для изучения паскаля абс а то совсем туго у меня с...

Удалить из исходной строки повторные вхождения заданного символа. Как вывести результат на экран?
Есть задание: Написать программу, удаляющую из исходной строки повторные вхождения заданного символа. Сделал решение: data segment ...

Дана строка символов, представляющих собой арифметическое выраже0ие. Вывести на экран результат данного выражения
Дана строка символов, представляющих собой арифметическое выраже0ие. Вывести на экран результат данного выражения. Так и не нашёл...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru