001: #include<stdio.h>
002: #include<stdlib.h>
003: #include<string.h>
004: 
005: 
006: // struttura a stack per salvare 3 int alla volta
007: struct bivi
008: {
009:   int ind_a[100];
010:   int ind_b[100];
011:   int ind_c[100];
012:   int n;
013: };
014: 
015: void pop(struct bivi *stack, int *ind_a, int *ind_b, int *ind_c);
016: void push(struct bivi *stack, const int ind_a, const int ind_b, const int ind_c);
017: 
018: int main(int argc, char **argv){
019: 
020:   struct bivi stack;
021: 
022:   char a[51], b[51], c[101], dest[101];
023: 
024:   FILE *fp=fopen("intarsi.txt", "r");
025:   if(!fp)
026:   {
027:     perror("");
028:     exit(1);
029:   }
030: 
031:   while(fscanf(fp," %[^,],%[^,],%[^\n]", a,b,c)==3) // devo leggere una stringa fino alla prima virgola esclusa, saltare una virgola, una seconda stringa fino alla prima virgola esclusa, saltare una virgola,
032:                                                     // e leggere la stringa finale fino al primo \n'
033:   {
034:     // ogni volta riazzero lo stack
035:     stack.n=0;
036: 
037:     // questi sono i 3 indici per le stringhe a, b e c. Parto dai primi caratteri ovvero le metto tutte a 0
038:     int ia=0, ib=0, ic=0;
039:     while(ia<strlen(a) && ib<strlen(b)) 
040:     {
041:       //printf("Analizzo [%c] [%c] e voglio ottenere [%c]\n", a[ia], b[ib], c[ic]); //DEBUG
042:       if(c[ic] == ' ')
043:       {
044:   dest[ic]=' ';
045:   ++ic;
046:       }
047:       else if(a[ia] != b[ib] && c[ic]==a[ia])
048:       {
049:   //printf("Prendo A\n"); //DEBUG
050:   dest[ic]='a';
051:   ++ic;
052:   ++ia;
053:       } 
054:       else if(a[ia] != b[ib] && c[ic]==b[ib])
055:       {
056:   //printf("Prendo B\n"); //DEBUG
057:   dest[ic]='b';
058:   ++ic;
059:   ++ib;
060:       }
061:       else if(a[ia] == b[ib] && c[ic]==b[ib])
062:       {
063:   //printf("Provo A\n"); //DEBUG
064:   push(&stack, ia, ib, ic); 
065:   dest[ic]='a';
066:   ++ic;
067:   ++ia;
068:       }
069:       else
070:       {
071:   //printf("Torno indietro e scelgo B\n"); //DEBUG
072:   pop(&stack, &ia, &ib, &ic);
073:   dest[ic]='b';
074:   ++ic;
075:   ++ib;
076: 
077:       }
078:     }
079: 
080:     // completo usando la parte finale delle stringhe A o B
081:     while(ia<strlen(a))
082:     {
083:       dest[ic]='a';
084:       ++ic;
085:       ++ia;
086:     }
087: 
088:     while(ib<strlen(b))
089:     {
090:       dest[ic]='b';
091:       ++ic;
092:       ++ib;
093:     }
094: 
095: 
096:     // fino ad orda in dest[] non avevo una stringa ma solo una serie di caratteri a o b. Trasformo quell'array in stringa mettendo il carattere nullo di terminazione
097:     dest[ic]='\0';
098:     printf("Lo schema che da %s e %s mi porta a %s e' %s\n", a, b, c, dest);
099:   }
100: 
101:   return 0;
102: }
103: 
104: // io ho fatto uno stack in cui metto e tolgo 3 interi alla volta in 3 array separati. Nulla vietava di fare uno stack solo in cui infilare un int alla volta
105: // l'unica accortezza era quella di chiamare le pop in ordine inverso rispetto alle puch (LIFO)
106: void pop(struct bivi *stack, int *ind_a, int *ind_b, int *ind_c)
107: {
108:   if(!stack->n)
109:   {
110:     printf("Errore! tento di leggere elemento da stack vuoto\n");
111:     exit(EXIT_FAILURE);
112:   }
113:   *ind_a=stack->ind_a[stack->n-1];
114:   *ind_b=stack->ind_b[stack->n-1];
115:   *ind_c=stack->ind_c[stack->n-1];
116:   stack->n = stack->n - 1;
117:   
118: }
119: 
120: void push(struct bivi *stack, const int ind_a, const int ind_b, const int ind_c)
121: {
122:   stack->ind_a[stack->n] = ind_a;
123:   stack->ind_b[stack->n] = ind_b;
124:   stack->ind_c[stack->n] = ind_c;
125:   stack->n = stack->n + 1;
126: }
127: 
128: