• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Bjecas

[Jogo] Onde está o erro?

39 mensagens neste tópico

Aqui vai uma ideia de um jogo para entreter os ociosos, e pode ser que ajude todos a aprender alguma coisa!

O objectivo do jogo é responder à questão colocada, e a única regra é que tenha como base um excerto de código PHP/PHP+HTML ou do género. A pessoa que responder à questão deve por sua vez colocar uma nova pergunta, para que o jogo continue!

_____________________________________________

Para dar o pontapé de saída, aí vai:

O seguinte código tem por objectivo criar uma tabuada muito simples.

<?php
echo "Tabela do <em>horror</em> na Primária<table>";
for ($x=1; $x<10; $x++) {
echo "<tr>";
for ($y=1; $y<10; $y++) {
	echo "<td>" . $x == 0 ? $x : $x*$y . "</td>"; 
}
echo "</tr>";
}
echo "</table>";
?>

Contudo, em vez da tabela esperada, o resultado num browser é:

"111111111222222222333333333444444444555555555666666666777777777888888888999999999"

Apenas examinando o código (não vale usar um servidor para fazer debug, é batota!), aponte o erro que causa este resultado inesperado, e indique a solução alterando o código o menos possível.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Excelente iniciativa!

A todos os que responderem, deixem a resposta com um fundo preto, de forma a não estragar a diversão aos próximos. ;)

Façam-no da seguinta forma:

[[tt][/tt]glow=black,1] texto aqui [/glow]

Não vou responder à pergunta porque não tenho outro desafio. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

de facto, parabéns pela iniciativa ;)

quanto ao desafio, a solução:

[glow=black,1]

<?php

echo "Tabela do <em>horror</em> na Primária<table>";

for ($x=1; $x<10; $x++) {

echo "<tr>";

for ($y=1; $y<10; $y++) {

echo "<td>" . $x*$y . "</td>";  <------------ aqui

}

echo "</tr>";

}

echo "</table>";

?>

[/glow]

quanto a um novo desafio..

Que linha falta ao seguinte código para funcionar como esperado? :D

<?php
$con = mysql_connect("localhost","user","pass");

        _________________________________

mysql_query("UPDATE Utilizador SET Idade = '23'
WHERE Nome = 'Kyu'";

mysql_close($con);
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui vai a minha do primeiro ;)

[glow=black,1]

<?php

echo "Tabela do <em>horror</em> na Primária<table>";

for ($x=1; $x<10; $x++) {

echo "<tr>";

for ($y=1; $y<10; $y++) {

echo "<td>";

echo $x == 0 ? $x : $x*$y;

echo "</td>";

}

echo "</tr>";

}

echo "</table>";

?>

[/glow]

ou melhor ainda

[glow=black,1]

<?php

echo "Tabela do <em>horror</em> na Primária<table>";

for ($x=1; $x<10; $x++) {

echo "<tr>";

for ($y=1; $y<10; $y++) {

echo "<td>" . ($x == 0 ? $x : $x*$y) . "</td>";

}

echo "</tr>";

}

echo "</table>";

?>

[/glow]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui vai a minha do primeiro :D

Está melhor que a minha visto que altera menos o código original.  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha solução do primeiro é igual à do Kyu,

A do 2º:

[glow=black,1]<?php

$con = mysql_connect("localhost","user","pass");

        mysql_select_db('utilizadores');

mysql_query("UPDATE Utilizador SET Idade = '23'

WHERE Nome = 'Kyu'";

mysql_close($con);

?>[/glow]

Agora, o 3º:

O que está mal neste código:


<?php

$total = "4";
$filetype = ".jpg";
$pasta = "images/random";

$primeiro = "1";

$random = mt_rand($primeiro);
$imagem = $random . $filetype;
echo "<img src=\"$pasta/$imagem\" alt=\"$imagem\" />";
?>

Lamento ser fácil, mas era o código que estava mais à mão de semear  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não vou responder porque não tenho ideias para um novo jogo, mas já vi a solução...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

À primeira:

[glow=black,1]

echo "Tabela do <em>horror</em> na Primária<table>";

for ($x=1; $x<10; $x++) {

  echo "<tr>";

  for ($y=1; $y<10; $y++) echo "<td>" . (($x == 0) ? $x : $x*$y) . "</td>";

  echo "</tr>";

}

echo "</table>";

[/glow]

À primeira do Kyu:

[glow=black,1]mysql_select_db('db', $con);[/glow]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

djthyrax, nem eu nem outros utilizadores temos respondido às perguntas porque não temos outros desafios em mente para continuar o jogo.

Depois de alguém responder, podes responder com soluções alternativas para o problema, mas para seres o primeiro tens de deixar um desafio. São as regras do jogo, logo editei o teu post.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem lá, mas eu acho o primeiro problema um bocado para o estúpido... Primeiro, aquela comparação não está ali a fazer nada, o $x nunca é zero, logo vai parar sempre ao else. Aquilo só dá mal porque não tem os ( ) à volta. Na minha opinião, a melhor correcção é tirar a compração e apenas por o resultado. Colocar () é uma estupidez porque a comparação não está lá a fazer nada.

Acho que tem mais lógica corrigir como deve ser em vez de corrigir "modificando o código o menos possível". Se a ideia é aprender, então as correcções têm de ser feitas da melhor forma!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem lá, mas eu acho o primeiro problema um bocado para o estúpido... Primeiro, aquela comparação não está ali a fazer nada, o $x nunca é zero, logo vai parar sempre ao else. Aquilo só dá mal porque não tem os ( ) à volta. Na minha opinião, a melhor correcção é tirar a compração e apenas por o resultado. Colocar () é uma estupidez porque a comparação não está lá a fazer nada.

Acho que tem mais lógica corrigir como deve ser em vez de corrigir "modificando o código o menos possível". Se a ideia é aprender, então as correcções têm de ser feitas da melhor forma!

Tens toda a razão, peço desculpas!

Escrevi o código assim "do pé para a mão", e ao rever emendei o $x inicial (que era 0) para 1, e nem notei na inutilidade da comparação.

Tendo isto em conta, a solução do Kyu faz todo o sentido (remove código desnecessário), embora a segunda do xbrunox seja exactamente a esperada - havia realmente um problema por lá faltarem os parênteses, era este o ponto fulcral. E isto para fazer notar que a usar sintaxe abreviada, por apelativa que possa parecer, pode ser uma fonte de dores de cabeça!

Assim, e como o xbrunox não adicionou um novo problema, atribuo a "vitória" ao Kyu! Obrigado a todos os outros por participarem e colocarem mais problemas!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Li o texto apenas na diagonal, nem reparei que era para apresentar um novo problema ;)

Em relação ao primeiro não considero que o código seja assim tão estúpido... realmente o operador ternário não tem qualquer utilidade no código, mas serve perfeitamente para despistar do real problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, a resposta era exactamente a que o djthyrax colocou, por isso é a tua vez de pôr um exercício ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Comecem já a pensar num problema para poderes depois responder logo a uma nova pergunta!  ;)

Deixo a sugestão de usarem os bugs que vos aparecem quando estão a criar código como fonte de inspiração!

Agora, o 3º:

O que está mal neste código:


<?php

$total = "4";
$filetype = ".jpg";
$pasta = "images/random";

$primeiro = "1";

$random = mt_rand($primeiro);
$imagem = $random . $filetype;
echo "<img src=\"$pasta/$imagem\" alt=\"$imagem\" />";
?>

Demorou-me um pouquinho a perceber, já não usava o mt_rand() há muiiiiito, e aquela documentação do PHP deixa-me sempre baralhado sobre o que é opcional ou não. Penso que seja isto:

[glow=black,1]$random = mt_rand($primeiro, $total);[/glow]

Alargando um pouquinho mais o âmbito das perguntas (sei que não se importam, hehe), o seguinte problema relaciona-se também com SQL, algo que julgo todos estão também familiarizados, pela frequência da associação PHP+MySQL:

A seguinte query evidencia um problema (tanto quanto me lembro era algo assim, embora agora não o possa testar!  :P). Qual é esse problema, e como o contornaria alterando apenas a query ($sql)?

$sql = "SELECT t1.colunaA, t2.colunaA FROM t1, t2 WHERE t1.colunaB = t2.colunaB";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
//Etc...
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

djthyrax, nem eu nem outros utilizadores temos respondido às perguntas porque não temos outros desafios em mente para continuar o jogo.

Depois de alguém responder, podes responder com soluções alternativas para o problema, mas para seres o primeiro tens de deixar um desafio. São as regras do jogo, logo editei o teu post.

Sorry, não reparei. Anyway, mete lá outra vez que vai aqui o problema:

Resultado esperado: passar a array para uma tabela mas deixar em branco os campos que sejam int(10). Estrutura da array => tabela: array(array(coluna 1, ..., coluna n))

$array=array(array("z", "y", "z"), array(1,2,4,10, "12"), array(1,"2","4", "10","12"));
echo "<table>";
foreach($array as $linha){
echo "<tr>";
foreach($linha as $coluna){ echo "<td>";
if($coluna == 10) echo " ";
else echo $coluna;
echo "</td>";
}
echo "</tr>";
}
echo "</table>";

(Não se queixem da indentação ou qualquer outro aspecto, isto está exactamente como eu quero ;))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então, ninguém sabe qual é o erro? Para quem não sabe, int(10) significa o integer (número inteiro) 10. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então, ninguém sabe qual é o erro? Para quem não sabe, int(10) significa o integer (número inteiro) 10. :P

Acho que o pessoal está com problemas em inventar novas questões para dar a resposta ;)

Vá não se acanhem, não importa que a questão seja fácil! De certeza que há membros muito experientes que saberão sempre as respostas, mas também há outros que embora tenham um nível de conhecimento menos elevado, também têm direito a se divertir e a  aprender!

Em resposta à questão do djthyrax:

[glow=black,1]No segundo "sub-array" o 10 é um número inteiro, enquanto que no terceiro é texto (uma string, definida pelas aspas em redor do valor). Ao contrário de outras linguagens, o PHP é liberal na forma como trata o tipo de conteúdo de cada variável (números inteiros, números "float", strings de texto,...) e faz automaticamente a conversão entre eles quando é preciso. Contudo, mantém a informação sobre o tipo da variável, mas este tem que ser verificado com o operador '===' de identidade (não sei se é esta a tradução), e não com '==' de igualdade. A resposta então seria:

if($coluna === 10) echo " ";  //linha 6[/glow]

________________

Relacionado com um outro post neste fórum, lembrei-me desta: descreva uma situação em que o seguinte código não mostrará o valor 4.

<?php
if($a == "") {
    $a = 4;
}
echo $a;
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[glow=black,1]

<?php

$a = "yougotowned!";

if($a == "") {

    $a = 4;

}

echo $a;

?>[/glow]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[glow=black,1]

<?php

$a = "yougotowned!";

if($a == "") {

    $a = 4;

}

echo $a;

?>[/glow]

Sem alterar o código! selfowned ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É isso mesmo Bjecas. ;)

Em resposta ao teu prob: [glow=black,1]Quando $a = "\t";, por exemplo. Daí se recomendar usar empty($a).[/glow]

Próximo problema:

Uma textarea com este conteúdo é passada ao script:

Olá,

eu gosto muito do P@P.

O pcaldeira é cromo.

E quer-se mostrar este comentário assim:

Um utilizador (IP: {endereço IP}) deixou o seguinte comentário no dia {dia}/{mês}/{ano}:

Olá,

eu gosto muito do P@P.

O pcaldeira é cromo.

Código:

$comentario = $_POST['textarea'];
$time = time();
$ip = $_SERVER['REMOTE_ADDR'];

echo "Um utilizador (IP: $ip) deixou o seguinte comentário no dia ".date('j/n/y', $time).":<br />$comentario";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em resposta ao teu prob: [glow=black,1]Quando $a = "\t";, por exemplo. Daí se recomendar usar empty($a).[/glow]

Boa, gostei do teu ponto! Mas não era nisso que estava a pensar.

A página contém apenas aquele código, e é chamada directamente pelo browser. Em que situação é que o valor de $a pode ser alterado (*hint* [glow=black,1]muitas vezes maliciosamente, do lado do cliente![/glow] *hint*) sem mexer no código-fonte?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A página contém apenas aquele código, e é chamada directamente pelo browser. Em que situação é que o valor de $a pode ser alterado (*hint* [glow=black,1]muitas vezes maliciosamente, do lado do cliente![/glow] *hint*) sem mexer no código-fonte?

[glow=black,1]Com register_globals ligadas, script.php?a=lolz por exemplo.[/glow]
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A página contém apenas aquele código, e é chamada directamente pelo browser. Em que situação é que o valor de $a pode ser alterado (*hint* [glow=black,1]muitas vezes maliciosamente, do lado do cliente![/glow] *hint*) sem mexer no código-fonte?

[glow=black,1]Com register_globals ligadas, script.php?a=lolz por exemplo.[/glow]

Eeeeexactamente! ;)

Só para lembrar que muitos servidores gratuitos têm este problema, por isso é preciso cuidado ao programar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Gurzi, não concordo com o teres movido este post. Este post não são dúvidas mas sim um jogo onde se metem problemas onde se dá a resposta e explica-se o porquê.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora