sharp231
@sharp231

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

偶数と奇数判定のアルゴリズム#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つでは改善できませんでした

何度もすみません
よろしくお願いします!

0

3Answer

resultは文字列で、pushメソッドはありません。
pushやjoinするなら let result = [] にすればいいかと思います。

3Like

Comments

  1. @sharp231

    Questioner

    ありがとうございます

なんだかいろんな人の(個別には正しい)意見を全部取り入れてしまったために矛盾が起きてるっぽいですね。
そえぞれは正しい意見でも、正しく理解せずにそれらを混ぜ合わせてしまうとまったく違うものになってしまうんですよ。

そもそもですが、

    const oddnumber = num[i]
    const evennumber = num[i + 1]

まだ偶数か奇数かわかっていないものにoddnumberevennumberという名前をつけるとコードを書いたりエラーを探したりするときにも混乱します。
ここは

    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;
}
1Like

Comments

  1. @sharp231

    Questioner

    for文を使っているから回って処理されているからうまく条件処理ができていないのですね

    内容の取捨選択をしていましたが最終的にこんがらがりました

同じ内容のスレッドを乱立するのは迷惑です。やめてください。

それから、回答をもらっているのにフィードバックを返さないのは失礼です。

そういう基本的なマナーが守れないのですか。

0Like

Comments

  1. @sharp231

    Questioner

    ありがとうございます

Your answer might help someone💌