0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScriptでFizzBuzz問題を解く

Posted at

#はじめに
この記事は、JavaScript初学者がFizzBuzz問題を解く過程をまとめたものです。

##要件
####1.入力された整数値でFizzBuzz問題を実行できる

  • fizzNumに入力された値の倍数とbuzzNumに入力された値の倍数を小さい順に表示する
  • 各々倍数と一緒にfizz、buzzと表示させる
  • 両方の倍数である時にはFizzBuzzと表示させる
  • 表示させるのは二桁の値まで

####2.整数値が入力されずに実行ボタンが押下された際にはエラーを表示させる

  • 文字列が入力された時
  • 少数が入力された時
  • 空欄だった時

##FizzBuzzを実装するために必要な処理
・実行ボタン押下時のイベント作成
・inputタグから入力された値の取得
・入力された値を元にfor文とif文で条件を定義して、条件と合致すれば出力
・入力された値が整数値であるかif文を使ってチェック

大まかに分けるとこれらの処理工程があります。
上から順に処理していきます。

##HTMLサンプルコード

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>FizzBuzz問題</title>
</head>
<body>
  <div>
    <h1>FizzBuzz問題</h1>
    <dl>
      <dt style="float: left; width:5rem">FizzNum:</dt>
      <dd><input type="text" id="fizz_num" placeholder="整数値を入力してください" value="" style="width: 10.5rem;"></dd>
      <dt style="float: left; width:5rem">BuzzNum:</dt>
      <dd><input type="text" id="buzz_num" placeholder="整数値を入力してください" value="" style="width: 10.5rem;"></dd>
    </dl>
    <button id="btn">実行</button>
    <p>【出力】</p>
    <ul id="output" style="list-style: none;"></ul>
  </div>
<script src="practice1.js"></script>
</body>
</html>

##実行ボタン押下時のイベント作成

// 実行ボタンの要素を取得
const btn = document.getElementById('btn');
// クリックイベント
btn.addEventListener('click', () => {

btn.addEventListener('click', () => { 
実行ボタンをクリック時の処理を記述します。
addEventListener()は、イベント発生時に引数で記述した処理を実行します。
第一引数のイベントの種類であるクリックを入れます。
第二引数の() => は関数の書き方の一つで、アロー関数といいます。
function()と同じです。functionがなくなって => になっただけです。
アロー関数の方が省略できて見やすくなるので使っています。

##inputタグから入力された値の取得

JavaScript

  // DOM
  const fizz_num = document.getElementById('fizz_num');
  const fizz = fizz_num.value;
  const buzz_num = document.getElementById('buzz_num');
  const buzz = buzz_num.value;
  const output = document.getElementById('output');

document.getElementById()を使用して、引数に入っているidを持つHTML要素を取得する。
取得した要素の値(value)を定数に代入する。
入力された値が必要なので、クリックイベントの中で行う。

##入力された値を元にfor文とif文で条件を定義して、条件と合致すれば出力

 // 値を代入する変数を宣言
  let val = '';

 // 変数iを宣言して1を代入し99まで+1する
  for (let i = 1; i < 100; i++) {

        // iがfizzとbuzzの倍数なら、valに文字列とiを代入
        if (i % fizz === 0 && i % buzz === 0) {
          val = 'FizzBuzz' + ' ' + i;

        // iがfizzの倍数なら、valに文字列とiを代入
        } else if (i % fizz === 0) {
          val = 'Fizz' + ' ' + i;

        // iがbuzzの倍数なら、valに文字列とiを代入
        } else if (i % buzz === 0) {
          val = 'Buzz' + ' ' + i;
        
        // iがfizzとbuzzの倍数でないなら、valを空にする
        } else {
          val = '';
        }

        // li要素を作成する定数liを宣言
        const li = document.createElement('li');

        // outputの子要素にliを追加
        output.appendChild(li);

        // liのテキストにvalを代入
        li.textContent = val;      
      }

ループ内で出力するli要素の内容を記述することに注意。

##入力された値が整数値であるかif文を使ってチェック

// fizzとbuzzの値が空ならば、outputの中身を空にして注意文を表示する
  if (!fizz || !buzz) {
    output.innerHTML = '';
    output.innerHTML = '<p>整数値を入力してください</p>'

    // fizzとbuzzの値が数字以外ならば、outputの中身を空にして注意文を表示する
  } else if (fizz.match(/^\D+$/) || buzz.match(/^\D+$/)) {
    output.innerHTML = '';
    output.innerHTML = '<p>整数値を入力してください</p>'

  // fizzとbuzzの値が小数ならば、outputの中身を空にして注意文を表示する 
  } else if (fizz.match(/^-?[0-9]+\.[0-9]+$/) || buzz.match(/^-?[0-9]+\.[0-9]+$/)) {
    output.innerHTML = '';
    output.innerHTML = '<p>整数値を入力してください</p>'

値が空の場合のチェックは定数(変数)の前に!をつける。
値が小数点の場合か、文字列が入っている場合のチェックは、正規表現で行う。
正規表現については以下のリンクを参考に。
正規表現総まとめ!! - Qiita

#終わりに
FIzzBuzz問題でJavaScriptのDOM操作や関数の書き方、イベントの作成方法などがより詳しく学べた。
Progateやドットインストールの次に何をしようか迷っている人は、FizzBuzz問題を解いてみると、プログラミングについての理解が深まると思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?