エクセル指向プログラミング (34レス)
エクセル指向プログラミング http://mevius.5ch.net/test/read.cgi/tech/1711440779/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
1: デフォルトの名無しさん [sage] 2024/03/26(火) 17:12:59.08 ID:e/0sucGI エクセル指向プログラミング(Excel Oriented Programming、EOP)は、ノンプログラマにとって最も直感的で習得が容易なプログラミングスタイルです。 ブログラマは難解な言語機能を覚えることなく、拡張が容易なソフトウェアを、簡単に開発することができます。 プログラムのすべてのデータは長さ可変の二次元配列の上で管理されます。この二次元配列を「シート」といい、配列の各要素を「セル」と言います。 シートはシングルトンオブジェクトです。すなわち、EOPでは単一のグローバル変数を上書きすることでプログラムの状態を更新します。 構造化データはすべて配列で表します。データ型などのスキーマはありません。どの行・どの列がなんのデータを表すのかは、その場その場で変更することができます。 行方向または列方向に連続するセルが一つのデータ構造を表します。したがって、構造化データの読み取りは while(cell) { // do something cell = sheet[r][c++]; } のように書けます。使い終わった領域は0またはnullで初期化しておきます。 ネストされた構造化データは、セルへの参照をセルに書き込みます。たとえば、多重配列を表現する場合は、ネストされた配列の先頭要素の座標をセルに書き込みます。 EOPでは、プログラマは好きなときに好きなデータ構造を使用することができます。既存のプログラミングスタイルのように、データ型やメソッドのシグネチャに、データ構造が制限されることがありません。 http://mevius.5ch.net/test/read.cgi/tech/1711440779/1
2: デフォルトの名無しさん [sage] 2024/03/26(火) 17:38:31.01 ID:e/0sucGI 例として、nameとage属性をもったデータ構造を読み取るプログラムを書いてみましょう。 r = 0; name = 0; age = 1; while(cell) { print("name: " + sheet[r][name] + ", age: " + sheet[r][age]); cell = sheet[r++][name]; } このように、EOPでは構造体やクラスのような難解な機能を使わずとも、配列とループだけでデータ構造を操作することができます。 特筆すべきことは、EOPではデータ構造は使用時に自由に変更できます。もし、上のデータ構造に新たな属性sexが必要であれば、単に追加すればよいのです。 MALE = 1; FEMALE = 2; sex = 2; sheet[0][sex] = MALE; sheet[1][sex] = FEMALE; http://mevius.5ch.net/test/read.cgi/tech/1711440779/2
3: デフォルトの名無しさん [sage] 2024/03/26(火) 19:22:17.08 ID:e/0sucGI EOPでは関数は使いません。別の処理に移動したい場合は、単にジャンプ先のセルの座標を指定すればよいのです。 以下は、すごろくを1マスずつ巡回し、BONUSマスならば2つ進め、PENALTYマスならば2つ戻り、巡回したマスをカウントするプログラムです。一度発動したボーナス/ペナルティは二回目からは無効になります。 r = 0; c = 0; cnt = 0 while(cell) { cnt++; if(cell == "BONUS") { cell = "VISITED"; c += 2; } else if(cell == "PENALTY") { cell = "VISITED"; c -= 2; } else { c += 1; } cell = sheet[r][c]; } http://mevius.5ch.net/test/read.cgi/tech/1711440779/3
4: デフォルトの名無しさん [sage] 2024/03/26(火) 19:23:43.98 ID:e/0sucGI べつの処理をした後、元の場所に戻ってきたい場合はどうすればいいでしょうか?スタックを使えば簡単にできます。 以下は、データの合計値を求めるプログラムです。ただし、現在のセルが配列の場合は、その配列の合計値を求めます。データは0列目が数値または配列宣言、配列宣言がされた時は1列目がジャンプ先の行番号、2列目が列番号です。 r = 0; data = 0; data_r = 1; data_c = 2; stack = 0; stack_r = 3; stack_c = 4; sum = 0; while(cell) { if (cell == "ARRAY") { stack++; sheet[stack][stack_r] = r; sheet[stack][stack_c] = data; tmp_r = r; r = sheet[tmp_r][data_r]; data = sheet[tmp_r][data_c]; data_r = data + 1; data_c = data + 2; cell = sheet[r][data]; } else { sum += cell; cell = sheet[r++][data]; } if (!cell) { if (stack) { r = sheet[stack][stack_r]; data = sheet[stack][stack_c]; data_r = data + 1; data_c = data + 2; stack--; } } } http://mevius.5ch.net/test/read.cgi/tech/1711440779/4
5: デフォルトの名無しさん [sage] 2024/03/26(火) 19:26:58.02 ID:e/0sucGI 訂正: r++やc++と書いてあるところ すべて++r, ++cです http://mevius.5ch.net/test/read.cgi/tech/1711440779/5
6: デフォルトの名無しさん [sage] 2024/03/26(火) 19:59:23.04 ID:e/0sucGI EOPでは、シートを用いてデータ構造をシンプルかつ柔軟に扱えるだけではなく、シートは手続きを表現することもできます 以下のプログラムは、4つのコマンド ADD PRINT を持ちます ADDを呼ぶと、引数の数が合計値に加算されます PRINTを呼ぶと、現在の合計値が表示されます r = 0; sum = 0; while(cell) { if (cell == "ADD") { sum += sheet[r][cmd + 1]; } if (cell =="PRINT") { print(sheet[r][cmd + 1]); } cell = sheet[++r][cmd]; } http://mevius.5ch.net/test/read.cgi/tech/1711440779/6
7: デフォルトの名無しさん [sage] 2024/03/27(水) 05:40:00.84 ID:Ln/fAIz6 言語何使ってんのコレ http://mevius.5ch.net/test/read.cgi/tech/1711440779/7
8: デフォルトの名無しさん [sage] 2024/03/27(水) 14:53:16.09 ID:8k2YrkW2 なんかオライリーみたいな導入 http://mevius.5ch.net/test/read.cgi/tech/1711440779/8
9: デフォルトの名無しさん [sage] 2024/03/29(金) 14:55:32.56 ID:hQjfrr6D ID:e/0sucGI こいつろくにプログラミングしたことないんだろうなぁ http://mevius.5ch.net/test/read.cgi/tech/1711440779/9
10: デフォルトの名無しさん [] 2024/03/29(金) 16:33:00.75 ID:4yVHOK9w ネタスレにマジレス http://mevius.5ch.net/test/read.cgi/tech/1711440779/10
11: デフォルトの名無しさん [sage] 2024/03/30(土) 19:46:50.28 ID:lpdJhGw+ あれだけ連投してるのにネタスレでごまかすのは無理でしょ まぁ足りない頭を絞って書いたものを正論で潰されるのは可哀相っちゃ可哀相だけど… http://mevius.5ch.net/test/read.cgi/tech/1711440779/11
12: デフォルトの名無しさん [] 2024/03/30(土) 22:25:41.35 ID:2vvOizF3 うわぁ…… http://mevius.5ch.net/test/read.cgi/tech/1711440779/12
13: デフォルトの名無しさん [sage] 2024/03/31(日) 05:30:13.50 ID:mCr6Yy4A >>1があれ以降書き込んでないのがお察し どんな反応求めてたんだろう http://mevius.5ch.net/test/read.cgi/tech/1711440779/13
14: デフォルトの名無しさん [] 2024/03/31(日) 10:58:19.19 ID:bHunl/8X >>11が心配 「連投してるからネタスレでない」というロジックが意味不明だし 「正論」とやらがどこに書かれているのかもわからない http://mevius.5ch.net/test/read.cgi/tech/1711440779/14
15: デフォルトの名無しさん [] 2024/03/31(日) 11:12:10.16 ID:AFDVA+e4 一次元の配列指向プログラミングならセルの参照は1個のパラメータだけで済むからより効率的 http://mevius.5ch.net/test/read.cgi/tech/1711440779/15
16: デフォルトの名無しさん [] 2024/04/02(火) 15:32:40.58 ID:CQMIJaVM 1次元配列ならジャンプ先のアドレスの指定は変数1個で済む http://mevius.5ch.net/test/read.cgi/tech/1711440779/16
17: デフォルトの名無しさん [sage] 2024/04/02(火) 15:41:03.62 ID:x3qRw97u 多次元配列だって計算すれば同じだよ 変数一つで実現できる 逆に一次元配列を多次元配列とみなして使う方法だってあるんだし http://mevius.5ch.net/test/read.cgi/tech/1711440779/17
18: デフォルトの名無しさん [] 2024/04/02(火) 19:06:12.99 ID:5dwwFNXN C言語なら、ポインタ型変数1個だけ使えばいいな http://mevius.5ch.net/test/read.cgi/tech/1711440779/18
19: デフォルトの名無しさん [sage] 2024/04/02(火) 19:09:22.44 ID:7yjlHQas >>18 ポインタ理解できてないだろ http://mevius.5ch.net/test/read.cgi/tech/1711440779/19
20: デフォルトの名無しさん [] 2024/04/02(火) 19:10:55.75 ID:5dwwFNXN >>19 ? http://mevius.5ch.net/test/read.cgi/tech/1711440779/20
21: デフォルトの名無しさん [sage] 2024/04/02(火) 19:18:03.35 ID:JgXYUviJ >>20 ポインタ型変数一つじゃ実現不可って話 http://mevius.5ch.net/test/read.cgi/tech/1711440779/21
22: デフォルトの名無しさん [sage] 2024/04/02(火) 19:22:08.05 ID:kERS+9TD ・配列の先頭アドレスを指すポインタ ・行数,列数を表す符号なし整数 ・↑をまとめた構造体 http://mevius.5ch.net/test/read.cgi/tech/1711440779/22
23: デフォルトの名無しさん [sage] 2024/04/02(火) 19:38:20.00 ID:JgXYUviJ それをポインタ型変数1個って言うか? http://mevius.5ch.net/test/read.cgi/tech/1711440779/23
24: デフォルトの名無しさん [] 2024/04/02(火) 19:51:06.70 ID:oY83wibz >>21 なぜ? http://mevius.5ch.net/test/read.cgi/tech/1711440779/24
25: デフォルトの名無しさん [] 2024/04/02(火) 19:55:08.71 ID:vNvRaytj ネタスレで、そのネタを下回る知能のやつがああだこうだ言っているという地獄 http://mevius.5ch.net/test/read.cgi/tech/1711440779/25
26: デフォルトの名無しさん [] 2024/04/02(火) 19:57:07.31 ID:GZPLkX8A ポインタ1個と即値だけでいけるがな http://mevius.5ch.net/test/read.cgi/tech/1711440779/26
27: デフォルトの名無しさん [sage] 2024/04/02(火) 20:11:35.84 ID:abcHw/BD スタックポインタはいるだろ http://mevius.5ch.net/test/read.cgi/tech/1711440779/27
28: デフォルトの名無しさん [] 2024/04/02(火) 20:20:15.30 ID:rNuJc/A1 スタックは要るな http://mevius.5ch.net/test/read.cgi/tech/1711440779/28
29: デフォルトの名無しさん [] 2024/04/02(火) 20:22:17.68 ID:rNuJc/A1 いや、いらんわ 戻り先のアドレスは紙にでも書いときゃいい http://mevius.5ch.net/test/read.cgi/tech/1711440779/29
30: デフォルトの名無しさん [sage] 2024/04/02(火) 20:33:07.24 ID:edguWIiV 以外に伸びたなとおもったら違う方向か http://mevius.5ch.net/test/read.cgi/tech/1711440779/30
31: デフォルトの名無しさん [sage] 2024/04/03(水) 11:24:36.72 ID:07nBP01A エクセルでプログラムとかメンテナンス性が最悪だからおすすめしない http://mevius.5ch.net/test/read.cgi/tech/1711440779/31
32: デフォルトの名無しさん [] 2024/04/04(木) 03:34:46.18 ID:GlxXdEjq ぬるぽ http://mevius.5ch.net/test/read.cgi/tech/1711440779/32
33: デフォルトの名無しさん [] 2024/04/04(木) 03:48:45.01 ID:2O67KOQT データの読み書きは while(cell = *p++) { // do something } データ構造を扱いたい時は 1つのオブジェクトがいくつのフィールドを持つか決めておき while(cell = *(p + size)) { // do something } のようにする 途中で構造を変えたくなった時のために、 sizeは3つか4つ余分に確保しておくのがベストプラクティス データ構造を入れ子にする場合や、サブルーチンを使う場合は、スタックを使う C言語とか忘れた http://mevius.5ch.net/test/read.cgi/tech/1711440779/33
34: デフォルトの名無しさん [sage] 2024/04/04(木) 11:19:31.47 ID:AaDBa930 つまんねーC言語モドキじゃなくて Excel4マクロみたいに独自性を出していこうよ http://mevius.5ch.net/test/read.cgi/tech/1711440779/34
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.004s