Постфиксная запись

  • Автор темы Charley2
  • Дата начала
Статус
Закрыто для дальнейших ответов.
C

Charley2

#1
В общем у меня такое задание: дана инфиксная запись выражения, которая надо читать из файла, содержащая тригонометрические операции(sin, cos, tan и т.д.). Считываю по символу в каждый элемент массива. В общем вопрос вот в чем: какие контейнеры и команды к ним надо использовать, чтобы из набора символов распознать и собрать в отдельные элементы эти sin, cos, arctan?
дано: char letter = {a, *, b, +, s, i, n, d}
надо: char* semant[0] = "a";
char* semant[1] = "*";
...
char* semant[4] = "sin";
char* semant[5] = "d";
 
C

Charley2

#2
Ладно, другой вопрос: есть функция semantec(), которая считывает запись из файла "expression.txt" : (a+B)*(c-d/e)^(f*h)*sin(k)
Если встретилась какаето тригонометрическая функция, то она записывается в один элемент letter, в противном случае для каждого символа из строки - отдельный элемент letter
Код:
void semantec() {
const int max=35;
map<int, string> SEM;
map<int, string> letter;	
char line[max];
int maximum=12;
int temp[12]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
int count, i, j, k=0, mem, h=0;
SEM[0]="sin";
SEM[1]="cos";
SEM[2]="tan";
SEM[3]="cot";
SEM[4]="asin";
SEM[5]="acos";
SEM[6]="atan";
SEM[7]="acot";
SEM[8]="exp";
SEM[9]="sqrt";
SEM[10]="sqrt3";
fstream pipe("expression.txt");
pipe.getline(line, max);
for (i=0; i<max; i++) {
j=0;
for (count=0; count<maximum; count++) {
if (line[i] == SEM[temp[count]][k]) {
temp[j]=temp[count];
mem=temp[count];
j++;
}
}
k++;
if (j==0) {
k--;
while (k>=0) {
letter[h-k][0]=line[i-k]; 
k--;
}
k=0;
maximum=12;
for (count=0; count<12; count++) {
temp[count]=count;
}
} else {
maximum=j;
}
if (k>2) {
k--;
h=h-k;
for (k=0; SEM[mem][k]; k++) {
letter[h][k]=SEM[mem][k];
}
k=0;
for (count=0; count<12; count++) {
temp[count]=count;
}
}
h++;
}
}
Почему не выводит к примеру cout << letter[0] или cout << letter[20].
Хотя если написать так:
cout << letter[0][0] << endl;
cout << letter[20][0] << letter[20][1] << letter[20][2];
На экран выведет:
(
sin
В чем проблема?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#3
Если встретилась какаето тригонометрическая функция, то она записывается в один элемент letter, в противном случае для каждого символа из строки - отдельный элемент letter
Это либо слишком умно для меня и я конкретный балбес, либо я зря не пошел учится на программиста в Индийский Институт Дружбы Народов... Определенно одно из двух.
 
C

Charley2

#4
Короче: проверяем строчку посимвольно (a+B)*(c-d/e)^(f*h)*sin(k)
line[0]='('; сверяем этот элемент с первым элементом из массива SEM
SEM[0][0]="s";
SEM[1][0]="c";
SEM[2][0]="t";
SEM[3][0]="c";
SEM[4][0]="a";
SEM[5][0]="a";
SEM[6][0]="a";
SEM[7][0]="a";
SEM[8][0]="e";
SEM[9][0]="s";
SEM[10][0]="s";
такого элемента нет сл-но letter[0][0]="("; i++
line[1]='a' опять сверяем этот элемент с первым элементом из массива SEM; опа такие элементы есть, сл-но запоминаем
SEM[4][0]="a";
SEM[5][0]="a";
SEM[6][0]="a";
SEM[7][0]="a";
i++, инкрементируем второй индекс SEM и делаем сравнение уже с этими элементами
line[2]="+" сверяем,
SEM[4][1]="s";
SEM[5][1]="c";
SEM[6][1]="t";
SEM[7][1]="c";
такого элемента нет сл-но letter[1][0]="a"; letter[2][0]="+" и так далее...
Таким образом мы дойдем до sin и сл-но letter[20][0]="s"; letter[20][1]="i"; letter[20][2]="n"
Т. е. cout << letter[20] должен вывести на экран: sin, чего не происходит
 
I

ierofant

#5
А зачем вообще использовать std::map<int, "хоть что">? Для таких вещей есть std::vector<"хоть что">
 
C

Charley2

#6
А зачем вообще использовать std::map<int, "хоть что">? Для таких вещей есть std::vector<"хоть что">
Ни знаю, я ни гуру в контейнерах STL, по идее я затем должен сравнивать каждый letter c элементами из map<int, string> op , где int индекс string это операция, затем если letter == op[j], то по индексу j определяем приоритет операции либо функции из map<int, int> prior (второй int - приоритет). Может это нерационально то, что я пишу, подскажите где взять информацию о контейнерах STL?
 
I

ierofant

#7
Статус
Закрыто для дальнейших ответов.