2017年5月5日金曜日

[UWSC]配列のサイズを変更する二【要素を挿入・追加】

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
今回は、配列に新しく要素を挿入・追加、リサイズしてしまう方法について書きました。

記事の内容

○配列に要素を挿入・追加

スマホで閲覧されている方へ
このブログは画面横幅を広くしてあります。スマホ解像度での閲覧は厳しいと思いますので、ウェブバージョンへどうぞ。

------------------
この方法はすごく面倒だったので、こちらで作り直ししております。
[UWSC]配列の要素の削除と挿入・追加[参照渡し使用]
------------------

前回の配列の削除に続き、挿入、追加です。


配列に要素を挿入・追加して配列を再構築

配列に要素を挿入・追加し、配列を綺麗に再構築しておく手順を作りました。

その中で使用する関数が以下です。
この関数の中でb[]という引数a[]より一つ要素の多い配列を宣言して、a[]と追加要素を代入するための箱として使用します。挿入する位置かどうかは10~15行目のif文で判断します。0から順番に処理して行くので、既に挿入済かどうかを覚えるfindという変数を定義して制御していきます。また、ubound()はこちらの記事([UWSC]配列の最大要素を返す関数)で作成した自作関数で、“渡された配列の最大要素数”を返す関数。

arry_append()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FUNCTION arry_append(a[],an,dt)
            j=0
            find=0
            DIM b[ubound(a)+1]
FOR i=0 TO ubound(b)
   IF an=-1 or i>ubound(a)
            b[j]=dt
   ELSE
      IF (find=0)
         IF (i=an)
            b[j]=dt
            find=1
         ELSE
            b[j]=a[i]
         ENDIF
      ELSE
            b[j]=a[i-1]
      ENDIF
         j=j+1
   ENDIF
NEXT
            RESULT=SLICE(b,0,LENGTH(b)-1)
FEND
関数プログラム説明
1,23行目1
23
FUNCTION arry_append(a[],an,dt)
FEND
arry_append()関数宣言:
引数a[]:挿入・追加対象の配列
引数an:挿入したい要素番号(-1:末尾に追加)
引数dtanの位置に追加するデータ
2~4行目2
3
4
            j=0
            find=0
            DIM b[ubound(a)+1]
以降使用する変数の初期値を代入。配列b[]は渡された配列a[]より一つサイズの大きいものを宣言します。(1要素を追加する関数なので)
変数findは既に要素を挿入済かどうかを覚えるフラグ。(配列要素番号を0から順番に処理して行くので既に挿入したかどうかを判断するために使用します。)
5,21行目5
21
FOR i=0 TO ubound(b)
NEXT
変数iを0から1づつ増やして配列の最大要素数までループさせます。
6,8,20行目6
8
20
   IF an=-1 or i>ubound(a)
   ELSE
   ENDIF
if条件文は、an(:挿入・追加しろと渡された要素番号)が-1、かつ、配列の最大要素より大きいかどうか。
(成り立つ:末尾に追加する)⇒ 7行目を実行
(成り立たない)⇒ 9~19行目を実行
7行目7            b[j]=dt
配列b[j]dtを代入。
9~19行目9
10
11
12
13
14
15
16
17
18
19
      IF (find=0)
         IF (i=an)
            b[j]=dt
            find=1
         ELSE
            b[j]=a[i]
         ENDIF
      ELSE
            b[j]=a[i-1]
      ENDIF
         j=j+1
if条件文は、変数findが0かどうか。
○⇒10~14行目を実行)

  if条件文は、指定された挿入位置anと変数iが等しいかどうか、
  (○⇒)    新配列b[j]にデータdtを代入、findに挿入した由を記憶。
  (×⇒)    新配列b[j]a[i]を代入。

×⇒17行目を実行)
  新配列b[j]に一つ要素の小さいa[i-1]を代入

いま5、21行目のループで変数iが増加。b[]a[]を同じ順番で全て代入するのではなく、挿入してしまった後は新配列の要素番号と元配列の要素番号が異なるので、iを使用せずjという新しい変数を使用。jは19行目を通ったとき(=b[]に一つ代入された)ときしか+1されないので、b[j]にはa[]が順番に代入されていく。(挿入された番号より小さいときはb[n]にはa[n]、大きいときはb[n]にはa[n-1]が代入されていく。)
22行目22            RESULT=SLICE(b,0,LENGTH(b)-1)
全要素コピーし終わってループを抜けたら、出来上がったb[]を関数の戻り値として返す。


呼び出し側は(“ARRY[]”という配列を使っている場合)
呼び出し側
1
2
3
4
5
      dmy=arry_append(ARRY,3,"poku")//←最後に追加する場合“3”の部分に-1指定
      DIM ARRY[ubound(dmy)]
   FOR i=0 TO ubound(dmy)
      ARRY[i]=dmy[i]
   NEXT
呼び出し側プログラム説明
1行目1      dmy=arry_append(ARRY,3,"poku")//←最後に追加する場合“3”の部分に-1指定
配列ARRY[3]に"poku"というデータを挿入します。戻り値を配列dmyに代入します。
2行目2      DIM ARRY[ubound(dmy)]
配列ARRY[]の最大要素番号を配列dmyの最大要素番号に変更します。
3~5行目3
4
5
   FOR i=0 TO ubound(dmy)
      ARRY[i]=dmy[i]
   NEXT
配列ARRY[]へ配列dmyをコピーします。

使用する場合には、3ヶ所(1、2、4行目)の“ARRY”を目的の配列名に書き直します。

動作確認しながら仕様を理解

動作確認

★1、★2、★4を準備して動作確認します。
動作確認
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//↓★1
   DIM ARRY[9]
  FOR i=0 TO 9
   ARRY[i]=i+1
  NEXT
//↑★1   ↓★2
   PRINT "使用前"
  FOR i=0 TO ubound(ARRY)
   PRINT "ARRY["+i+"]="+ARRY[i]
  NEXT
//↑★2   ↓★3
   dmy=arry_append(ARRY,3,"poku")//←最後に追加する場合“3”の部分に-1指定
   DIM ARRY[ubound(dmy)]
  FOR i=0 TO ubound(dmy)
   ARRY[i]=dmy[i]
  NEXT
//↑★3   ↓★4
   PRINT "使用後"
  FOR i=0 TO ubound(ARRY)
   ARRY[i]=dmy[i]
   PRINT "ARRY["+i+"]="+ARRY[i]
  NEXT
//↑★4
動作確認プログラム説明
2~5行目2
3
4
5
   DIM ARRY[9]
  FOR i=0 TO 9
   ARRY[i]=i+1
  NEXT
確認に使うためにARRYという配列変数に適当な値入れておく。
7~10行目7
8
9
10
   PRINT "使用前"
  FOR i=0 TO ubound(ARRY)
   PRINT "ARRY["+i+"]="+ARRY[i]
  NEXT
目的のブロック(★3)に入る前にARRYの中身がどうなってるか表示しておく。
12~16行目12
13
14
15
16
   dmy=arry_append(ARRY,3,"poku")//←最後に追加する場合“3”の部分に-1指定
   DIM ARRY[ubound(dmy)]
  FOR i=0 TO ubound(dmy)
   ARRY[i]=dmy[i]
  NEXT
動作確認をしたい呼び出しコード。
ここでは“要素数3”に"poku"というデータを挿入せよと書いてあります。
18~22行目18
19
20
21
22
   PRINT "使用後"
  FOR i=0 TO ubound(ARRY)
   ARRY[i]=dmy[i]
   PRINT "ARRY["+i+"]="+ARRY[i]
  NEXT
目的のブロック(★3)から出た後ARRYの中身がどうかわったか表示する。

確認結果
結果 使用前 使用後
an=3指定 ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=4
ARRY[4]=5
ARRY[5]=6
ARRY[6]=7
ARRY[7]=8
ARRY[8]=9
ARRY[9]=10
ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=poku
ARRY[4]=4
ARRY[5]=5
ARRY[6]=6
ARRY[7]=7
ARRY[8]=8
ARRY[9]=9
ARRY[10]=10
an=0指定 ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=4
ARRY[4]=5
ARRY[5]=6
ARRY[6]=7
ARRY[7]=8
ARRY[8]=9
ARRY[9]=10
ARRY[0]=poku
ARRY[1]=1
ARRY[2]=2
ARRY[3]=3
ARRY[4]=4
ARRY[5]=5
ARRY[6]=6
ARRY[7]=7
ARRY[8]=8
ARRY[9]=9
ARRY[10]=10
an=-1指定 ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=4
ARRY[4]=5
ARRY[5]=6
ARRY[6]=7
ARRY[7]=8
ARRY[8]=9
ARRY[9]=10
ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=4
ARRY[4]=5
ARRY[5]=6
ARRY[6]=7
ARRY[7]=8
ARRY[8]=9
ARRY[9]=10
ARRY[10]=poku
an=15指定 ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=4
ARRY[4]=5
ARRY[5]=6
ARRY[6]=7
ARRY[7]=8
ARRY[8]=9
ARRY[9]=10
ARRY[0]=1
ARRY[1]=2
ARRY[2]=3
ARRY[3]=4
ARRY[4]=5
ARRY[5]=6
ARRY[6]=7
ARRY[7]=8
ARRY[8]=9
ARRY[9]=10
ARRY[10]=poku

anの指定によって、挿入される位置が変わっています。
-1を指定しても、配列の最大要素より大きな値を指定しても同じ結果になるようにしました。(意図してない使い方だよと警告するために、後者の場合にエラーを出すよう改良してもよいかもしれません。)



記事の内容

○配列に要素を挿入・追加


【関連記事】
[UWSC]配列のサイズを変更する一【要素を削除】
[UWSC]BMP画像の幅と高さを得る関数
人気![UWSC]配列変数と関数[使い方まとめ]
[UWSC]配列の最大要素を返す関数


スポンサーリンク



↓ ランキングに参加しています!(Ctrlキーを押しながら) ↓

blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 
目次
ポク太郎の「俺の説明聞いてくれ」最キラー記事 IT関連
電気回路やプログラムの記事。元々のメインコンテンツ。
UWSC奮闘記
プログラミングのできる子に
デジタルの世界って
映画・ドラマ・芸能
ハリウッドが主のエンターテイメントの記事。最近は似顔絵多し。
戦士の息抜き
落書き漫画
数コマ漫画とアホ漫画。結局最大コンテンツに。
物思いに耽る
今日の数学
アホの雑記
取りとめもなく好き勝手に書く記事。不本意にも一番人気だったり。
役に立つかも
休むに似たり
好き勝手に書く
ブログ運営
AnalyticsやSerchConsolなどの使い方、アクセスアップに関する話題。
アドセンス関連
他のGoogleツール
その他
アホのもくろみ

免責事項 ホームへ戻る

スポンサーリンク





0 件のコメント:

コメントを投稿