Портирование кода с c++ на c#
Формулировка задачи:
Добрый день!
Помогите, пожалуйста, перевести на с# такой кодЗаранее спасибо!
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<locale.h>
struct tree
{char znak;
int res;
tree *l, *r;
};
struct pol
{char c;
pol *next;
};
char* polish(char*, pol**);
int a_to_i(char*, int);
char pop(pol**);
pol* push(pol**, char);
int prior(char);
tree* add(tree*, char, int);
void see(tree*);
int calc(tree*);
int fl=1;
int _tmain(int argc, _TCHAR* argv[])
{ setlocale(LC_ALL,"Rus");
tree *dr=NULL;
pol *h=NULL;
char *str;
int i, number;
if(!(str=(char*)malloc(50))) {puts("Ошибка при работе с памятью!"); return 0;}
puts("Введите выражение\n");
fflush(stdin);
gets(str);
str=polish(str, &h);
puts("Выражение, записанное в виде обратной польской записи:");
puts(str);
i=strlen(str);
i--;
while(i>=0)
{if(*(str+i)=='/' || *(str+i)=='*' || *(str+i)=='-' || *(str+i)=='+')
{dr=add(dr, *(str+i), 0);
i--;
}
if(*(str+i)==' ') i--;
if(*(str+i)>='0' && *(str+i)<='9')
{number=0; int mn=1;
while(*(str+i)>='0' && *(str+i)<='9')
{number+=(*(str+i)-'0')*mn;
mn*=10;
i--;
}
dr=add(dr,' ', number);
}
}
puts("Дерево, лежащее на боку");
see(dr);
puts("\nНажмите клавишу для получения результата");
if(getch()) calc(dr);
printf("Результат вычисления: %d\n", calc(dr));
return 1;
}
char* polish(char *str, pol **h)
{int i=0, point=0;
char *out;
if(!(out=(char*)malloc(50))) {puts("Ошибка при работе с памятью!"); return 0;}
while(*(str+i)!='\0' && *(str+i)!='=')
{while(*(str+i)==' ') i++; //propysk probelov
if(*(str+i)==')')
{while((*h)->c!='(') //esli zakruvaiyshchaya skobka, vutalkivaem iz steka vse elementu do otkruvaiyshchei skobki i samy skobky
*(out+point++)=pop(h);
pop(h);
}
if(*(str+i)>='1' && *(str+i)<='9') //esli tsifra - v stroky
{while(*(str+i)>='1' && *(str+i)<='9')
{*(out+point++)=*(str+i);
i++;
}
*(out+point++)=' ';
i--;
}
if(*(str+i)=='(') //esli '(' - zapisuvaem ee stek
*h=push(h, '(');
if(*(str+i)=='+' || *(str+i)=='-' || *(str+i)=='*' || *(str+i)=='/') //esli znak - vutalkivaem iz steka vse elementu s nizshim
{while((*h!=NULL) && (prior((*h)->c)>=prior(*(str+i)))) //prioritetom i zapisuvaem znak v stek
*(out+point++)=pop(h);
*h=push(h, *(str+i));
}
i++;
}
while(*h!=NULL) //zapisuvaem v stroky ostavshiesya elementy
*(out+point++)=pop(h);
*(out+point)='\0';
return out;
}
pol* push(pol **h, char c)
{pol *s;
s=(pol*)malloc(sizeof(pol));
s->c=c;
s->next=*h;
return s;
}
char pop(pol **h)
{char c;
pol *s;
if(!*h) return '\0';
s=*h;
c=s->c;
if(s->c=='(' || s->c=='+' || s->c=='-' || s->c=='*' || s->c=='/')
*h=s->next;
else *h=NULL;
free(s);
return c;
}
int a_to_i(char *str, int i)
{ int ch=0, k=1;
while(*(str+i)>='0' && *(str+i)<='9')
{ch+=k*(*(str+i)-'0');
k*=10;
i--;
}
return ch;
}
int prior(char c)
{ switch(c)
{case '*': case '/': return 3;
case '+': case '-': return 2;
case ')': return 1;
}
return 0;
}
tree* add(tree *dr, char symbol, int number)
{
if(!dr)
{if(!(dr=(tree*)malloc(sizeof(tree)))) {puts("Ошибка при работе с памятью!"); return 0;}
dr->res=number;
dr->znak=symbol;
dr->l=dr->r=NULL;
fl=1;
return dr;
}
if(dr->znak==' ') //если записано число, возвращаемся
return dr;
if(!dr->r) //запись вправо
{dr->r=add(dr->r, symbol, number);
return dr;
}
if(dr->r)
{if(dr->r->znak!=' ') //если записано не число, записываем число сюда
dr->r=add(dr->r, symbol, number);
else //число
{fl=0;
dr->l=add(dr->l, symbol, number); //иначе записываем влево
}
}
if(dr->r && fl==0)
dr->l=add(dr->l, symbol, number);
return dr;
}
void see(tree *dr)
{if (dr->l) see(dr->l);
if(dr->res!=0) printf("%c%d",dr->znak,dr->res);
else printf("%c",dr->znak);
if (dr->r) see(dr->r);
return;
}
int calc(tree *dr)
{if(dr)
{ if(dr->l)
dr->res=calc(dr->l);
if(dr->r)
switch(dr->znak)
{case '+': dr->res+=calc(dr->r); break;
case '-': dr->res-=calc(dr->r); break;
case '*': dr->res*=calc(dr->r); break;
case '/': dr->res/=calc(dr->r); break;
}
}
return dr->res;
}Решение задачи: «Портирование кода с c++ на c#»
textual
Листинг программы
char* polish(char*, pol**); int a_to_i(char*, int); char pop(pol**); pol* push(pol**, char); int prior(char); tree* add(tree*, char, int); void see(tree*); int calc(tree*); int fl=1;