Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pensante

[Resolvido] Como começar, elaborar e entender este problema

Recommended Posts

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

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

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

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 e

count($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

 

[/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

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

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

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

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

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

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

É, 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

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

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

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

 

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

[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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.