Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Различные нотации записи выражений, перевод из префиксной записи в польскую 
:(
    Опции темы
Kronit
Дата 19.11.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.9.2006
Где: МОСКВА

Репутация: нет
Всего: нет



Здравствуйте. У меня такое задание. Мне нужно перевести выражение из префиксной записи в обратную польскую (т.е, например,  +a*bc  -->  bc*a+ ). Я так понимаю, что польская обратная запись - это просто постфиксная запись. Я даже понимаю, что мое изначальное выражение (в преф. записи) нужно просто переписать в обратном порядке (в постф. запись). Естественно со всеми проверками на корректнось введенного префиксного выражения. Только символы, не являющиеся знаками, переписать надо в обратном порядке, но не меняя их местами...т.е. как bc не меняются на cb в моем примере. Надеюсь Вы поняли..)

только у меня проблема. Как переписать выражение в обратном порядке - это эллементарно. Но вот как при этом не менять местами символы, не равные знаку?

выбрать их можно:
Код

(a[i] >='0' && a[i] <= '9') || (a[i] >='A' && a[i] <= 'Z') ||(a[i] >='a' && a[i] <= 'z')

а что дальше?

буду ждать ваших предложений. Заранее спасибо.
PM MAIL ICQ   Вверх
Sartorius
Дата 19.11.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 Выбирай из входной строки подстроки разделенные знаками начиная с конца. Потом их целиком в выходную строку скидывай. 
PM MAIL ICQ   Вверх
Kronit
Дата 19.11.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.9.2006
Где: МОСКВА

Репутация: нет
Всего: нет



Цитата(Sartorius @ 19.11.2006,  13:57)
Выбирай из входной строки подстроки разделенные знаками начиная с конца. Потом их целиком в выходную строку скидывай.

Только я не совсем понимаю как это сделать...делать так:
 
Код

l = strlen(a);
j=0;
 for (i=l-1;i>=0;i--) if (a[i]!='+' || a[i]!='*' || .....){ b[g]=a[i] ; g++;}


Но только так в массиве b будут все символы-незнаки подряд и в обратном порядке...
А как вбивать в отдельные массивы? сколько массивов создавать? я же не знаю сволько будит этих блоков символов между знаками.

          
    
     
         

Это сообщение отредактировал(а) Kronit - 19.11.2006, 17:58
PM MAIL ICQ   Вверх
Partizan
Дата 20.11.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



strrev() не поможет?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kronit
Дата 20.11.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.9.2006
Где: МОСКВА

Репутация: нет
Всего: нет



Цитата(Partizan @ 20.11.2006,  15:58)
strrev() не поможет?

Впринципе переписать строку в обратном порядке так действительно проще, чем через цикл for. Но мне же надо чтобы символьные подстроки(не знаки) не менялись местами.
теперь мне надо чтоб строка: +abc*ab была переписана в строку +cba*ba.
Тогда после strrev() у меня и получится нужная строка ab*abc+

как мне буквы поменять местами?
PM MAIL ICQ   Вверх
Partizan
Дата 20.11.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



разбить строку на токены с пом strtok()...в качестве символов-разделителей взять символы арифметических операций и для каждой полученной подстроки сделать strrev....
нерационально, но работать должно...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Partizan
Дата 20.11.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



с помощью strtok всё становится совсем просто...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Partizan
Дата 20.11.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



держи вот...написал пока делать нечего было...

Код

// notations.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#define MAX_LEN 255
#define MAX_TOKENS 50
#define MAX_OPERS 255

int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;

    char cOrigStr[MAX_LEN];
    char *cOutputStr;
    char *tokens[MAX_TOKENS];
    char opers[MAX_OPERS] = "\0"; 
    const char cSeparators[] = "+-*/";
    int i = 0;
    cin >> cOrigStr;

    
    i = 0;   

    for (int j = 0; j < strlen(cOrigStr); j++)
        if (cOrigStr[j] == '+' || cOrigStr[j] == '-' || cOrigStr[j] == '*' || cOrigStr[j] == '/'){
            opers[i] = cOrigStr[j];
            opers[i+1]='\0';
            cout << opers[i] << endl;
            i++;
        }


    i = 0;
    tokens[i] = strtok(cOrigStr, cSeparators);
    
    while(tokens[i] != NULL){
                  i++;
      tokens[i] = strtok(NULL, cSeparators);
    };

    cOutputStr = new char[MAX_LEN];
    cOutputStr[0] = '\0';

    for (int j = 0; j<i; j++){
      
      strcat(cOutputStr, tokens[i-j-1]);
      strncat(cOutputStr, &opers[i-j-1], 1);
    };

    cout << cOutputStr;
    cin >>cOutputStr;
    return 0;
}




--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kronit
Дата 20.11.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.9.2006
Где: МОСКВА

Репутация: нет
Всего: нет



Цитата(Partizan @ 20.11.2006,  21:55)
держи вот...написал пока делать нечего было...

Код

// notations.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#define MAX_LEN 255
#define MAX_TOKENS 50
#define MAX_OPERS 255

int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;

    char cOrigStr[MAX_LEN];
    char *cOutputStr;
    char *tokens[MAX_TOKENS];
    char opers[MAX_OPERS] = "\0"; 
    const char cSeparators[] = "+-*/";
    int i = 0;
    cin >> cOrigStr;

    
    i = 0;   

    for (int j = 0; j < strlen(cOrigStr); j++)
        if (cOrigStr[j] == '+' || cOrigStr[j] == '-' || cOrigStr[j] == '*' || cOrigStr[j] == '/'){
            opers[i] = cOrigStr[j];
            opers[i+1]='\0';
            cout << opers[i] << endl;
            i++;
        }


    i = 0;
    tokens[i] = strtok(cOrigStr, cSeparators);
    
    while(tokens[i] != NULL){
                  i++;
      tokens[i] = strtok(NULL, cSeparators);
    };

    cOutputStr = new char[MAX_LEN];
    cOutputStr[0] = '\0';

    for (int j = 0; j<i; j++){
      
      strcat(cOutputStr, tokens[i-j-1]);
      strncat(cOutputStr, &opers[i-j-1], 1);
    };

    cout << cOutputStr;
    cin >>cOutputStr;
    return 0;
}


Оки...спасибо выручил..щас буду разбираться. Правда я на С пишу, но думаю Сpp тоже пойму.

Это сообщение отредактировал(а) Kronit - 20.11.2006, 23:14
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.