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

Консоль: Переписать С++ код в С#

24.04.2012, 21:22. Показов 1080. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел нужную программу на С++. Но моих знаний недостаточно чтобы разобраться в этом коде и переписать самому. Нужно переписать это творение на C#.

Собственно говоря, код:

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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
 
struct list
{
int data;
struct list *next;
};
 
 
typedef struct stack
{
struct list *top;
}   stack;
 
int top(stack *s)
{
return (s -> top -> data);
}
 
int pop(stack *s)
{
int a;
struct list *p;
 
p = s->top;
a = p->data;
s->top = p->next;
 
free(p);
return(a);
}
 
void push(int a, stack *s)
{
struct list *p;
 
p = (struct list *) malloc(sizeof(struct list));
 
p->data = a;
p->next = s->top;
s->top = p;
}
 
 
int prior(char h)
{
if ((h == '*') || (h == '/'))
return 5;
 
if ((h == '+') || (h == '-'))
return 4;
 
if (h == '=')
return 3;
 
if (h == ')')
return 2;
 
if (h == '(')
return 1;
}
 
int main()
{
stack *s;
s = (stack*) malloc (sizeof(stack));
s->top = NULL;
 
char str_in[256], str_out[256], x, tmp;
 
gets(str_in);
 
int n = strlen(str_in), k = 0;
 
for (int i = 0; i < n; i++)
{
x = str_in[i];
 
if (((x >= '0') && (x <= '9')) || ((x >= 'a') && (x <= 'z')))
{
str_out[k] = x;
k++;
}
else
if (x == '(')
push(x, s);
else
if (x == ')')
{
tmp = pop(s);
 
while (tmp != '(')
{
str_out[k] = tmp;
k++;
 
tmp = pop(s);
}
}
else
if (s->top)
{
tmp = top(s);
 
while ((prior(tmp) >= prior(x)))
{
tmp = pop(s);
str_out[k] = tmp;
k++;
if (s->top == NULL) break;
tmp = top(s);
 
}
 
push(x, s);
}
else
push(x, s);
}
 
while (s->top != NULL)
{
tmp = pop(s);
str_out[k] = tmp;
k++;
}
 
str_out[k] = 0;
printf("%s", str_out);
 
getch();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2012, 21:22
Ответы с готовыми решениями:

Переписать код под консоль
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Нужно переписать код из формы в консоль
Здравствуйте, сделал код в формах но не могу перевести его в консоль Условие Для книг, хранящихся в библиотеке, задаются:...

Переписать код с консоль для формы (application form)
Добрый день! У меня код для консоля, но нужно его переделать для формы где есть button, edit1 и инфо вывести в ShowMessage! Пожалуйста,...

8
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2012, 10:11
Как-то так:
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
using System;
using System.Collections.Generic;
using System.Text;
 
class Program
{
    static void Main()
    {
        Stack<char> s = new Stack<char>();
        string str_in = Console.ReadLine();
        StringBuilder str_out = new StringBuilder(str_in.Length);
 
        foreach (char x in str_in) {
            if (char.IsLetterOrDigit(x)) str_out.Append(x);
            else if (x == '(') s.Push(x);
            else if (x == ')') {
                while (s.Peek() != '(') str_out.Append(s.Pop());
                s.Pop();
            }
            else {
                while (s.Count > 0 && prior(s.Peek()) >= prior(x)) str_out.Append(s.Pop());
                s.Push(x);
            }
        }
 
        while (s.Count > 0) str_out.Append(s.Pop());
        Console.WriteLine(str_out);
        Console.ReadKey(true);
    }
 
    static int prior(char h)
    {
        switch (h) {
            case '*': case '/': return 5;
            case '+': case '-': return 4;
            case '=': return 3;
            case ')': return 2;
            case '(': return 1;
            default: return 0;
        }
    }
}
1
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
25.04.2012, 11:50  [ТС]
Проверил десяток вариантов роботы - работает. Этот код преобразует инфиксную строку в постфиксную. Пока я изучал это дело то увидел что много кто из новичков интересуются. Этот вариант решения будет им полезен.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2012, 12:00
Код, конечно, далеко не идеален.
Приложение будет слетать при не верном вводе (напр. скобки не закрыты), не работает с отрицательными и вещественными числами, не поддерживаются функции, плохая поддержка многоразрядных чисел (123+2 будет выглядеть как 1232+) и т.д.

Но для поверхностного ознакомления, думаю, пойдет.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
25.04.2012, 13:38  [ТС]
Немного добавил отсебятины чтобы в постфиксной записи можно было различать числа. Разделял их(числа и знаки) пробелами.

В любом случае станет кому-то полезным:
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
using System;
using System.Collections.Generic;
using System.Text;
 
class Program
{
    static void Main()
    {
        Stack<char> s = new Stack<char>();
        string str_in = Console.ReadLine();
        StringBuilder str_out = new StringBuilder(str_in.Length);
 
        foreach (char x in str_in)
        {
            if (char.IsLetterOrDigit(x)) str_out.Append(x);
            else if (x == '(') {  s.Push(x); }
            else if (x == ')')
            {
                while (s.Peek() != '(')
                {
                    str_out.Append(" ");
                    str_out.Append(s.Pop());
                }
 
                s.Pop();
            }
            else
            {
                while (s.Count > 0 && prior(s.Peek()) >= prior(x)) { str_out.Append(" ");  str_out.Append(s.Pop()); }
                s.Push(x);
            }
            if (x == '+' || x == '-' || x == '*' || x == '/' || x == '^') str_out.Append(" "); 
        }
 
        while (s.Count > 0)
        {
            str_out.Append(" ");
            str_out.Append(s.Pop());
        }
            
        Console.WriteLine(str_out);
        Console.ReadKey(true);
    }
 
    static int prior(char h)
    {
        switch (h)
        {
            case '^': return 6;
            case '*':
            case '/': return 5;
            case '+':
            case '-': return 4;
            case '=': return 3;
            case ')': return 2;
            case '(': return 1;
            default: return 0;
        }
    }
}
Добавлено через 4 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Код, конечно, далеко не идеален.
Приложение будет слетать при не верном вводе (напр. скобки не закрыты), не работает с отрицательными и вещественными числами, не поддерживаются функции, плохая поддержка многоразрядных чисел (123+2 будет выглядеть как 1232+) и т.д.

Но для поверхностного ознакомления, думаю, пойдет.
Часть проблем решает мой ввариант с пробелами.

Как-то так можно добавить роботу с дробами:
C#
1
if (char.IsLetterOrDigit(x) || x == '.' ) str_out.Append(x);
Добавлено через 11 минут
Но как добавить обратотку отрицательных значений пока не знаю. Может обозначить как-то, например "-5" - "~5".
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2012, 13:54
Цитата Сообщение от van Persie Посмотреть сообщение
C#
1
str_out.Append(" "); str_out.Append(s.Pop());
Небольшая подсказка: StringBuilder.Append возвращает ссылку на текущий экземпляр, потому эти два вызова можно написать так:
C#
1
str_out.Append(" ").Append(s.Pop());
Цитата Сообщение от van Persie Посмотреть сообщение
Но как добавить обратотку отрицательных значений пока не знаю.
Обычно выполняется проверка предыдущих символов. Если минус стоит в начале строки, сразу же после другого оператора или после открытой скобки, то он воспринимается как знак отрицательного числа, идущего после него, а не как оператор вычитания.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
25.04.2012, 14:00  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Обычно выполняется проверка предыдущих символов. Если минус стоит в начале строки, сразу же после другого оператора или после открытой скобки, то он воспринимается как знак отрицательного числа, идущего после него, а не как оператор вычитания.
Как проверить предыдущий и следующий символ строки когда foreach нашел "-" ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2012, 14:05
Самый простой способ - заменить foreach на for и проверять i-1
Если хотите оставить foreach, то добавьте переменную, в которой будет храниться символ с предыдущей итерации.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
25.04.2012, 14:15  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Самый простой способ - заменить foreach на for и проверять i-1
Если хотите оставить foreach, то добавьте переменную, в которой будет храниться символ с предыдущей итерации.

Первое что пришло в голову:

C#
1
if (x == '-' && !Char.IsDigit(last)) { str_out.Append(x); continue; }
Cамый примитивный вариант. Переменная типа char - last получает значение х в конце выполнения итерации foreach;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2012, 14:15
Помогаю со студенческими работами здесь

Переписать код с switch на код с использованием массивов
&lt;?php $action = $_POST; switch($action){ case 'first' echo 'первый' break; case 'red' echo 'красный' break; case 'blue' echo...

Переписать в новый целочисленный массив В все элементы с порядковыми номерами, кратными трем (консоль не использовать)
пожалуйста помогите решить задачу: Дан целочисленный массив A размера N (&lt;=15).Переписать в новый целочисленный массив В все элементы с...

Как переписать код Pascal на код VB
var Form1: TForm1; n:integer=0; s:real=0; k:integer=0; implementation {$R *.dfm} procedure...

Не выводит в консоль код html
Добрый вечер. Начал изучать jQuery и столкнулся с проблемой - в консоль не хочет выводить содержимое html тега. Вернее выводит, но не в том...

Делфи консоль(код прилагается)
1.Даны два произвольных массива F, G размера n, m соответственно. Найти количество ненулевых элементов массива F и количество ненулевых...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru