| English | 意味 |
|---|---|
| user-defined types/ˈjuːzə dɪˈfaɪnd taɪps/ | ユーザー定義型 |
| non-composite/nɒn ˈkɒmpəzɪt/ | 非複合型 |
| composite/ˈkɒmpəzɪt/ | 複合型 |
| enumerated type/ɪˈnjuːməreɪtɪd taɪp/ | 列挙型 |
| pointer/ˈpɔɪntə/ | ポインタ |
| dereference/ˌdiːˈrefrəns/ | デレファレンス |
| record/ˈrekɔːd/ | レコード |
| set/set/ | セット |
| class/klæs/ | クラス |
| attributes/ˈætrɪbjuːts/ | 属性 |
| methods/ˈmeθədz/ | メソッド |
ミスを不可能にする型
- 病院システムが患者の血液型を
STRINGとして保存していました。「O+」の代わりに「0+」(文字の代わりゼロ)を入力した人がいました。フィールドはそれを受理しました。なぜなら、文字列はどんな値でも受け入れるからです。 - プログラム内に「0+」が血液型ではないことを判別する手段はなく、このエラーは影響を与えるポイントまで修正されずに伝播しました。
- フィールドに8つの血液型に厳密に一致する値を持つ型を与えると、プログラムが実行される前にコンパイラによって書き込み的瞬间に割り当てが拒絶されます。
- これがユーザ定義型が提供するものです。このレッスンはシラバスで名称が指定されているもの、およびそれらの間の選択方法に関するものです。
ユーザ定義型が必要な理由
- 組み込み
STRINGでは、少数の合法的な値のいずれかを持つべきフィールドに無意味な値を格納できてしまいます。ユーザ定義型はこれを制限するため、コンパイラはより多くのミスを検出できます。 - 現実のエンティティは通常、異なる型の値の集合体であり、組み込み型は1つしか保持できません。
DECLARE MyTaxi : Vehicleは自己説明的です: 変数が何を表すかを明言しますが、DECLARE MyTaxi : STRINGは単にその記憶上の形式だけを説明します。
-user-defined types(ユーザー定義型)が必要とされる理由は何か?すべて選択してください。
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
制限、グループ化、自己説明性です。速度向上が理由ではありません。正確さと明瞭さが目的です。
非複合型: 列挙型
- 非複合型は単一の値を保持します;複合型は複数の値をグループ化します。
- 列挙型は、名前付き定数の固定リストである値を持ちます。これらの名前は新しい型の値であり、内部では小さな整数として格納されます。
TYPE Vehicle = (M100, M230, T101, T102, T120, T150)
DECLARE MyTaxi : Vehicle
MyTaxi ← T102 // anything outside the list is rejected
- 用途: 曜日の名称、色、ステータスコード、血液型など、法的に許容される値が短い既知のリストで表せる分野すべて。

6つの名前付き値のみが割り当て可能であり、それ以外には割り当てられない
列挙型(enumerate型)が保持するのは:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
列挙型は、変数を固定セットの名前付き値(例:曜日の名前)のいずれかに制限します。
非合成型: ポインタ
- ポインタは、他の変数のメモリアドレスまたは
NULL(「ターゲットなし」を意味する)を保持します。 - ポインタを**参照解除(dereference)**するには、記法
p^を用いて、それが指す変数にアクセスすることです。
TYPE PNode = ^TNode // a pointer to a TNode
DECLARE p : PNode
p ← NEW TNode
p^.Value ← 42 // dereference, then reach the field
- ポインタによって動的な構造体が可能になります。連結リストはポインタで結合されたノードであり、木構造は2つのポインタを持つノードです。また、大きなレコードをプロシージャに渡す際にもコピーせずに传递できます。

変数はデータそのものではなく、データの場所を保持しています
ポインタは別の変数のメモリアドレスを格納しており、そのポインタを参照(例:p^)することで、指し示している変数にアクセスできる。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
NULLで「何も指していない」ことを示すポインタは、リンクedListやツリーのような動的構造を構築する方法です。
ポインタが指す変数にアクセスすること(p^と表記される)を______と呼びます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
ポインタはアドレスを持ち、アンレファレンスでその先にあるデータへ追跡します。これによりリンクedListやツリーが構築されます。
合成型
- レコードは、異なるタイプのフィールドを1つの名前の下でまとめ、
TYPE … ENDTYPEブロック内に配置します。トピック10で触れました。 - セットは、順序を持たない 一意の値の集合であり、add、remove、メンバーシップテスト、union、intersectionといった操作を持っています。
DECLARE Available : SET OF Colour
Available ← {Red, Blue}
IF Green IN Available THEN
…
ENDIF
- クラスと、そのインスタンスであるオブジェクトは、データフィールドである属性と、それに対する操作であるメソッドを統合します。

異なるタイプのフィールド、1つの識別子
各ユーザー定義型が保持する内容と対応させてください。
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
列挙型=固定された名前付き値;ポインタ=アドレス;クラス=データ+振る舞い;セット=重複のない無秩序な値。
セットとは、値が一度以上現れることができる順序付きコレクションのことである。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
セットは無秩序で、その値は一意です。重複を許容する順序付き構造は配列です。
クラス
CLASS Taxi
PRIVATE Capacity : INTEGER
PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
RETURN Capacity
ENDFUNCTION
ENDCLASS
- クラスは定義であり、オブジェクトはそのインスタンスです。例えれば、独自の乗客定員を持つ実際のタクシーの1台のようなものです。
- レコードとの違いはメソッドにあります。レコードはデータだけですが、クラスはデータおよびそれに伴う振る舞いです。
クラスが組み込むのは:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
クラスは属性とメソッドを束ねたものであり、オブジェクトはそのインスタンスです。
クラスとレコードの違いは何か?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
両方のグループはフィールドを持ち、振る舞いはクラスのみが担う。オブジェクトはクラスの1つのインスタンスである。
演習例: 型を選択し理由を示す
- 予約システムでは、各予約について、Requested、Confirmed、Cancelled のいずれかであるステータスを保持します。どのようなユーザー定義型を使用すべきか、そしてなぜか?
- 列挙型: 法的に許容される値は短い固定リストであるため、この型により他の値の割り当てを防ぎ、コードがドメインと同じように読み取れます。
- 予約自体については、参照、日付、乗客数、価格? レコード: 値が異なるタイプであり、常に1回の予約全体を説明するため。
- まだ空いている座席のセットについては? セット: 順序を持たず、重複がなく、メンバーシップチェックが必要な操作であるため。
between them の選択
| 要件 | 型 |
|---|---|
| 短い固定リストからの値 | 列挙型 |
| 間接参照、または成長する構造体 | ポインタ |
| 1つのものを記述する複数の異なるタイプのフィールド | レコード |
| 順序を持たない一意の値の集合 | セット |
| 状態およびそれに作用する振る舞い | クラス |
プログラミング概念ラボ
各例とそれが示すプログラミングの概念を結びつけてください。
変数が {Red, Green, Blue} のいずれかである必要がある場合、最適な型は:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
許容値の固定リストこそが、列挙型の存在意義である。
見落としやすいポイント
- 列挙型の値は名前付き定数であり、文字列ではありません。
MyTaxi ← "T102"は別の概念であり、誤りです。 - ポインタはアドレスを保持しており、値そのものではありません。参照解除が値に到達するステップです。
- セットは順序を持たず重複がありません。配列は順序があり重複があります。問題文の表現からどちら应选择がわかります。
- クラスをレコードより優れているとさせるのはメソッドです。違いを問われたらそう答えてください。
理解できましたか
- ユーザー定義型は、格納可能なものを制限し、関連する値をグループ化し、コードを自己説明的にします。
- 非合成型: 列挙型(名前付き定数の固定リスト)、ポインタ(アドレス、参照解除によってアクセス)
- 合成型: レコード(異なるタイプのフィールド)、セット(順序なし、一意)、クラス/オブジェクト(属性+メソッド)
- 要件から選択し、一致する特性(固定リスト、間接参照、混合フィールド、一意性、状態と振る舞い)に基づいて正当化してください。