Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249

Консоль: объясните работу кода

31.03.2012, 14:34. Показов 858. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот класс, который должен преобразовать истфиксную строку в постфиксную.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace rpn
{
    class Nonation
    {
        string stack;
        string input;
        string buff;
 
        public Nonation()
        {
            input = Console.ReadLine();
        }
        public void AddToStack(char chr)
        {
            stack += Convert.ToString(chr);
        }
 
        public void AddToBuff(char chr)
        {
            buff += Convert.ToString(chr);
        }
 
        public int Priority(char chr)
        {
            if (chr == '-' || chr == '+')
                return 1;
            else
                if (chr == '*' || chr == '/')
                {
                    return 2;
                }
                else return 3; 
        }
 
        public void Calculate()
        {
            foreach (char chr in input)
            {
                if (char.IsDigit(chr))
                {
                    AddToStack(chr);
                }
 
 
                if (!char.IsDigit(chr))
                {
                    AddToStack(' ');
                }
                
                if (chr == '+' || chr == '-' || chr == '*' || chr == '/')
                {
                    if (!(buff == null))
                    {
                        if (Priority(Convert.ToChar(buff)) > Priority(chr))
                        {
                            AddToStack(Convert.ToChar(buff));
                            AddToStack(' ');
                            buff = "";
                            AddToBuff(chr);
 
                        }
                    }
                    else
                        if (buff == null)
                        {
                            AddToBuff(chr);
                        }
                    
                    AddToBuff(chr); 
                } 
 
             
            }
            Console.WriteLine(stack);
            Console.WriteLine(buff);
        }
    }
}
А вот сдесь ошибка. Когда программа пытается сравнить возвращаемые значения.
C#
1
  if (Priority(Convert.ToChar(buff)) > Priority(chr))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2012, 14:34
Ответы с готовыми решениями:

Консоль: объясните работу кода
Пишу консольное приложение, которое строку с истфиксной записи будет превращать в постфиксную, например "1+(2-3)*4" превращать...

Работа с foreach: объясните работу кода
Есть код: private void button11_Click(object sender, EventArgs e) { string str = textbox.Text.Split('\n'); ...

Объясните работу куска кода с IndexOf
Здравствуйте. Объясните, как работает кусок кода. Заранее спасибо. while (cur != -1) { cur =...

8
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.03.2012, 14:41
Цитата Сообщение от van Persie Посмотреть сообщение
C#
1
if (Priority(Convert.ToChar(buff)) > Priority(chr))
Ошибка будет вылетать, если строка buff состоит более чем из одного символа.
Я так понимаю, сравнивать нужно верхний элемент стека и текущий символ. Проще всего это сделать так:
C#
1
if (Priority(buff.Last()) > Priority(chr))
В целом же код вызывает улыбку. Такое ощущение, что человек программированием позавчера начал заниматься.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
31.03.2012, 14:49  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Ошибка будет вылетать, если строка buff состоит более чем из одного символа.
Я так понимаю, сравнивать нужно верхний элемент стека и текущий символ. Проще всего это сделать так:
C#
1
if (Priority(buff.Last()) > Priority(chr))
В целом же код вызывает улыбку. Такое ощущение, что человек программированием позавчера начал заниматься.

Спасибо за ответ. Примерно так и есть Если не трудно покритикуй мой код ещё. Может что-то новое узнаю
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.03.2012, 14:59
Да в целом-то нормуль, ну разве что вместо строк использовать готовый класс Stack или на худой конец StringBuilder, а то у вас при каждом вызове AddToStack и AddToBuff создается новая строка, что будет заметно тормозить код при обработке длинных выражений.

Улыбнуло меня то, как организованы условия. Сразу вспомнился анекдот: программист перед сном ставит рядом с кроватью два стакана: полный - если захочет пить, и пустой - если не захочет.
C#
1
2
if (char.IsDigit(chr)) ...
if (!char.IsDigit(chr))...
вместо
C#
1
2
if (char.IsDigit(chr)) ...
else ...
То же самое и тут:
C#
1
2
if (!(buff == null))
else if (buff == null)
вместо
C#
1
2
if (buff != null) ...
else ...
или поменять блоки местами для лучшей читабельности:
C#
1
2
if (buff == null) ...
else...
Как видите, сущие пустячки.

Что касается самого алгоритма, то у вас будут проблемы при обработке отрицательных чисел, выражений в скобках и чисел разрядностью больше единицы.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
31.03.2012, 15:15  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Да в целом-то нормуль, ну разве что вместо строк использовать готовый класс Stack или на худой конец StringBuilder, а то у вас при каждом вызове AddToStack и AddToBuff создается новая строка, что будет заметно тормозить код при обработке длинных выражений.


Что касается самого алгоритма, то у вас будут проблемы при обработке отрицательных чисел, выражений в скобках и чисел разрядностью больше единицы.
1.Я пока еще понятия не имею что это за чудо-класс Stack или StringBuilder.
2. Для того чтобы как-то решить проблему разрядности я вроде разделяю числа пробелами.
3. До отрицательных выражения и скобок я пока не дошёл. Хотелось бы чтобы программа решала хотя бы простые 1+2*3.

Добавлено через 3 минуты
Только-что придуманный мною фрагмент должен был добавить после последнего числа все оставшиеся знаки операций в обратном порядке. Но что-то не спешит это делать.
C#
1
2
3
4
5
6
7
8
9
10
if (chr == input.Last())
                    {
                        AddToStack(chr);
                        buff.Reverse();
 
                        foreach (char rev in buff)
                        {
                            AddToStack(rev);
                        }
                    }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.03.2012, 15:42
Цитата Сообщение от van Persie Посмотреть сообщение
2. Для того чтобы как-то решить проблему разрядности я вроде разделяю числа пробелами.
Ага, точно. Это я затупил

Цитата Сообщение от van Persie Посмотреть сообщение
что-то не спешит это делать.
Постарайтесь раз и навсегда запомнить, что строки в шарпе - неизменяемы. То есть создав однажды экземпляр строки, изменить его уже не получится, можно будет только создать новый экземпляр.
Зная об этом, проблема в коде становится очевидной - вот она:
Цитата Сообщение от van Persie Посмотреть сообщение
buff.Reverse();
Метод Reverse возвращает ссылку на измененную строку, при этом старая строка, на которую указывает buff, остается неизменной. Ну а так как у вас результат метода не присваивается никакой переменной, то получается, что измененная строка возвращается "в никуда".
Исправляем:
C#
1
buff = buff.Reverse();
После чего буфер, наверное, надо будет очистить.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
31.03.2012, 16:06  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
После чего буфер, наверное, надо будет очистить.
Осталось узнать как это сделать

Добавлено через 10 минут
Этот вариант тоже не хочет добавлять всё что осталось в строке buff;
C#
1
2
3
4
5
6
7
8
9
10
  if (chr == input.Last())
                    {
                        AddToStack(chr);
                        buff = Convert.ToString(buff.Reverse());
 
                        foreach (char rev in buff)
                        {
                            AddToStack(rev);
                        }
                    }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.03.2012, 16:21
Цитата Сообщение от van Persie Посмотреть сообщение
Осталось узнать как это сделать
C#
1
buff = string.Empty;
Цитата Сообщение от van Persie Посмотреть сообщение
Этот вариант тоже не хочет добавлять всё что осталось в строке buff
Ну да, Reverse же работает со строкой как с итератором...
Попробуйте так:
C#
1
buff = string.Join(string.Empty, buff.Reverse());
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
31.03.2012, 18:51  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
buff = string.Empty;

Ну да, Reverse же работает со строкой как с итератором...
Попробуйте так:
C#
1
buff = string.Join(string.Empty, buff.Reverse());

всёравно последний символ с buff не добавляет в stack;

Примеры:
Ввод 12+2
Вывод 12 2

Ввод 12+2+3+4
Вывод:12 2 + 3 + 4

В обоих случаях в конце должен быть "+", который спокойно сидит себе в buff;

Добавлено через 2 часа 2 минуты
Вот этот фрагмент кода вообще не работает:

C#
1
2
3
4
5
6
7
8
9
10
 if (chr == input.Last())
                    {
                        AddToStack(chr);
                        buff  = string.Join(string.Empty, buff.Reverse());
 
                        foreach (char rev in string.Join(string.Empty, buff.Reverse()))
                        {
                            AddToStack(rev);
                        }
                    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2012, 18:51
Помогаю со студенческими работами здесь

Объясните строку вывода в консоль
Объясните что означает предпоследняя строка там где на консоль выводится как можно подробнее!!! using System; using System.Linq; ...

Объясните работу с классами
добрый день! объясните мне работу с классами. Мое видение то есть к примеру мне нужно создать программу которая будет выполнять функции 1....

Объясните работу класса ManagementObject
Осваиваю C#. практикуюсь на WMI и получении информации о ПК с его помощью. Например, есть такой код: string query =...

Объясните работу цикла в приведенном коде
Объясните пожалуйста следующий фрагмент for (int i = 1; i < txt.Length; i++) { pol = 0; ...

Объясните работу с интерфейсами в данном примере
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Observer { class...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru