2013年08月12日

配列 その9 2次配列

■配列 その9 2次配列

今回から数回にわたって、2次配列について書いていきたいと思います。
2次配列は、他の言語では「2次元配列」と呼ばれることが多いようですが、ここではプロデルの用語「2次配列」を使っていきます。

■2次配列を作る

配列の説明の最初に紹介した、Excel をここでもまた使って説明をしていきます。
とりあえず、前回の記事で使った[名簿]の1次配列を流用して、2次配列を作っていきます。

──────────────────────────────
名簿は、{「青山」、「木村」、「鈴木」、「中村」、「村田」、「山田」}
──────────────────────────────

この名前の一覧を、Excelの A列に、1行目から順に入力していきます。実際に Excelを起動して入力してもらっても、脳内でイメージしてもらっても、どちらでも結構です。

青山
木村
鈴木
中村
村田
山田

次に、それぞれの名前に対応した年齢を B列に入力していきます。

青山 23
木村 54
鈴木 37
中村 28
村田 60
山田 45

C列には、それぞれの性別を入力します。

青山 23 男
木村 54 男
鈴木 37 女
中村 28 男
村田 60 女
山田 45 男

これで、6行×3列の表が出来ました。
この表が、2次配列(のイメージ)です。

これを、添え字を使って配列の形に書き直してみます。
※年齢は 数値ですが、記述を統一するために 「 」 で括ってあります。

名簿(1)は、{「青山」、「23」、「男」}
名簿(2)は、{「木村」、「54」、「男」}
名簿(3)は、{「鈴木」、「37」、「女」}
名簿(4)は、{「中村」、「28」、「男」}
名簿(5)は、{「村田」、「60」、「女」}
名簿(6)は、{「山田」、「45」、「男」}

名簿(1)〜名簿(6) にそれぞれ対応する要素が { } で括られています。
これは、配列の要素が、これまた配列の形になっていることを表しています。
このように、配列が「入れ子」のようになっているのが、2次配列の特徴です。したがって、2次配列を扱う時は手順が複雑になります。

■2次配列の要素を取得する

まず、配列の要素番号を指定して、その要素を取得してみます。

────────────────────
名簿(1)は、{「青山」、「23」、「男」}
名簿(2)は、{「木村」、「54」、「男」}
名簿(3)は、{「鈴木」、「37」、「女」}
名簿(4)は、{「中村」、「28」、「男」}
名簿(5)は、{「村田」、「60」、「女」}
名簿(6)は、{「山田」、「45」、「男」}

名簿(3)を表示する
────────────────────

上のプログラムを実行すると、メッセージボックスに
{鈴木,37,女}
と表示されます。
先ほど説明したように、配列の形で答えが戻ってきます。
ここで、名簿の3番目の 鈴木さんの年齢を知りたいとします。
その場合は、次のように書きます。

────────────────────
名簿(1)は、{「青山」、「23」、「男」}
名簿(2)は、{「木村」、「54」、「男」}
名簿(3)は、{「鈴木」、「37」、「女」}
名簿(4)は、{「中村」、「28」、「男」}
名簿(5)は、{「村田」、「60」、「女」}
名簿(6)は、{「山田」、「45」、「男」}

鈴木さん年齢は、名簿(3)(2)
鈴木さん年齢を表示する
────────────────────

メッセージボックスに「37」と、鈴木さんの年齢が表示されます。
次にポイントとなる行について説明します。
※ここで、「鈴木さん年齢」というちょっとおかしな変数名を使っているのは、「鈴木さんの年齢」というように「の」を入れるとエラーになってしまうためです。
プロデルでは「の」という助詞が重要な意味を持つため、変数名には使えない決まりになっています(例外もあり)。

────────────────────
鈴木さん年齢は、名簿(3)(2)
────────────────────

まず、鈴木さんは名簿の3番目(3行目)なので、

名簿(3)

と指定します。

配列(3)は、{鈴木,37,女}

という、これまた配列ですから、この配列の中から、さらに要素番号を指定します。
年齢の要素番号は 2 ですから、添え字は (2) です。
これをまとめて書くと、

名簿(3)(2)

となります。

※私は、わかりやすく、間違いを減らすために、最初の配列の要素を指定する部分を、次のように [ ] で括って書く時もあります。

[名簿(3)](2)
posted by yanikun at 08:36| Comment(0) | TrackBack(0) | produire

配列 その10 2次配列の手順(GUI 使用)

■配列 その10 2次配列の手順(GUI 使用)

次に、2次配列のさまざまな手順について説明していきます。
いちいち、配列(1)は、 〜 と書いていくと、それだけで字数を使ってしまうので、ここからは、プロデルのウィンドウ部品「リストビュー」を使って説明していきます。
1次配列の所でも書いたように、「リストボックス」は1次配列を表示するのに使い、2次配列を表示するには「リストビュー」を使います。
WindowsのExplorerを詳細表示にすると、ファイル/フォルダの一覧が、ちょうどプロデルのリストビューと同じ形になります。いや、これは話が逆ですが。

とにかく、リストビュー部品に、[名簿]の配列を表示して、そこからデータを取得したり、並べ替えたりする手順を紹介していきます。

操作の説明:
──────────────────────────────
次のボタンを押すと、それぞれの処理を実行します。

男 … 名簿から 男 を取り出してテキスト領域に表示します。
女 … 名簿から 女 を取り出してテキスト領域に表示します。
年齢 上 … 年齢が上の順にリストビューを並び変えます。
年齢 下 … 年齢が下の順にリストビューを並び変えます。
平均年齢 … メンバーの平均年齢をメッセージボックスに表示します。
──────────────────────────────

プログラム:
──────────────────────────────
「Produire.WinControl.dll」を利用する

ウィンドウ1を表示する
待機する

ウィンドウ1とは
ウィンドウを継承する

はじめの手順
初期化する
名簿(1)は、{「青山」、「23」、「男」}
名簿(2)は、{「木村」、「54」、「男」}
名簿(3)は、{「鈴木」、「37」、「女」}
名簿(4)は、{「中村」、「28」、「男」}
名簿(5)は、{「村田」、「60」、「女」}
名簿(6)は、{「山田」、「45」、「男」}
名簿を要素にそれぞれ繰り返す
名字は、要素(1)
年齢は、要素(2)
性別は、要素(3)
リストビュー1に、名字を追加する
その詳細を、{[年齢]、[性別]}に変える
繰り返し終わり
終わり

初期化する手順
この内部領域大きさを{359、213}に変える
この内容を「名簿」に変える

ラベル1というラベルを作る
その内容を「名簿」に変える
その位置と大きさを{13、13、29、12}に変える

リストビュー1というリストビューを作る
その表示方法を「詳細」に変える
その罫線を○に変える
その見出し一覧を{「名字」、「年齢」、「性別」}に変える
その見出し幅を{45、38、38}に変える
その位置と大きさを{13、29、121、169}に変える

ボタン1というボタンを作る
その内容を「男」に変える
その位置と大きさを{141、29、75、23}に変える

ボタン2というボタンを作る
その内容を「女」に変える
その位置と大きさを{141、59、75、23}に変える

ボタン3というボタンを作る
その内容を「年齢 上」に変える
その位置と大きさを{141、89、75、23}に変える

ボタン4というボタンを作る
その内容を「年齢 下」に変える
その位置と大きさを{141、119、75、23}に変える

ボタン5というボタンを作る
その内容を「平均年齢」に変える
その位置と大きさを{141、146、75、23}に変える

ラベル2というラベルを作る
その内容を「結果」に変える
その位置と大きさを{222、13、29、12}に変える

テキスト領域1というテキスト領域を作る
その位置と大きさを{222、26、121、172}に変える

ボタン6というボタンを作る
その内容を「閉じる」に変える
その位置と大きさを{141、175、75、23}に変える
この取消ボタンをボタン6に変える

終わり

ーー男
ボタン1がクリックされた時の手順
テキスト領域1をクリアする
配列は、リストビュー1の詳細一覧
男は、配列から「男」を探したもの
もし、男が「{}」でないなら
男を要素にそれぞれ繰り返す
結果は、配列([要素])
名字は、結果(1)
名字を、テキスト領域1に改行して挿入する
繰り返し終わり
もし終わり
終わり

ーー女
ボタン2がクリックされた時の手順
テキスト領域1をクリアする
配列は、リストビュー1の詳細一覧
女は、配列から「女」を探したもの
もし、女が「{}」でないなら
女を要素にそれぞれ繰り返す
結果は、配列([要素])
名字は、結果(1)
名字を、テキスト領域1に改行して挿入する
繰り返し終わり
もし終わり
終わり

ーー年齢 上
ボタン3がクリックされた時の手順
配列は、リストビュー1の詳細一覧
配列を『
それを{左,右}とみなす
もし左(2)>右(2)なら
-1を返す
他でもし左(2)<右(2)なら
1を返す
そうでなければ
0を返す
もし終わり
』で並び替える
リストビュー1をクリアする
配列を要素にそれぞれ繰り返す
要素(1)を、リストビュー1に追加する
その詳細を、{[要素(2)]、[要素(3)]}に変える
繰り返し終わり
リストビュー1にフォーカス
終わり

ーー年齢 下
ボタン4がクリックされた時の手順
配列は、リストビュー1の詳細一覧
配列を『
それを{左,右}とみなす
もし左(2)<右(2)なら
-1を返す
他でもし左(2)>右(2)なら
1を返す
そうでなければ
0を返す
もし終わり
』で並び替える
リストビュー1をクリアする
配列を要素にそれぞれ繰り返す
要素(1)を、リストビュー1に追加する
その詳細を、{[要素(2)]、[要素(3)]}に変える
繰り返し終わり
リストビュー1にフォーカス
終わり

ーー平均年齢
ボタン5がクリックされた時の手順
年齢配列は、{}
配列は、リストビュー1の詳細一覧
配列を要素にそれぞれ繰り返す
要素(2)を、年齢配列に加える
繰り返し終わり
値は、年齢配列の平均
平均年齢は、値を-2で四捨五入したもの
「[平均年齢]才」を表示する
終わり

ーー閉じる
ボタン6がクリックされた時の手順
自分を閉じる
終わり

終わり
──────────────────────────────

プログラムの説明は、次の記事で。
posted by yanikun at 08:40| Comment(0) | TrackBack(0) | produire

配列 その11 前回の記事のプログラムの説明

■配列 その11 前回の記事のプログラムの説明

プログラムの説明:
──────────────────────────────
「Produire.WinControl.dll」を利用する

ウィンドウ1を表示する
待機する

ウィンドウ1とは
ウィンドウを継承する

はじめの手順
初期化する
名簿(1)は、{「青山」、「23」、「男」}
名簿(2)は、{「木村」、「54」、「男」}
名簿(3)は、{「鈴木」、「37」、「女」}
名簿(4)は、{「中村」、「28」、「男」}
名簿(5)は、{「村田」、「60」、「女」}
名簿(6)は、{「山田」、「45」、「男」}
//[名簿]という2次配列を作成します。

名簿を要素にそれぞれ繰り返す
//その配列を、要素ごとに繰り返して処理します。

名字は、要素(1)
//[名簿]という2次配列の要素は、{名字、年齢、性別}という配列なので、
//その要素番号1を[名字]という変数に代入します。
//[名前]という変数名は、エラーになることがあるので[名字]にしています。

年齢は、要素(2)
//[名簿]という2次配列の要素は、{名字、年齢、性別}という配列なので、
//その要素番号2を[年齢]という変数に代入します。

性別は、要素(3)
//[名簿]という2次配列の要素は、{名字、年齢、性別}という配列なので、
//その要素番号3を[性別]という変数に代入します。

リストビュー1に、名字を追加する
//[名字]という変数に代入した配列の要素=それぞれの名字を、
//リストビュー1の一覧に追加していきます。

その詳細を、{[年齢]、[性別]}に変える
//リストビューの表示を「詳細」にしてあるので、上の命令文で追加した項目に、
//それぞれ対応する項目を追加していきます。
//この詳細の追加は、配列形式で項目を指定します。
//ここでは、[年齢] [性別] という変数に代入したデータを追加しています。
//この命令文は、次のように書くことも出来ます。タイプ数が少なくなります。
//その詳細は、{[年齢]、[性別]}

繰り返し終わり
終わり

初期化する手順
この内部領域大きさを{359、188}に変える
この内容を「ウィンドウ1」に変える

ラベル1というラベルを作る
その内容を「名簿」に変える
その位置と大きさを{13、13、39、12}に変える

リストビュー1というリストビューを作る
その位置と大きさを{13、29、121、143}に変える
その表示方法を「詳細」に変える
//リストビューの表示設定を「詳細」にします。
//こうすると、Explorerの詳細表示と似た形になります。

その見出し一覧を{「名字」、「年齢」、「性別」}に変える
//「見出し一覧」は、リストビューの上部にある「カラム」と呼ばれる部分です。
//Explorerでは、名前・サイズ・種類・更新日時…などになっています。
//横に並んだ各項目の途中に区切りを入れて見やすく整えるものです。
//そして、それぞれの「見出し」に配列の要素を格納していくようになっています。

その見出し幅を{45,38,38}に変える
//見出し(カラム)の横幅を指定します。単位はピクセルです。

その罫線を○に変える
//音声では関係ありませんが、リストビューの項目ごと・カラムごとに
//罫線を引くことによって見やすくすることが出来ます。
//将来的に一般に公開する時に、晴眼者や弱視のユーザーには親切な設定になります。

ボタン1というボタンを作る
その内容を「男」に変える
その位置と大きさを{141、29、75、23}に変える

ボタン2というボタンを作る
その内容を「女」に変える
その位置と大きさを{141、59、75、23}に変える

ボタン3というボタンを作る
その内容を「年齢 上」に変える
その位置と大きさを{141、89、75、23}に変える

ボタン4というボタンを作る
その内容を「年齢 下」に変える
その位置と大きさを{141、119、75、23}に変える

ラベル2というラベルを作る
その内容を「結果」に変える
その位置と大きさを{222、13、39、12}に変える

テキスト領域1というテキスト領域を作る
その位置と大きさを{222、26、121、146}に変える

ボタン5というボタンを作る
その内容を「閉じる」に変える
その位置と大きさを{141、149、75、23}に変える
この取消ボタンを、ボタン5に変える
//「取消ボタン」を、ウィンドウを閉じるボタンに割り当てることによって、
//Escapeキーを押した時にウィンドウを閉じるように設定することが出来ます。

終わり
//ウィンドウ1の初期化の終わりです。

ーー男
ボタン1がクリックされた時の手順
テキスト領域1をクリアする
//以下の手順で得られた結果を書き出すために、
//テキスト領域をあらかじめクリアしておきます。

配列は、リストビュー1の詳細一覧
//[配列]という変数に、リストビューの詳細一覧(2次配列)を代入します。

男は、配列から「男」を探したもの
//[配列]の要素の中から「男」というキーワードを探します。
//ヒットしたら、その要素番号を[男]という変数に代入します。

もし、男が「{}」でないなら
//ここでは、確実に存在(ヒット)するキーワードを探していますが、
//ヒットするかどうかわからないケースを想定して、
//「もし文」によって、エラーを回避しています。

男を要素にそれぞれ繰り返す
結果は、配列([要素])
//[男]という変数に代入されたデータは、配列の形になっています。
//その配列を、要素ごとに繰り返して処理していきます。
//参考:配列 その6 http://talk-pc.sblo.jp/article/70078098.html?1372824930

名字は、結果(1)
//[結果]は、指定されたリストビューの項目のデータが配列の形で戻ってきます。
//例:要素番号 2 = {青山,23,男}
//ここでは[名字]を使いたいので、[結果]の1番目の要素を指定します。

名字を、テキスト領域1に改行して挿入する
//上で得られたデータ[名字]を、テキスト領域に挿入します。
//テキスト領域への文字列の挿入は、テキスト領域の[内容]の最後の位置に挿入されます。
//一行に一人ずつ[名字]を表示させたいので、「改行して挿入」を使います。

繰り返し終わり
もし終わり
終わり

ーー女
ボタン2がクリックされた時の手順
テキスト領域1をクリアする
配列は、リストビュー1の詳細一覧
女は、配列から「女」を探したもの
もし、女が「{}」でないなら
女を要素にそれぞれ繰り返す
結果は、配列([要素])
名字は、結果(1)
名字を、テキスト領域1に改行して挿入する
繰り返し終わり
もし終わり
終わり

ーー年齢 上
ボタン3がクリックされた時の手順
配列は、リストビュー1の詳細一覧
//「詳細一覧」は、リストビューが「詳細」表示の時の設定項目です。
//リストビューの一列が2次配列の「行」、
//横に配置された見出し(カラム)が2次配列の「列」
//を表しています。

配列を『
//『 』 で括られた部分の手順は、「匿名手順」という手順です。
//匿名手順は、簡単に言うと、手順の「入れ子」のようなものです。
//匿名手順の中で得られる結果を、その前後の手順の引数として渡したり、
//その前後の手順の中の変数に代入することが出来ます。
//このプログラムでは、「名簿」という2次配列の要素を、
//匿名手順の変数として、その手順の中に代入して、それぞれの要素の大小を
//比較して並び変えていきます。

それを{左,右}とみなす
//比較する要素を {左,右} という並び替えのための配列に代入します。

もし左(2)>右(2)なら
-1を返す
//大小を比較する年齢は、各要素の2番目の要素なので (2) と添え字で指定します。
//「左」に代入された年齢が、「右」の年齢よりも大きければ、
//-1 という値をかえします。

他でもし左(2)<右(2)なら
1を返す
//「左」に代入された年齢が、「右」の年齢よりも小さければ、
//1 という値を返します。

そうでなければ
0を返す
//「左」に代入された年齢が、「右」の年齢と同じなら、
//0 という値を返します。

もし終わり
』で並び替える
//以上の匿名手順で得られた結果で、元の「名簿」の配列を並び変えます。

リストビュー1をクリアする
//並び変えた配列を表示酢るために、いったんリストビューの
//全ての項目を消去(クリア)します。

配列を要素にそれぞれ繰り返す
//並び変えられた配列を、要素ごとに処理していきます。

要素(1)を、リストビュー1に追加する
//要素(1)=名字を、リストビューの項目に追加します。

その詳細を、{[要素(2)]、[要素(3)]}に変える
//要素(2)=年齢、要素(3)=性別を、
//対応する名字の行に追加していきます。

繰り返し終わり
リストビュー1にフォーカス
終わり

//上の手順の説明は、読んでいてもよくわからないかもしれません。
//なにしろ、書いている当人が、よくわからないまま書いていますので。
//とりあえず、こうした並び替えの手順が必要な時には、
//プログラムをそのままコピーして使って下さい。
//その際、比較する要素が、配列の何番目にあるのかに注意して書き替えて下さい。

ーー年齢 下
ボタン4がクリックされた時の手順
配列は、リストビュー1の詳細一覧
配列を『
それを{左,右}とみなす
もし左(2)<右(2)なら
//前の手順とは逆に 左(2)<右(2) となっています。
//ここでは[左]の要素が[右]の要素よりも小さいなら〜
//という判断文に変わっています。

-1を返す
他でもし左(2)>右(2)なら
//当然、ここも前の手順とは逆になっています。

1を返す
そうでなければ
0を返す
もし終わり
』で並び替える
リストビュー1をクリアする
配列を要素にそれぞれ繰り返す
要素(1)を、リストビュー1に追加する
その詳細を、{[要素(2)]、[要素(3)]}に変える
繰り返し終わり
リストビュー1にフォーカス
終わり

ーー平均年齢
ボタン5がクリックされた時の手順
年齢配列は、{}
//「年齢配列」という、要素数を限定しない配列を、あらかじめ作成しておきます。
//この配列に、元の配列から[年齢]という要素を追加していって、
//その平均を求めます。

配列は、リストビュー1の詳細一覧
配列を要素にそれぞれ繰り返す
要素(2)を、年齢配列に加える
繰り返し終わり
値は、年齢配列の平均
平均年齢は、値を-2で四捨五入したもの
//小数点以下の数値が多いので、2桁までで四捨五入します。

「[平均年齢]才」を表示する
終わり

ーー閉じる
ボタン6がクリックされた時の手順
自分を閉じる
終わり

終わり
──────────────────────────────
posted by yanikun at 08:45| Comment(0) | TrackBack(0) | produire