その他の部品:
変数
プログラムで提示される特定の概念は変数と呼ばれます 。 気温や車のエンジンなどのより複雑なオブジェクトのような値は、プログラム内の変数になることがあります。
各変数には、特定のタイプと特定の値があります。 ほとんどの変数にも名前がありますが、一部は匿名です。
変数の例として、学校の生徒数の概念を考えることができます。 学生の数は整数であるため、 intが適切なタイプであり、 studentCountはかなりわかりやすい名前になります。
D構文規則に従って、変数はそのタイプで始まり、名前が続きます。 プログラムに変数を導入することを定義と呼びます 。 変数が定義されると、その名前はその値を表し始めます。
インポート標準 stdio ;
ボイドメイン( )
{
//変数の定義; この定義
// studentCount型がintであることを示します。
int studentCount ;
//変数の名前がその値になります:
writeln ( "Present" 、 studentCount 、 "students。" ) ;
}
このプログラムの出力:
0
この行からわかるように、 studentCountの値は0です。前章の基本型の表によると、 intの初期値は0です。
studentCount行は出力に表示されないことに注意してください。 言い換えれば、プログラムは「StudentCount学生が出席しています」と表示しません。
変数値は、 =演算子を使用して変更されます。 =演算子は変数に新しい値を割り当てます。このため、代入演算子と呼ばれています :
インポート標準 stdio ;
ボイドメイン( )
{
int studentCount ;
writeln ( "Present" 、 studentCount 、 "students。" ) ;
// studentCountに200を割り当てます:
studentCount = 200 ;
writeln ( "Now Present、" studentCount 、 "students。" ) ;
}
0 . 200 .
決定時に変数の値がわかっている場合、変数の値はその定義と同時に割り当てることができます。 これは重要な原則です。 これにより、変数に割り当てられた値が割り当てられるまで変数を使用できなくなります。
インポート標準 stdio ;
ボイドメイン( )
{
//値の同時定義と割り当て:
int studentCount = 100 ;
writeln ( "Present" 、 studentCount 、 "students。" ) ;
}
100 .
演習
- 出力「2.11のレートで20ユーロを交換しました」の2つの変数を定義します。 浮動小数点値の場合、 doubleを使用します。
...ソリューション<-!
import std.stdio;
void main()
{
int amount = 20;
ダブルレート= 2.11;
writeln(「交換」、金額、
「レートでのユーロ」、レート);
}
->
インポート標準 stdio ;
ボイドメイン( )
{
int amount = 20 ;
ダブルレート= 2.11 ;
writeln ( "I exchange" 、 amount 、
「レートでのユーロ」 、レート) ;
}
標準入出力ストリーム
その瞬間まで、プログラムの印刷出力はすべてコンソールウィンドウに表示されていました 。 これは実際には多くのプログラムでよく使用されますが、実際には、文字は標準出力ストリームに出力されます 。
標準出力は文字ベースです。 印刷されるものはすべて、最初に記号表現に変換され、次に記号として出力に順次送信されます。 たとえば、前の章で表示した整数値100は、値100としてではなく、3文字の1、0 、および0として出力に送信されます 。
同様に、通常キーボードとして認識しているのは、実際にはプログラムの標準入力ストリームであり、文字にも基づいています。 情報は常にデータに変換するためのシンボルとして提供されます。 たとえば、整数値42は、実際には文字4および2として標準入力に送られます。
これらの変換は自動的に行われます。
この連続文字の概念は、 文字ストリームと呼ばれます 。 標準入力ストリームと標準出力ストリームはこの説明に適合するため、文字ストリームです。
Dの標準入力および出力ストリームの名前は、それぞれstdinおよびstdoutです。
これらのスレッドでの操作には、通常、ストリームの名前、ポイント、および操作の名前が必要です。 例: stream.operation() 。 stdinとstdoutは非常に頻繁に使用されるため、慣例により、名前とピリオドを指定せずに標準操作を呼び出すことができます(例: operation()) 。
前の章で使用したwritelnは、実際にはstdout.writelnの略です。 また、 書き込みはstdout.writeの略です。 したがって、Hello Worldプログラムは次のように記述できます。
インポート標準 stdio ;
ボイドメイン( )
{
標準 writeln ( "Hello world!" ) ;
}
演習
- stdout.writeが writeと同じように機能することを確認してください。
...ソリューション
インポート標準 stdio ;
ボイドメイン( )
{
標準 writeln ( 1 、 "、" 、 2 ) ;
}
標準入力ストリームからの読み取り
プログラムによって読み取られたデータは、最初に変数に格納する必要があります。 たとえば、標準入力ストリームから生徒数を読み取るプログラムは、この情報を変数に格納する必要があります。 この特定の変数の型はintです。
前の章で見たように、情報を表示するときに想定されるようにstdoutを指定する必要はありません。 さらに、出力されるものは引数として示されます。 したがって、 studentCountの値を表示するにはwrite(studentCount)で十分です 。 要約すると:
: stdout : write : studentCount : ,
書き込みの逆の操作はreadfです。 彼女は標準入力ストリームから読み取ります。 名前の文字「f」は「formatted」から取られます。この関数が読み取るものは常に特定の形式で表示される必要があるためです。
また、前の章で、標準入力ストリームがstdinと呼ばれることを学びました。
読むとき、パズルの一部がまだありません:データを保存する場所。 要約すると:
: stdin : readf : : ?
データを保存する場所の場所は、変数のアドレスを使用して示されます。 変数のアドレスは、その値が保存されているコンピューターのメモリ内の正確な位置です。
Dでは、名前の前に表示される「&」文字は、この変数が表すもののアドレスです。 たとえば、 studentCountのアドレスは&studentCountです。 ここで、 &studentCountは「 studentCount address」と読むことができ、これは上記の疑問符に代わる欠落部分です。
: stdin : readf : : studentCount
名前の前に&を入力すると、その名前が表すものの住所を取得することを意味します 。 この概念は参照とポインタの基礎であり、これについては次の章で説明します。
readfを使用する1つの機能の説明は延期します。 さて、 readfの最初の引数は文字列 "%s"でなければならないというルールを取りましょう :
readf("%s", &studentCount);
注:以下で説明するように、ほとんどの場合、行にはスペースも含める必要があります: "%s"。
「%s」は、データが変数のタイプに一致する方法で自動的に変換されることを示します。 たとえば、文字「4」および「2」をint変数に読み込む場合、整数値42に変換する必要があります。
以下のプログラムでは、ユーザーに生徒数を入力するように求めています。 エントリの終了後にEnterキーを押す必要があります。
インポート標準 stdio ;
ボイドメイン( )
{
書きます( 「何人の学生がいますか?」 ) ;
/ *
*使用する変数を宣言する
*入力ストリームから読み取られる情報のストレージ
* /
int studentCount ;
//この変数に入力を書き込みます
readf ( "%s" 、 および studentCount ) ;
writeln ( "Got it:Present、" studentCount 、 "students。" ) ;
}
空白をスキップする
データの入力後に押すEnterキーでさえ、特別なコードとして保存され、 stdinストリームに配置されます。 これは、プログラムが情報が1つ以上の行に入力されているかどうかを検出するのに役立ちます。
これは便利な場合もありますが、そのような特定のコードはほとんどの場合プログラムにとって重要ではないため、入力から削除する必要があります。 それ以外の場合、入力をブロックし、他のデータが読み取られないようにします。
問題を実証するために、入力ストリームから教師の数も読み取りましょう。
インポート標準 stdio ;
ボイドメイン( )
{
書きます( 「何人の学生がいますか?」 ) ;
int studentCount ;
readf ( "%s" 、 および studentCount ) ;
書きます( 「先生は何人いますか?」 ) 。
int teacherCount ;
readf ( "%s" 、 および teacherCount ) ;
writeln ( "Got it:Present、" studentCount 、 "students" 、
「そして」 teacherCount 、 「教師」。 ) ;
}
残念ながら、2番目のintの読み取り中にプログラムが停止しました 。
? 100 ? 20 <-
ユーザーは20に等しい教師の数を入力しましたが、以前の値100を読み取るときにEnterキーを表す特別なコードが入力ストリームにまだあり、それをブロックしています。 入力ストリームに保存される文字は次のようになります。
100[EnterCode]20[EnterCode]
最初の文字[EnterCode]は入力をブロックします。
この問題の解決策は、%sの前にスペースを追加して、教師の数を読む前に遭遇する可能性のあるEnterキーコードが重要ではないことを示すことです: "%s"。 フォーマット文字列内のスペースは、入力に先行する可能性のあるゼロ個以上の不可視文字を読み取って無視するために使用されます。 そのような文字には、スペース文字自体、Enterキーを表すコード、Tabキーの文字 、および空白文字と呼ばれるその他のものが含まれます 。
一般に、入力ストリームから読み取られるデータには「%s」を使用できます。 上記のプログラムは、次の変更により期待どおりに機能します。
// ...
readf ( "%s" 、 および studentCount ) ;
// ...
readf ( "%s" 、 および teacherCount ) ;
// ...
結論:
? 100 ? 20 : 100 20 .
追加情報
- //で始まる行は、単一行のコメントを示します。 複数行のコメントを書くには、行をラベル/ *および* /で囲みます。
他のコメントをコメントアウトするには、/ +および+ /を使用します。
/ +
//単一行コメント
/ *
取るコメント
数行
* /
他のコメントを含むコメントブロック
+ /
- ソースコード内のほとんどのスペースは重要ではありません。 コードを読みやすくするために、複数行に長い式を記述するか、余分なスペースを追加することをお勧めします。 ただし、言語構文の規則に従っている限り、追加のスペースなしでプログラムを作成できます。
インポート標準 stdio ; void main ( ) { writeln ( "読みにくい!" ) ; }
これほど多くのスペースがあるコードは読みにくいです。
演習
- プログラムが整数値を予期しているときに数字以外の文字を入力し、プログラムが正しく動作しないことを観察します。
...ソリューション文字を目的のタイプに変換できない場合、 stdinは 使用できない状態になります。 たとえば、 intが予想されるときに「abc」と入力すると、 stdinが 使用できなくなります。