{ }codelper
入れ子の条件比較P0020

三つの数の真ん中

整数 a, b, c が一行に空白区切りで与えられる。
三つを大きさの順に並べたとき真ん中に来る数を出力せよ。
同じ数があってもよい(例:5 5 1 なら真ん中は 5)。
ソート関数やリストの並べ替えを使わず、比較だけで解いてみよう。

入力
-1,000,000,000 ≤ a, b, c ≤ 1,000,000,000
出力
真ん中の数を一つ
例 1 · stdin
3 9 5
stdout
5
例 2 · stdin
5 5 1
stdout
5
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

同じ値があるときが落とし穴です。
a < b < c or c < b < a のように < だけを使うと、5 5 1 はどの分岐にも入らず最後の else に落ちます。
先に a >= b で二つに分け、その中で c の位置を聞けば(入れ子の条件)同じ値も漏れなく入ります。
比較をつなげる a < b < c が数学どおりに読めるのは Python だけです。
C・C++・Java・C#・JS では a < b && b < c と分けて書きます(C・C++・JS では a < b < c も文法上は通りますが、(a < b) の真偽(1/0、true/false)を c と比べるという別の意味になります)。
JS・TS は入力を Number に変えないと文字列比較("10" < "9" が真)になります。
Craykon は もし (a >= b) { もし (…) { } でなければ { } } のように中にもう一度書きます。
分岐の中で初めて作った変数は外で使えない(Java・C#・C・C++ も同じ)ので、mid は分岐の前に作っておきます。
Python は違い、if の中で作った変数も外から見えます。

Pythonmain.py · 16 行
a, b, c = map(int, input().split())if a >= b:    if b >= c:        mid = b      # a >= b >= c    elif a >= c:        mid = c      # a >= c > b    else:        mid = a      # c > a >= belse:    if a >= c:        mid = a      # b > a >= c    elif b >= c:        mid = c      # b >= c > a    else:        mid = b      # c > b > aprint(mid)
JavaScriptmain.js · 12 行
const [a, b, c] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let mid;if (a >= b) {  if (b >= c) mid = b;  else if (a >= c) mid = c;  else mid = a;} else {  if (a >= c) mid = a;  else if (b >= c) mid = c;  else mid = b;}console.log(mid);
TypeScriptmain.ts · 13 行
import { readFileSync } from "node:fs";const [a, b, c]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let mid: number;if (a >= b) {  if (b >= c) mid = b;  else if (a >= c) mid = c;  else mid = a;} else {  if (a >= c) mid = a;  else if (b >= c) mid = c;  else mid = b;}console.log(mid);
JavaMain.java · 19 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();        int mid;        if (a >= b) {            if (b >= c) mid = b;            else if (a >= c) mid = c;            else mid = a;        } else {            if (a >= c) mid = a;            else if (b >= c) mid = c;            else mid = b;        }        System.out.println(mid);    }}
C#Main.cs · 24 行
using System; class Program{    static void Main()    {        int[] v = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        int a = v[0], b = v[1], c = v[2];        int mid;        if (a >= b)        {            if (b >= c) mid = b;            else if (a >= c) mid = c;            else mid = a;        }        else        {            if (a >= c) mid = a;            else if (b >= c) mid = c;            else mid = b;        }        Console.WriteLine(mid);    }}
C++main.cpp · 16 行
#include <iostream> int main() {    int a, b, c, mid;    std::cin >> a >> b >> c;    if (a >= b) {        if (b >= c) mid = b;        else if (a >= c) mid = c;        else mid = a;    } else {        if (a >= c) mid = a;        else if (b >= c) mid = c;        else mid = b;    }    std::cout << mid << "\n";}
Cmain.c · 17 行
#include <stdio.h> int main(void) {    int a, b, c, mid;    scanf("%d %d %d", &a, &b, &c);    if (a >= b) {        if (b >= c) mid = b;        else if (a >= c) mid = c;        else mid = a;    } else {        if (a >= c) mid = a;        else if (b >= c) mid = c;        else mid = b;    }    printf("%d\n", mid);    return 0;}
Craykonmain.cray · 36 行
v = コンソール.数読み();a = v[0];b = v[1];c = v[2];mid = 0;もし (a >= b){    もし (b >= c)    {        mid = b;    }    でなければ もし (a >= c)    {        mid = c;    }    でなければ    {        mid = a;    }}でなければ{    もし (a >= c)    {        mid = a;    }    でなければ もし (b >= c)    {        mid = c;    }    でなければ    {        mid = b;    }}コンソール.書く(mid);