Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*MoveaOverb : Coloca o bloco a no topo do monte onde está o bloco b
- retornando eventuais blocos que já estiver em sobre a às suas
- posições originais. */
- void MoveAOverB(TBloco *bloco , int a , int b)
- {
- Apontador pA, pB, pAntA , pAntB;
- int listaA;
- int listaB;
- if(a!=b)/*Compara se os blocos são diferentes */
- {
- /*rocura os blocos */
- pA = ProcuraBloco (bloco ,&pAntA,&listaA,a);
- pB = ProcuraBloco (bloco ,&pAntB,&listaB,b);
- if(listaA != listaB) /*Compara se os blocos já não estão na mesma
- lista */
- {
- if(pA != NULL && pB != NULL) /*Compara se há algum b l o c o em cima
- da mesa*/
- {
- if (pA->pProx != NULL) /*Compara se há algum bloco em cima do que
- vaiser movimentado */
- {
- PosOr iginal (bloco,pA->pProx ); /*Retorna o bloco a posição
- original */
- pA->pProx = NULL; /*Faz o ul t imo apontar para NULL*/
- }
- while (pB->pProx != NULL) /* Percor re at é chegar no ultimo da
- lista*/
- {
- pB = pB->pProx;
- }
- pB->pProx = pA; /*Coloca o blocoA em cima da lista de blocos em
- cima de B*/
- (pAntA)->pProx = NULL; /*faz a mesa na posição correpondente ao
- blocoA apontar para NULL*/
- bloco->lista[listaB].pUltimo = pA; /*Faz o ultimo da listaB
- receber o novo ultimo da lista */
- }
- }
- }
- }
- void PileAOntoB(TBloco *bloco , int a , int b)
- {
- Apontador pA, pB, pAntA , pAntB;
- int listaA;
- int listaB;
- if(a!=b) /*Compara se os blocos são diferentes */
- {
- /*Procura os blocos */
- pA = ProcuraBloco (bloco,&pAntA,&listaA,a);
- pB = ProcuraBloco ( bloco ,&pAntB,&l i s t aB , b);
- i f (listaA != listaB) /*Compara se os blocos já não estão na mesma
- lista*/
- {
- if(pA != NULL && pB != NULL) /*Compara se há algum bloco em cima
- da mesa*/
- {
- if (pB->pProx != NULL) /*Compara se há algum b l o c o em cima do que
- vai ser movimentado */
- {
- PosOriginal ( bloco , pB->pProx ); /*Retorna o b l o c o a pos i ção
- original */
- pB->pProx = NULL; /*Faz o ul t imo apontar para NULL*/
- }
- pB->pProx = pA; /*Coloca alista de blocos que estão em cima de
- A em cima do blocoB*/
- (pAntA)->pProx = NULL; /*Faz a mesa na posição correpondent e ao
- blocoA apontar para NULL*/
- }
- }
- }
- }
- void PileAOverB(TBloco *bloco , int a , int b)
- {
- Apontador pA, pB, pAntA , pAntB;
- int listaA;
- int listaB;
- if(a!=b) /*Compara se os blocos são diferentes */
- {
- /*Procura os b l o c o s */
- pA = ProcuraBloco ( bloco ,&pAntA,&listaA,a);
- pB = ProcuraBloco ( bloco ,&pAntB,&listaB,b);
- if(listaA != listaB ) /*Compara se os blocos já não estão na mesma
- lista */
- {
- i f (pA != NULL && pB != NULL) /*Compara se há algum b l o c o em cima
- da mesa*/
- {
- while (pB->pProx != NULL) /* Percor re at é chegar no ul t imo da
- lista */
- {
- pB = pB->pProx;
- }
- pB->pProx = pA;
- (pAntA)->pProx = NULL; /*Faz a mesa na pos i ção cor r epondent e ao
- b l o c o A apontar para NULL*/
- bloco->lista[listaA].pUltimo = pAntA;
- while (pA->pProx != NULL) /* Percor re at é chegar no ul t imo da
- lista */
- {
- pA = pA->pProx;
- }
- bloco->lista[listaB].pUltimo = pA; /*Faz o ultimo da listaB
- receber o novo ultimo da lista */
- }
- }
- }
- }
- void SalvaArquivo (TBloco *bloco , char* file )
- {
- FILE* fp; /*Cria o caminho do ar qui vo*/
- int i;
- Apontador aux;
- fp = fopen (file,"w"); /* Realiza a abertura do arquivo para escrita*/
- for (i=0;i<bloco->tam;i++)
- {
- fprintf(fp,"%d:",i);
- for(aux=bloco->lista[i].pPrimeiro->pProx;aux!=NULL;aux= aux->pProx)
- {
- fprintf(fp,"%d",aux->item.Chave);
- }
- fprintf(fp,"\n");
- }
- fprintf(fp,"\n");
- }
- #include "tblocos.h"
- int main(int argc , char* argv[])
- {
- TBloco bloco;
- char *x , *y;
- int numbloc , bloc1 , bloc2;
- int listaA;
- int listaB;
- FILE * fp;
- fp = fopen ( argv[1], " r " ); /* Realiza a abertura do arquivo e leitura
- dele por linha de comando */
- x = ( char *) mal loc ( sizeof ( char ) *5); /*É multiplicado por cinco , pois
- refere ao tamanho da palavra move + o \0 */
- y = ( char *) mal loc ( sizeof ( char ) *5);
- fscanf(fp, "%d\n" ,&numbloc ); /*Faz aleitura de um dado no arquivo que
- representa o tamanho da mesa */
- CriaListaPadrao(&bloco , numbloc );
- fscanf( fp , "%s %d %s %d\n" ,x,&bloc1 , y,&bloc2 ); /*Faz a leitura dos
- outros dados do arquivo */
- while( ( strcmp (x , "quit"))!=0) /*Compara . Caso seja quit fecha o arquivo
- ,se não entra no while */
- {
- /*Comparações feitas para saber qual movimento será exe cutado pelo
- braço robótico */
- if( ( strcmp (x , "move" ) )==0)
- {
- if( ( strcmp (y , " onto " ) )==0)
- {
- MoveAOntoB(&bloco , bloc1 , bloc2 );
- }
- else
- {
- MoveAOverB(&bloco , bloc1 , bloc2 );
- }
- }
- else
- {
- if( ( strcmp (y , " onto " ) )==0)
- {
- PileAOntoB(&bloco , bloc1 , bloc2 );
- }
- else
- {
- PileAOverB(&bloco , bloc1 , bloc2 );
- }
- }
- fscanf( fp , "%s %d %s %d\n" ,x,&bloc1 , y,&bloc2 );
- }
- fclose ( fp ); /*fecha o arquivo*/
- SalvaArquivo(&bloco , argv [ 2 ] );
- return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement