Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Польская система. Реализация способа записи формулы 
:(
    Опции темы
H0Jlb
Дата 22.4.2010, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 18.2.2010

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



Вообщем есть такая система или способ записи - Польская.

Например: a*(k+l)

Прямая Польская система: *a+kl
Обратная Польская система: kl+a*

Я реализовал Обратную польскую систему через стек и потом инвертировал чтоб сделять прямую.
Но гдето оишбка сам найти не могу.
Я сделал более менее понятные переменные если чтото не понятно я попробую написать подробней.

Код

#include <stdafx.h>
#include <iostream>
using namespace std;
char cmek[30];
int k;
int max;
int push (char push, int k)
{
    while (k!=0)
    {
        cmek[k+1]=cmek[k];
        k--;
    }
    cmek[0]=push;
    return 0;
}
char pop ()
{
    char pop=cmek[0];
    k=0;
    while (cmek[k+1]!=-1)
    {
        cmek[k]=cmek[k+1];
        k++;}
    cmek[k]=-1;
    return pop;
}
int main()
{
    char IN[30],OUT[30];
    int i,j,n;
    ::max=0;
    i=0;
    while (i!=31)
    {cmek[i]=-1;i++;}
    n=0;
    while (IN[n-1]!='=')
    {
        cin>>IN[n];
        n++;
    }
    for (i=0;i<n;i++)
    {
        switch (IN[i])
        {
        case ' ': 
            break;
        case '*':
            push(IN[n],::max);::max+=1;
            break;
        case '/':
            OUT[j]=pop();j++;::max-=1;
            push(IN[n],::max);::max+=1;
            break;
        case '+':
            push(IN[n],::max);::max+=1;
            break;
        case '-':
            push(IN[n],::max);::max+=1;
            break;
        case '(':
            push(IN[n],::max);::max+=1;
        case ')':
            do
            {
                OUT[j]=pop();::max-=1;
                j++;
            }
            while (OUT[j-1]!='(');
            j--;
            OUT[j]=-1;
        default:
            OUT[j]=IN[i];j++;
        }
    }
    while (pop()!=-1) 
    {
        OUT[j]=pop();::max-=1;
        j++;
    }
    for (i=j-1;i<-1;i--)
        cout<<OUT[i];
    system("pause");
    return 0;
}


Это сообщение отредактировал(а) H0Jlb - 22.4.2010, 07:41
PM MAIL   Вверх
Earnest
Дата 22.4.2010, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



"Где-то ошибки" ищутся так: сначала руками прописываешь по шагам весь процесс для тестового примера. Потом повторяешь его с помощью отладчика и ищешь разницу. А кто за тебя будет это делать?


--------------------
...
PM   Вверх
H0Jlb
Дата 22.4.2010, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 18.2.2010

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



Спасибо за совет. Я нашел ошибку нереализованны скобки. Пока не пишите исправлю покажу.



Это сообщение отредактировал(а) H0Jlb - 22.4.2010, 07:43
PM MAIL   Вверх
H0Jlb
Дата 20.5.2010, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 18.2.2010

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



Переделал но теперь вообще не выводит ничего. Почему то там где if и сравнение с '1' он пропускает (false) и не хочет делать подпрограммую(

Код

#include <stdafx.h>
#include <iostream>
#include <windows.h>
using namespace std;
char cmek[20],cmek1[20];
int i,imax;
int max,max1;
int push (char push)
{
    for (int i=19;i>0;i--)
        cmek[i+1]=cmek[i];
    cmek[0]=push;
    return 0;
}
char pop ()
{
    char pop=cmek[0];
    for (i=0;i<20;i++)
        cmek[i]=cmek[i+1];
    return pop;
}
int push1 (char push1)
{
    for (int i=19;i>0;i--)
        cmek1[i+1]=cmek1[i];
    cmek1[0]=push1;
    return 0;
}
int main()
{
    int j,j2,j3,j4,j5,j6,n,iP2,Y;
    char P3[30],P2[30],P1[30];
    n=0;
    ZeroMemory( P1, sizeof(P1) );
    ZeroMemory( P2, sizeof(P2) );
    ZeroMemory( P3, sizeof(P3) );
    Y=0;
    do
    {
        n++;
        cin>>P1[n];
    }
    while (P1[n]!='=');
    for (j=0;j<n;j++)
    {
        switch (P1[j])
        {
        case '(':
            push(j);
            break;
        case ')':
            push1(j);
            push1(pop());
            Y++;
            break;
        }
    }
    push1(n);
    push1(0);
    for (int j1=0;j1<Y+1;j1++)
    {
        for  (j2=cmek1[2*j1+1]+1;j2<cmek1[2*j1];j2++)
            if (P3[j2]!='1')
                if (P1[j2]=='*' || P1[j2]=='/')
                {
                    if (P1[j2-1]!='(' || P1[j2-1]!=')')
                        P2[iP2++]=P1[j2-1];
                        if (P1[j2+1]!='(' || P1[j2-1]!=')')
                        P2[iP2++]=P1[j2+1];
                    P2[iP2++]=P1[j2];
                    P3[j2-1]='1';
                    P3[j2]='1';
                    P3[j2+1]='1';
                }
        for  (j2=cmek1[2*j1+1];j2<cmek1[2*j1];j2++)
            if (P3[j2]!='1')
                if (P1[j2]=='+' || P1[j2]=='-')
                {
                    if (P1[j2-1]!='(')
                        P2[iP2++]=P1[j2-1];
                    if (P1[j2-1]!=')')
                        P2[iP2++]=P1[j2-1];
                    if (P1[j2+1]!='(')
                        P2[iP2++]=P1[j2+1];
                    if (P1[j2+1]!=')')
                        P2[iP2++]=P1[j2+1];
                    P2[iP2++]=P1[j2];
                    P3[j2-1]='1';
                    P3[j2]='1';
                    P3[j2+1]='1';
                }
    }
    for (j3=0;j3<iP2;j3++)
        if (P2[j3]!='*' || P2[j3]!='/' || P2[j3]!='-' || P2[j3]!='+')
            if (P2[j3]!='(' || P2[j3]!=')' ) 
                for (j4=j3;j4<iP2;j4++)
                {
                    if (P2[j3]==P2[j4])
                    {
                        for (j5=j3;j5<iP2;j5++)
                            P2[j5]=P2[j5+1];
                        iP2--;
                    }
                    else 
                    {
                        for (j5=j3;j5<iP2;j5++)
                            P2[j5]=P2[j5+1];
                        iP2--;
                    }
                }
    for (j6=iP2;j6>-1;j6++)
        cout<<P2[iP2]<<' ';
    cout<<endl;
    system("pause");
    return 0;
}



Это сообщение отредактировал(а) H0Jlb - 20.5.2010, 08:57
PM MAIL   Вверх
Earnest
Дата 20.5.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



H0Jlb, что значит "почему-то"? Нет такого слова в лексиконе программиста. 
Поставь точку прерывания на это условие и смотри значения переменных.


--------------------
...
PM   Вверх
H0Jlb
Дата 20.5.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 18.2.2010

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



Я смотрел Весь массив P3 обнулен, он доходит да места условия и сразу прыгает на второй счетчик .(
Не совсем понимаю разницу между ' ' и " ".
Вот при зацыкливании он выдает сообщение и можно пото поглядеть в какой переменной какое значение, а при отладки нет.
НАверно надо какуето закладку включить?

Я непонимаю. Компилятор со строчки for сразу прыгает на второй for . (P3 проверил там все нули.)

Это сообщение отредактировал(а) H0Jlb - 20.5.2010, 13:03
PM MAIL   Вверх
Albor
Дата 20.5.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

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



H0Jlb, у тебя код вообще какой-то замороченный. Вот здесь:
Код

  switch (P1[j])
        {
        case '(':
            push(j);// здесь
            break;


зачем запихиваешь в стек счётчик цикла?

Добавлено через 8 минут и 20 секунд
Вот здесь выход за пределы массива
Код

  for (int i=19;i>0;i--)
        cmek[i+1]=cmek[i];

У тебя 20 элементов в массиве i+1 в начале работы цикла лезет не в свою память.
PM MAIL ICQ   Вверх
H0Jlb
Дата 20.5.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 18.2.2010

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



1. Я записываю адреса скобок чтобы связать их, то есть я каждое "(" связываю с каждым ")".
2. Ага спасибо щя исправлю, но я думаю ошибка тут не в этом .(

Исправил проблема все таже.
Щяс я объясню в крации.
Сначало я связываю пложение скобок "(" ")" .
Затем начанаю с внутренних скобок компоновать уже польскую запись, по мере перебора скобок я должен сделать так чтобы то что в нутри придыдущих скобок программа не счетала (ввел массив P3 длинной как выражение P1 и каждый раз как я уже записал положение из выражения я записываю в те позиции "1" для этого и нужен if ). Затем я просто через отрицательный счетчик вывожу на экран все да наоборот и получаю обратную польскую запись )

насчет стеков. например

(a+s * ( d - f / ( f + e - ( h + y ) - o ) + t ) - q)=
Делается вот как (позиции с лево на право начиная с нуля.

1. стек (0)                  стек1 ()
2. стек (5,0)               стек1 ()
3. стек (10,5,0)          стек1 ()
4. стек (15,10,5,0)     стек1 ()
5. стек (10,5,0)          стек1(15,19)
6. стек (5,0)               стек1 (10,22,15,19)
7. стек (0)                  стек1 (5,25,10,22,15,19)
8. стек ()                    стек1 (0,28,10,22,15,19)
Вааааа нашел ошибку пошел исправлять ;) p.s. Спасибо за вопрос со стеком smile

Ошибку исправил легче не стало. (Я делал цыкл не от "(" до ")",а наоборот)   smile 

Вот как сейчас.

Код

#include <stdafx.h>
#include <iostream>
#include <windows.h>
using namespace std;
char cmek[20],cmek1[20];
int i,imax;
int max,max1;
int push (char push)
{
    for (int i=18;i>0;i--)
        cmek[i+1]=cmek[i];
    cmek[0]=push;
    return 0;
}
char pop ()
{
    char pop=cmek[0];
    for (i=0;i<20;i++)
        cmek[i]=cmek[i+1];
    return pop;
}
int push1 (char push1)
{
    for (int i=18;i>0;i--)
        cmek1[i+1]=cmek1[i];
    cmek1[0]=push1;
    return 0;
}
int main()
{
    int j,j2,j3,j4,j5,j6,n,iP2,Y;
    char P3[30],P2[30],P1[30];
    n=0;
    ZeroMemory( P1, sizeof(P1) );
    ZeroMemory( P2, sizeof(P2) );
    ZeroMemory( P3, sizeof(P3) );
    Y=0;
    do
    {
        n++;
        cin>>P1[n];
    }
    while (P1[n]!='=');
    for (j=0;j<n;j++)
    {
        switch (P1[j])
        {
        case '(':
            push(j);
            break;
        case ')':
            push1(j);
            push1(pop());
            Y++;
            break;
        }
    }
    push1(n);
    push1(0);
    for (int j1=Y;j1<-1;j1--)
    {
        for  (j2=cmek1[2*j1]+1;j2<cmek1[2*j1+1];j2++)
            if (P3[j2]!='1')
                if (P1[j2]=='*' || P1[j2]=='/')
                {
                    if (P1[j2-1]!='(' || P1[j2-1]!=')')
                        P2[iP2++]=P1[j2-1];
                        if (P1[j2+1]!='(' || P1[j2-1]!=')')
                        P2[iP2++]=P1[j2+1];
                    P2[iP2++]=P1[j2];
                    P3[j2-1]='1';
                    P3[j2]='1';
                    P3[j2+1]='1';
                }
        for  (j2=cmek1[2*j1]+1;j2<cmek1[2*j1+1];j2++)
            if (P3[j2]!='1')
                if (P1[j2]=='+' || P1[j2]=='-')
                {
                    if (P1[j2-1]!='(')
                        P2[iP2++]=P1[j2-1];
                    if (P1[j2-1]!=')')
                        P2[iP2++]=P1[j2-1];
                    if (P1[j2+1]!='(')
                        P2[iP2++]=P1[j2+1];
                    if (P1[j2+1]!=')')
                        P2[iP2++]=P1[j2+1];
                    P2[iP2++]=P1[j2];
                    P3[j2-1]='1';
                    P3[j2]='1';
                    P3[j2+1]='1';
                }
    }
    for (j3=0;j3<iP2;j3++)
        if (P2[j3]!='*' || P2[j3]!='/' || P2[j3]!='-' || P2[j3]!='+')
            if (P2[j3]!='(' || P2[j3]!=')' ) 
                for (j4=j3;j4<iP2;j4++)
                {
                    if (P2[j3]==P2[j4])
                    {
                        for (j5=j3;j5<iP2;j5++)
                            P2[j5]=P2[j5+1];
                        iP2--;
                    }
                    else 
                    {
                        for (j5=j3;j5<iP2;j5++)
                            P2[j5]=P2[j5+1];
                        iP2--;
                    }
                }
    for (j6=iP2;j6>-1;j6++)
        cout<<P2[iP2]<<' ';
    cout<<endl;
    system("pause");
    return 0;
}





Это сообщение отредактировал(а) H0Jlb - 20.5.2010, 18:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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