Poziomy zagnieżdzeń elementów formuły logicznej

0

Witam mam problem z obliczaniem poziomu zagniezdzenia elementow w formule logicznej a mianowicie jak interpretowac wyrazenia n(......) bo przy kilku nawiasach i wiekszej ilosci negacji mi sie krzaczy jesli jest jedna negacja to jest ok np (2i2)i(2i(n3)) jest 0 1 1 1 0 0 0 1 1 1 3 3 1 0 i wszystko sie zgadza. Nie musicie podawac gotowego kodu sam jestem sobie stanie to napisac jezeli w miare jasno ktos wyjasni mi gdzie tkwi blad w moim roumowaniu

zeby bardziej zrozumiec o co mi chodzi http://sphere.pl/~skalar/LiTM/litm02.pdf
strona 2G

z gory dzieki za pomoc

//a-koniunkcja
//o-alternatywa
//n-negacja
//i-implikacja
//e-rownowaznosc

wpiszcie sobie na przyklad 000000000000000000<enter> i formule (n(2i(n3)))

wyjdzie 0 2 2 3 3 3 5 5 3 1 0

a powinno byc 0 2 2 3 3 3 5 5 3 2 0

dodam tylko ze poziom zagniezdzenia samej negacji i wyrazen ~q (czyli w programie nX) nalezy wiekszyc o 1


#include <iostream.h>
#include <conio.h>

char tabela[10000];
char formula[10000];
char buf_formula[10000];
int zagniezdzenia[10000];
int nawias[10000];
int cnt=0;
int neg=0;
int zonk=0;

void zamiana_na_zero_jeden();
void zagniezdzenia_obl();

int main()
{

while (scanf("%s", &tabela)!=EOF)
{
scanf("%s", &formula);
          
zamiana_na_zero_jeden();
 
zagniezdzenia_obl();
                       
            
   
 cout << buf_formula <<"\n";
 
for(int w=0;w<strlen(buf_formula);w++) cout << zagniezdzenia[w]<<" ";

    

}



return 0;
}



void zamiana_na_zero_jeden()
{
     
int buf=0;
char cyferka[1];

       for(int i=0;i<strlen(formula);i++)
            {   
               cyferka[0]=formula[i];  
               if(isdigit(formula[i]))
               {
                                   
               int buf = atoi (cyferka);
               buf_formula[i]=tabela[buf];
               
               }
               else buf_formula[i]=formula[i];       
            }
}

void zagniezdzenia_obl()
{
//-----------------obliczanie zagniezdzen --------------------

for (int e=0; e<strlen(buf_formula);e++)
    {
         
            
         if(buf_formula[e]=='n')
          {
           neg++;;                      
           cnt++;
           zagniezdzenia[e]=cnt;
          }
          
         
  
         else if(buf_formula[e]=='(')
          {
          zagniezdzenia[e]=cnt;
           cnt++;

           
          }
    
         else if(buf_formula[e]==')')
          {
            cnt--;      
            if(neg>0)
            {
                     neg--;
                     cnt--;
            }    
           zagniezdzenia[e]=cnt;
          }
          
          else zagniezdzenia[e]=cnt;          
         
     }
cnt=0;   
neg=0;

//--------------koniec obliczania zagniezdzen-----------------------
}


0

reagujesz na wystapienie konkretnego znaku z ewentualna poprawka na "wlaczenie" negacji.. spojrzmy:

(n(2i(n3)))

krok po kroku:

start - cnt=0 neg=0
(n(2i(n3)))
???????????

jest nawias: [] = cnt = 0, cnt++ =1
(n(2i(n3)))
0??????????

jest n: cnt++ =2 , neg++ =1, []=cnt=2
(n(2i(n3)))
02?????????

jest nawias: [] = cnt = 2, cnt++ =3
(n(2i(n3)))
022????????

jest 2i:  [] = cnt = 3
(n(2i(n3)))
02233??????

jest nawias: [] = cnt = 3, cnt++ =4
(n(2i(n3)))
022333?????

jest n: cnt++ =5 , neg++ =2, []=cnt=5
(n(2i(n3)))
0223335????

jest i: []=cnt=5
(n(2i(n3)))
02233355???

jest ): cnt--=4, neg>0 => {cnt--=3,neg--=1}, []=cnt=3
(n(2i(n3)))
022333553??

jest ): cnt--=2, neg>0!!! => {cnt--=1!!!, neg--=0}, []=cnt=1!!!
(n(2i(n3)))
0223335531?

jest ): cnt--=0, neg==0 => {}, []=cnt=0
(n(2i(n3)))
02233355310

wykrzykniki powinny Ci wszystko wyjasnic

spoiler:
nie mozesz reagowac na samo "ze negacja jest wlaczona". to ze jest ) i ze neg>0 nie oznacza, ze ten nawias zamyka negacje! pierwszy nawias ')' zamyka negacje n3, ale zwroc uwage, ze drugi nawias ')' jest dla 2i a dopiero trzeci zamyka negacje pierwsza! seria ifow ktore opracowales, poprzez warunek neg>0 traktuje nawias drugi jako zamkniecie negacji. jest to blad.

jesli nie wiesz o czym mowie, przesledz jak Twoj program przetwarza:
( n((n1)2i(3i4))i5 ) )
zamkniecie nawiasu po n1 prawidlowo zmniejszy stan zagneizdzenia
natomiast zamkniecie nawiasu po 4ce nieprawidlowo, poniewaz podczas niego NEG jest > 0 i sie odpali zamkniecie negacji, ale przeciez negacja zamyka sie dopiero po i5..</span>
/spoiler

a tak w ogole.. czemu nie posluchales skryptu i nie zrobiles tego na ONP i stosie? bylo by Ci latwiej pewnie..

1 użytkowników online, w tym zalogowanych: 0, gości: 1