Sponsored Link
 
>>  Main > Programing > Primary > 0004

D言語入門 第04章 - 入力

#01 - 文字列の入力

今回は…

前回までで、変数と出力を使ったプログラムを作りましたが、これだけではプログラムが走ってから終了するまででなにも操作をすることがないので、プログラムを作ったという実感がないかもしれません。
今回は、出力にくわえ、入力という操作を覚えようと思います。
入力には、 readln() というモノを使います。
ここで注意なのですが、この関数は、半角の文字からなる「文字列」しか読み込むことができません。 日本語や整数、実数を読み込もうとしてはいけません。
実際に使うには、次のようにします。
char[] hoge;
hoge = readln();
このように記述すると、コンソール画面での入力が可能になります。

今回のミソ

  • 入力方法するには readln() を使う

サンプルコード

// おまじない。
import std.stdio;

// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    writef("input : ");
    // char[] 型(文字列型)の変数 hoge を定義する。
    char[] hoge;
    // 文字列型の変数 hoge に文字列を入力する。
    // .dupはおまじない
    hoge = readln().dup;
    // 文字列型の変数 hoge の内容を書き出す。
    writef(hoge);
    // おまじない
    return 0;
}

実行結果

input : abc
abc

まとめ

今回は、文字列を入力することができるようになりました。
まぁしかし、文字列だけ読みこめても汎用性は低いでしょうから、数値や実数も読み込めるようにしたいですね。
というわけで、次回は、整数や実数を読み込んでみます。

#02 - 数値の入力

今回は…

前回文字列を入力してみましたが、今回は数値を入力してみます。
前回お話しした通り、 readln() 関数では、半角の文字からなる「文字列」しか読み込めません。
数値を得るには、この文字列を数値に変換しましょう。
import std.conv;
と import std.stdio; の下に書き入れ、
int hoge = toInt("50");
とすることで、文字列をint型に変換することができます。
しかし、前回の readln() で読み込んだ文字列は直接この関数を通すことができません。
readln() 関数を用いて読み込んだ文字列には文字列の最後に改行文字("\n"や"\r", "\r\n")が含まれているからです。
これを取り除かないとうまく変換されないので、これを取り除く作業もします。
取り除くには、
import std.string;
と import std.stdio; の下に書き入れ、
char[] hoge;
hoge = readln();
hoge = chomp(hoge).dup;
とすることで改行文字を取り除いた文字列を得ることができます。
.dupはおまじないです。(D2.0で必要です。文字列のコピーをとります。)
これをしない場合、D2.0ではこのようなエラーをはきます
cannot implicitly convert expression (chomp(cast(const(char)[])readln(stdin),null)) of type const(char)[] to char[]
これは、「内容を変更してはいけない文字列 const(char)[] 型を内容を変更してもよい char[] 型に暗黙的に変換できない」という意味です。
これを回避する方法はいくつかありますが、ここではとりあえず.dupとしておきます。
詳しくは、cast、const/final/invariant、autoなどのキーワードなどとともに、のちに解説を加えます。
まぁ、とにかく、入力した文字列を数値に変換するには、
import std.conv;
import std.string;
と import std.stdio; というおまじないの下に書き、
char[] hoge;
hoge = readln();
hoge = chomp(hoge).dup;
int fuga = toInt(hoge);
と書くことになりますね。

また、数値以外にも、実数を読み込むこともできます。
real fuga = toReal(hoge);

今回のミソ

  • readln() で取得された文字には改行文字が含まれている。
  • 改行文字を取り除くには import std.string; として chomp() を使う。
  • D2.0ではchomp()など文字列を返す関数の後には.dupをつけると char[] 型の変数に(コピーされた文字列が)代入できる。
  • 整数に変換するには import std.conv; として、 toInt() を使う。
  • 実数に変換するには import std.conv; として、 toReal() を使う。

サンプルコード

// おまじない。
import std.stdio;
import std.conv;
import std.string;
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    writef("input : ");
    // char[] 型(文字列型)の変数 hoge を定義する。
    char[] hoge;
    // 文字列型の変数 hoge に文字列を入力する。
    // .dupはおまじない
    hoge = readln().dup;
    // 行末の改行文字を取り除いて代入しなおす。
    // .dup/.idupはおまじない
    hoge = chomp(hoge.idup).dup;
    // 整数型の変数 fuga を定義する
    int fuga;
    // 文字列型の変数 hoge を整数に変換して、
    // 整数型の変数 fuga に代入する。
    // idupはおまじない
    fuga = toInt(hoge.idup);
    // 実数型の変数 piyo を定義する
    real piyo;
    // 文字列型の変数 hoge を実数に変換して、
    // 実数型の変数 piyo に代入する。
    piyo = toInt(hoge.idup);
    // それぞれ書き出してみる
    writefln(fuga);
    writefln(piyo);
    // おまじない
    return 0;
}

実行結果

input : 50
50
50

まとめ

#summary - まとめ

第04章のミソ

  • 入力方法するには readln() を使う
  • readln() で取得された文字には改行文字が含まれている。
  • 改行文字を取り除くには import std.string; として chomp() を使う。
  • D2.0ではchomp()など文字列を返す関数の後には.dupをつけると char[] 型の変数に(コピーされた文字列が)代入できる。
  • 整数に変換するには import std.conv; として、 toInt() を使う。
  • 実数に変換するには import std.conv; として、 toReal() を使う。

宿題

足し算専用の電卓を作りましょう。
以下は出力例です
例1)
input : 15
15 +
input : 40
15 + 40 = 55

例2)
input : 32.5
32.5 +
input : 56.8
32.5 + 56.8 = 89.3

コメント

さてさて、できましたかな~?
入力をすることで、ただただ結果を表示するだけのプログラムじゃなく、対話式のプログラムになりますね。
この入力された値をどのように使うか、ということで、次の章は「分岐」です。
そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~

ページトップ / 目次 / 次へ
Copyright©SHOO All rights reserved. / LastModified : 2007/12/24(月)[04:43:59.891]