{ }codelper
null 値真偽値n行の読み込みP0047

空欄は前の値で

温度計が n 回測った値を順に記録したが、測れなかったときは空行として残った。
一行目に n が与えられ、続く n 行はそれぞれ整数一つか空行(空白もない行)である。
各行について結果を一行ずつ出力せよ:整数があればその数を、空行ならそれより前で最も最近記録された数を書く。
前に記録された数が一つもなければ "なし" を書く。
0 と負の数も記録された数である。

入力
1 ≤ n ≤ 1,000、-1,000 ≤ 記録された数 ≤ 1,000
出力
n 行、数または "なし"
例 1 · stdin
5

3

0

stdout
なし
3
3
0
0
例 2 · stdin
3
-1


stdout
-1
-1
-1
main.py
入力(stdin)

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

$ 準備完了

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

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

「まだ値がない」を入れる方法は言語ごとに違います。
Python None(last is None で確かめる)、JS null、TS number | null(strict モードでは確かめる前に数として使えない)、Java は int に null を入れられないので Integer(null のまま計算すると NullPointerException)、C# は int?(HasValue、??)、C++17 は std::optional<int>、Craykon は なし。
C の int には「なし」がまったくないので、bool has = false(<stdbool.h>)のような真偽値を別に持ちます。
落とし穴は三つ:① 「なし」を 0 や -1 のような特別な数で代用すると、本物の 0・-1 と区別できません(例 2)。
② if (last)・if last: のように真偽で聞くと、JS と Python は 0 も偽と見なすので、0 を読んだあとに "none" が出ます — last === null、last is None のように null かどうかを別に聞きます。
③ 空行は null ではなく空文字列 "" です(Craykon コンソール.行読み() も空行なら ""、入力が終わって初めて なし)。
これをそのまま数にすると Python int("") は ValueError、Java Integer.parseInt("") は NumberFormatException で止まり、JS Number("") と C atoi("") は黙って 0 になります。
だから数にする前に、空行かどうかを文字のまま確かめます。

Pythonmain.py · 7 行
n = int(input())last = None                      # 아직 읽은 수가 없음for _ in range(n):    line = input()    if line != "":        last = int(line)    print("なし" if last is None else last)
JavaScriptmain.js · 10 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);let last = null; // 아직 읽은 수가 없음const out = [];for (let i = 1; i <= n; i++) {  // Number("")는 0이라서 빈 줄인지 먼저 글자로 확인한다  if (lines[i] !== "") last = Number(lines[i]);  out.push(last === null ? "なし" : last);}console.log(out.join("\n"));
TypeScriptmain.ts · 11 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);let last: number | null = null; // 아직 읽은 수가 없음const out: string[] = [];for (let i = 1; i <= n; i++) {  // Number("")는 0이라서 빈 줄인지 먼저 글자로 확인한다  if (lines[i] !== "") last = Number(lines[i]);  out.push(last === null ? "なし" : String(last));}console.log(out.join("\n"));
JavaMain.java · 18 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        Integer last = null; // int는 null을 담을 수 없어 Integer를 쓴다        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            String line = in.readLine();            if (!line.isEmpty()) last = Integer.parseInt(line);            out.append(last == null ? "なし" : last.toString()).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 19 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int? last = null; // int? 는 null도 담는 int        var out_ = new StringBuilder();        for (int i = 0; i < n; i++)        {            string line = Console.ReadLine();            if (line != "") last = int.Parse(line);            out_.Append(last.HasValue ? last.Value.ToString() : "なし").Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 16 行
#include <iostream>#include <optional>#include <string> int main() {    std::string line;    std::getline(std::cin, line);    int n = std::stoi(line);    std::optional<int> last;  // 처음에는 값이 없음    for (int i = 0; i < n; i++) {        std::getline(std::cin, line);        if (!line.empty()) last = std::stoi(line);        if (last) std::cout << *last << '\n';        else std::cout << "なし\n";    }}
Cmain.c · 22 行
#include <stdbool.h>#include <stdio.h>#include <stdlib.h> int main(void) {    char line[32];    fgets(line, sizeof line, stdin);    int n = atoi(line);    /* C의 int에는 '값 없음'이 없어서 따로 참·거짓 하나를 둔다 */    bool has = false;    int last = 0;    for (int i = 0; i < n; i++) {        fgets(line, sizeof line, stdin);        if (line[0] != '\n' && line[0] != '\0') {            last = atoi(line);            has = true;        }        if (has) printf("%d\n", last);        else puts("なし");    }    return 0;}
Craykonmain.cray · 18 行
n = コンソール.行読み().数に();마지막 = なし;繰り返す (i = 0; i < n; i++){    줄 = コンソール.行読み();    もし (줄 != "")    {        마지막 = 줄.数に();    }    もし (마지막 == なし)    {        コンソール.書く("なし");    }    でなければ    {        コンソール.書く(마지막);    }}