【发布时间】:2015-02-26 19:28:19
【问题描述】:
因此,对于我的作业,我必须输入长度和宽度,并根据输入打印出“*”模式。最小高度为 7,仅增加奇数,宽度为 6 的任意倍数。
使用高7宽12输出的基本格式:
************
************
*** ***
*** ***
*** ***
************
************
所以基本上第一行和最后两行是笔直穿过整个宽度,奇数行包含 3 个星号,后跟 3 个空格,直到到达宽度的末尾。偶数行以 3 个空格开头。
我已经弄清楚如何使用以下代码打印前两行:
do
{
printf("*");
++i;
}while(i<width);
printf("\n");
do
{
printf("*");
++j;
}while(j<=width);
printf("\n");
但是对于我的生活,我想不出正确的方法来使用基本的嵌套循环来打印出内部模式。我问了一个不熟悉 C 但用 Java 写了一个基本程序的程序员朋友。我不懂 Java,并试图翻译它,但注意到两种语言之间的逻辑存在一些大差异,这让我很头疼。这是他的代码:
// LOGGING
var consoleLine = "<p class=\"console-line\"></p>";
console = {
log: function (text) {
$("#console-log").append($(consoleLine).html(text));
}
};
// PATTERN PARAMETERS
var rows = 6;
var cols = 7;
// hard code a space so html respects it
var space = " "
console.log("cols: " + cols + " rows: " + rows);
for (y = 0; y < rows; ++y) {
var line = "";
for (x = 0; x < cols; ++x) {
// First two and last two rows do not have patterns and just print filled
if (y == 0 || y == 1 || y == rows - 1 || y == rows - 2) {
line += "*";
} else {
if (y % 2 == 0) {
// Even row
line += x % 6 < 3 ? "*" : space;
} else {
// Odd row
line += x % 6 >= 3 ? "*" : space;
}
}
}
console.log(line);
}
请帮助我或指出正确的方向!我在网上搜索过,但似乎找不到有效的解决方案!
编辑-忘了提到所有“printf”使用一次只能打印一个字符......例如单个*
编辑编辑-我成功了!!!!非常感谢大家,非常感谢您的意见和指导!这是我所拥有的完美运行的东西:
for (y = 0; y < height; ++y)
{
printf("\n");
for (x = 0; x < width; ++x)
{
// First two and last two rows do not have patterns and just print filled lines
if (y == 0 || y == 1 || y == height - 1 || y == height - 2)
{
printf("*");
}
else
{
if (y % 2 == 0)
{
if(x%6<3)
{
printf("*");
}
else
{
printf(" ");
}
} else {
// Odd row
if(x%6>=3)
{
printf("*");
}
else
{
printf(" ");
}
}
}
}
printf("\n");
【问题讨论】:
-
考虑使用
putchar('*');而不是printf("*");,但这是细枝末节,不是一个严重的问题。打印前两行代码的不均匀重复令人担忧,特别是如果最后两行代码还有两个副本。你能弄清楚如何为任意数量的重复打印交错的空间和星号的三元组吗?您如何确定是以空格还是星号开头,并在两个字符之间交替?如果宽度不是三的倍数会怎样? -
是的,我朋友提供的代码给了这 4 行正确的位置,但我一生都记不起我是如何把它翻译成 C 的。我打算使用 if 语句"height" % 2 来确定它是偶数还是奇数,但我似乎无法正确实现它。我在前面的几行中进行了一些检查,以确保输入正确。
-
这是 JavaScript,不是 Java。但是,如果你去掉所有的日志记录并将
var重命名为int,我看不出这些“大差异”会是什么。 -
我很抱歉。而且我想我不知道如何实现偶数/奇数功能: line += x % 6
-
不要使用
do/while循环,即使它们似乎很适合目的,它们也容易出错。在您的代码中,当width==0是有效输入(0 是 6 的倍数)时,您无法生成空行。此外,您忘记初始化循环计数器。使用标准成语:for (i = 0; i < width; i++) { ... }