mcfraga Posted April 10, 2012 at 10:47 AM Report #448347 Posted April 10, 2012 at 10:47 AM Olá muito bom dia! Sou novo aqui no portugal a programar por isso quero antes dizer que do pouco que sei, contem com a minha ajuda! Mas estou numa situação complicada e agora preciso de ajuda! Tenho que fazer um "bingo" ou "loto" em matlab. A primeira função com muito trabalho ja a fiz em que o enunciado é: "Especifique a função E = extracao(k) que retorna um vector de k posições, cujos elementos são todos os números inteiros entre 1 e k, distribuídos aleatoriamente. Sugestão: Inicialize o vector E com os números ordenados de 1 a k e repita “bastantes” vezes (tipicamente 3 vezes o valor de k) a seguinte operação: a) Obtenha aleatoriamente dois números inteiros i e j, entre 1 e k. c) No vector E, troque o elemento E(i) pelo elemento E(j)" Agora, o meu problema é a alínea b) em que o enunciado é: "Os nj cartões de dc×dc posições serão implementados através de uma matriz de dc×(nj*dc) posições (por exemplo de 3×15 para , nj = 5 e dc = 3) . As primeiras dc colunas correspondem ao primeiro cartão, as segundas dc colunas ao segundo cartão, e assim sucessivamente. Implemente a função M = distribuir(nj,dc) que retorna uma matriz M de dc×(nj*dc), com números de 1 a dc*nj*dc, distribuídos aleatoriamente pelas suas posições. Sugestão: Generalize o procedimento anterior para uma matriz de dc×(nj*dc), ou obtenha um vector de dc*nj*dc elementos e transforme-o numa matriz de dc×(nj*dc)." Não estou a conseguir fazer uma função com numeros aleatorios sem repetir em que a matriz tenha tantos"quadrados" como de numeros de filas e coluna e de jogadores. Se me pudessem dar uma ajuda agradecia muito, já que estou a tentar à muito tempo e não chego a lado nenhum. Se precisarem de mais algum dado aqui têm o link do "trabalho" http://ssdi.di.fct.unl.pt/icp/1112-2/index.htm Muito obrigado e cumprimentos Manuel Castro
pedrosorio Posted April 10, 2012 at 11:07 AM Report #448351 Posted April 10, 2012 at 11:07 AM Tendo em conta que é uma iniciação à programação compreendo que tenham que programar a função extracao e certifica-te de que compreendes bem o que ela está a fazer, mas existe uma função que faz precisamente isso no matlab (chama-se randperm - random permutation). Na alínea b, se querem ter nj cartões com dc x dc posições, não compreendo porque é que não usam uma estrutura dc x dc x nj (i.e. com três índices). Se eu estivesse no teu lugar, usaria a segunda sugestão (obter um vector de dc*nj*dc elementos usando a função extracao que já tens feita) e depois convertê-lo numa matriz dc x (nj*dc). Para fazer a conversão vector -> matriz, tens duas hipóteses: ou crias uma matriz cheia de zeros com as dimensões corretas e depois usas ciclos para copiar os elementos do vector para a matriz, ou fazes à maneira mais "matlab" usando a função reshape (vê a descrição na documentação). Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 11:38 AM Author Report #448356 Posted April 10, 2012 at 11:38 AM Obrigado pela resposta, mesmo assim não consigo fazer a matriz..burrice minha... Em termos práticos como é que aproveito a função anterior?
pedrosorio Posted April 10, 2012 at 11:45 AM Report #448358 Posted April 10, 2012 at 11:45 AM Implemente a função M = distribuir(nj,dc) que retorna uma matriz M de dc×(nj*dc), com números de 1 a dc*nj*dc. Tens uma função que retorna um vector com números entre 1 e K. Queres uma função que retorna uma matriz com números de 1 a dc*nj*dc: 1) Obter vector com números de 1 a dc*nj*dc -> V = extracao(dc*nj*dc); 2) Colocar os elementos do vector V numa matriz dc x (nj*dc) -> duas hipóteses, ciclo for ou usar a função reshape Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 11:52 AM Author Report #448359 Posted April 10, 2012 at 11:52 AM Estou muito agradecido pelas resposta. É mais ou menos assim? function M=distribuir (nj,dc) E=1:dc*nj*dc; s=1; while s<=3*dc*nj*dc; i=fix(rand*dc*nj*dc+1); j=fix(rand*dc*nj*dc+1); aux= E(j); E(j)=E(i); E(i)=aux; s=s+1; endwhile M=reshape(E,[dc,dc*nj] endfunction EDIT: Já consegui!!! Muitíssimo obrigado pela ajuda! estou agradecidíssimo! ja funciona: function E=distribuir (nj,dc) E=1:dc*nj*dc; s=1; while s<=3*dc*nj*dc; i=fix(rand*dc*nj*dc+1); j=fix(rand*dc*nj*dc+1); aux= E(j); E(j)=E(i); E(i)=aux; s=s+1; endwhile E=reshape(E,[dc,dc*nj]) endfunction Nesta alínea 2c. Iniciar um jogo (1 val) Implemente a função [M,E] = iniciar(nj, dc) utilizando as duas funções auxiliares definidas nos pontos anteriores. O objectivo é sair a função extracao e a funcao distribuir?
pedrosorio Posted April 10, 2012 at 12:27 PM Report #448367 Posted April 10, 2012 at 12:27 PM Nesta alínea 2c. Iniciar um jogo (1 val) Implemente a função [M,E] = iniciar(nj, dc) utilizando as duas funções auxiliares definidas nos pontos anteriores. O objectivo é sair a função extracao e a funcao distribuir? "utilizando as duas funções auxiliares definidas nos pontos anteriores" - o enunciado parece indicar que tens que usar as duas funções. Se olhasses para as alíneas seguintes provavelmente ganharias perspectiva sobre o que estás a fazer e perceberias o que significam o E e o M no contexto do jogo que estás a implementar, em vez de fazeres cada alínea cegamente sem compreender o contexto. Já agora, não faças posts duas e três vezes seguidas, clica em "Modificar" quando quiseres alterar um post. Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 12:51 PM Author Report #448371 Posted April 10, 2012 at 12:51 PM obrigado. Não me podia dar mais uma ajuda? 3a. Actualiza cartões (1 val) Implemente a função [M,i,j] = posicao(M, E, k) que atualiza o estado da matriz M após a saída do k-ésimo elemento do vector E (que pode ser considerado o k-ésimo número sorteado na extração E). A atualização consiste em detectar na matriz M a linha i e coluna j em se encontra o elemento com valor igual ao k-ésimo elemento do vector E e substitui-lo (em M) por 0. como é que começo?
pedrosorio Posted April 10, 2012 at 06:13 PM Report #448425 Posted April 10, 2012 at 06:13 PM Não comeces novos tópicos para dúvidas que se referem a outros tópicos (é impossível perceber esta dúvida sem ter lido o outro tópico). Sabes utilizar ciclos for? Se sim, é muito fácil percorrer a matriz até encontrar a posição que é igual a E(k) e substituí-la por 0. O que é que já tentaste? Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 06:26 PM Author Report #448428 Posted April 10, 2012 at 06:26 PM Já estive a remoer varias coisas. Acabei por apagar e agora a única coisa que tenho é isto: function [M,i,j] = posicao (M,E,k) s=fix(rand*k+1); Tenho que definir primeiro M, i e j. Certo? Sim, sei usar ciclos for ponho for M(i,j)=E(k) M(i,j)=0? Obrigado, Manuel Castro o que fiz: function [M,i,j] = posicao (M,E,k) E=extracao(k) i=1:rows(M) j=1:columns(M) for M(i,j)=E(k) M(i,j)=0 endfor endfunction só não sei o q é q tenho de por no octave para o M
mcfraga Posted April 10, 2012 at 08:38 PM Author Report #448452 Posted April 10, 2012 at 08:38 PM Não há ninguem, por aqui?
pedrosorio Posted April 10, 2012 at 08:58 PM Report #448455 Posted April 10, 2012 at 08:58 PM Vai uma grande confusão por aí... Em primeiro lugar não tens que fazer E=extracao(k). Essa função recebe um vector E que já foi definido e que corresponde à ordem da extração. Aparentemente Octave tem funções rows e columns (em Matlab essas funções não existem). Começas por fazer i=1:rows(M) j=1:columns(M) Quando devias ter for i=1:rows(M) for j=1:columns(M) Porque são estes os ciclos for. Depois metes um ciclo for que não faz sentido nenhum, o que tu queres é testar se (if) M(i,j) é igual a E(k): if M(i,j) == E(k) M(i,j) = 0; No Octave não tens que pôr nada para o M. Alteras o M dentro da função e ele devolvido de acordo com as alterações que fizeste. Tens que te preocupar é em alterar as variáveis i e j para que sejam devolvidas com os valores correctos. Para isso dentro daquele if precisas de fazer M(i,j) = 0, mas também de guardar os valores i e j em variáveis auxiliares (a e b por exemplo). Depois dos ciclos for atribuis às variáveis i e j os valores que guardaste nas variáveis auxiliares. Em alternativa podes fazer os ciclos com outras variáveis (que não i e j) para poderes guardar diretamente as posições desejadas nas variáveis i e j que são devolvidas. Há maneiras mais elegantes de fazer tudo isto em MATLAB sem ciclos for mas para já parece-me suficiente para uma iniciação à programação. Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 09:14 PM Author Report #448460 Posted April 10, 2012 at 09:14 PM Assim? function [M,i,j] = posicao (M,E,k) for i=1:rows(M) for j=1:columns(M) if M(i,j) == E(k) M(i,j) = 0; endif endfunction o problema é que não sei o que escrever depois no octave no lugar do M e do E, ou tenho que usar a função iniciar? Como é que a funçaõ vai buscar o E e o M que so esta definida por nj e dc da outra função?
pedrosorio Posted April 10, 2012 at 10:14 PM Report #448479 Posted April 10, 2012 at 10:14 PM Essa função recebe o vector E e a matriz M. Quando alguém quer utilizar essa função para simular que saiu mais um número, chama a função com o M e E que já foram gerados previamente. A função só tem que fazer a sua tarefa (que é colocar um zero na matriz M onde esta for igual a E(k), e outra coisa que não estás a fazer, devolver em i e j as coordenadas da matriz em que se encontra este elemento). Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 10:31 PM Author Report #448488 Posted April 10, 2012 at 10:31 PM Entao só uso esta funcao depois da funcao iniciar(que sai um vector E e uma matriz M) e ponho no octave por exemplo posicao(M,E,3)? É que assim diz que o M não está definido.. Peço imensa desculpa estar a incomodar, se não tiver mais paciência não responda 👍 já ajudou muitíssimo!
pedrosorio Posted April 10, 2012 at 11:07 PM Report #448501 Posted April 10, 2012 at 11:07 PM O enunciado que tu indicaste diz precisamente isso: 3a. Actualiza cartões (1 val) Implemente a função [M,i,j] = posicao(M, E, k) que atualiza o estado da matriz M após a saída do k-ésimo elemento do vector E (que pode ser considerado o k-ésimo número sorteado na extração E). Uma sequência normal seria chamar a função iniciar (que gera os cartões e a ordem de extração dos números), e depois chamar consecutivamente posicao(M,E,1), posicao(M,E,2), etc. até o jogo acabar (provavelmente ao verificar noutra função que um dos cartões estivesse totalmente preenchido). Não respondo a dúvidas por mensagem.
mcfraga Posted April 10, 2012 at 11:27 PM Author Report #448509 Posted April 10, 2012 at 11:27 PM Pronto..muito obrigado. Só alguma coisa falta aqui que eu ainda não percebi function [M,i,j] = posicao (M,E,k) i=a; j=b; for i=1:rows(M) for j=1:columns(M) a=i; b=j; if M(i,j) == E(k) M(i,j) = 0; endfor endfor endif endfunction
pedrosorio Posted April 11, 2012 at 12:40 AM Report #448513 Posted April 11, 2012 at 12:40 AM function [M,i,j] = posicao (M,E,k) for i=1:rows(M) for j=1:columns(M) if M(i,j) == E(k) M(i,j) = 0; a=i; b=j; endif endfor endfor i=a; j=b; endfunction Parece-me que ainda tens alguma dificuldade em perceber a lógica de programação (por exemplo colocas i=a; j=b; no início da função, quando tu queres guardar essa informação depois dos ciclos for, e colocas o a=i; b=j; fora do if quando só queres fazer isso quando M(i,j) == E(k)). Tens que rever esses conceitos desde o início. Não respondo a dúvidas por mensagem.
mcfraga Posted April 11, 2012 at 08:39 AM Author Report #448521 Posted April 11, 2012 at 08:39 AM Isto continua a dizer que o M está indefinido, e fiz exactamente o que me disse. Fazer a função iniciar(que sai o M e o E) e depois fazer posicao (M,E,1)..
pedrosorio Posted April 11, 2012 at 02:56 PM Report #448605 Posted April 11, 2012 at 02:56 PM Neste fórum, se não metes código exato é provável que ninguém te ajude porque não somos adivinhos. Estás a fazer (por exemplo): [M,E] = iniciar(5,3); [M,i,j] = posicao(M,E,1); Eu presumo que estejas a fazer: iniciar(5,3); posicao(M,E,1); ou algo do género. Isso não vai funcionar porque a função iniciar é que devolve a matriz M e o vector E, se não os guardares explicitamente (fazendo como no código acima) eles não estão definidos e não podes usá-los... Mais uma vez, estes são conceitos absolutamente elementares de programação (o que são variáveis, como são utilizadas, etc.) aconselho-te a rever toda a matéria desde o início para garantir que percebes o que se passa. Não respondo a dúvidas por mensagem.
mcfraga Posted April 11, 2012 at 03:40 PM Author Report #448616 Posted April 11, 2012 at 03:40 PM Obrigadissimo nem sei como lhe agradecer. Você é de uma disponibilidade enorme e ajuda os outros como nunca vi. Muito obrigado Supostamente na funçao iniciar devia sair o E= por exemplo 4 5 8 9 7 5 e M= 4 5; 8 9; 7 5? Sendo assim, se eu ponho posicao (M,E,1) e depois posicao (M,E,2)..etc, acaba por ganhar sempre o primeiro jogador..
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