Jump to content

Recommended Posts

Posted

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

Posted

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.

Posted

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.

Posted

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?

Posted

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.

Posted

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?

Posted

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.

Posted

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

Posted

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.

Posted

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?

Posted

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.

Posted

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!

Posted

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.

Posted

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

Posted
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.

Posted

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.

Posted

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..

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.