HRMT Posted May 29, 2012 at 11:02 PM Report #459031 Posted May 29, 2012 at 11:02 PM (edited) Boas pessoal, venho novamente pedir a vossa ajuda agora aqui com as listas ligadas. O que tenho de fazer é : dada uma posição inicial num tabuleiro e uma lista de comandos, determinar a posição final do veiculo desde que o percurso seja valido porque tenho casa bloqueadas. Comecei por fazer uma estrutura para guardar o estado do tabuleiro e depois as funções que executam os comandos (VE - Rodar para esquerda 90ª; VD - Rodar para direita 90º e AV - Avança uma posição) e a função que atualiza. typedef struct s{ int xli; int ycol; struct s *prox; }*Obs, NodoObs; char rodar_direita (char *comando, Tabuleiro *sTabuleiro, Carro c) { int x, y; char direcao; c -> x = x; c -> y = y; if (( strcmp(comando,"VD") == 0) && (direcao == 'C')) grava_pos_tabuleiro (sTabuleiro,x,y,'D'); // D -> Direita if (( strcmp(comando,"VD") == 0) && (direcao == 'B')) grava_pos_tabuleiro (sTabuleiro,x,y,'E'); // E -> Esquerda if (( strcmp(comando,"VD") == 0) && (direcao == 'D')) grava_pos_tabuleiro (sTabuleiro,x,y,'B'); // B -> Baixo if (( strcmp(comando,"VD") == 0) && (direcao == 'E')) grava_pos_tabuleiro (sTabuleiro,x,y,'C'); // C -> Cima return grava_pos_tabuleiro(sTabuleiro,x,y,direcao); } char rodar_esquerda (char *comando, Tabuleiro *sTabuleiro, Carro c) { int x, y; char direcao; c -> x = x; c -> y = y; if (( strcmp(comando,"VE") == 0) && (direcao == 'C')) grava_pos_tabuleiro (sTabuleiro,x,y,'E'); // E -> Esqueda if (( strcmp(comando,"VE") == 0) && (direcao == 'B')) grava_pos_tabuleiro (sTabuleiro,x,y,'D'); // D -> Direita if (( strcmp(comando,"VE") == 0) && (direcao == 'D')) grava_pos_tabuleiro (sTabuleiro,x,y,'C'); // C -> Cima if (( strcmp(comando,"VE") == 0) && (direcao == 'E')) grava_pos_tabuleiro (sTabuleiro,x,y,'B'); // b -> Baixo return grava_pos_tabuleiro(sTabuleiro,x,y,direcao); } char avancar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c) { int x, y; char direcao; c -> x = x; c -> y = y; if (( strcmp(comando,"AV") == 0) && (direcao =='C')) grava_pos_tabuleiro (sTabuleiro,x-1,y,'C'); if (( strcmp(comando,"AV") == 0) && (direcao =='B')) grava_pos_tabuleiro (sTabuleiro,x+1,y,'B'); if (( strcmp(comando,"AV") == 0) && (direcao =='D')) grava_pos_tabuleiro (sTabuleiro,x,y+1,'D'); if (( strcmp(comando,"AV") == 0) && (direcao =='E')) grava_pos_tabuleiro (sTabuleiro,x,y-1,'E'); return grava_pos_tabuleiro(sTabuleiro,x,y,direcao); } void *actualizar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c) { if ( strcmp(comando,"VD") == 0) rodar_direita("VD", sTabuleiro, c); if ( strcmp(comando,"VE") == 0) rodar_esquerda("VE", sTabuleiro, c); if ( strcmp(comando,"AV") == 0) avancar_posicao("AV", sTabuleiro, c); else printf("COMANDO ERRADO\n"); } A minha dúvida é se estou a pensar bem e a fazer bem. E depois precisava de ajuda de como determinar a posição inicial através dos comandos. Se me pudessem dar algum exemplo ou de como o fazer agradecia imenso. Edited May 30, 2012 at 08:15 AM by pmg LP adicionada ao GeSHi
pmg Posted May 30, 2012 at 08:20 AM Report #459061 Posted May 30, 2012 at 08:20 AM Nas funcoes apresentadas, porque é que chamas a função grava_pos_tabuleiro() duas vezes? Chamas primeiro com um dos ifs consoante a direcção e a seguir outra vez como parte do return. Nota: não sei se está bem ou mal (não estudei o teu código suficientemente), mas à primeira vista parece-me, pelo menos, um exagero. Porque é que o objecto onde guardas os dados do tabuleiro é uma lista ligada? Não podia ser um array? Em principio, com um array, as coisas ficam bem mais simples. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
HRMT Posted May 30, 2012 at 12:45 PM Author Report #459135 Posted May 30, 2012 at 12:45 PM Tens razão o return não está a fazer nada eu é que me esqueci de apagar. Sim tens razão com um array é bem mais simples. Obrigado pela ajuda.
HRMT Posted May 30, 2012 at 05:10 PM Author Report #459226 Posted May 30, 2012 at 05:10 PM Boas, estou a fazer como tu disses-te mas esta-me a dar uns avisos na strcmp. Mas era assim que estava s a falar: char det_posicao_final (char comando [], Tabuleiro *sTabuleiro, Carro c) { int i; printf("Insira a lista de comandos: \n"); scanf("%s", &comando[]); char matrix [0 .. sTabuliro -> xlinha-1 , 0 .. sTabuleiro -> ycoluna-1]; char matrix [] = pos_inicial(x,y); for(i = 0; comando[i] != '\0'; i++) { if(strcmp(comando[i],"AV")) avancar_posicao ("AV",sTabuleiro,c); if(strcmp(comando[i],"VD")) rodar_direita ("VD",sTabuleiro,c); if(strcmp(comando[i],"VE")) rodar_esquerda ("VE",sTabuleiro,c); } }
pmg Posted May 30, 2012 at 05:25 PM Report #459230 Posted May 30, 2012 at 05:25 PM char det_posicao_final (char comando [], Tabuleiro *sTabuleiro, Carro c) { int i; printf("Insira a lista de comandos: \n"); scanf("%s", &comando[]); Isto nao é C. char matrix [0 .. sTabuliro -> xlinha-1 , 0 .. sTabuleiro -> ycoluna-1]; Isto nao é C (o ".."). Além disso, a virgula a separar os argumentos, quando muito, serviria como separador de expressoes e nao como definicao de multiplas dimensoes do array. char matrix [] = pos_inicial(x,y); Isto nao é C. for(i = 0; comando[i] != '\0'; i++) { if(strcmp(comando[i],"AV")) avancar_posicao ("AV",sTabuleiro,c); O "comando[ i ]" é um caracter, nao é uma string. A funcao strcmp funciona com strings. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
HRMT Posted May 31, 2012 at 03:38 PM Author Report #459499 Posted May 31, 2012 at 03:38 PM (edited) Não estava mesmo a fazer nada de jeito :s. Podem-me dizer se agora estou a fazer bem? A função só nao está a chamar e a guardar o valor da casa inicial e dentro da função da posição inicial eu tenho lá a direcão do carro. Se me pudessem explicar como posso fazer como usar os valores da posição inicial a gradecia imenso mesmo. E desculpem pelo incomodo. void pos_inicial (Tabuleiro *sTabuleiro, Carro c) { int x, y; char direcao; printf("Qual a casa inicial? \n"); scanf("%d%d", &x, &y); c -> x = x; c -> y = y; printf("Qual a orientação do carro?\n"); printf("(C-Cima / B-Baixo/ D-Direita / E-Esquerda)\n"); scanf("%c" , &direcao); if (((x >= 0) && (x <= sTabuleiro->xlinha )) && ((y >= 0) && (y <= sTabuleiro->ycoluna))) { if (direcao == 'C') grava_pos_tabuleiro (sTabuleiro,x,y,'C'); if (direcao == 'B') grava_pos_tabuleiro (sTabuleiro,x,y,'B'); if (direcao == 'D') grava_pos_tabuleiro (sTabuleiro,x,y,'D'); if (direcao == 'E') grava_pos_tabuleiro (sTabuleiro,x,y,'E'); } else printf("CASA NÃO EXISTE!!!\n"); } char det_posicao_final (Tabuleiro *sTabuleiro, Carro c) { char comando [100]; char *ptr = comando; int i; printf("Insira a lista de comandos: \n"); scanf("%s", comando); for(i = 0; comando[i] =! '\0'; i++) { if( (strcmp(comando,"VD") == 0)) rodar_direita ("VD", sTabuleiro, c); if( (strcmp(comando,"VE") == 0)) rodar_esquerda ("VE", sTabuleiro, c); if( (strcmp(comando,"AV") == 0)) avancar_posicao ("AV", sTabuleiro, c); } } } Edited May 31, 2012 at 05:31 PM by Baderous geshi
HRMT Posted May 31, 2012 at 07:47 PM Author Report #459550 Posted May 31, 2012 at 07:47 PM (edited) se eu criar assim uma estrutura para guardar sempre os valores das casas iniciais } typedef struct inic { int xli_inic; int ycol_inic; char *casa_inic; }Pos; Pos *defenir_casa_inic (int li_inic, int col_inic) { Pos *ptr1 = malloc (sizeof (Pos)); ptr1 -> xli_inic = li_inic; ptr1 -> ycol_inic = col_inic; ptr1 -> casa_inic = malloc (sizeof (char) * li_inic * col_inic); return ptr1; } void destruir_casa_inic (Pos *inic) { free (inic -> casa_inic); free ( inic ); } int linha_inic_tab(Pos *inic) { return inic -> xli_inic; } int coluna_inic_tab(Pos *inic) { return inic -> ycol_inic; } Depois para determinar a posição final posso utilizar a xli_inic e ycol_inic. Estou a pensar bem ou estou a fazer uma estupidez? Edited June 1, 2012 at 08:49 PM by Baderous geshi
HRMT Posted May 31, 2012 at 08:11 PM Author Report #459555 Posted May 31, 2012 at 08:11 PM Se eu na função det_posicao_final usar a função que grava no tabuleiro com os valores da casa inicial. Pode ser assim?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now