Advertisement
Guest User

Untitled

a guest
Aug 18th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1. /*MoveaOverb : Coloca o bloco a no topo do monte onde está o bloco b
  2. retornando eventuais blocos que já estiver em sobre a às suas
  3. posições originais. */
  4. void MoveAOverB(TBloco *bloco , int a , int b)
  5. {
  6. Apontador pA, pB, pAntA , pAntB;
  7. int listaA;
  8. int listaB;
  9. if(a!=b)/*Compara se os blocos são diferentes */
  10. {
  11. /*rocura os blocos */
  12. pA = ProcuraBloco (bloco ,&pAntA,&listaA,a);
  13. pB = ProcuraBloco (bloco ,&pAntB,&listaB,b);
  14. if(listaA != listaB) /*Compara se os blocos já não estão na mesma
  15. lista */
  16. {
  17. if(pA != NULL && pB != NULL) /*Compara se há algum b l o c o em cima
  18. da mesa*/
  19. {
  20. if (pA->pProx != NULL) /*Compara se há algum bloco em cima do que
  21. vaiser movimentado */
  22. {
  23. PosOr iginal (bloco,pA->pProx ); /*Retorna o bloco a posição
  24. original */
  25. pA->pProx = NULL; /*Faz o ul t imo apontar para NULL*/
  26. }
  27. while (pB->pProx != NULL) /* Percor re at é chegar no ultimo da
  28. lista*/
  29. {
  30. pB = pB->pProx;
  31. }
  32. pB->pProx = pA; /*Coloca o blocoA em cima da lista de blocos em
  33. cima de B*/
  34. (pAntA)->pProx = NULL; /*faz a mesa na posição correpondente ao
  35. blocoA apontar para NULL*/
  36. bloco->lista[listaB].pUltimo = pA; /*Faz o ultimo da listaB
  37. receber o novo ultimo da lista */
  38. }
  39. }
  40. }
  41. }
  42.  
  43. void PileAOntoB(TBloco *bloco , int a , int b)
  44. {
  45. Apontador pA, pB, pAntA , pAntB;
  46. int listaA;
  47. int listaB;
  48. if(a!=b) /*Compara se os blocos são diferentes */
  49. {
  50. /*Procura os blocos */
  51. pA = ProcuraBloco (bloco,&pAntA,&listaA,a);
  52. pB = ProcuraBloco ( bloco ,&pAntB,&l i s t aB , b);
  53. i f (listaA != listaB) /*Compara se os blocos já não estão na mesma
  54. lista*/
  55. {
  56. if(pA != NULL && pB != NULL) /*Compara se há algum bloco em cima
  57. da mesa*/
  58. {
  59. if (pB->pProx != NULL) /*Compara se há algum b l o c o em cima do que
  60. vai ser movimentado */
  61. {
  62. PosOriginal ( bloco , pB->pProx ); /*Retorna o b l o c o a pos i ção
  63. original */
  64. pB->pProx = NULL; /*Faz o ul t imo apontar para NULL*/
  65. }
  66. pB->pProx = pA; /*Coloca alista de blocos que estão em cima de
  67. A em cima do blocoB*/
  68. (pAntA)->pProx = NULL; /*Faz a mesa na posição correpondent e ao
  69. blocoA apontar para NULL*/
  70. }
  71. }
  72. }
  73. }
  74.  
  75. void PileAOverB(TBloco *bloco , int a , int b)
  76. {
  77. Apontador pA, pB, pAntA , pAntB;
  78. int listaA;
  79. int listaB;
  80. if(a!=b) /*Compara se os blocos são diferentes */
  81. {
  82. /*Procura os b l o c o s */
  83. pA = ProcuraBloco ( bloco ,&pAntA,&listaA,a);
  84. pB = ProcuraBloco ( bloco ,&pAntB,&listaB,b);
  85. if(listaA != listaB ) /*Compara se os blocos já não estão na mesma
  86. lista */
  87. {
  88. i f (pA != NULL && pB != NULL) /*Compara se há algum b l o c o em cima
  89. da mesa*/
  90. {
  91. while (pB->pProx != NULL) /* Percor re at é chegar no ul t imo da
  92. lista */
  93. {
  94. pB = pB->pProx;
  95. }
  96. pB->pProx = pA;
  97. (pAntA)->pProx = NULL; /*Faz a mesa na pos i ção cor r epondent e ao
  98. b l o c o A apontar para NULL*/
  99. bloco->lista[listaA].pUltimo = pAntA;
  100. while (pA->pProx != NULL) /* Percor re at é chegar no ul t imo da
  101. lista */
  102. {
  103. pA = pA->pProx;
  104. }
  105. bloco->lista[listaB].pUltimo = pA; /*Faz o ultimo da listaB
  106. receber o novo ultimo da lista */
  107. }
  108. }
  109. }
  110. }
  111.  
  112. void SalvaArquivo (TBloco *bloco , char* file )
  113. {
  114. FILE* fp; /*Cria o caminho do ar qui vo*/
  115. int i;
  116. Apontador aux;
  117. fp = fopen (file,"w"); /* Realiza a abertura do arquivo para escrita*/
  118. for (i=0;i<bloco->tam;i++)
  119. {
  120. fprintf(fp,"%d:",i);
  121. for(aux=bloco->lista[i].pPrimeiro->pProx;aux!=NULL;aux= aux->pProx)
  122. {
  123. fprintf(fp,"%d",aux->item.Chave);
  124. }
  125. fprintf(fp,"\n");
  126. }
  127. fprintf(fp,"\n");
  128. }
  129.  
  130.  
  131. #include "tblocos.h"
  132. int main(int argc , char* argv[])
  133. {
  134. TBloco bloco;
  135. char *x , *y;
  136. int numbloc , bloc1 , bloc2;
  137. int listaA;
  138. int listaB;
  139. FILE * fp;
  140. fp = fopen ( argv[1], " r " ); /* Realiza a abertura do arquivo e leitura
  141. dele por linha de comando */
  142. x = ( char *) mal loc ( sizeof ( char ) *5); /*É multiplicado por cinco , pois
  143. refere ao tamanho da palavra move + o \0 */
  144. y = ( char *) mal loc ( sizeof ( char ) *5);
  145. fscanf(fp, "%d\n" ,&numbloc ); /*Faz aleitura de um dado no arquivo que
  146. representa o tamanho da mesa */
  147. CriaListaPadrao(&bloco , numbloc );
  148. fscanf( fp , "%s %d %s %d\n" ,x,&bloc1 , y,&bloc2 ); /*Faz a leitura dos
  149. outros dados do arquivo */
  150. while( ( strcmp (x , "quit"))!=0) /*Compara . Caso seja quit fecha o arquivo
  151. ,se não entra no while */
  152. {
  153. /*Comparações feitas para saber qual movimento será exe cutado pelo
  154. braço robótico */
  155. if( ( strcmp (x , "move" ) )==0)
  156. {
  157. if( ( strcmp (y , " onto " ) )==0)
  158. {
  159. MoveAOntoB(&bloco , bloc1 , bloc2 );
  160. }
  161. else
  162. {
  163. MoveAOverB(&bloco , bloc1 , bloc2 );
  164. }
  165. }
  166. else
  167. {
  168. if( ( strcmp (y , " onto " ) )==0)
  169. {
  170. PileAOntoB(&bloco , bloc1 , bloc2 );
  171. }
  172. else
  173. {
  174. PileAOverB(&bloco , bloc1 , bloc2 );
  175. }
  176. }
  177. fscanf( fp , "%s %d %s %d\n" ,x,&bloc1 , y,&bloc2 );
  178. }
  179. fclose ( fp ); /*fecha o arquivo*/
  180. SalvaArquivo(&bloco , argv [ 2 ] );
  181. return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement