resultは文字列で、pushメソッドはありません。
pushやjoinするなら let result = []
にすればいいかと思います。
偶数と奇数判定のアルゴリズム#3
解決したいこと
質問1と質問2を参考にコードをしました
問題を1つずつ改善していきました
そして、入力すると1-884*84*8
と出力がされる
デバッグで確認すると18*8*4*8*4*8
と出力したいですが
*
と-
の挿入にミスがあるので改善したいです
発生している問題・エラー
TypeError: result.push is not a function
at StringChallenge (/tmp/732312299/main.js:21:14)
at Object.<anonymous> (/tmp/732312299/main.js:35:13)
at Module._compile (node:internal/modules/cjs/loader:1254:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
at Module.load (node:internal/modules/cjs/loader:1117:32)
at Module._load (node:internal/modules/cjs/loader:958:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
function StringChallenge(num) {
//数字じゃなくて文字列で出力しなければならい
let result = "";
num = num.toString();
for (let i = 0; i < num.length - 1; i++) {
const oddnumber = num[i]
const evennumber = num[i + 1]
//0は無視
//if文の書き方にミスがある0の処理ではなく偶数、奇数の処理にしてみます
//偶数同士に'*'を入れる条件式 等価演算子または厳密演算子でコードを作成する
if (oddnumber % 2 === 0 && oddnumber % 2 === 0) {
//文字列にキャストされているから+=ではない
result.push(oddnumber, '*');
}
//奇数同士で'-'を入れる条件式
else if (evennumber % 2 === 1 && evennumber % 2 === 1) {
//文字列にキャストされているから+=ではない
result.push(evennumber, '-');
}
else {
;
}
//入力した文字列の数字を配列するための処理が必要
result.push(num[num.length - 1]);
}
// code goes here
//最後は文字列で連結する
return result.join('');
}
// keep this function call here
console.log(StringChallenge(readline()));
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
return result.join('');
を'return result'に変更してみました
result.push(oddnumber, '*');
result.push(evennumber, '-');
をresult += oddnumber + '*';
result += evennumber + ' -';
に変更してみました
上記の2つでは改善できませんでした
何度もすみません
よろしくお願いします!
3Answer
Comments
@sharp231
Questionerありがとうございます
なんだかいろんな人の(個別には正しい)意見を全部取り入れてしまったために矛盾が起きてるっぽいですね。
そえぞれは正しい意見でも、正しく理解せずにそれらを混ぜ合わせてしまうとまったく違うものになってしまうんですよ。
そもそもですが、
const oddnumber = num[i]
const evennumber = num[i + 1]
まだ偶数か奇数かわかっていないものにoddnumber
やevennumber
という名前をつけるとコードを書いたりエラーを探したりするときにも混乱します。
ここは
const 今の数字 = num[i]
const 次の数字 = num[i + 1]
という名前にしてみてはどうでしょう。
そうすると
if (今の数字 % 2 === 0 && 今の数字 % 2 === 0) {
result.push(今の数字, '*');
}
//奇数同士で'-'を入れる条件式
else if (次の数字 % 2 === 1 && 次の数字 % 2 === 1) {
//文字列にキャストされているから+=ではない
result.push(次の数字, '-');
}
となりますよね。
if文で&&
の右側と左側の式がまったく同じものですが、これって間違ってますよね?
他にも
- pushを使ってる上に最後に
result.join('');
で文字列に変換しているということは、resultは文字列ではなく配列なのでlet result = []
とするべき(これがエラーになった理由) - 偶数同士でも奇数同士でもない場合に何も出力されなくなっている
-
result.push(num[num.length - 1]);
をループ内に書いているため、数字を一桁処理するたびに最後の一文字も出力されてしまう
とおかしなところがあります。
function StringChallenge(num) {
let result = "";
let 前の数字 = "";
num.toString().forEach(今の数字 => {
if (前の数字 != "") {
if (前の数字 % 2 == 0 && 今の数字 % 2 == 0) {
result += "*";
} else if (前の数字 % 2 == 1 && 今の数字 % 2 == 1) {
result += "-";
}
}
//resultが文字列型だと確定していれば += でOK
result += 今の数字;
前の数字 = 今の数字;
}
return result;
}
Comments
@sharp231
Questionerfor文を使っているから回って処理されているからうまく条件処理ができていないのですね
内容の取捨選択をしていましたが最終的にこんがらがりました
同じ内容のスレッドを乱立するのは迷惑です。やめてください。
それから、回答をもらっているのにフィードバックを返さないのは失礼です。
そういう基本的なマナーが守れないのですか。
Comments
@sharp231
Questionerありがとうございます