はじめに
「解きながら学ぶJava」(その名の通り「〜〜するプログラムを作成せよ。」といった問題を解きながらJavaを学んでいく書籍)に書かれている問題を**"JavaScriptで書く"**ということをやっている中で見事に詰まりました。
JavaScriptは、JavaやRubyのようにクラスを用いて綺麗に定義、みたいなことがしづらいですし、標準入力も若干面倒なので結構苦戦しました
(今回はreadlineモジュールを使用)
ちなみに私は、上記の本を持っておきながら、Javaを触ったことはありません。笑
どんな問題?
キーボードから次々と整数値を読み込んで、合計と平均を求めるプログラムを作成せよ。加算する整数の個数は最初に読み込むこと。
という問題です。
実際に書いたプログラム
const readline = require('readline');
const log = console.log;
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let num_int;
let input_int;
let sum = 0;
async function readInt() {
const rl = readline.createInterface({input: process.stdin});
const ait = rl[Symbol.asyncIterator]();
log('整数:');
input_int = parseInt((await ait.next()).value);
};
function checkInt() {
rl.question('何個加算しますか: ', async function (answer) {
num_int = parseInt(answer);
for(let i = 0; i < num_int; i++) {
await readInt();
sum += input_int;
}
rl.close();
log(`合計は${sum}です。`);
log(`平均は${sum / num_int}です。`);
});
};
log('整数を加算します。');
checkInt();
コードの中身は深くは追いませんが、ざっくりポイントだけ記載します。
-
大元の処理を行うcheckInt関数に、「何個加算しますか?」の問に対して入力された数の回数分だけfor文で処理をループさせている
-
checkInt関数とは別に、readInt関数を定義し、加算対象の数を入力する処理を書いている
-
標準入力は、readlineモジュールを使用し、繰り返し入力が必要になる部分にasync/awaitを使用
async/awaitを使用することで非同期処理が可能となり、コンソールへの繰り返し入力が可能となります。
実行するとこんな感じになります(↓)
整数を加算します。
何個加算しますか: 3
整数:
48
整数:
67
整数:
89
合計は204です。
平均は68です。
上記のコードはあくまで一例ですので、ご参考までに。