画面にこう出れば正解
どの言語で書いても、同じ入力なら画面に出る文字は1文字も違わない、というのが正解の決め方です(例は Python で動かしたときのコマンドです)。
割り切れない(7 ÷ 2)
$ python3 calc.py 7 2
7 + 2 = 9
7 - 2 = 5
7 × 2 = 14
7 ÷ 2 = 3.5
7 ÷ 2 の商は 3、余りは 1割り切れる(9 ÷ 3)
$ python3 calc.py 9 3
9 + 3 = 12
9 - 3 = 6
9 × 3 = 27
9 ÷ 3 = 3
9 ÷ 3 の商は 3、余りは 0小数になる(1 ÷ 8)
$ python3 calc.py 1 8
1 + 8 = 9
1 - 8 = -7
1 × 8 = 8
1 ÷ 8 = 0.125
1 ÷ 8 の商は 0、余りは 1負の数(−7 ÷ 2)
$ python3 calc.py -7 2
-7 + 2 = -5
-7 - 2 = -9
-7 × 2 = -14
-7 ÷ 2 = -3.5
-7 ÷ 2 の商は -4、余りは 110 ÷ 4
$ python3 calc.py 10 4
10 + 4 = 14
10 - 4 = 6
10 × 4 = 40
10 ÷ 4 = 2.5
10 ÷ 4 の商は 2、余りは 20 で割る
$ python3 calc.py 5 0
0 では割れません10言語のプログラム
どれもそのまま保存して動かせます。毎朝、上の正解の例をすべて実際に動かして確かめています。
calc.php8.4.26 で 6 / 6 件の出力が正解と一致
<?php
// 2つの整数で、足し算・引き算・掛け算・割り算をする
$a = (int) $argv[1];
$b = (int) $argv[2];
if ($b === 0) {
echo "0 では割れません\n";
exit;
}
// 商と余り: 余りが 0 以上になるようにそろえる(-7 ÷ 2 は 商 -4、余り 1)
$q = intdiv($a, $b);
$r = $a % $b;
if ($r < 0) {
$r += $b;
$q -= 1;
}
echo "$a + $b = " . ($a + $b) . "\n";
echo "$a - $b = " . ($a - $b) . "\n";
echo "$a × $b = " . ($a * $b) . "\n";
echo "$a ÷ $b = " . ($a / $b) . "\n";
// 日本語の直前の変数は {} で囲む("$q、" と書くと「$q、」までが変数名になる)
echo "$a ÷ $b の商は {$q}、余りは {$r}\n";
動かし方(ファイルを保存したフォルダで) ・ PHP を入れる
$ php calc.php 7 2
calc.py3.14.7 で 6 / 6 件の出力が正解と一致
# 2つの整数で、足し算・引き算・掛け算・割り算をする
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
if b == 0:
print("0 では割れません")
sys.exit()
d = a / b # / の答えは、割り切れても小数(9 / 3 は 3.0)
print(f"{a} + {b} = {a + b}")
print(f"{a} - {b} = {a - b}")
print(f"{a} × {b} = {a * b}")
print(f"{a} ÷ {b} = {int(d) if d.is_integer() else d}")
print(f"{a} ÷ {b} の商は {a // b}、余りは {a % b}") # // と % は、余りが 0 以上になる
動かし方(ファイルを保存したフォルダで) ・ Python を入れる
$ python3 calc.py 7 2
calc.go1.27.2 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
a, _ := strconv.Atoi(os.Args[1])
b, _ := strconv.Atoi(os.Args[2])
if b == 0 {
fmt.Println("0 では割れません")
return
}
// 整数どうしの / は小数を切り捨てるので、小数の答えは float64 にしてから割る
d := strconv.FormatFloat(float64(a)/float64(b), 'f', -1, 64)
// 商と余り: 余りが 0 以上になるようにそろえる(-7 ÷ 2 は 商 -4、余り 1)
q, r := a/b, a%b
if r < 0 {
r += b
q--
}
fmt.Printf("%d + %d = %d\n", a, b, a+b)
fmt.Printf("%d - %d = %d\n", a, b, a-b)
fmt.Printf("%d × %d = %d\n", a, b, a*b)
fmt.Printf("%d ÷ %d = %s\n", a, b, d)
fmt.Printf("%d ÷ %d の商は %d、余りは %d\n", a, b, q, r)
}
動かし方(ファイルを保存したフォルダで) ・ Go を入れる
$ go run calc.go 7 2
calc.js24.15.0 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
const a = Number(process.argv[2]);
const b = Number(process.argv[3]);
if (b === 0) {
console.log("0 では割れません");
} else {
// 商と余り: 余りが 0 以上になるようにそろえる(-7 ÷ 2 は 商 -4、余り 1)
const q = Math.floor(a / b);
const r = a - q * b;
console.log(`${a} + ${b} = ${a + b}`);
console.log(`${a} - ${b} = ${a - b}`);
console.log(`${a} × ${b} = ${a * b}`);
console.log(`${a} ÷ ${b} = ${a / b}`);
console.log(`${a} ÷ ${b} の商は ${q}、余りは ${r}`);
}
動かし方(ファイルを保存したフォルダで) ・ JavaScript を入れる
$ node calc.js 7 2
Calc.java21.0.12 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
public class Calc {
public static void main(String[] args) {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
if (b == 0) {
System.out.println("0 では割れません");
return;
}
// 整数どうしの / は小数を切り捨てるので、小数の答えは double にしてから割る
double d = (double) a / b;
String ds = d == Math.rint(d) ? String.valueOf((long) d) : String.valueOf(d);
System.out.println(a + " + " + b + " = " + (a + b));
System.out.println(a + " - " + b + " = " + (a - b));
System.out.println(a + " × " + b + " = " + (a * b));
System.out.println(a + " ÷ " + b + " = " + ds);
// 商と余り: Math.floorDiv と Math.floorMod は、余りが 0 以上になる(-7 ÷ 2 は 商 -4、余り 1)
System.out.println(a + " ÷ " + b + " の商は " + Math.floorDiv(a, b) + "、余りは " + Math.floorMod(a, b));
}
}
動かし方(ファイルを保存したフォルダで) ・ Java を入れる
$ java Calc.java 7 2
calc.cs10.0.402 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
using System.Globalization;
int a = int.Parse(args[0]);
int b = int.Parse(args[1]);
if (b == 0)
{
Console.WriteLine("0 では割れません");
return;
}
// 整数どうしの / は小数を切り捨てるので、小数の答えは double にしてから割る
string d = ((double)a / b).ToString(CultureInfo.InvariantCulture);
// 商と余り: 余りが 0 以上になるようにそろえる(-7 ÷ 2 は 商 -4、余り 1)
int q = a / b, r = a % b;
if (r < 0) { r += b; q--; }
Console.WriteLine($"{a} + {b} = {a + b}");
Console.WriteLine($"{a} - {b} = {a - b}");
Console.WriteLine($"{a} × {b} = {a * b}");
Console.WriteLine($"{a} ÷ {b} = {d}");
Console.WriteLine($"{a} ÷ {b} の商は {q}、余りは {r}");
動かし方(ファイルを保存したフォルダで) ・ C# を入れる
$ dotnet run calc.cs -- 7 2
calc.rs1.99.0 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
fn main() {
let args: Vec<String> = std::env::args().collect();
let a: i64 = args[1].parse().unwrap();
let b: i64 = args[2].parse().unwrap();
if b == 0 {
println!("0 では割れません");
return;
}
// 整数どうしの / は小数を切り捨てるので、小数の答えは f64 にしてから割る
let d = a as f64 / b as f64;
println!("{a} + {b} = {}", a + b);
println!("{a} - {b} = {}", a - b);
println!("{a} × {b} = {}", a * b);
println!("{a} ÷ {b} = {d}");
// 商と余り: div_euclid と rem_euclid は、余りが 0 以上になる(-7 ÷ 2 は 商 -4、余り 1)
println!("{a} ÷ {b} の商は {}、余りは {}", a.div_euclid(b), a.rem_euclid(b));
}
動かし方(ファイルを保存したフォルダで) ・ Rust を入れる
$ rustc calc.rs && ./calc 7 2
calc.rb4.0.7 で 6 / 6 件の出力が正解と一致
# 2つの整数で、足し算・引き算・掛け算・割り算をする
a = ARGV[0].to_i
b = ARGV[1].to_i
if b.zero?
puts "0 では割れません"
exit
end
# 整数どうしの / は小数を切り捨てるので、小数の答えは fdiv で求める(9.fdiv(3) は 3.0 なので整数に直す)
d = a.fdiv(b)
puts "#{a} + #{b} = #{a + b}"
puts "#{a} - #{b} = #{a - b}"
puts "#{a} × #{b} = #{a * b}"
puts "#{a} ÷ #{b} = #{d == d.floor ? d.to_i : d}"
puts "#{a} ÷ #{b} の商は #{a / b}、余りは #{a % b}" # 整数の / と % は、余りが 0 以上になる
動かし方(ファイルを保存したフォルダで) ・ Ruby を入れる
$ ruby calc.rb 7 2
calc.kt2.4.21 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
fun main(args: Array<String>) {
val a = args[0].toInt()
val b = args[1].toInt()
if (b == 0) {
println("0 では割れません")
return
}
// 整数どうしの / は小数を切り捨てるので、小数の答えは Double にしてから割る
val d = a.toDouble() / b
val ds = if (d % 1.0 == 0.0) d.toLong().toString() else d.toString()
println("$a + $b = ${a + b}")
println("$a - $b = ${a - b}")
println("$a × $b = ${a * b}")
println("$a ÷ $b = $ds")
// 商と余り: floorDiv と mod は、余りが 0 以上になる(-7 ÷ 2 は 商 -4、余り 1)。% は割られる数の符号になる(余り -1)
println("$a ÷ $b の商は ${a.floorDiv(b)}、余りは ${a.mod(b)}")
}
動かし方(ファイルを保存したフォルダで) ・ Kotlin を入れる
$ kotlinc calc.kt -include-runtime -d calc.jar && java -jar calc.jar 7 2
calc.swift6.3.3 で 6 / 6 件の出力が正解と一致
// 2つの整数で、足し算・引き算・掛け算・割り算をする
let args = CommandLine.arguments
let a = Int(args[1])!
let b = Int(args[2])!
if b == 0 {
print("0 では割れません")
} else {
// 整数どうしの / は小数を切り捨てるので、小数の答えは Double にしてから割る
// Double をそのまま書くと 3.0 のように .0 が付くので、割り切れるときは整数で書く
let d = a % b == 0 ? String(a / b) : String(Double(a) / Double(b))
// 商と余り: Swift の % は割られる数の符号になるので、余りが 0 以上になるようにそろえる(-7 ÷ 2 は 商 -4、余り 1)
var q = a / b, r = a % b
if r < 0 {
r += abs(b)
q += b > 0 ? -1 : 1
}
print("\(a) + \(b) = \(a + b)")
print("\(a) - \(b) = \(a - b)")
print("\(a) × \(b) = \(a * b)")
print("\(a) ÷ \(b) = \(d)")
print("\(a) ÷ \(b) の商は \(q)、余りは \(r)")
}
動かし方(ファイルを保存したフォルダで) ・ Swift を入れる
$ swift calc.swift 7 2
言語でつまずきやすいところ
初心者がよく書く形(各言語で最初に習う書き方をそのまま使ったもの)を、同じ正解表で動かした結果です。言語を出した答えごとにまとめ、赤い字はその言語が実際に出した間違った行です。
| 入力 | 初心者がよく書く形の答え(10言語) |
|---|---|
割り切れない(7 ÷ 2)7 2 |
|
割り切れる(9 ÷ 3)9 3 |
|
小数になる(1 ÷ 8)1 8 |
|
負の数(−7 ÷ 2)-7 2 |
|
10 ÷ 410 4 |
|
0 で割る5 0 |
|
この回でやること
- 文字として受け取った数字を、計算できる数(整数)に変える
+・-・*・/・%で計算する- 0 で割らないように確かめる
解説
数字の文字を、数に変える
コマンドライン引数は、数字に見えても「文字」として渡されます。"7" + "2" は、多くの言語で "72"(文字のつなげ合わせ)になってしまいます。計算する前に int()・Number()・Integer.parseInt() などで整数に変えます。
割り算は、言語で答えが変わる
「整数 ÷ 整数」の答えは、言語によって違います。
| 言語 | 7 / 2 の答え | 9 / 3 の答え |
|---|---|---|
| Python・JavaScript・PHP | 3.5 | 3.0(Python)・3(JavaScript・PHP) |
| Go・Java・C#・Rust・Ruby | 3(小数を切り捨て) | 3 |
Go・Java・C#・Rust・Ruby で 3.5 を出すには、先にどちらかを小数の型(double・float64 など)に変えてから割ります。Python の / は、割り切れても 3.0 のように小数で答えるので、整数で見せたいときは直します。
商と余りは、負の数で言語が分かれる
−7 ÷ 2 の商と余りは、決め方が2つあります。
- 余りを 0 以上にする(数学の決め方): 商 −4、余り 1
- 商を 0 の方へ切り捨てる: 商 −3、余り −1
Python と Ruby の //・/・% は前者、Go・Java・C#・Rust・JavaScript・PHP の /(整数)・% は後者です。この回では「余りは 0 以上」で書いています。Java の Math.floorDiv・Math.floorMod、Rust の div_euclid・rem_euclid のように、前者の答えを出す関数がある言語もあります。
0 では割れない
0 で割ると、多くの言語はエラーで止まります(JavaScript は Infinity という値になります)。割る前に 0 かどうかを確かめます。
練習
- 「7 ÷ 2 = 3.5」の行を「7 ÷ 2 ≒ 3.5」に変えてみましょう
- 2つの数の平均(足して2で割る)を出す行を足してみましょう。整数どうしの割り算に気をつけます