Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Secret_Volga
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 187
1

Из Pascal в C#

16.01.2018, 13:26. Просмотров 139. Ответов 9
Метки нет (Все метки)

Помогите пожалуйста перевести на язык C#
Pascal
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
uses math;
type arr = array of string[20];
 
//процедура помещения токена в стек
procedure push(var x: arr; var y: string);
begin
  setlength(x, length(x) + 1); //увеличиваем глубину стека
  x[high(x)] := y //помещаем токен
end;
 
//процедура извлечения токена из стека
procedure pop(var x: arr; var y: string);
begin
  y := x[high(x)]; //извлекаем токен
  setlength(x, length(x) - 1) //уменьшаем глубину стека
end;
 
const op = '()+-*/^'; //операторы в порядке возрастания приоритетов
var s, t, q, error: string; //входная строка, буферы токена, сообщение об ошибке
    i, err: integer; //счётчик, ошибка преобразования строки в число
    num: real; //проверочный результат
    st, st_op: arr; //выходной стек, стек операций
    st_n: array of real; //стек операндов
begin
  writeln('Введите выражение:'); //ввод выражения в инфиксной нотации
  readln(s);
  s := s + ' '; //добавляем пробел для удобства алгоритма
  for i := length(s) downto 1 do //разбиваем пробелами выражение на токены
    if pos(s[i], op) > 0 //если очередной символ - оператор
      then begin //то вставляем пробелы до и после него
        insert(' ', s, i + 1);
        insert(' ', s, i)
      end;
  while pos('  ', s) > 0 do delete(s, pos('  ', s), 1); //убираем лишние пробелы
  if (length(s) > 0) and (s[1] = ' ') then delete(s, 1, 1);
  if length(s) = 0 //если строка пустая
    then error := 'Ошибка: пустое выражение' //формируем сообщение об ошибке и более ничего не делаем
    else begin //если строка не пустая, то
      writeln('Выражение:'); //печатаем выражение, разбитое на токены
      writeln(s);
      t := ''; //инициализируем буфер токена: пока пустой
      for i := 1 to length(s) do //сканируем выражение
        begin
          if s[i] <> ' ' //если не пробел,
            then t := t + s[i] //то помещаем символ в буфер токена
            else begin //иначе разбираемся с токеном
              case t[1] of //смотрим первый символ токена
                  '0'..'9', '.': //если относится к числу,
                    begin //то
                      val(t, num, err); //проверяем, является ли токен допустимой записью числа
                      if err = 0
                        then push(st, t) //если да, то помещаем токен в выходной стек
                        else begin //если нет,
                          error := 'Ошибка: не число: ' + t; //то формируем текст ошибки
                          break //и прекращаем сканирование
                        end
                    end;
                  '(': //если открывающая скобка,
                    push(st_op, t); //то помещаем токен в стек
                  ')':
                    begin //если закрывающая скобка,
                      while (length(st_op) > 0) and (t[1] <> '(') do //то пока не встретился токен '(' и стек операторов не опустел
                        begin
                          pop(st_op, t); //извлекаем токен из стека операторов
                          if t[1] <> '(' then push(st, t) //и помещаем его в выходной стек
                        end;
                      if t[1] <> '(' //если последний извлечённый токен не '(',
                        then begin
                          error := 'Ошибка: нарушен баланс скобок'; //то формируем текст ошибки
                          break //и прекращаем сканирование
                        end
                    end;
                  '+', '-', '*', '/', '^': //если токен - операция,
                    begin
                      //то пока стек операторов не пустой и операция на вершине стека операторов с большим или равным приоритетом,
                      while (length(st_op) > 0) and ((pos(t[1], op) - 1) div 2 <= (pos(st_op[high(st_op)][1], op) - 1) div 2) do
                        begin
                          pop(st_op, q); //извлекаем токен из стека операторов
                          push(st, q); //помещаем токен в выходной стек
                        end;
                      push(st_op, t); //добавляем токен к стеку операторов
                    end
                  else //если токен какой-то другой,
                    begin
                      error := 'Ошибка: недействительный оператор: ' + t; //то формируем текст ошибки
                      break //и прекращаем сканирование
                    end
                end;
              t := '' //реинициализируем буфер токена
            end;
        end;
        //сканирование окончено
      while length(st_op) > 0 do //если в стеке операторов остались операторы, перемещаем их в выходной стек
        if pos(st_op[high(st_op)][1], op) < 3 //если оператор - скобка,
          then begin
            error := 'Ошибка: нарушен баланс скобок'; //то формируем текст ошибки
            break //и прекращаем перемещение
          end
          else begin //если оператор - не скобка,
            pop(st_op, t); //то извлекаем его из стека операторов
            push(st, t) //и помещаем в выходной стек
          end;
    end;
  if (length(st) > 0) and (length(error) = 0) //если выходной стек не пуст и нет ошибки,
    then begin //то
      writeln('ОПЗ:'); //печатаем выражение в постфиксной нотации
      for i := 0 to high(st) do write(st[i], ' ');
      writeln;
      for i := 0 to high(st) do //пробегаемся по выходному стеку и пытаемся вычислить выражение
        case st[i][1] of
            '+', '-', '*', '/', '^': //если токен - оператор,
              begin //то пытаемся выполнить операцию
                case st[i][1] of //смотрим, что за оператор
                    '+': st_n[high(st_n) - 1] := st_n[high(st_n) - 1] + st_n[high(st_n)]; //находим сумму
                    '-': st_n[high(st_n) - 1] := st_n[high(st_n) - 1] - st_n[high(st_n)]; //находим разность
                    '*': st_n[high(st_n) - 1] := st_n[high(st_n) - 1] * st_n[high(st_n)]; //находим произведение
                    '/': //деление
                      if st_n[high(st_n)] <> 0 //если делитель не равен 0
                        then st_n[high(st_n) - 1] := st_n[high(st_n) - 1] / st_n[high(st_n)] //то находим частное
                        else begin //иначе ошибка деления на 0
                          error := 'Ошибка: деление на ноль';
                          break
                        end;
                    '^': //возведение в степень
                      if (st_n[high(st_n) - 1] = 0) and (st_n[high(st_n)] = 0) //если 0^0
                        then begin //то ошибка 0^0
                          error := 'Ошибка: 0^0';
                          break
                        end
                        else if (frac(1 / st_n[high(st_n)]) = 0) and not odd(trunc(1 / st_n[high(st_n)])) and (st_n[high(st_n) - 1] < 0)
                          then begin //если корень чётной степени из отрицательного числа, то ошибка
                            error := 'Ошибка: корень чётной степени из отрицательного числа';
                            break
                          end
                          else if st_n[high(st_n) - 1] > 0 //если всё в норме, вычисляем степень
                            then st_n[high(st_n) - 1] := exp(ln(st_n[high(st_n) - 1]) * st_n[high(st_n)])
                            else if st_n[high(st_n) - 1] < 0
                              then st_n[high(st_n) - 1] := -exp(ln(-st_n[high(st_n) - 1]) * st_n[high(st_n)])
                              else st_n[high(st_n) - 1] := 0
                  end;
                setlength(st_n, length(st_n) - 1) //операция выполнена, убираем второй операнд из стека (результат помещён на место первого операнда)
              end
            else begin //если не оператор,
              setlength(st_n, length(st_n) + 1); //то увеличиваем глубину стека операндов
              val(st[i], st_n[high(st_n)], err) //и помещаем в стек операндов токен, преобразованный в число
            end
          end
    end;
  if length(error) > 0 //если есть ошибка,
    then write(error) //то печатаем её
    else write('Результат: ', st_n[high(st_n)]:0:15); //иначе печатаем результат
  readln
end.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2018, 13:26
Ответы с готовыми решениями:

Turbo Pascal, Pascal ABC, Free Pascal, PascalABC.NET - в чем разница?
Всем привет, решил изучать Паскаль, но на форуме увидел 4 его версии - Turbo...

Нужно перевести программу с Turbo Pascal в Pascal ABC.NET
Вот есть программный код , но он для турбо паскаля, помогите перевести его в...

Различия трансляторов Pascal ABC.Net и Turbo/Borland Pascal
Пожалуйста, объясните различия между компиляторами Pascal ABC.Net и...

Список слов распечатать в алфавитном порядке. В Turbo Pascal или Pascal ABC
Дана непустая последовательность слов, в каждом из которых содержится от 1 до 6...

Из множества выбрать три различные точки по условию -из Turbo Pascal во Free Pascal
Даны 2 множества точек на плоскости. Выбрать три различные точки первого...

9
sharpdev08
Заблокирован
16.01.2018, 13:35 2
У Вас же даже комментарии есть - неужели сложно?
1
Secret_Volga
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 187
16.01.2018, 13:36  [ТС] 3
да, сложно... не могу поэтому прошу помощи... пожалуйста
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,834
Завершенные тесты: 2
16.01.2018, 13:36 4
Secret_Volga, учебник открыть тоже сложно было?
1
Secret_Volga
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 187
16.01.2018, 13:37  [ТС] 5
по делу пожалуйста....
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,834
Завершенные тесты: 2
16.01.2018, 13:39 6
Secret_Volga, деловой?) Свои наработки выкладывай или жди с неба халявы.
1
Secret_Volga
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 187
16.01.2018, 13:40  [ТС] 7
нету своих... буду ждать.... просто заметил как не задам вопрос... сразу великие умы мира заходят и советуют самому.... вот вопрос а вы можете хоть половину от этого написать?
0
Usaga
Эксперт .NET
5128 / 3489 / 614
Регистрация: 21.01.2016
Сообщений: 13,834
Завершенные тесты: 2
16.01.2018, 13:44 8
Secret_Volga, детскими методами моё самолюбие задеть, чтоли, пытаетесь?)

Цитата Сообщение от Secret_Volga Посмотреть сообщение
сразу великие умы мира заходят и советуют самому.
А с чего вы решили, что вам кинуться за вас ваше задание делать? Так-то "великие умы" великими стали самообучаясь. Может и вам попробовать? Или это для лохов?
0
valera_21
371 / 355 / 94
Регистрация: 05.01.2010
Сообщений: 1,480
Завершенные тесты: 5
16.01.2018, 13:51 9
я так полагаю, для данной задачи вполне подойдут
https://habrahabr.ru/post/50196/
https://habrahabr.ru/post/122397/
1
Почтальон
16.01.2018, 13:51     Из Pascal в C#
  #10

Не по теме:

Secret_Volga, признайтесь, фрилансом же занимаетесь, за чужой счет :) ?

0
16.01.2018, 13:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2018, 13:51
Привет! Вот еще темы с ответами:

Есть ли аналог модуля tpdate.tpu (Turbo Pascal) для Free Pascal
Внимание! Нужно срочно узнать название юнита для freepascal, который выполняет...

Нужно перевести код с Pascal ABC на Turbo Pascal - рисование работающей мельницы
Вот код, он должен рисовать работающею мельницу. uses graphABC,crt; type...

Можно как-то переделать код из Turbo Pascal чтобы он работал в pascal abc.net?
Сделайте пожалуйста, я просто не вникаю uses Graph, Crt; var grDriver:...


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

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

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