データ ストレージ

たとえば、プレイヤーが複雑で不親切なコンピューター インターフェイスと対戦する、「User Hostile」というコンピューター ゲームを開発したとします。ここで、このゲームの月次売上を 5 年間にわたって追跡するプログラムを作成する必要があります。または、ハッカー ヒーロー トレーディング カードを在庫する必要があるとします。
すぐに、情報を保存および処理するには単純な基本データ型以上のデータ型が必要であるという結論に達するでしょう。
 

配列 (リスト)。はじめに

大量のデータを扱いやすくするために、セルのグループには共通の名前が付けられます。このようなセルのグループは 配列 と呼ばれます
配列–これは、同じ種類のメモリ セルのグループであり、並んで配置され、共通の名前が付けられています。グループ内の各セルには一意の番号が付いています。

配列を扱うときは、次の 3 つのタスクを解決する方法を学ぶ必要があります。
バツ配列に必要なサイズのメモリを割り当てる
バツ目的のセルにデータを書き込む
バツセルからデータを読み取る


パスカルの配列


伝統的に Pascal は

のような静的配列を使用します <プレ> var a: 整数の配列 [1..10];

配列の境界は定数によって設定する必要があり、プログラム操作中に配列のサイズを変更することはできません。ただし、整数だけでなく、たとえば文字や列挙型のインデックスを作成することもできます。たとえば、各文字の出現回数をカウントするには、配列を使用できます

<プレ> var LettersCount: 整数の配列 ['a'..'z'];

心ゆくまで操作してください:

<プレ> LettersCount['z'] := 1; LettersCount['d'] := LettersCount['d'] + 1;

このような配列の欠点はよく知られています。使用する必要がある要素の数が事前にわからない場合、最大サイズのメモリが配列に割り当てられます。その結果、ほとんどの場合、「将来のために買いだめ」し、時にはこれを「準備」します。十分ではないことがわかりました。そのため、このような配列は  static と呼ばれます。サイズは静的であり、プログラムのコンパイル段階で設定する必要があります。ただし、Pascal には動的配列があり、そのサイズは設定できるだけでなく、プログラムの過程で変更することもできます。これらの配列と、それらを使用する利点についてさらに説明します。

配列の作成

配列を作成するとき、スペースがメモリに割り当てられます(特定の数のセル) <プレ> 1) 配列は要素をリストするだけで作成: <プレ> var a: 整数の配列。 SetLength(a, 3); [0] := 1; [1] := 2; [2] := 3;
2) 配列は、整数または実数、文字列など、あらゆるタイプのデータで構成できます  <プレ> var a: char の配列。 SetLength(a, 3); [0] := 'a'; [1] := 'b'; [2] := 'c'; 3) 配列は常に「知っている」あなたのサイズ。  length 関数は、配列のサイズを決定するために使用されます。多くの場合、配列のサイズは別の変数に保存され、異なる配列サイズで動作するようにプログラムを簡単に変更できます。例: <プレ> N:= 10; // 変数 N に配列のサイズを格納します SetLength(a, N); // 配列とサイズ N を設定 writeln(長さ(a)); //配列のサイズを表示 配列のサイズはキーボードから設定できます。

配列要素の参照

配列の有用性の多くは、その要素に個別にアクセスできるという事実から生まれます。
これを行う方法は、インデックスを使用して要素に番号を付けることです。
インデックス は、特定の配列要素を指す値です。

覚えておいてください!
パスカルの配列の番号付けはゼロから始まります!

(これは必須です。最初から始める必要があります。これは特に覚えておくことが重要です)

配列 A へのアクセスの例: <プレ> x := (A[3] + 5) * A[1] // A[3] と A[1] の値を読み取る A[0] := x + 6 // 新しい値を A[0] に書き込みます 配列要素を操作するプログラムを分析してみましょう。 <プレ> 変数 i: 整数; a: 整数の配列。 始める     i := 1;     setlength(a, 5); // 5 つの要素の配列を作成します      a[0] := 23; // 配列の 5 つの要素のそれぞれに (0 から 4 までのインデックス)     a[1] := 12; // 特定の値を書き込む     a[2] := 7;     a[3] := 43;     a[4] := 51;     a[2] := a[i] + 2 * a[i - 1] + a[2 * i]; // インデックス 2 の要素の値を式の結果に変更します     // i=1 なので、得られた式に変数 i の値を代入します。     // 次の式  a[2] := a[1] + 2*a[0] + a[2];     writeln(a[2] + a[4]); 終わり。
実行結果このプログラムでは、インデックス 2 とインデックス 4 の配列の要素の合計値が 116 に等しい という値が画面に表示されます。 例からわかるように、配列の任意の要素にアクセスできます。 。また、さまざまな式を使用して必要な要素の数を計算します (たとえば、プログラム A[i-1] または A[2*i] のように、これらの場合、要素のインデックスが計算され、要素のインデックスに依存します)。 i の値)

プログラム例を見てみましょう <プレ> var a: 整数の配列。 始める     setlength(a, 5);     a[5] := 5; a[-1] := 0; 終わり。

なぜなら配列は 5 つの要素で宣言されているため、要素には 0 から 4 までの番号が付けられます  6 行目のプログラムが存在しない要素を参照していることがわかります。 [5] そして 7 行目で、同じく存在しないa[-1] に移動します。

プログラムが配列の範囲を超えていたことが
判明しました。 範囲外の配列は、配列内に存在しないインデックスを持つ要素にアクセスしています。
このような場合、通常、プログラムは実行時エラー
でクラッシュします。

 
 

配列を操作する場合、通常、配列のすべての要素を一度に操作する必要があります。
要素の反復処理: 配列のすべての要素を調べ、必要に応じて、それぞれの要素に対して何らかの操作を実行します。
このためには、0 から N-1 (N は配列要素の数) まで変化する変数を含むループが最もよく使用されます。
N の下で配列の現在のサイズ、つまり
を考慮します。 N := 長さ(A) <プレ> ... for i := 0 から n - 1 が始まります // ここでは a[i] を扱います 終わり; ... 指定されたループでは、変数 i は値 0、1、2、...、N-1 をとります。 したがって、ループの各ステップで、番号 i を持つ配列の特定の要素にアクセスします。
したがって、配列 a[i] の 1 つの要素で何を行う必要があるかを記述し、これらのアクションをそのようなサイクル内に配置するだけで十分です。

配列に最初の N & nbsp; 自然数を入れるプログラムを書いてみましょう。つまり、プログラムの最後には、配列の要素が等しくなるはずです。 <プレ> a[0] = 1 a[1] = 2 a[2] = 3 ... a[N - 1] = N パターンは簡単にわかります。配列要素の値は、要素のインデックスよりも 1 大きくなければなりません。
ループは次のようになります <プレ> for i := 1 to n - 1 do a[i] := i + 1; タスクを完了します。