Перевод арифметических выражений в обратную польскую нотификацию - 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.
- Если текущий символ является пробелом, то проверяется следующее: 5.1. Если в массиве операций есть элементы, то они выводятся на экран вместе с оператором. 5.2. Если в массиве операций нет элементов, то программа завершается.
- Если текущий символ не является оператором или пробелом, то он игнорируется.
- После обработки всех символов, программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д