Перевод арифметических выражений в обратную польскую нотификацию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, извините что обращаюсь, но больше некуда. Пробовал поискать решение в интернете, испробовал разные идеи, но не получается сделать. Преподаватели не помогают, знакомые сами мучаются. Сама трудность, на основе заданного кода, составить облегченный вариант кода для перевода простейших выражений в обратную польскую запись. Промучался неделю и решил написать сюда. Основа для кода:
#include <stdio.h>
#include <conio.h>
int Chislo(char text[],int *i)
{int c=0;
 while(text[*i]>='0' && text[*i]<='9')
 {c=c*10+(text[*i]-'0');
  (*i)++;
 }
return c;
}
main()
{
 char text[20];
 int i;
 float opd[3];
 char opc[3];
 int pr[3];
 int j=-1;
 printf("Vvedite arifmeticheskoe vyrajenie, v konce probel\n");
 gets(text);
 i=-1;
 do
 {i++;
  opd[++j]=Chislo(text,&i);
  opc[j]=text[i];
  switch(text[i])
  {case'+':
   case'-':pr[j]=1;break;
   case'*':
   case'/':pr[j]=2;break;
   case' ':pr[j]=0;
  }
 while (j>0 && pr[j]<=pr[j-1])
  {switch (opc[j-1])
   {case'+': opd[j-1]=opd[j-1]+opd[j]; break;
    case'-': opd[j-1]=opd[j-1]-opd[j]; break;
    case'*': opd[j-1]=opd[j-1]*opd[j]; break;
    case'/': opd[j-1]=opd[j-1]/opd[j]; break;
   }
  opc[j-1]=opc[j];
  pr[j-1]=pr[j];
  j=j-1;
 }
}
while(text[i]!=' ');
printf(text);
getch();
}
Да, сам код используется для счета арифметических выражений, но надо отталкиваться от него, т.е. использовать схожее построение и стеки в целом.

Решение задачи: «Перевод арифметических выражений в обратную польскую нотификацию»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
main()
{char text[20];
 int i=0;
 int pr[3];
 float opd[3];
 char opc[3];
 int j=-1;
 int m=0,k=0;
 printf("\n Vvedite arifm. vyrajenie:\n");
 gets(text);
 for(i=0; i<20; i++)
  if(text[i]>='a' && text[i]<='g')
   printf("%c",text[i]);
 i=0;
  do
  {++i;
   opd[++j]=text[i];
   opc[j]=text[i];
   switch(text[i])
   {case'+':
   case'-':pr[j]=1;break;
   case'*':
   case'/':pr[j]=2;break;
   case' ':pr[j]=0;
   }
   while (j>0 && pr[j]<=pr[j-1])
    {switch (opc[j-1])
     {case'+': printf("+"); break;
      case'-': printf("-"); break;
      case'*': printf("*"); break;
      case'/': printf("/");
     }
  opc[j-1]=opc[j];
  pr[j-1]=pr[j];
  j=j-1;
  }
  ++i;
 } 
 while(text[i]!=' ');
 getch();
}

Объяснение кода листинга программы

В этом коде переводится арифметическое выражение в обратную польскую нотацию (postfix notation). Список действий:

  1. Ввод арифметического выражения с клавиатуры.
  2. Инициализация массивов для хранения символов, чисел и операций.
  3. Проход по всем символам введенного выражения.
  4. Если текущий символ является оператором (+, -, *, /), то в массив операций записывается этот оператор и в массив чисел записывается 1.
  5. Если текущий символ является пробелом, то проверяется следующее: 5.1. Если в массиве операций есть элементы, то они выводятся на экран вместе с оператором. 5.2. Если в массиве операций нет элементов, то программа завершается.
  6. Если текущий символ не является оператором или пробелом, то он игнорируется.
  7. После обработки всех символов, программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы