我正在尝试制作一个程序,将用户字符串输入显示为x的5x5矩阵。因此,如果用户输入"abc",结果输出应该是第一行:
预期输出
我目前只允许显示a、b和c,但一旦代码工作,我会将其扩展到字母表中的每个字母。
我为每一行制作了一个数组,其中包含在每一行中制作一个字母所需的字符。
因此,如果用户在abc中输入,程序将把输入分成一个字符数组[‘a’,‘b’,‘c’],然后计算输入的长度(3)。while循环开始,它将检查用户输入的第一个元素是哪个字母,并将其与alphaRow1数组中的正确元素匹配并打印。while循环将重复此操作,直到它遍历了用户输入中的每个元素。
我目前只尝试了第一行的代码,但稍后会添加其他行。
每当我在用户输入中输入时,它都会出现"a"的alphaRow1元素,无论我输入的是"b"还是"c"。while循环似乎正确重复,因此如果我输入abc,它将显示"a"的alphaRow1元素3次:
用户输入为"abc"时的实际输出
我不确定出了什么问题,所以它每次只显示第一个元素。while循环似乎是正确的,并且它似乎正在正确地递增
alphaRow1 = [" x ","xxxx "," xxxx"];
alphaRow2 = [" x x ","x x","x "];
alphaRow3 = [" xxx ","xxxx ","x "];
alphaRow4 = ["x x","x x","x "];
alphaRow5 = ["x x","xxxx "," xxxx"];
input=prompt("Enter something","Enter here");
letterCount=0;
splitInput = input.split('');
inputLength = input.length;
while (letterCount < inputLength){ //while loop for first row.
if (splitInput[letterCount] = 'a'){ //if selected element in user input
document.write(alphaRow1[0]); //is 'a' display first element from
letterCount++; //alphaRow1
}
else if (splitInput[letterCount] = 'b'){
document.write(alphaRow1[1]);
letterCount++;
}
else if (splitInput[letterCount] = 'c'){
document.write(alphaRow1[2]);
letterCount++;
}
else{
document.write("error");
}
}
if和else语句中存在错误。当您应该使用相等运算符==
时,您正在使用赋值运算符=
代码的问题在于,应该在while循环中使用double==if。
实际上,您正在重写if和else-if语句中的值。
除了在if
条件下执行的赋值外,还应避免使用document.write
。相反,构建一个字符串作为结果,并单独处理页面的实际输出。为此,可以使用pre
元素,然后将其textContent
属性设置为结果字符串。pre
还将呈现换行符并使用单间距字体,这正是您所需要的。
此外,如果您按模式所代表的字母对模式进行键控,即创建一个具有属性"a"的对象,该对象的值将为该字母的完整模式,则模式的数据结构将更易于使用。这样,您就不需要所有单独的if
条件,一旦您需要覆盖所有可用的字母和字符,这些条件就会失控。
这是建议的代码。试试看。
// Define your patterns keyed by the letter first, not by the line
var pattern = {
a: [" X ",
" X X ",
" XXX ",
"X X",
"X X",
"X X"],
b: ["XXXX ",
"X X",
"XXXX ",
"X X",
"X X",
"XXXX "],
c: [" XXXX",
"X ",
"X ",
"X ",
"X ",
" XXXX"],
'?': [" XXX ",
"X X",
" X ",
" X ",
" ",
" X "]
};
// Use split/join and map to gather the output string. Do
// not write with document.write
function getOutput(s) {
return pattern.a.map(function (_, lineNo) {
return s.split('').map(function(letter) {
if (!pattern[letter]) letter = '?' // default
return pattern[letter][lineNo];
}).join(' ');
}).join('n');
}
// I/O handling: separated from logic
var input = document.querySelector('input');
// Use pre element to have monospaced font and render all white space
var output = document.querySelector('pre');
input.oninput = function() {
// At every change in the input, generate the output
output.textContent = getOutput(this.value);
}
Input: <input>
<pre></pre>