基本上,我正在尝试在文本周围创建一个框架,并且在文本所在的第三行上,它不打印出应该是围绕它的“填充”的#。
******************
*################*
*#HELLO, JUSTIN!*
*################*
******************
这就是它的样子 - 之后!在$ greeting变量中,应该有一个#。代码如下,任何人都可以解释为什么会这样吗?
<html>
<body><?php
$pad = 1;
$rows = ($pad * 2) + 3;
$greeting = "HELLO, JUSTIN!";
$col = strlen($greeting) + (2 * $pad) + 2;
for ($r = 0; $r != $rows; ++$r)
{
for ($c = 0; $c != $col; ++$c)
{
if ($r == $pad + 1 && $c == $pad + 1)
{
echo $greeting;
$c += strlen($greeting);
//echo "#";
}
else
{
if ($r == 0 || $r == $rows - 1 || $c == 0 || $c == $col - 1)
echo "*";
else
echo "#";
}
}
echo "<br />";
}
?></body>
</html>
答案 0 :(得分:1)
在垂直填充(上方和下方)的$问候是容易做到的,最棘手的部分似乎得到含有$问候以显示右行。
尝试在for循环中使用&lt; =(小于或等于),而不是!=(不等于[s])。 您必须更改if语句的范围。
$text = "justin rocks my socks!";
$asteriskAt = 0;
$poundAt = 1;
$padding_left = 2;
$padding_right = 2;
//table looks like
//ABCDEFG
//HIJKLMN
//OPQRSTU
//row view
//0000000
//1111111
//3333333
//column view
//0123456
//0123456
//0123456
// ^ all the same "table" (anything with x and y, or rows and cols), just different ways of viewing it.
$num_cols = strlen($text) + ($padding_left + $padding_right); //so far so good?
//strlen($text) evaluates to 22
//$num_cols evaluates to 26 ( = 22 + 2 + 2)
for ($c = 0; $c <= $num_cols; ++$c) {
if ($c == $asteriskAt || $c == $num_cols - $asteriskAt) {
echo '*';
}
if ($c == $poundAt || $c == $num_cols - $poundAt) {
echo '#';
}
if ($c > $poundAt || $c < $num_cols - $poundAt) {
// is it clear why I picked this "range" ?
// if you do $c > 2 || $c < $num_cols - 2
// you will display something different
// because the cols and rows are zero-indexed
//
//cols
// 0123456
// ^2 is actually slot #3
//our thing will look like
//01___56
//compared with
//0123456
//01___56 <- (padding dudes)
//0123456
$idx = $c - $padding_left;
echo $text[$idx];
}
}
$text = "justin rocks my socks!";
$asteriskAt = 0;
$poundAt = 1;
$padding_left = 2;
$padding_right = 2;
//table looks like
//ABCDEFG
//HIJKLMN
//OPQRSTU
//row view
//0000000
//1111111
//3333333
//column view
//0123456
//0123456
//0123456
// ^ all the same "table" (anything with x and y, or rows and cols), just different ways of viewing it.
$num_cols = strlen($text) + ($padding_left + $padding_right); //so far so good?
//strlen($text) evaluates to 22
//$num_cols evaluates to 26 ( = 22 + 2 + 2)
for ($c = 0; $c <= $num_cols; ++$c) {
if ($c == $asteriskAt || $c == $num_cols - $asteriskAt) {
echo '*';
}
if ($c == $poundAt || $c == $num_cols - $poundAt) {
echo '#';
}
if ($c > $poundAt || $c < $num_cols - $poundAt) {
// is it clear why I picked this "range" ?
// if you do $c > 2 || $c < $num_cols - 2
// you will display something different
// because the cols and rows are zero-indexed
//
//cols
// 0123456
// ^2 is actually slot #3
//our thing will look like
//01___56
//compared with
//0123456
//01___56 <- (padding dudes)
//0123456
$idx = $c - $padding_left;
echo $text[$idx];
}
}
顺便说一句,www.ideone.com也有PHP翻译!真棒。
检查这两个输出的差异,并注意我只更改了for循环中的一个运算符:
http://ideone.com/M1lpM //星号:D
http://ideone.com/JqsTx //没有最后的星号=(
你发布的代码也不错,特别是如果它第一次尝试的话! 但实际上,编程和软件通常需要精确度,而且你不能因为做你所说的而对电脑生气。因此,在阶段或步骤中工作要好得多,因为在调试时可以使用清晰度=)
程序员逐渐学习(如果他们像我一样顽固),这不仅仅是让代码在你开始编写代码后2分钟工作,而是让它具有可读性和可变性,可维护性将来。开发是一个很好的习惯,因为在你再次查看你的代码之前你永远不会知道它会持续多久“这个疯狂的人到底做了什么?!”你可能会想,然后意识到你在一年前写的......你永远不知道谁最终会维护不管你做什么,你是否在商业应用的一个开源项目或工作作出贡献。
所以,一些建议(我会告诉我6年前的自己,真的):
如果您对我发布的代码有任何疑问,请随时询问=)
希望这可以帮助你找出你为什么贴不工作,你预料到的方式代码,但你可以很轻松的做出Gordian Knot这是非常困难的,而不完美的智慧,通过削减/生活冥想和节制
答案 1 :(得分:0)
你忘记了填充:
更改
$c += strlen($greeting);
到
$c += strlen($greeting) - $pad;
答案 2 :(得分:0)
$c += strlen($greeting);
必须替换为
$c += strlen($greeting)-1;