Pensante 0 Denunciar post Postado Agosto 31, 2010 Não quero respota do exercicio e sim um melhor entendimento, compreensão do problema!!! o que a proposta pede? um array que deixe de lado só o numero 13 e conforme for o M ele vai desligar de 5 em 5? o que intende disto: Durante a crise energética na Nova Zelândia neste inverno, um regime de contingência foi desenvolvido para desligar a energia para as áreas do país de uma forma sistemática. O país foi dividido em N regiões (Auckland região foi número 1, e Wellington número 13). Um número, M, seria escolhido aleatoriamente, a energia seria cortada em primeiro lugar na região 1 e depois em M regiões a seguir sucessivamente, de forma circular nas N regiões totais, ignorando regiões já desligadas. Por exemplo, se N = 17 e M = 5, a energia seria desligada para as regiões na seguinte ordem: 1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7. O problema é que é necessário desligar Wellington por último, pois nesta região encontra-se a sede elétrica do país. Assim para um dado N, o número M deve ser cuidadosamente escolhido para que região 13 seja a última região selecionada. Escreva um programa que leia uma série de números de regiões (N) de um array e, em seguida, determina para cada N o menor número M que irá garantir que Wellington (região 13) será a última região a ser apagada. Entrada e Saída Entrada será composta por um array com uma série de número de regiões (N), onde 12 < N < 101. O processo será encerrado quando o programa encontrar no array o número de região igual a 0 (zero). Saída será composta por uma série de linhas impressas na saída padrão, uma para cada elemento da entrada. Cada linha será composta do número M de acordo com o problema descrito. Exemplo de entrada 17 0 Exemplo de saída 7 Compartilhar este post Link para o post Compartilhar em outros sites
Splinterzin 0 Denunciar post Postado Agosto 31, 2010 Olha só: N = número de regiões; M = "número da vez"; não vi nada relacionado em desligar de 5 em 5, a parte onde tem M = 5 é apenas um exemplo onde: existem 17 regiões e "5" é a região da vez!! quando você der uma entrada de : 20 ( por exemplo ) você deve retornar um número entre 0 e 20 ONDE seja diferente de 1 ( sempre será a 1 a ser desligada e diferente de 13 que será a última ); uma vez que ele retorne um número random nessa condição, você armazena ele e vai eliminando dos próximos resultados. Foi isso que eu entendi ! Se você dividir em 30 regiões por exemplo: 1 = primeira a ser desligada, então o número 1 cai fora, o número 13 somente quando toda as opções estiverem esgotadas... Não sei se estou certo mas, criando outro array pra armazenar os valores JÁ obtidos, e algumas variáveis para armazenar PRIMEIRA e ULTIMA você consegue facilmente resolver! Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Agosto 31, 2010 Agora meu problema é que quero fazer um programa em algoritmo de um vetor q va ate 17 e gere numeros aleatorios e jogue no vetorB. eu gostaria de saber como se faz um sorteio aleatorio dentro de um para? ñ tenho ideia!! pesquisei mas o q achei foi sobre rand, mas como isto acontece, ele é só para numeros reais, eu quero numeros inteiros. eu achei uma linha de codigo assim: num <- rand * 20 o q realmente esta linha tah fazendo?! como eu faço um sorteio aleatório? Compartilhar este post Link para o post Compartilhar em outros sites
Denis_Uyeda 0 Denunciar post Postado Setembro 1, 2010 Eu entendi mais ou menos isso o que o Splinterzin disse, mas parece que o exemplo não tem muita coerência com a descrição, né? Por exemplo, se N = 17 e M = 5, a energia seria desligada para as regiões na seguinte ordem: 1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7. Se M era o número da vez, então ele foi ignorado para que o 1 fosse o primeiro a ser desligado. Entrada e Saída Entrada será composta por um array com uma série de número de regiões (N), onde 12 < N < 101. Essa parte ficou bastante confusa para mim. Se 12 < N e N < 101, então N deve estar entre 12 e 101?Se levar isso em consideração, então imagino que o número de regiões na entrada é limitado a isso, mas não necessariamente é o total de regiões, afinal, tem a região 1 e as outras.. O processo será encerrado quando o programa encontrarno array o número de região igual a 0 (zero). Nesse caso, imagino que quando o M for igual a 0, então desliga o 13 e encerra o programa. Enfim, eu entendi mais ou menos isso.. Essa linha está multiplicando um número aleatório por 20, e atriubindo à variável num Para gerar números aleatórios, isso varia de linguagem pra linguagem mas se for em PHP é: $variavel = rand(valor_minimo,valor_maximo); EX: $M = rand(0,count($N)); Onde $M é a variável que vai receber o número ecount($N) é o número máximo. Nesse caso é a quantidade de posições que o array $N possui.. entendeu? :mellow: Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 1, 2010 [/code] Onde $M é a variável que vai receber o número e count($N) é o número máximo. Nesse caso é a quantidade de posições que o array $N possui.. entendeu? :mellow: e qual é o numero de posições deste array, pois o outro mais em cima disse q o array tem q ser menor q 101 , mas tem q ter 17 posições? e o 13 é o ultimo a ser eliminada? Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 1, 2010 o exercicio pede que crie um vetor de 17 posições, e os numeros armazenados em cada posição é aleatorio maior q 12 e menor q 101. eu axo q criando um vetor B para armazenar as informações de A seria bom e não pode ter numero repetido no vetor de impressão (vetor B ). O programa é encerrado quando chega a 0, sendo a ultima posição percorrida 13 eu pensei assim: $vetA=array (1..17); e um rand para criar os numeros aleatorios: $vetA= rand(13,100); depois uma condição para comparar os numeros aleatorios armazenados em vetA com o vetB if $vetA[$i] == $vetB[$i] $vetA[$i]=rand(13,100); else $vetB[$i]=$vetA[$i]; Queria saber se do jeito q estou fazeno tah certo? Desde já, obrigada! Compartilhar este post Link para o post Compartilhar em outros sites
Splinterzin 0 Denunciar post Postado Setembro 1, 2010 Pelo que entendi, o número de regiões (N) deve ser Maior que 12 e menor que 101, faz sentido porque a região 13 deve estar presente, agora esse limite de 100 regiões é apenas um detalhe. Esse problema foi escrito de uma maneira muito confusa. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Setembro 1, 2010 1. Utilize a função range() para criar uma matriz com os números no intervalo que você precisa. 2. Utilize a função shuffle() para "embaralhar" os itens da matriz. 3. Utilize a função array_slice() para pegar a fatia da matriz que você precisa. Basicamente, ficaria assim: <?php $numeros = range( 13 , 100 ); shuffle( $numeros ); var_dump( array_slice( $numeros , 0 , 17 ) ); A saída vai ser alguma coisa como: array(17) { [0]=> int(71) [1]=> int(81) [2]=> int(36) [3]=> int(54) [4]=> int(99) [5]=> int(78) [6]=> int(93) [7]=> int(15) [8]=> int(17) [9]=> int(42) [10]=> int(13) [11]=> int(85) [12]=> int(19) [13]=> int(46) [14]=> int(32) [15]=> int(51) [16]=> int(94) } ;) Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Setembro 1, 2010 Queria saber se do jeito q estou fazeno tah certo? Funciona? Então está certo. Não funciona? Então está errado. Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 1, 2010 Funciona? Então está certo. Não funciona? Então está errado. engraçadinho.... resolveu minha questão! vou explicar melhor: tem algo q possa fazer para melhorar a estrutura? 1. Utilize a função range() para criar uma matriz com os números no intervalo que você precisa. 2. Utilize a função shuffle() para "embaralhar" os itens da matriz. 3. Utilize a função array_slice() para pegar a fatia da matriz que você precisa. Gostei desta solução, mas como eu faço para botar uma condição que a posição 13 (indice) é a ultima a ser impressa e depois de 13, 0 é o numero que finaliza o programa? para aparecer na tela? Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 1, 2010 Pelo que entendi, o número de regiões (N) deve ser Maior que 12 e menor que 101, faz sentido porque a região 13 deve estar presente, agora esse limite de 100 regiões é apenas um detalhe. Esse problema foi escrito de uma maneira muito confusa. Com toda certeza!!! Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Setembro 2, 2010 mas como eu faço para botar uma condição que a posição 13 (indice) é a ultima a ser impressa e depois de 13, 0 é o numero que finaliza o programa? Não consegui compreender, você pode ilustrar o que precisa ? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Setembro 2, 2010 É, tá difícil. Não de resolver a sua lição, mas de entendê-la. O mais próximo que cheguei tentando sintetizar uma solução foi, ao invés de misturar os elementos de um array de 13 à 100 foi misturar de 14 à 100, depois mesclar com outro array contendo apenas o 13 e o zero: $numbers = range( 14, 100 ); shuffle( $numbers ); printf( '%s', implode( ', ', array_merge( array_slice( $numbers , 0 , 17 ), array( 13, 0 ) ) ) ); /** * Saída (algo como) * 70, 46, 14, 72, 20, 58, 29, 95, 100, 66, 45, 57, 39, 54, 31, 92, 23, 13, 0 */ Se seu professor perguntar, não foi você quem fez :P Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 2, 2010 O programa deve gerar numeros aleatórios para cada posição do vetor de 1..17 posições no indice e a posição 13 do vetor deve ser a ultima ser impressa na tela, depois dela é a posição 0 (ou uma condição q dirá q 0 encerra o programa) que dira que o programa encerrou. Ex: tela------------------------------------------------------- 1 55 Estação desligada! 2 34 3 22 4 37 5 66 6 55 7 36 8 13 9 100 10 99 11 76 12 72 14 75 15 39 16 47 17 41 13 88 Ultima estação desligada 0 - Fim de execução ------------------------------------------------------------- Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Setembro 2, 2010 Ok amigo, Se você ainda não leu as regras do fórum, talvez seja interessante lê-las: Regras do Fórum Seus dois tópicos foram unidos em 1 só por se tratarem do mesmo problema. <?php $valores = range( 13 , 100 ); shuffle( $valores ); $posicoes = array_merge( range( 1 , 12 ) , range( 14 , 17 ) , array( 13 , 0 ) ); $numeros = array_combine( $posicoes , array_merge( array_slice( $valores , 0 , 17 , false ) , array( null ) ) ); array_walk( $numeros , function( $v , $k ){ $m = '%3d'; switch( $k ){ case 1: $m = '%d - Estação desligada'; break; case 13: $m = '%d - Última estação desligada'; break; case 0: $m = ' - Fim de execução'; break; } printf( "%2d %s\n" , $k , sprintf( $m , $v ) ); } ); Saída: 1 14 - Estação desligada 2 64 3 32 4 68 5 67 6 74 7 65 8 35 9 19 10 96 11 63 12 95 14 50 15 87 16 52 17 61 13 51 - Última estação desligada 0 - Fim de execução http://forum.imasters.com.br/public/style_emoticons/default/seta.gif range() http://forum.imasters.com.br/public/style_emoticons/default/seta.gif array_merge() http://forum.imasters.com.br/public/style_emoticons/default/seta.gif array_combine() http://forum.imasters.com.br/public/style_emoticons/default/seta.gif array_slice() http://forum.imasters.com.br/public/style_emoticons/default/seta.gif array_walk() http://forum.imasters.com.br/public/style_emoticons/default/seta.gif printf() http://forum.imasters.com.br/public/style_emoticons/default/seta.gif sprintf() Se você não estiver utilizando PHP 5.3+, basta estudar o uso das funções acima que você conseguirá adaptar o código acima com facilidade. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 3, 2010 Eu ia perguntar como fazia para imprimir na tela a junção de 2 arrays num 3º como abaixo: $array1 = array(); $array2 = array(); $i=0; foreach (range(13, 100) as $array1){ } $array1 = array(range (1, 17) ) ; $array2 = array( range (13,100) ); $c = array_combine ( $array1 , $array2 ); for ($i=1; $i<=17; $i++) { if ($i != 13) { echo "Posição ( $i ) "; print_r ($c) ; echo " - Região Desligada!"; echo "<br />"; } if ($i ==13) { $i=$i+1; echo "Posição ( $i ) "; print_r ($c); echo " - Região Desligada!"; echo "<br />"; } } echo "Posição ( 13 ) "; print_r ($c) ; echo " - Região Desligada!"; echo "<br />"; echo "0 - Fim de Execução!"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 3, 2010 Se você não estiver utilizando PHP 5.3+, basta estudar o uso das funções acima que você conseguirá adaptar o código acima com facilidade. ;) Realmente eu consegui adapta-lo como eu queria mais como em programação existe varias outras formas de montar uma solução ainda tem outra q quero aprender q é o do post anterior q coloquei!!! Obrigada Compartilhar este post Link para o post Compartilhar em outros sites
Pensante 0 Denunciar post Postado Setembro 9, 2010 [Resolvido]Eu consegui resolver o programa com o que o João postou, facilmente eu adptei para imprimir o que eu realmente queria, e consegui entender perfeitamente. Muito facil! e tambem eu fiz outro programa q fazia a mesma coisa só q utilizando a estrutura if e com um vetor fixo, quer dizer, criei um vetor de 17 posições com valores fixos, ñ mudariam quando a pagina fosse atualizada. E fiz com que a estrutura só imprimisse a posição 13 depois da de 17 e 0 como fim de execução. o 2º q fiz: <?php $a=array('35','54','39','88','77','32','44','61','72','38','32','56','43','18','94','100','91','81'); $b=array(); for ($i=1; $i<=17; $i++) { if ($i != 13) { echo "Posição ( $i ) "; echo $a[$i] ; echo " - Região Desligada!"; echo "<br />"; } if ($i ==13) { $i=$i+1; echo "Posição ( $i ) "; echo $a[$i] ; echo " - Região Desligada!"; echo "<br />"; } } echo "Posição ( 13 ) "; echo $a[13] ; echo " - Região Desligada!"; echo "<br />"; echo "0 - Fim de Execução!"; ?> Compartilhar este post Link para o post Compartilhar em outros sites