2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mindの小技 「多次元配列」~構造体の多次元配列~

Last updated at Posted at 2025-05-17

はじめに

日本語プログラミング言語Mindの小技「多次元配列」について説明したいと思います。

対象読者

日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
10 構造体・型紙
└構造体のアクセス
 └多次元配列を実現する場合

次に、添え字が複数になる場合、つまり、多次元配列状になる場合の表記について説明する。
 まず、先ほどの成績簿を次のように拡張する。
 (成績簿を拡張したもの)

成績簿は 構造体
      担任名は 文字列実体 長さ 40桁
          生徒名は 文字列実体 長さ 40桁
          数学の成績は 変数
          英語の成績は 変数
          国語の成績は 変数
      個人データは
        生徒名と 数学の成績と 英語の成績と 国語の成績
    クラスデータは
      担任名と 30名分の 個人データ
  全体は
    4クラス分の クラスデータである。

上記で分かるように、「個人データは ・・・」の行までは先と同じであり、違うのは、その直後に「クラスデータ」という上位集合を定義した点である。「個人データ」の30名分の集合として「クラスデータ」という上位集合を定義している。
 上記の拡張版の成績簿では、「生徒名」、「数学の成績」、「英語の成績」、「国語の成績」、「個人データ」が多次元配列のような扱いとなるので、これらの要素の引用では添え字を2つ記述する必要がある。
 例えば、3組の5番の生徒の数学の成績は、
数学の成績(3組、5番)を 数値表示し ・・・
のような引用になる。
 ここで「大きな重みの添え字から並べる」という重要な規則を知っておいて欲しい。これは我々を実社会での、「何年、何組、何番」とか、「○○丁目、○○番地」というように、大きな区分から先に記述するという慣習に合わせたものである。

本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

対応バージョン

■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版

小技の解説

この記事の取り扱う「多次元配列」は構造体の多次元配列です。基底のメンバ変数を単一にすれば通常の変数の多次元配列にもできると思われます。

この記事でのソースコード例は構造体を基底のメンバとした多次元配列の例となります。

Mindプログラムソース

galaxy.src
宇宙は 構造体
    銀河フィラメント名は 文字列実体 長さ 50桁
        超銀河団名は 文字列実体 長さ 20桁
            銀河団名は 文字列実体 長さ 20桁
                銀河名は 文字列実体 長さ 20桁
                    恒星名は 文字列実体 長さ 50桁
                        惑星名は 文字列実体 長さ 50桁
                            直径は  変数
                            衛星数は 変数
                            平均公転半径は 変数
                        惑星データは 
                                惑星名と 直径と 衛星数と 平均公転半径
                    恒星系は 
                        恒星名と 8個の 惑星データ
                銀河系は 
                    銀河名と  2個の 恒星系    
            銀河団は 
                銀河団名と 2個の 銀河系
        超銀河団は
            超銀河団名と 2個の 銀河団
    銀河フィラメントは
        銀河フィラメント名と 2個の 超銀河団
全体は 2個の 銀河フィラメント。

暗黒物質は 文字列定数 「 」。

宇宙全体を形成するとは (・ → ・)
        銀河フィラメント名(1)に 「ヘルクレス座・かんむり座グレートウォール」を 入れ
            超銀河団名(1,1)に 「ラニアケア超銀河団」を 入れ、
                銀河団名(1,1,1)に 「局所銀河団」を 入れ、
                    銀河名(1,1,1,1)に 「天の川銀河」を 入れ、
                        恒星名(1,1,1,1,1)に 「太陽」を 入れ、
                            惑星名(1,1,1,1,1,1)に 「地球」を 入れ、
                                直径(1,1,1,1,1,1)に 1を 入れ、
                                衛星数(1,1,1,1,1,1)に 1を 入れ、
                                平均公転半径(1,1,1,1,1,1)に 1を 入れ、
                            惑星名(1,1,1,1,1,2)に 「木星」を 入れ、
                                直径(1,1,1,1,1,2)に 11を 入れ、
                                衛星数(1,1,1,1,1,2)に 97を 入れ、
                                平均公転半径(1,1,1,1,1,2)に 5を 入れ、
                        恒星名(1,1,1,1,2)に 「プロキシマ・ケンタウリ」を 入れ、
                            惑星名(1,1,1,1,2,1)に 「プロキシマ・ケンタウリb」を 入れ、
                            惑星名(1,1,1,1,2,2)に 「プロキシマ・ケンタウリd」を 入れ、
                    銀河名(1,1,1,2)に 「アンドロメダ銀河」を 入れ、
                銀河団名(1,1,2)に 「うみへび座銀河団」を 入れ、
                    銀河名(1,1,2,1)に 「NGC3309」を 入れ、
                    銀河名(1,1,2,2)に 「NGC3312」を 入れ、
            超銀河団名(1,2)に 「おとめ座超銀河団」を 入れ、
                銀河団名(1,2,1)に 「おとめ座銀河団」を 入れ、
                    銀河名(1,2,1,1)に 「NGC4408」を 入れ、
                    銀河名(1,2,1,2)に 「NGC4486」を 入れ、
        銀河フィラメント名(2)に 「CfA2グレートウォール」を 入れ
            超銀河団名(2,1)に 「かみのけ座超銀河団」を 入れ、
                銀河団名(2,1,1)に 「かみのけ座銀河団」を 入れ、
                    銀河名(2,1,1,1)に 「NGC4874」を 入れ、
                    銀河名(2,1,1,2)に 「NGC4889」を 入れ、
            超銀河団名(2,2)に 「しし座超銀河団」を 入れ、
                銀河団名(2,2,1)に 「しし座銀河団」を 入れ、
                    銀河名(2,2,1,1)に 「NGC3623」を 入れ、
                    銀河名(2,2,1,2)に 「NGC3627」を 入れること。

宇宙を観測するとは     (・ → ・)
        銀河フィラメント番号は 変数
        超銀河番号は   変数
        銀河団番号は    変数
        銀河番号は     変数
        恒星系番号は    変数
        惑星番号は      変数

    銀河フィラメント番号を セットし
    銀河フィラメントの 要素数で 回数指定し
        銀河フィラメント名(銀河フィラメント番号)を 一行表示し
        超銀河番号を セットし
        超銀河団の 要素数で 回数指定し
            暗黒物質を 表示し 超銀河団名(銀河フィラメント番号,超銀河番号)を 一行表示し
            銀河団番号を セットし
            銀河団の 要素数で 回数指定し
                2で 回数指定し 暗黒物質を 表示し 繰り返す 
                銀河団名(銀河フィラメント番号,超銀河番号,銀河団番号)を 一行表示し
                銀河番号を セットし
                銀河系の 要素数で 回数指定し
                    3で 回数指定し 暗黒物質を 表示し 繰り返す 
                    銀河名(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号)を 一行表示し
                    恒星系番号を セットし
                    恒星系の 要素数で 回数指定し
                        恒星名(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号,恒星系番号)が 空列に 等しい文字列?
                        でなければ
                            4で 回数指定し 暗黒物質を 表示し 繰り返す 
                            恒星名(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号,恒星系番号)を 一行表示し
                            惑星番号を セットし
                            2で 回数指定し
                                5で 回数指定し 暗黒物質を 表示し 繰り返す 
                                惑星名(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号,恒星系番号,惑星番号)を 表示し
                                「 直径:」を 表示し 
                                直径(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号,恒星系番号,惑星番号)を
                                数値表示し
                                「 衛星数:」を 表示し
                                衛星数(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号,恒星系番号,惑星番号)を
                                数値表示し
                                「 平均公転半径:」を 表示し 
                                平均公転半径(銀河フィラメント番号,超銀河番号,銀河団番号,銀河番号,恒星系番号,惑星番号)を
                                数値表示し 改行し
                                惑星番号を 一つ増加し
                            繰り返す
                            恒星系番号を 一つ増加し
                        つぎに
                    繰り返す
                    銀河番号を 一つ増加し
                繰り返す
                銀河団番号を 一つ増加し
            繰り返す
            超銀河番号を 一つ増加し
        繰り返す
        銀河フィラメント番号を 一つ増加し
    繰り返す。

メインとは (・ → ・)
    宇宙全体を形成し
    宇宙を観測すること。

本来の単語名の意味からすると要素数のスケールが違い過ぎますが、データの初期化の都合で、極小構成な世界線の異次元ワールドと思っていただければ幸いです:relaxed:

「なになにの 要素数」で回数指定している点に注目いただければ幸いです。
惑星情報のループは、本来は「惑星データの 要素数」で回数指定するところですが、惑星データを初期設定しきれず、とりあえず2つの惑星情報としています。

文字列は空列で、変数は0でランタイムが初期化しています。

コンパイル結果

ではコンパイルしてみます。下位ライブラリはfileを指定します。

Mind9

下図はMind9βです。

C:\developments\vscode\mind9>mind galaxy file   

日本語プログラミング言語 Mind Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> galaxy.exe

Mind8

C:\developments\vscode\mind9>mind galaxy file

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> galaxy.exe

Mind7

C:\developments\vscode\mind9>mind galaxy file
日本語プログラミング言語 Mind Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> galaxy.exe

実行結果

つづいて実行してみます。
Mind7の結果です。記述は割愛していますがMind8/9βも同じです。

C:\developments\vscode\mind9>galaxy
ヘルクレス座・かんむり座グレートウォール
 ラニアケア超銀河団
  局所銀河団
   天の川銀河
    太陽
     地球 直径:1 衛星数:1 平均公転半径:1
     木星 直径:11 衛星数:97 平均公転半径:5
    プロキシマ・ケンタウリ
     プロキシマ・ケンタウリb 直径:0 衛星数:0 平均公転半径:0
     プロキシマ・ケンタウリd 直径:0 衛星数:0 平均公転半径:0
   アンドロメダ銀河
  うみへび座銀河団
   NGC3309
   NGC3312
 おとめ座超銀河団
  おとめ座銀河団
   NGC4408
   NGC4486
  
   
   
CfA2グレートウォール
 かみのけ座超銀河団
  かみのけ座銀河団
   NGC4874
   NGC4889
  
   
   
 しし座超銀河団
  しし座銀河団
   NGC3623
   NGC3627
  
   
   

C:\developments\vscode\mind9>

遠方の宇宙構造物であるほど、個別の恒星識別は難しいようで、恒星名の情報はみつけにくい感じでした。そのため、惑星データの要素数でループさせると、初期化データで繰り返し表示される回数が多くなってしまうため、惑星情報の繰り返し数は2回としています。

参考情報

この小技「多次元配列」を使った記述例の記事はまだないようです。見つけたら教えてください。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕40周年です。

本記事シリーズのご紹介

本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕40周年プロジェクト」の一環です。

興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできますよ。

Mindプログラミングマニュアル(基本文法)ページから気になるお題の構文を選んで、この記事のようにサンプル実装実行してQiitaにアウトプットしてみましょう!

筆者はMind7/8/9βで検証しておりますが、もちろんMind8だけでもじゅうぶんです。またお題が既存記事とかぶるのはまったく問題ありません。同じお題でみなさまの多様斬新なサンプルをお待ちしております:grinning:

面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう:relaxed:

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?