連載プロデル入門の第11話目になりました。今回は、データ型について詳しく説明します。
プロデルには、数値や文字列といった値があります。値にはいくつかのタイプがあり、これらのタイプを「データ型」と呼びます。プロデルには、これまでには紹介していないデータ型がありますので今回はこれらのデータ型について一つ一つ説明します。少し難しい話が続きますがデータ型が分かるとプログラミングがより深く理解できるかと思います。
値には、数値や文字列などがあり、情報の量や表現できる内容に特徴があります。このような値の特徴をタイプ別に分けたものをデータ型と言います。変数については第2話で説明しましたが、実は、変数に入れる値のタイプをデータ型として指定することができます。
プロデルのデータ型については、マニュアルに列挙してあります。
変数にデータ型を決めて宣言するには『【変数の名前:データ型】』の形式で、次のように書きます。このように宣言した変数を「文字列型の変数」「整数型の変数」などと言います。
【箱1:文字列】
【箱2:整数】
第9話では「種類」を説明しましたが、種類もデータ型のひとつです。そのため「文字列」や「整数」と同じように種類名も同じようにデータ型として指定できます。
このようにデータ型を指定して宣言した変数では、原則として、データ型が異なる値を代入できません。
なお、手順の実補語の仮引数にも同じように「:」を使ってデータ型を指定できます。
データ型には、「値型」と「参照型」の2つに分けられます。簡単に説明すると、値型は、定数式で指定でき、代入する度に値が複製される種類のデータ型です。参照型は、はじめに「作る」文でオブジェクトを作るデータ型です。それぞれについて説明します。
A. 値型
値型は、変数や引数といったメモリ上の箱に値そのものを直接格納するデータ型です。代入文で値そのものが複製されて代入先の箱を代入されます。値型には、「文字列」,数値型と「真偽値」,「日時形式」,「日時期間形式」などがあります。
文字列型
文字列型は、0文字以上の文字を表す値型のデータ型です。プロデル上では便宜的に文字列を値型として扱っています。文字列については、第10話で紹介しました。
数値型
数値型とは、その名の通り数値を表現する値型のデータ型です。「整数」「長整数」「浮動小数」「倍浮動小数」「固定小数」があります。
値などの情報を記憶する時に、その情報量に応じて記憶に使うコンピュータのメモリの大きさが決まっています。ちょっとした数値ならば少しの大きさで事足りますが、大きな値の場合にはその分だけのメモリの場所が必要です。数値型では、データ型ごとに値が表せる範囲が決まった何種類かのデータ型があります。
数値型には、「整数」「長整数」「浮動小数」「倍浮動小数」といったたくさんの種類があります。それぞれの数値には記録できる桁数に違いがあります。
数値型とその格納できる値の範囲、ビット数を表にまとめました。
値型名 | 格納できる値の範囲 | ビット数 |
---|---|---|
整数 | -2,147,483,648~2,147,483,647 | 32 |
長整数 | -9,223,372,036,854,775,808~9,223,372,036,854,775,807 | 64 |
浮動小数 | 約7桁 | 32 |
倍浮動小数 | 約15~16桁 | 64 |
固定小数 | 約28~29桁 | 128 |
表の「ビット数」は、数値を記録するために必要なメモリ上の大きさです。「整数」が一番よく使う数値型です。長整数のビット数は整数の2倍ですのでその分、値の範囲が広くなります。なお、値は2進数で記録されるので、格納できる値の範囲は、2進数で切りが良い数字になっています。
【値A:整数】は、123
【値B:長整数】は、123123123
整数は、次のように16進数表記や2進数表記で書くこともできます。
値Cは、0xFF15 //16進数表記
値Dは、0b1010 //2進数表記
次に「浮動小数」「倍浮動小数」は、小数を表現できる数値型です。格納できる値の範囲は、整数部分と小数部分とを合わせた桁数となります。
固定小数(Decimal)も小数が表現できる数値型です。他の数値型に比べて値の範囲が一番広く、10進数で小数部分の誤差無く表現されることが特徴です。そのため例えば金額を計算する時に適しています。
浮動小数と倍浮動小数の誤差
「浮動小数」「倍浮動小数」では、2進数で正確に表現できない小数の値があり、このような値を記録した時に、丸め誤差が起こることがあります。一方固定小数は、誤差が起きない正確に値を表現できるデータ型です。浮動小数での誤差が気になる場合には、「固定小数」で値を扱うのが便利です。
オーバーフロー(桁あふれ)
数値型は格納できる値の範囲を超えるとオーバーフロー(桁あふれ)します。オーバーフローとは、値を保持するために予め用意した箱の大きさに、値が納まりきれなくなった状態のことです。
次の例では、整数型の変数に範囲を超える長整数の値を代入しています。予め用意した整数型の大きさに無理矢理、表現できない大きい値を入れたことで、元とは異なる値になってしまいます。
【値:整数】は、123123123123123 //整数の範囲を超える長整数の値を入れる
値を報告する //-704351309となる(オーバーフローする)
真偽値
真偽値型は、真と偽の2つの状態だけを持つ値型のデータ型です。真偽値では、真と偽の2つの値で表現しますが、次の表のようにいくつかの書き方で指定できます。
真の値 | 真,○,オン,1 |
偽の値 | 偽,×,オフ,0 |
判定結果は、○
もし判定結果が○なら
「成功」と表示する
もし終わり
条件式の結果を真偽値として代入する
もし文の条件式は、その判定結果が真偽値として返されます。そのため、次のプログラムのように代入文に条件式を書くこともできます。実行すると、条件式の結果が真偽値として変数に代入されます。
値は、120
結果は、値が100以上
結果を報告する
列挙型
列挙型は、選択肢を表す値型のデータ型です。整数に変換することもできます。
現在のプロデルでは、GUI部品で見た目や状態を指定する時に使います。
ウィンドウを作る
その種類をダイアログに変える
それを表示する
待機する
日時形式と日時期間形式
日時形式型は、年月日と時分秒を表現する値型のデータ型です。日時期間形式型は、経過時間や差分時間を表現するデータ型です。
「日時形式化」手順を使うと、文字列の日時表記から日時形式型へ変換できます。日時形式型では、その値が表す年月日,時分秒をそれぞれ取り出せます。また「前日」設定項目や「翌日」設定項目で、前日と翌日をそれぞれ日時形式型の値として調べることもできます。
対象日時は「2019/01/02 12:23:45」を日時形式化
対象翌日は、対象日時の翌日
対象翌日の日付を報告する
日時形式と日時期間形式でそれぞれ使える設定項目は、次の通りです。
日時形式型の値では、足し算と引き算を使うことができます。その結果は日時期間形式型の値になります。経過日数を計算する時などには便利です。
対象日時は「2021/01/01 12:23:45」を日時形式化
時間差は、今日-対象日時
「[対象日時の日付]とは[時間差の日数]日差があります」を報告する
このように、日時形式と日時期間形式では、日時や時刻をまとめて一つの値として扱うことができます。文字列や数値は単一の値ですが、このような複雑な値を持つデータ型もあります。
B.参照型
参照型は、オブジェクトを格納するためのデータ型です。参照型は、配列や「作る」文でオブジェクトを作る必要がある種類を表すデータ型です。種類定義から作ったオブジェクトは、基本的に参照型となります。
参照型の変数は、変数の箱そのものと、その中身をそれぞれ別々の場所に分けて保管します。「作る」文などで作ったオブジェクトは、オブジェクトを保管する場所(ヒープ領域)に格納されます。変数の箱の中には、オブジェクトが置いてある場所だけが代入されます。
値型と参照型の違い
値型と参照型の違いは、別の変数に代入する時や手順の引数として指定した時に、値がコピーされるかどうかの違いです。値型は変数の中に値そのものが代入されています。一方参照型は、変数の中にオブジェクトの参照先(メモリ上の置き場所)が入っています。
例えば、整数は値型であり、配列は参照型です。この2つのデータ型の内容を変数に入れて操作した時の例を図に表しました。配列については第5話で紹介しました。
値型は、別の変数に代入すると値(120)が複製されます。2つの変数は値をそれぞれ保持するので、代入後に、元の変数の値を変えても、別の変数はそのままです。
一方参照型は、別の変数に代入しても元と同じ配列を指し示します。そのため、元の変数と別の変数とは、どちらも同じ配列を操作することになります。例えば、次のプログラムのように配列Bを使って要素の値を99に変えると、配列Aで要素を取得しても99という同じ結果が表示されます。配列Aも配列Bもメモリ上では同じ配列だからです。
配列A={1,2,3}
配列B=配列A
配列B(1)=99
「A」&配列Aを報告する
「B」&配列Bを報告する
配列の複製
配列そのものを複製するには「クローン」設定項目を使います。この場合、配列Bは、配列Aの要素をコピーした別の配列が使われるため、配列Bの内容を変えても配列Aには変化がありません。
配列A={1,2,3}
配列B=配列Aのクローン
配列B(1)=99
「A」&配列Aを報告する
「B」&配列Bを報告する
値の変換
プロデルには値の自動変換機能があります。データ型が異なる値でも、代入先のデータ型に合わせて元の値を自動的に変換できる場合があります。
基本的に、データ型が指定された変数には、そのデータ型以外の値を代入することができません。しかし文字列と整数とは、代入する際に自動的に値を変換できます。
次のプログラムでは、「100」という文字列を整数型の変数へ代入しています。このとき「値」変数には100という整数型の値として格納されます。
【値:整数】は「100」
値を報告する
値の変換は、例えばユーザから入力された内容を計算するといった場合に便利です。
次のプログラムでは、「聞く」手順を使ってユーザから入力された文字列を「値段」変数に入れています。
値段は「値段」を聞く
「お支払いは[値段*1.1]円です。」と表示する
「値段」変数には、文字列が格納されていますが、そのまま計算式に書くと、値段を数値型(この場合整数)に変換してから、1.1を掛けて、その計算結果を表示してくれます。
さらにこのとき、計算式の計算結果は浮動小数なので、画面へ表示するために、計算結果を文字列へ変換しています。このようにデータ型の自動変換を意識していない所で利用しています。
変換できるデータ型は、マニュアルのそれぞれのデータ型のページの「型変換」項目で説明しています。変換できる主なデータ型は次の通りです。
変換元のデータ型 | 変換先のデータ型 |
文字列 | 数値型(整数,長整数,浮動小数,倍浮動小数,固定小数) 配列 |
配列 | 文字列 |
数値型 | 文字列 |
日時形式 | 文字列 |
データ型を判定するには
プロデルでは「種類名」手順で値のデータ型を調べられます。
値は、123
値の種類名を報告する
もし文では、「~である」後置子を使って値が特定のデータ型かどうかを判定できます。
値は、1.08
もし値が数値であるなら「数値です」を報告する
もし値が浮動小数であるなら「浮動小数です」を報告する
まとめ
今回は、データ型についてご紹介しました。プログラミングの入門書では、冒頭に登場する基礎的な知識として紹介されています。プロデルは、データ型をあまり意識しなくても動くプログラムが作れることが魅力ですが、プロデルでもデータ型を知ると、より作りたいものをすばやく、簡単に作れるようになるはずです。堅い説明になってしまいましたが、数値型や、値型と参照型の違いが分からなくなった時にはぜひ読み返してみてください。
次回もお楽しみに。
※当ブログの記事の著作権はゆうとにあります。プロデルに関係が無い目的で、文章や図表,プログラムを複製, 改変, 移植して掲載することを堅く禁止します