rkd 0 Denunciar post Postado Abril 22, 2011 Olá, - Estou aprendendo a programar em C então ainda é comun alguns erros de lógica realmente. O codigo abaixo é fruto de algumas tentativas e de suporte com algumas pessoas, porém ainda não esta como desejo. - Preciso que a matriz seja mostrada com 10 numeros lixos que no caso seria o 3, no codigo abaixo nem sempre quando rodado ele me retorna 10 numeros 3(Algumas vezes 7,8,9) o Mesmo acontece com o 9 que seria o obstáculo. - Provavelmente esses valores estão vindo randomicamente, porém necessito que seja fixos: Dez numeros 3 e nove numero 9. Sendo assim preciso de uma Matriz 10x10 que me retorne aleátoriamente: - 10 numeros 3(Aleatorios na matriz, que seria o lixo) - 9 numeros 9(Seria obstaculos em lugares aletarios na matriz tb) - Depois da matriz pronta terei que procurar pelos lixos e nao poderei passar pelos obstáculos. Segue o codigo abaixo, espero que alguem possa ajudar. #include <stdio.h> #include <stdlib.h> #include <time.h> float vet[10][10]; main() { int i,j,num,numdois; srand(time(NULL)); for(j=0;j<11;j++) { num = rand() % 10; numdois = rand() % 10; vet[num][numdois]=9; if (j<10) vet[numdois][num]=3; } for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } printf("\n"); } system ("pause"); } Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 22, 2011 O usuário pediu, via pm, que eu removesse o tópico pra evitar "colas" dos colegas da faculdade... Trouxe o tópico pra cá, pro caso de alguém discordar da remoção. Acho que seria bom cobrir isso no regulamento do fórum (eu, particularmente, sou contra remover conteúdo à toa... penso que a condição para que o fórum sirva como fonte de auxílio seja que o conteúdo gerado fique disponível a todos). guidjos Se você imprimir os valores que aparecem no rand ´para num e numdois veria o problema. eu imprimi uma vez e obtive os seguintes valores : num numdois 9 5 9 4 9 2 7 7 4 9 6 8 5 6 3 2 2 1 6 3 Repare que os valores sorteados no segundo caso são o inverso dos valores sorteados no quinto. Vai escrever por cima. E repare também no quarto caso, os dois valores são iguais e vão escrever no mesmo lugar. Pode acontecer de não repetir células, mas é muito provável que acontece pelo menos uma repetição. O que você poderia fazer é verificar se tal célula da matriz já possui algum valor armazenado. Se já possuir realiza novo sorteio de célula. Outra dica não relacionada ao problema é que você não precisa fazer a comparação: if (j<10) vet[numdois][num]=3; se colocar o valor de parada no FOR j < 10 em vez de j < 11 Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 22, 2011 Se você imprimir os valores que aparecem no rand ´para num e numdois veria o problema. eu imprimi uma vez e obtive os seguintes valores : num numdois 9 5 9 4 9 2 7 7 4 9 6 8 5 6 3 2 2 1 6 3 Repare que os valores sorteados no segundo caso são o inverso dos valores sorteados no quinto. Vai escrever por cima. E repare também no quarto caso, os dois valores são iguais e vão escrever no mesmo lugar. Pode acontecer de não repetir células, mas é muito provável que acontece pelo menos uma repetição. O que você poderia fazer é verificar se tal célula da matriz já possui algum valor armazenado. Se já possuir realiza novo sorteio de célula. Outra dica não relacionada ao problema é que você não precisa fazer a comparação: if (j<10) vet[numdois][num]=3; se colocar o valor de parada no FOR j < 10 em vez de j < 11 E pra fazer a procura dos dados da matriz levando em consideração que SE encontrar o 9 deve fazer outro caminho (a volta) e continuar, você poderia me indicar qual função ou comando utilizar, existem algu comando que deixe isso prático? Grato. Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 22, 2011 Esse é um problema de pathfinding, existem alguns algoritmos para isso, mas eu considero de dificuldade moderada pra cima. Os mais utilizado é esse -> http://www.policyalmanac.org/games/aStarTutorial_port.htm E sempre se pode recorrer a velha força bruta, que consiste em tentar todos os caminhos possíveis e retornar aquele em que menos células foram necessárias. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 23, 2011 Então estive fazendo uns teste depois das dicas que você me passou e acabei ficando com dúvidas: Estarei comendando as duvidas dentro do code. for(j=0;j<10;j++) \\ Este laço vai de 0 a 10. { num = rand() % 10; \\ Aqui procedimento normal de conseguir um numero aleatorio de 0 ate 10 ja que vetor é 10x10 numdois = rand() % 10; vet[num][numdois]=9; \\ [b]Agora a duvida:[/b] você falou que [b]num[/b] não pode ser igual à [b]numdois[/b] , porém neste caso você está atribuindo o numero 9 na posição [4][4] 4linha 4coluna ali será atribuido o valor 9 certo? Então quando passa pra segunda parte(do 3) acaba repetindo a célula. if (j<10) \\ Aqui enquanto j menor que 10 continua... vet[numdois][num]=3; } for(i=0;i<10;i++) \\ { for(j=0;j<10;j++) \\ { printf("%.f ",vet[i][j]); } printf("\n"); } system ("pause"); } Sendo assim fiz da seguinte maneira: if (j < 10) if (num != dumdois) Claro esse eleminaria vetores do tipo [4][4] Mas não consegui de outro modo, ainda sim tive porcentagens de perdas... Se puder me da uma luz, esse é o primeiro passo do trabalho se ficar "meia boca" fica mal :( Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 23, 2011 Quis dizer antes que esta comparação: if (j < 10) é desnecessária, pois o j nunca vai ser maior 10. E não aconselho isso: if (num != numdois) Porque não é um problema que sejam iguais, é uma célula como qualquer outra. O problema é garantir que nenhum lixo (3) ou obstáculo (9) vão ser colocados em uma célula já ocupada. Então a lógica seria: Sorteia uma linha e uma coluna na matriz enquanto uma célula vaga não for encontrada. Você pode ter um resultado melhor se fizer isso para cada tipo dado que quer colocar na matriz, no seu caso duas vezes, uma para o lixo e outra para o obstáculo. for(j=0;j<10;j++) { do { num = rand() % 10; numdois = rand() % 10; }while(vet[num][numdois] != 0); vet[num][numdois]=9; do { num = rand() % 10; numdois = rand() % 10; }while(vet[numdois][num] != 0); vet[numdois][num]=3; } Esse código vai fazer o que você quer, e é possível deixa-lo mais otimizado, fazendo tudo dentro de um único do while. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 26, 2011 Existe alguma forma mais simples de fazer essa procura? Estive vendo um exemplo quase completo onde a pessoa desenvolveu a matriz tipo string, é possivel tornar essa busca mais simples? Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 26, 2011 Provelmente tenha modos mais simples, e acho q char ou int nesse caso nao muda muito a solução, pois em vez de vetor de int vai ser de char.. nao vejo muita diferença... Achei uma coisa que talvez de interesse, http://fabricio.skooterweb.com/trabalhos/labirinto.pdf Caso esse link não te ajude... Tive uma ideia aqui, mas nem testei e talvez nao funcione em todos os casos. O que você pode fazer é assim. Lixeiro sai na posição 0,0 da matriz, lixo está na posição 3,3. Então você sabe que tem que andar 3 casas pra frente e e 3 casas abaixo ( supondo que seja proibido movimento diagonal ). São 6 movimentos. Escolha qual movimento tem prioridade, se horizontal ou vertical e comece a testar se pode fazer o movimento. Sendo x e y a posição do lixeiro na matriz. If ( vet[x+1][y] == 0) //move horizontalmente else if (vet[x][y+1] == 0) //move verticalmente Logicamente se ambas as direções estiverem bloqueadas vai ter que pensar em outra solução. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 26, 2011 Estava fazendo uns testes aqui e notei um problema, não consigo escrever na primeira linha. Confeço que ainda não consegui entender como fazer o rastreamente celula por celula então estava tetando encher o programa de SE pra tentar capturar as celulas onde tivessem 3 e 9, depois iria fazer uma repetição para isso e ir preenchendo com numeros 1 para toda casa 0 porém me daparei com um problema. if(vet[0][0] == 0){ vet[0][0]=1; } Não estou conseguindo escrever nada na primeira linha, seja na 0,0 | 0,1 | 0,2.... As outras estão normais, qual seria o motivo? Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 26, 2011 Nesse trecho de código que você postou não tem nada de errado. Só se nessa posição não exista um zero, ai ele não ai escrever nada mesmo. Melhor postar todo o código. Só tenha certeza que não é nenhum tipo de lixo de memória. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 26, 2011 Nesse trecho de código que você postou não tem nada de errado. Só se nessa posição não exista um zero, ai ele não ai escrever nada mesmo. Melhor postar todo o código. Só tenha certeza que não é nenhum tipo de lixo de memória. #include <stdio.h> #include <stdlib.h> #include <time.h> float vet[10][10]; main() { int i,j,num,numdois,x,y; srand(time(NULL)); for(j=0;j<10;j++) { do { num = rand() % 10; numdois = rand() % 10; }while(vet[num][numdois] != 0); vet[num][numdois]=9; do { num = rand() % 10; numdois = rand() % 10; }while(vet[numdois][num] != 0); vet[numdois][num]=3; } for(i=0;i<10;i++ { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } if((vet[i][j] == 9) || (vet[i][j] == 3)){ printf("Elemento [%f][%f]", i, j); } if(vet[0][0] == 0){ vet[0][0]=1; } printf("\n"); } system ("pause"); } Lembro que intenção principal é sobre escrever os numeros 3 com algo e de preferencia havendo um delay por exemplo. Peço que se alguem tenha a solução porfavor poste meu tempo está acabando .__. Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 26, 2011 Sempre indente seu código, fica mais fácil para você e para os outros lerem. Veja o que acontece nesse trecho de seu código: for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } if((vet[i][j] == 9) || (vet[i][j] == 3)){ printf("Elemento [%d][%d]", i, j); } if(vet[0][0] == 0){ vet[0][0]=1; } printf("\n"); } O laço começa com i = 0, entao entra no for do j, imprime toda uma linha e sai do for j com j = 10, seu J SEMPRE é avaliado como 10 apartir dali. O seu: if((vet[i][j] == 9) || (vet[i][j] == 3)){ printf("Elemento [%d][%d]", i, j); } Compara a posição [10] ( sendo o i variavel de 0 a 9). Compara uma posição que nem existe no seu array. Outra coisa, i e j foram declarados como int, use %d se for imprimir sua saída com printf. E quando você atribui: if(vet[0][0] == 0){ vet[0][0]=1; } Isso funciona, na posição [0][0] vai ter um 1 se o valor anterior era 0, só que você não imprime mais pra ver, ja que seu i vai assumir valor 1 no próximo laço. É só colocar um printf no final do programa, ou mandar reimprimir a matriz que você verá. Qual era sua intenção nessa parte do código? Listar todas as posições com lixos e obstáculos? Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 26, 2011 #include <stdio.h> #include <stdlib.h> #include <time.h> float vet[10][10]; main() { int i,j,num,numdois,x,y; srand(time(NULL)); for(j=0;j<10;j++) { do { num = rand() % 10; numdois = rand() % 10; }while(vet[num][numdois] != 0); vet[num][numdois]=9; do { num = rand() % 10; numdois = rand() % 10; }while(vet[numdois][num] != 0); vet[numdois][num]=3; } for(i=0;i<10;i++ { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } printf("\n"); } system ("pause"); } Ignore as partes anteriores leve em consideração apenas este. Se eu fizer um SE vet[0][0] == 0 e tentar jogar vet[0][0] = 1 Simplesmente ele não escreve nada nesta posição, se puder verificar porfavor. if(vet[0][0] == 0){ vet[0][0]=1; } (ele nao escreve sobre a posição de nenhuma celula da linha 0.) O objetivo é apenas com um pequeno delay e ir substituindo os 0 por 1, indentificar onde está os 3 e substitui-lo também além de desviar dos obstáculos, eu preciso disso ou pelo menos entender como fazer, o problema é que o professor não deu nomes funções pra isso, talvez seja possivel fizer com um while, if, mas não to conseguindo justamente por causa desse erro que setei acima, logo no inicio já tem algo errado. Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 26, 2011 Rode esse o código e veja você mesmo que se vet[0][0] for 0 ele VAI substituir por 1. Se for 3 ou 9 ele vai deixar como está. #include <stdio.h> #include <stdlib.h> #include <time.h> float vet[10][10]; main() { int i,j,num,numdois,x,y; srand(time(NULL)); for(j=0;j<10;j++) { do { num = rand() % 10; numdois = rand() % 10; }while(vet[num][numdois] != 0); vet[num][numdois]=9; do { num = rand() % 10; numdois = rand() % 10; }while(vet[numdois][num] != 0); vet[numdois][num]=3; } for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } printf("\n"); } printf("\n ANTES VETOR NA POSICAO [0][0] = %.f\n",vet[0][0]); if (vet[0][0] == 0) vet[0][0] = 1; printf("\n DEPOIS VETOR NA POSICAO [0][0] = %.f\n",vet[0][0]); system ("pause"); } Todas as vezes o código funcionou, só que tem você estava olhando para um resultado anterior a essa atribuição, tem que mandar mostrar de novo depois de atribuir. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 27, 2011 Consegui visualizar mais é inviável trabalhar posição por posição manualmente. Por isso tento fazer algo que rode celula por celula. printf("\n###################\n"); for(p1=0;p1<10;p1++) { for(p2=0;p2<10;p2++) { printf("%.f ",vet[p1][p2]); if (vet[p1][p2] == 3); printf("\n VETOR LIXO ACHADO NA POSICAO ELE SERA LIMPO %.f\n", p1, p2); vet[p1][p2] = 0; printf("\n AGORA LIXO SERA MODIFICADO, RECEBERA 0 %.f\n",vet[p1][p2]); } printf("\n"); } Porém o problema agora é que não consigo utilizar laço FOR pois o printf está bagunçando toda estrutura. Grato, Preciso realmente procurar os 3 e 9. - Transformar 3 em 0. - Desviar dos 9. Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 27, 2011 Sim, é inviável célula a célula, mas você tinha que entender o porque você achava que não estava alterando a célula quando na verdade estava. Se não entender a lógica não adianta tentar programar, nada vai funcionar. if (vet[p1][p2] == 3); ponto e vírgula depois de um if? Isso não existe. if (vet[p1][p2] == 3); printf("\n VETOR LIXO ACHADO NA POSICAO ELE SERA LIMPO %.f\n", p1, p2); vet[p1][p2] = 0; printf("\n AGORA LIXO SERA MODIFICADO, RECEBERA 0 %.f\n",vet[p1][p2]); Se você quer que todas as 3 instruções sejam processadas tem que colocar um abre chaves depois do parentes do if e fechar ela depois da ultima instrução que quer executar caso o if seja verdadeiro. Atualmente seu código faz o seguinte Mostra na tela o elemento na posição p1,p2 Verifica se vet[p1][p2] == 3 e não faz absolutamente nada caso seja verdadeiro. Comparação vazia. escreve a primeira mensagem na tela atribui 0 na posição p1,p2 não importante o que esteja ali ( seja, 0, 3 ou 9 ) escreve a segunda mensagem. Ele faz isso para todas as células. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 27, 2011 for(p1=0;p1<10;p1++) { for(p2=0;p2<10;p2++) { printf("%.f ",vet[p1][p2]); if (vet[p1][p2] == 3){ printf("\n\n VETOR LIXO ACHADO NA POSICAO %.f , ELE SERA LIMPO\n", p1, p2); vet[p1][p2] = 0; var = p1; var2 = p2; printf("\n AGORA LIXO SERA MODIFICADO, RECEBERA 0 %.f\n",vet[p1][p2]); printf (" Gravada posicoes em inteiro |Posicao1 %.d Posicao2 %.d",p1,p2); } } printf("\n"); } Acho melhorou porém os printfs ainda continuam atrapalhando, não consigo posicionar a matriz, escrever, posicionar. Compartilhar este post Link para o post Compartilhar em outros sites
Myho 2 Denunciar post Postado Abril 27, 2011 Ok, primeiro vamos criar uma função para exibir a matriz completa sempre que quisermos: void mostraMatriz() { int i,j; for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } printf("\n"); } } A função acima é código seu mesmo, só transformei em função, imagino que você já tenha aprendido alguma coisa sobre isso. Então após randomizar os lixos e obstaculos você manda imprimir a matriz em seu estado inicial e de uma pausa para poder ver ( system("pause"), getchar(), getch() você escolhe a função que quiser). printf("Matriz Inicial:\n"); mostraMatriz(); system ("pause"); A partir de agora você pode percorrer a matriz atrás de lixos para recolher. Se você quer só mostrar em que posição estão esses lixos e colocar 0 depois de mostrar só precisa de um pequeno ajuste, usando agora a função de mostrar a matriz. for(i=0;i<10;i++) { for(j=0;j<10;j++) { if (vet[i][j] == 3){ printf("\nAchado Lixo na posicao [%d][%d]\n",i,j); vet[i][j] = 0; printf("Lixo foi recolhido, nova matriz é:\n"); mostraMatriz(); system("pause"); } } } Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 27, 2011 Ok, primeiro vamos criar uma função para exibir a matriz completa sempre que quisermos: void mostraMatriz() { int i,j; for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%.f ",vet[i][j]); } printf("\n"); } } A função acima é código seu mesmo, só transformei em função, imagino que você já tenha aprendido alguma coisa sobre isso. Então após randomizar os lixos e obstaculos você manda imprimir a matriz em seu estado inicial e de uma pausa para poder ver ( system("pause"), getchar(), getch() você escolhe a função que quiser). printf("Matriz Inicial:\n"); mostraMatriz(); system ("pause"); A partir de agora você pode percorrer a matriz atrás de lixos para recolher. Se você quer só mostrar em que posição estão esses lixos e colocar 0 depois de mostrar só precisa de um pequeno ajuste, usando agora a função de mostrar a matriz. for(i=0;i<10;i++) { for(j=0;j<10;j++) { if (vet[i][j] == 3){ printf("\nAchado Lixo na posicao [%d][%d]\n",i,j); vet[i][j] = 0; printf("Lixo foi recolhido, nova matriz é:\n"); mostraMatriz(); system("pause"); } } } Gostaria de agradecer pelo suporte, consegui entender acima de tudo como o programa vem funcionando até o momento, apesar de não conhecer muitas funcoes e algumas estruturas ainda, talvez isso esteja favorecendo eu não ter 'acabado' esse problema ainda. Pois bem consegui substituir os lixos achar os obstáculos etc...Agora estou tentando arrumar um provavel ultimo problema, queria pedir uma dica de estrutura de repetição se possivel nesse caso talvez para solucionar o caso. Compartilhar este post Link para o post Compartilhar em outros sites
rkd 0 Denunciar post Postado Abril 28, 2011 Gostaria de agradecer o suporte. Obrigado Myho. Até a proxima. Compartilhar este post Link para o post Compartilhar em outros sites