javascript 为什么不印双镜帕斯卡星星图案?

ssgvzors  于 2023-02-18  发布在  Java
关注(0)|答案(3)|浏览(148)

下面是打印下图所示图案的My JavaScript代码。请检查代码并解决错误。

<script>
var n = prompt("Enter the number of n you want to print");
        //rows = Math.floor(n / 2)
        
        let str = ""
        var i, j, k
        for(i = 1; i <= n; i++){
            for(j = 1; j <= i; j++){
                str += "*"
            }
            for(k = n + 1; k >= i; k--){
                str += " "
            }
            for(k = n + 1; k >= i; k--){
                str += " "
            }
            for(j = 1; j <= i; j++){
                str += "*"
            }       
            str += "\n"
        }       
        
        for(i = 1; i <=n + 2; i++){
            for(j = n + 2; j > i; j--){
                str += "*"
            }
            for(k = 1; k <= i; k++){
                str = " "
            }
            for(k = 1; k <= i; k++){
                str = " "
            }
            for(j = n + 2; j > i; j--){
                str += "*"
            } 
            str += "\n"
        }
        console.log(str)
</script>

我希望输出如下:

但输出中只有两个空格

4ktjp1zp

4ktjp1zp1#

将输入转换为Number

n = Number(n);

然后像@TomLV提到的那样修改代码:

var n = prompt("Enter the number of n you want to print");
        //rows = Math.floor(n / 2)
        n = Number(n);
        let str = ""
        var i, j, k
        for(i = 1; i <= n; i++){
            for(j = 1; j <= i; j++){
                str += "*"
            }
            for(k = n + 1; k >= i; k--){
                str += " "
            }
            for(k = n + 1; k >= i; k--){
                str += " "
            }
            for(j = 1; j <= i; j++){
                str += "*"
            }       
            str += "\n"
        }       
        
        for(i = 1; i <=n + 2; i++){
            for(j = n + 2; j > i; j--){
                str += "*"
            }
            for(k = 1; k <= i; k++){
                str += " "
            }
            for(k = 1; k <= i; k++){
                str += " "
            }
            for(j = n + 2; j > i; j--){
                str += "*"
            } 
            str += "\n"
        }
        console.log(str)
m2xkgtsf

m2xkgtsf2#

在第二个"i for循环"的两个"k循环"中,您将str设置为等于" "
例如:

for(k = 1; k <= i; k++){
    str = " "
}
for(k = 1; k <= i; k++){
     str = " "
 }

如果您将这些更新为+=,它就可以工作。

i7uq4tfw

i7uq4tfw3#

一些问题:

  • prompt返回一个字符串,你需要把它转换成一个数字。你可以用一元加号来完成。
  • str = " "出现在您应该执行str += " "的两个位置
  • 生成的模式在中心线有两个空格,而你被要求在那里只有一个空格,为了实现这一点,让k循环少一次迭代,并在这些循环之外添加str += " "作为一个单独的语句。
  • 输出在最后有一个空行,这是因为第二个i循环使一次迭代太多。

不是问题,但是:

  • 使用分号来分隔语句。虽然JavaScript提供了自动插入分号的功能,但你不会是第一个陷入其中一个陷阱的人。最好自己控制这一点,并养成添加分号的习惯。
  • 这里真的没有必要在顶部声明循环变量,只要在需要它们的时候声明它们,并且只声明它们需要的作用域即可。

我将假设输出中的 number 行应该是n*2+1,并且在这方面没有错误。
更正代码:

// Convert string to number using unary plus:
const n = +prompt("Enter the number of n you want to print");

let str = "";
for (let i = 1; i <= n; i++) {
    for (let j = 1; j <= i; j++) {
        str += "*";
    }
    // Reduced the number of iterations here:
    for (let k = n; k >= i; k--) {
        str += " ";
    }
    // Add one space for the center column 
    //    that is the only column without asterisks
    str += " ";
    // Reduced the number of iterations here:
    for (let k = n; k >= i; k--) {
        str += " ";
    }
    for (let j = 1; j <= i; j++) {
        str += "*";
    }       
    str += "\n";
}

// Reduced number of iterations. i should not become equal to n + 2
for (let i = 1; i <= n + 1; i++) {
    for (let j = n + 2; j > i; j--) {
        str += "*";
    }
    // Reduced the number of iterations here:
    for (let k = 1; k < i; k++) {
        str += " "; // Fixed assignment
    }
    // Add one space for the center column 
    //    that is the only column without asterisks
    str += " ";
    // Reduced the number of iterations here:
    for (let k = 1; k < i; k++) {
        str += " "; // Fixed assignment
    }
    for (let j = n + 2; j > i; j--) {
        str += "*";
    } 
    str += "\n";
}
console.log(str);

请注意,JavaScript有一些函数可以简化这个过程,例如可以使用"*".repeat(i)代替循环来生成相同的字符串。
所以它变成了:

const n = +prompt("Enter the number of n you want to print");
let str = "";
for (let i = 1; i <= n + 1; i++) {
    str += "*".repeat(i) + " ".repeat(2*n + 3 - 2*i) + "*".repeat(i) + "\n";
}       
for (let i = n; i >= 1; i--) {
    str += "*".repeat(i) + " ".repeat(2*n + 3 - 2*i) + "*".repeat(i) + "\n";
}
console.log(str);

你也可以重用第一个循环的结果,通过将行存储在一个数组中来得到输出的后半部分,然后反转这个数组来得到输出的后半部分(去掉中间行):

const n = +prompt("Enter the number of n you want to print");
const arr = Array.from({length: n + 1}, (_, i) => 
    "*".repeat(i+1) + " ".repeat(2*(n-i)+1) + "*".repeat(i+1)
);
console.log([...arr, ...arr.reverse().slice(1)].join("\n"));

相关问题