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: