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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Charley2, 26 фев 2011.

Статус темы:
Закрыта.
  1. Charley2

    Charley2 Гость

    В общем у меня такое задание: дана инфиксная запись выражения, которая надо читать из файла, содержащая тригонометрические операции(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";
     
  2. Charley2

    Charley2 Гость

    Ладно, другой вопрос: есть функция semantec(), которая считывает запись из файла "expression.txt" : (a+B)*(c-d/e)^(f*h)*sin(k)
    Если встретилась какаето тригонометрическая функция, то она записывается в один элемент letter, в противном случае для каждого символа из строки - отдельный элемент letter
    Код (Text):
    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
    В чем проблема?
     
  3. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Это либо слишком умно для меня и я конкретный балбес, либо я зря не пошел учится на программиста в Индийский Институт Дружбы Народов... Определенно одно из двух.
     
  4. Charley2

    Charley2 Гость

    Короче: проверяем строчку посимвольно (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, чего не происходит
     
  5. ierofant

    ierofant Гость

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

    Charley2 Гость

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

    ierofant Гость

Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей