Page Top

今回は… anchor.png

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

char[] hoge;
hoge = readln();

このように記述すると、コンソール画面での入力が可能になります。

Page Top

今回のミソ anchor.png

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

サンプルコード anchor.png

filesample0401p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 
 
 
-
!
-
-
!
-
!
-
|
!
-
!
-
!
!
// おまじない。
import std.stdio;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    write("input : ");
    // char[] 型(文字列型)の変数 hoge を定義する。
    char[] hoge;
    // 文字列型の変数 hoge に文字列を入力する。
    // .dupはおまじない
    hoge = readln().dup;
    // 文字列型の変数 hoge の内容を書き出す。
    write(hoge);
    // おまじない
    return 0;
}
+  Tango用はこちら
filesample0401t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
 
-
|
|
!
 
-
!
-
-
|
!
-
!
-
!
-
!
-
!
!
// おまじない。
import tango.io.Stdout;
// Tangoだと、文字列の入力に Cin を使います。
// Cin を使うには以下のモジュールをimportします。
// ようは、おまじない。
import tango.io.Console;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    // .flush は、画面上への出力を確実に行うために必要です。
    Stdout("input : ").flush;
    // char[] 型(文字列型)の変数 hoge を定義する。
    char[] hoge;
    // 文字列型の変数 hoge に文字列を入力する。
    hoge = Cin.copyln();
    // 文字列型の変数 hoge の内容を書き出す。
    Stdout(hoge);
    // おまじない
    return 0;
}
Page Top

実行結果 anchor.png

1
2
3
$ dmd -run sample0401p.d
input : abc
abc
Page Top

まとめ anchor.png

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

Page Top

#02 - 数値の入力 anchor.png

Page Top

今回は… anchor.png

前回文字列を入力してみましたが、今回は数値を入力してみます。
前回お話しした通り、 readln() 関数では、半角の文字からなる「文字列」しか読み込めません。
数値を得るには、この文字列を数値に変換しましょう。

import std.conv;

と import std.stdio; の下に書き入れ、

int hoge = to!(int)("50");

とすることで、文字列をint型に変換することができます。
しかし、前回の readln() で読み込んだ文字列は直接この関数を通すことができません。
readln() 関数を用いて読み込んだ文字列には文字列の最後に改行文字("\n"や"\r", "\r\n")が含まれているからです。
これを取り除かないとうまく変換されないので、これを取り除く作業もします。
取り除くには、

import std.string;

と import std.stdio; の下に書き入れ、

char[] hoge;
hoge = readln();
hoge = chomp(hoge).dup;

とすることで改行文字を取り除いた文字列を得ることができます。
.dupはおまじないです。*1

1
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 = to!(int)(hoge);

と書くことになりますね。

また、数値以外にも、実数を読み込むこともできます。

real fuga = toReal(hoge);

このように記述すると、コンソール画面での入力が可能になります。

Page Top

今回のミソ anchor.png

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

サンプルコード anchor.png

filesample0402p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
 
 
 
-
!
-
-
!
-
!
-
|
!
-
|
!
-
!
-
|
|
|
|
!
-
!
-
|
!
-
!
|
-
!
!
// おまじない。
import std.stdio;
import std.conv;
import std.string;
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    write("input : ");
    // char[] 型(文字列型)の変数 hoge を定義する。
    char[] hoge;
    // 文字列型の変数 hoge に文字列を入力する。
    // .dupはおまじない
    hoge = readln().dup;
    // 行末の改行文字を取り除いて代入しなおす。
    // .dup/.idupはおまじない
    hoge = chomp(hoge.idup).dup;
    // 整数型の変数 fuga を定義する
    int fuga;
    // 文字列型の変数 hoge を整数に変換して、
    // 整数型の変数 fuga に代入する。
    // to!(文字列から変換したい型)(文字列)
    // とすることで、文字列から整数や実数に変換することが可能
    // idupはおまじない
    fuga = to!(int)(hoge.idup);
    // 実数型の変数 piyo を定義する
    real piyo;
    // 文字列型の変数 hoge を実数に変換して、
    // 実数型の変数 piyo に代入する。
    piyo = to!(real)(hoge.idup);
    // それぞれ書き出してみる
    writeln(fuga);
    writeln(piyo);
    // おまじない
    return 0;
}
+  Tango用はこちら
filesample0402t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
 
 
-
!
-
!
-
!
-
-
!
-
!
-
|
|
|
!
-
!
-
|
!
-
!
-
|
|
!
-
!
|
-
!
!
// おまじない。
import tango.io.Console;
import tango.io.Stdout;
// toIntを使うためのおまじない
import tango.text.convert.Integer;
// toFloatを使うためのおまじない
import tango.text.convert.Float;
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    Stdout("input : ").flush;
    // char[] 型(文字列型)の変数 hoge を定義する。
    char[] hoge;
    // 文字列型の変数 hoge に文字列を入力する。
    // Tangoの場合、Cin.copyln()を使うが、これによって取得できる文字列の最後には
    // 改行文字が存在しない。
    // 従って、chomp相当の関数を使用する必要はない。
    hoge = Cin.copyln();
    // 整数型の変数 fuga を定義する
    int fuga;
    // 文字列型の変数 hoge を整数に変換して、
    // 整数型の変数 fuga に代入する。
    fuga = toInt(hoge);
    // 実数型の変数 piyo を定義する
    real piyo;
    // 文字列型の変数 hoge を実数に変換して、
    // 実数型の変数 piyo に代入する。
    // Tangoでは toFloat を使用する。
    piyo = toFloat(hoge);
    // それぞれ書き出してみる
    Stdout(fuga).newline;
    Stdout(piyo).newline;
    // おまじない
    return 0;
}
Page Top

実行結果 anchor.png

1
2
3
4
$ dmd -run sample0402p.d
input : 50
50
50
Page Top

まとめ anchor.png

今回は文字列から数値に変換する作業を行った。
注意しなければいけないのは、文字列と数値を同じようには扱えないということ。 すなわち、以下のコードは間違いとなる。

char[] hoge;
hoge = readln();
writefln(hoge + 100);

上記の例は、文字列の変数 hoge と、数値の定数 100 を足し算したものである。
文字列と数値は足し算することができないため、エラーとなる。
今回の文字列を数値に変換する方法(to!(int)()to!(real)())を適宜利用してください。

Page Top

#summary - まとめ anchor.png

Page Top

第04章のミソ anchor.png

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

宿題 anchor.png

足し算専用の電卓を作りましょう。
以下は出力例です

例1)

1
2
3
4
input : 15
15 +
input : 40
15 + 40 = 55

例2)

1
2
3
4
input : 32.5
32.5 +
input : 56.8
32.5 + 56.8 = 89.3
Page Top

コメント anchor.png

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

そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~


Page Top

投票とコメント anchor.png

Choices Vote
大変参考になった5  
参考になった1  
あまり参考にならなかった0  
まったく参考にならなかった0  

Show recent 10 comments. Go to the comment page.

  • real fuga = toReal(hoge);はreal fuga = to!(real)(hoge)の間違いでは? -- ゲストEdit 2012-12-10 (月) 18:46:58
Name:

*1 D2.0で必要です。文字列のコピーをとります。これをしない場合、D2.0ではこのようなエラーをはきます

Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 5619, today: 2, yesterday: 1
Princeps date: 2012-12-10 (Mon) 18:47:02
Last-modified: 2012-12-10 (Mon) 18:47:02 (JST) (2917d) by ゲスト
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu