Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. typedef struct
  6. {
  7.     int sigla;
  8.     int Na;
  9.     char* antecedenti;
  10.     char conseguente;
  11. }regola;
  12.  
  13. void stampa(regola**,int,int,char*);
  14. void deduzione (regola**,int,char*,int*,int*,int*,char*,int*,int*,int*,int*,int*,int,int,int*,int);
  15.  
  16.  
  17.  
  18.  
  19. int main()
  20. {
  21.     int Nr,i,j,Nc,Nco;
  22.     int a = 0, b = 0, c = 1,d = 0, e = 0;
  23.     int  *usate=NULL,*ind_reg=NULL,*rit=NULL,*eseguibile;
  24.     char antecedente,pulizia;
  25.     char *arrivo,*conosciuti;
  26.     regola **regole;
  27.     eseguibile = &a;
  28.     *eseguibile = 1;
  29.     fflush(stdin);
  30.  
  31.     printf("Inserirci il numero di regole: ");
  32.     scanf("%d",&Nr);
  33.     arrivo = (char*) malloc(sizeof(char));
  34.     regole = (regola**) malloc(Nr*sizeof(regola*));
  35.     for(i=0;i<Nr;i++)
  36.         regole[i] = (regola*) malloc(sizeof(regola));
  37.         //Input
  38.     printf("\n\nInserisci le regole\n");
  39.     for(i=0;i<Nr;i++)
  40.     {
  41.         printf("\tRegola %d\n",i+1);
  42.         regole[i]->sigla = i+1;
  43.         printf("Inserisci il numero di antecedenti: ");
  44.         scanf("%d",&regole[i]->Na);
  45.         for(j=0;j<regole[i]->Na;j++)
  46.             regole[i]->antecedenti = (char*) malloc(regole[i]->Na*sizeof(char));
  47.         printf("Inserisci gli antecedenti:\n");
  48.         for(j=0;j<regole[i]->Na;j++)
  49.         {
  50.            do
  51.            {
  52.             pulizia=getchar();
  53.            }while(pulizia!='\n' && pulizia!=EOF);
  54.            printf("Antecedente %d: ",j+1);
  55.            scanf("%c",&regole[i]->antecedenti[j]);
  56.  
  57.         }
  58.         do
  59.         {
  60.             pulizia=getchar();
  61.         }while(pulizia!='\n' && pulizia!=EOF);
  62.         printf("Inserisci il conseguente: ");
  63.         scanf("%c",&regole[i]->conseguente);
  64.  
  65.  
  66.     }
  67.     printf("Inserisci il numero di elementi conosciuti: ");
  68.     scanf("%d",&Nc);
  69.     Nco = Nc;
  70.     conosciuti = (char*) malloc(Nc*sizeof(char));
  71.     for(i=0;i<Nc;i++)
  72.     {
  73.         printf("Elemento %d:",i+1);
  74.         do
  75.         {
  76.             pulizia=getchar();
  77.         }while(pulizia!='\n' && pulizia!=EOF);
  78.         scanf("%c",&conosciuti[i]);
  79.  
  80.     }
  81.     //stampa(regole,Nr,Nc,conosciuti);
  82.     printf("Inserisci l'elemento da cercare:");
  83.         do
  84.         {
  85.             pulizia=getchar();
  86.         }while(pulizia!='\n' && pulizia!=EOF);
  87.     scanf("%c",&arrivo[0]);
  88.     deduzione (regole, Nr,arrivo,usate,ind_reg,rit,conosciuti, &d, &b, &c, &Nc, &e, 0, 0,eseguibile,Nco);
  89.     printf("Hello World");
  90.  
  91.     for(i=0;i<Nr;i++)
  92.     {
  93.         free(regole[i]->antecedenti);
  94.         free(regole[i]);
  95.     }
  96.     free(regole);
  97.     free(arrivo);
  98.     free(conosciuti);
  99.     free(usate);
  100.     free(rit);
  101.     free(ind_reg);
  102.  
  103.     return 0;
  104. }
  105.  
  106. void stampa(regola** regole,int Nr,int Nc,char*conosciuti)
  107. {
  108.     int i,j;
  109.     for(i=0;i<Nr;i++)
  110.     {
  111.         printf("\n\nRegola:%d\n",regole[i]->sigla);
  112.         printf("Antecedenti: ");
  113.         for(j=0;j<regole[i]->Na;j++)
  114.             printf("%c ",regole[i]->antecedenti[j]);
  115.             printf("\nConseguente: %c\n",regole[i]->conseguente);
  116.  
  117.  
  118.     }
  119.  
  120.     printf("\n\nElementi conosciuti:");
  121.     for(i=0;i<Nc;i++)
  122.         printf("%c ",conosciuti[i]);
  123.  
  124.  
  125.  
  126. }
  127.  
  128.  
  129. void deduzione(regola **regole,int Nr,char*arrivo,int*usate,int*ind_reg,int*rit,char*conosciuti,int *dim_usate,int *dim_ind_reg,int* dim_arrivo,int* dim_conosciuti,int *dim_rit,int x,int y,int *eseguibile,int Nco)
  130. {
  131.     int i,j,k;
  132.     if(!*dim_arrivo)
  133.      return;
  134.     printf("Sto cercando:%c\n",arrivo[*dim_arrivo-1]);
  135.     printf("Sono su:%d\n",x);
  136.     printf("Dim_arrivo:%d\n",*dim_arrivo);
  137.     printf("Dim_ritorno:%d\n",*dim_rit);
  138.     printf("Dim_ind_reg:%d\n",*dim_ind_reg);
  139.     printf("Dim_usate:%d\n",*dim_usate);
  140.     *eseguibile = 1;
  141.     if(!*dim_arrivo)
  142.         return;
  143.     if(x>=Nr)
  144.     {
  145.         if(*dim_ind_reg)
  146.         {
  147.             arrivo = (char*) realloc(arrivo,--*dim_arrivo*sizeof(char));
  148.             *dim_ind_reg -=1;
  149.             if(*dim_ind_reg == 0)
  150.             ind_reg = NULL;
  151.             else
  152.             ind_reg = (int*) realloc(ind_reg,*dim_ind_reg*sizeof(int));
  153.             *eseguibile = 0;
  154.             return;
  155.  
  156.         }
  157.         arrivo = (char*) realloc(arrivo,--*dim_arrivo*sizeof(char));
  158.         *dim_rit -= 1;
  159.         if(*dim_rit == 0)
  160.         rit = NULL;
  161.         else
  162.         rit = (int*) realloc(rit,*dim_rit*sizeof(int));
  163.         if(*dim_rit>0)
  164.         x = 1+rit[*dim_rit-1];
  165.  
  166.     }
  167.     else
  168.     {
  169.     if(!*dim_arrivo)
  170.         return;
  171.     if(regole[x]->conseguente != arrivo[*dim_arrivo-1])
  172.     x++;
  173.     else
  174.     {
  175.     rit = (int*) realloc(rit,++*dim_rit*sizeof(int));
  176.     rit[*dim_rit-1] = x;
  177.     for(j = 0; j<regole[x]->Na; j++)
  178.     {
  179.         for(i = 0; i<*dim_conosciuti; i++)
  180.             if(regole[x]->antecedenti[j] == conosciuti[i])
  181.                 break;
  182.         if(i == *dim_conosciuti)
  183.         {
  184.             ind_reg = (int*) realloc(ind_reg,++*dim_ind_reg*sizeof(int));
  185.             ind_reg[*dim_ind_reg-1] = j;
  186.             arrivo = (char*) realloc(arrivo,++*dim_arrivo*sizeof(char));
  187.             arrivo[*dim_arrivo-1] = regole[x]->antecedenti[j];
  188.             deduzione(regole,Nr,arrivo,usate,ind_reg,rit,conosciuti,dim_usate,dim_ind_reg,dim_arrivo,dim_conosciuti,dim_rit,0,0,eseguibile,Nco);
  189.             if(!*eseguibile)
  190.             {
  191.                 x += 1;
  192.                 *dim_rit -= 1;
  193.                 if(*dim_rit == 0)
  194.                 rit = NULL;
  195.                 else
  196.                 rit = (int*) realloc(rit,*dim_rit*sizeof(int));
  197.                 break;
  198.             }
  199.             else
  200.             {
  201.                 j = ind_reg[*dim_ind_reg-1];
  202.                 *dim_ind_reg -=1;
  203.                 if(*dim_ind_reg == 0)
  204.                 ind_reg = NULL;
  205.                 else
  206.                 ind_reg = (int*) realloc(ind_reg,*dim_ind_reg*sizeof(int));
  207.  
  208.             }
  209.  
  210.         }
  211.  
  212.     }
  213.     if (*eseguibile)
  214.     {
  215.         if(regole[x]->conseguente != arrivo[0])
  216.         {
  217.         conosciuti = (char*) realloc(conosciuti, ++*dim_conosciuti*sizeof(char));
  218.         conosciuti[*dim_conosciuti-1] = regole[x]->conseguente;
  219.         }
  220.         usate = (int*) realloc(usate, ++*dim_usate*sizeof(int));
  221.         printf("Regole sigla:%d\n",regole[x]->sigla);
  222.         usate[*dim_usate-1] = regole[x]->sigla;
  223.         if(*dim_ind_reg)
  224.             return;
  225.         if(! *dim_ind_reg)
  226.         {
  227.             printf("Dim_usate prima della stampa:%d\n",*dim_usate);
  228.             printf("Elenco regole:");
  229.             for(i = 0; i < *dim_usate; i++)
  230.                 printf("%d ",usate[i]);
  231.             if(Nco < *dim_conosciuti)
  232.             conosciuti = (char*) realloc(conosciuti,--*dim_conosciuti*sizeof(char));
  233.             x = 1+rit[*dim_rit-1];
  234.             *dim_rit -= 1;
  235.             if(*dim_rit == 0)
  236.             rit = NULL;
  237.             else
  238.             rit = (int*) realloc(rit,*dim_rit*sizeof(int));
  239.             *dim_usate -= 1;
  240.             if(*dim_usate == 0)
  241.             usate = NULL;
  242.             else
  243.             usate = (int*) realloc(usate,*dim_usate*sizeof(int));
  244.             printf("\n\n:");
  245.  
  246.         }
  247.  
  248.  
  249.       }
  250.  
  251.      }
  252.     }
  253.  
  254.     deduzione (regole,Nr,arrivo,usate,ind_reg,rit,conosciuti,dim_usate,dim_ind_reg,dim_arrivo,dim_conosciuti,dim_rit,x,y,eseguibile,Nco);
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement